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

; 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.8 }
%struct.anon.8 = 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.iovec = type { ptr, i64 }
%struct.cursor_set_result = type { i32, i8 }
%struct.page_get_result = type { ptr, i32 }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%struct.MDBX_cursor = type { i32, %union.anon, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon = type { i16 }
%struct.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.2 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.0, %union.anon.1 }
%union.anon.0 = type { i32 }
%union.anon.1 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.2 = type { %struct.anon.4 }
%struct.anon.4 = type { %struct.troika, ptr, %struct.anon.5, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.6 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.5 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.6 = type { %struct.anon.7 }
%struct.anon.7 = type { i64, ptr }
%struct.anon = type { i8, i8 }
%struct.clc2 = type { %struct.clc, %struct.clc }
%struct.clc = type { ptr, i64, i64 }
%struct.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%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.11, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.12, %struct.anon.16, i8, ptr, ptr, ptr, %struct.anon.17, %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.10, i32, i64, i64, i64 }
%union.anon.10 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.11 = type { ptr, ptr, ptr, ptr }
%struct.anon.12 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.13, %union.anon.14 }
%struct.anon.13 = type { i16, i16, i16, i16 }
%union.anon.14 = type { i32 }
%struct.anon.16 = type { i64, i64, i64, i64, i64 }
%struct.anon.17 = 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 }
%struct.anon.19 = type { i16, i16 }
%struct.shared_lck = type { i64, i32, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, [2 x %union.mdbx_atomic_uint32_t], [16 x i8], %struct.pgops, [16 x i8], %union.pthread_mutex_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, i32, %struct.anon.22, %union.pthread_mutex_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, [16 x i8], [0 x %struct.reader_slot] }
%struct.pgops = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %struct.anon.20 }
%struct.anon.20 = type { %struct.gc_prof_stat, %struct.gc_prof_stat, i32, i32, i32, i32, i32 }
%struct.gc_prof_stat = type { i64, i64, i32, i32, i32, i32, %struct.anon.21 }
%struct.anon.21 = type { i64, i64, i32 }
%struct.anon.22 = type { [4 x i32], [4 x i64] }
%struct.reader_slot = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t }

@globals = external global %struct.libmdbx_globals, align 8
@.str.5 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [22 x i8], align 1
@__func__.cursor_put = external hidden unnamed_addr constant [11 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [135 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.67 = external hidden unnamed_addr constant [146 x i8], align 1
@.str.68 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.69 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.70 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.71 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.72 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.73 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.74 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.75 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.76 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.77 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.78 = external hidden unnamed_addr constant [66 x i8], align 1
@.str.79 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.81 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.82 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.83 = external hidden unnamed_addr constant [139 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [56 x i8], align 1

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @cursor_validate(ptr noundef) #0

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

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

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

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

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

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

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

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

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

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @cursor_validate_updating(ptr noundef) #0

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

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_touch(ptr noundef, ptr noundef, ptr noundef) #5

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #6

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

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

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden ptr @node_data(ptr noalias noundef) #4

; Function Attrs: inlinehint nounwind willreturn memory(none) uwtable
declare hidden zeroext i16 @flags_db2sub(i16 noundef zeroext) #9

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

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @inner_last(ptr noundef, ptr noundef) #5

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @outer_last(ptr noundef, ptr noundef, ptr noundef) #5

; Function Attrs: hot nounwind uwtable
define dso_local i32 @cursor_put(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) #5 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca [510 x i8], align 16
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca %struct.iovec, align 8
  %15 = alloca %struct.iovec, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca i8, align 1
  %19 = alloca %struct.iovec, align 8
  %20 = alloca %struct.iovec, align 8
  %21 = alloca i32, align 4
  %22 = alloca %struct.cursor_set_result, align 4
  %23 = alloca %struct.cursor_set_result, align 4
  %24 = alloca %struct.iovec, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca i64, align 8
  %28 = alloca %struct.page_get_result, align 8
  %29 = alloca %struct.iovec, align 8
  %30 = alloca %struct.iovec, align 8
  %31 = alloca %struct.tree, align 4
  %32 = alloca ptr, align 8
  %33 = alloca i8, align 1
  %34 = alloca i8, align 1
  %35 = alloca i16, align 2
  %36 = alloca ptr, align 8
  %37 = alloca i64, align 8
  %38 = alloca ptr, align 8
  %39 = alloca i64, align 8
  %40 = alloca ptr, align 8
  %41 = alloca i64, align 8
  %42 = alloca i32, align 4
  %43 = alloca %struct.page_get_result, align 8
  %44 = alloca i64, align 8
  %45 = alloca i64, align 8
  %46 = alloca %struct.page_get_result, align 8
  %47 = alloca ptr, align 8
  %48 = alloca i64, align 8
  %49 = alloca ptr, align 8
  %50 = alloca i32, align 4
  %51 = alloca %struct.page_get_result, align 8
  %52 = alloca i64, align 8
  %53 = alloca i32, align 4
  %54 = alloca i64, align 8
  %55 = alloca ptr, align 8
  %56 = alloca i64, align 8
  %57 = alloca ptr, align 8
  %58 = alloca ptr, align 8
  %59 = alloca %struct.iovec, align 8
  %60 = alloca ptr, align 8
  %61 = alloca i32, align 4
  %62 = alloca ptr, align 8
  %63 = alloca ptr, align 8
  %64 = alloca i64, align 8
  %65 = alloca i64, align 8
  %66 = alloca ptr, align 8
  %67 = alloca i64, align 8
  %68 = alloca ptr, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #11
  call void @llvm.lifetime.start.p0(i64 510, ptr %11) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #11
  %69 = load ptr, ptr %6, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.MDBX_cursor, ptr %69, i32 0, i32 5
  %71 = load ptr, ptr %70, align 8, !tbaa !11
  %72 = getelementptr inbounds %struct.MDBX_txn, ptr %71, i32 0, i32 9
  %73 = load ptr, ptr %72, align 8, !tbaa !13
  store ptr %73, ptr %12, align 8, !tbaa !5
  %74 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %75 = zext i8 %74 to i32
  %76 = icmp sle i32 5, %75
  %77 = xor i1 %76, true
  %78 = xor i1 %77, true
  %79 = zext i1 %78 to i32
  %80 = sext i32 %79 to i64
  %81 = call i64 @llvm.expect.i64(i64 %80, i64 0)
  %82 = icmp ne i64 %81, 0
  br i1 %82, label %83, label %90

83:                                               ; preds = %4
  %84 = load i32, ptr %9, align 4, !tbaa !9
  %85 = and i32 %84, 65536
  %86 = icmp ne i32 %85, 0
  br i1 %86, label %87, label %90

87:                                               ; preds = %83
  %88 = load ptr, ptr %8, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.iovec, ptr %88, i32 0, i32 0
  store ptr null, ptr %89, align 8, !tbaa !22
  br label %90

90:                                               ; preds = %87, %83, %4
  br label %91

91:                                               ; preds = %90
  %92 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %93 = zext i8 %92 to i32
  %94 = icmp sle i32 5, %93
  %95 = xor i1 %94, true
  %96 = xor i1 %95, true
  %97 = zext i1 %96 to i32
  %98 = sext i32 %97 to i64
  %99 = call i64 @llvm.expect.i64(i64 %98, i64 0)
  %100 = icmp ne i64 %99, 0
  br i1 %100, label %101, label %118

101:                                              ; preds = %91
  %102 = load ptr, ptr %6, align 8, !tbaa !5
  %103 = call i32 @cursor_dbi_dbg(ptr noundef %102)
  %104 = load ptr, ptr %7, align 8, !tbaa !5
  %105 = getelementptr inbounds [510 x i8], ptr %11, i64 0, i64 0
  %106 = call ptr @mdbx_dump_val(ptr noundef %104, ptr noundef %105, i64 noundef 255)
  %107 = load ptr, ptr %7, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.iovec, ptr %107, i32 0, i32 1
  %109 = load i64, ptr %108, align 8, !tbaa !24
  %110 = load ptr, ptr %8, align 8, !tbaa !5
  %111 = getelementptr inbounds [510 x i8], ptr %11, i64 0, i64 0
  %112 = getelementptr inbounds i8, ptr %111, i64 254
  %113 = getelementptr inbounds i8, ptr %112, i64 1
  %114 = call ptr @mdbx_dump_val(ptr noundef %110, ptr noundef %113, i64 noundef 255)
  %115 = load ptr, ptr %8, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.iovec, ptr %115, i32 0, i32 1
  %117 = load i64, ptr %116, align 8, !tbaa !24
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_put, i32 noundef 715, ptr noundef @.str.44, i32 noundef %103, ptr noundef %106, i64 noundef %109, ptr noundef %114, i64 noundef %117)
  br label %118

118:                                              ; preds = %101, %91
  br label %119

119:                                              ; preds = %118
  br label %120

120:                                              ; preds = %119
  %121 = load i32, ptr %9, align 4, !tbaa !9
  %122 = and i32 %121, 64
  %123 = icmp ne i32 %122, 0
  br i1 %123, label %124, label %375

124:                                              ; preds = %120
  %125 = load ptr, ptr %6, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.MDBX_cursor, ptr %125, i32 0, i32 1
  %127 = getelementptr inbounds %struct.anon, ptr %126, i32 0, i32 0
  %128 = load i8, ptr %127, align 4, !tbaa !25
  %129 = sext i8 %128 to i32
  %130 = and i32 %129, 1
  %131 = icmp eq i32 %130, 0
  br i1 %131, label %132, label %375

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

142:                                              ; preds = %132
  store i32 22, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

143:                                              ; preds = %132
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %15) #11
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = call i32 @cursor_ops(ptr noundef %144, ptr noundef %14, ptr noundef %15, i32 noundef 4)
  store i32 %145, ptr %10, align 4, !tbaa !9
  %146 = load i32, ptr %10, align 4, !tbaa !9
  %147 = icmp ne i32 %146, 0
  %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 %156

154:                                              ; preds = %143
  %155 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %155, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

156:                                              ; preds = %143
  %157 = load ptr, ptr %6, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.MDBX_cursor, ptr %157, i32 0, i32 7
  %159 = load ptr, ptr %158, align 8, !tbaa !26
  %160 = getelementptr inbounds %struct.clc2, ptr %159, i32 0, i32 0
  %161 = getelementptr inbounds %struct.clc, ptr %160, i32 0, i32 0
  %162 = load ptr, ptr %161, align 8, !tbaa !27
  %163 = load ptr, ptr %7, align 8, !tbaa !5
  %164 = call i32 %162(ptr noundef %163, ptr noundef %14)
  %165 = icmp ne i32 %164, 0
  br i1 %165, label %166, label %167

166:                                              ; preds = %156
  store i32 -30418, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

167:                                              ; preds = %156
  %168 = load i32, ptr %9, align 4, !tbaa !9
  %169 = and i32 %168, 524288
  %170 = icmp ne i32 %169, 0
  %171 = xor i1 %170, true
  %172 = xor i1 %171, true
  %173 = zext i1 %172 to i32
  %174 = sext i32 %173 to i64
  %175 = call i64 @llvm.expect.i64(i64 %174, i64 0)
  %176 = icmp ne i64 %175, 0
  br i1 %176, label %177, label %221

177:                                              ; preds = %167
  %178 = load ptr, ptr %6, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.MDBX_cursor, ptr %178, i32 0, i32 8
  %180 = load ptr, ptr %179, align 8, !tbaa !30
  %181 = icmp ne ptr %180, null
  %182 = xor i1 %181, true
  %183 = xor i1 %182, true
  %184 = xor i1 %183, true
  %185 = zext i1 %184 to i32
  %186 = sext i32 %185 to i64
  %187 = call i64 @llvm.expect.i64(i64 %186, i64 0)
  %188 = icmp ne i64 %187, 0
  br i1 %188, label %189, label %190

189:                                              ; preds = %177
  store i32 22, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

190:                                              ; preds = %177
  %191 = load ptr, ptr %6, align 8, !tbaa !5
  %192 = load i32, ptr %9, align 4, !tbaa !9
  %193 = and i32 %192, 128
  %194 = call i32 @cursor_del(ptr noundef %191, i32 noundef %193)
  store i32 %194, ptr %10, align 4, !tbaa !9
  %195 = load i32, ptr %10, align 4, !tbaa !9
  %196 = icmp ne i32 %195, 0
  %197 = xor i1 %196, true
  %198 = xor i1 %197, true
  %199 = zext i1 %198 to i32
  %200 = sext i32 %199 to i64
  %201 = call i64 @llvm.expect.i64(i64 %200, i64 0)
  %202 = icmp ne i64 %201, 0
  br i1 %202, label %203, label %205

203:                                              ; preds = %190
  %204 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %204, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

205:                                              ; preds = %190
  %206 = load ptr, ptr %8, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.iovec, ptr %206, i64 1
  %208 = getelementptr inbounds %struct.iovec, ptr %207, i32 0, i32 1
  %209 = load i64, ptr %208, align 8, !tbaa !24
  %210 = icmp eq i64 %209, 0
  %211 = xor i1 %210, true
  %212 = xor i1 %211, true
  %213 = zext i1 %212 to i32
  %214 = sext i32 %213 to i64
  %215 = call i64 @llvm.expect.i64(i64 %214, i64 0)
  %216 = icmp ne i64 %215, 0
  br i1 %216, label %217, label %218

217:                                              ; preds = %205
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

218:                                              ; preds = %205
  %219 = load i32, ptr %9, align 4, !tbaa !9
  %220 = sub i32 %219, 64
  store i32 %220, ptr %9, align 4, !tbaa !9
  br label %371

221:                                              ; preds = %167
  %222 = load ptr, ptr %6, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.MDBX_cursor, ptr %222, i32 0, i32 8
  %224 = load ptr, ptr %223, align 8, !tbaa !30
  %225 = icmp ne ptr %224, null
  br i1 %225, label %226, label %356

226:                                              ; preds = %221
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #11
  %227 = load ptr, ptr %6, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.MDBX_cursor, ptr %227, i32 0, i32 9
  %229 = load ptr, ptr %6, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.MDBX_cursor, ptr %229, i32 0, i32 1
  %231 = getelementptr inbounds %struct.anon, ptr %230, i32 0, i32 1
  %232 = load i8, ptr %231, align 1, !tbaa !25
  %233 = sext i8 %232 to i64
  %234 = getelementptr inbounds [32 x ptr], ptr %228, i64 0, i64 %233
  %235 = load ptr, ptr %234, align 8, !tbaa !5
  %236 = load ptr, ptr %6, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.MDBX_cursor, ptr %236, i32 0, i32 10
  %238 = load ptr, ptr %6, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.MDBX_cursor, ptr %238, i32 0, i32 1
  %240 = getelementptr inbounds %struct.anon, ptr %239, i32 0, i32 1
  %241 = load i8, ptr %240, align 1, !tbaa !25
  %242 = sext i8 %241 to i64
  %243 = getelementptr inbounds [32 x i16], ptr %237, i64 0, i64 %242
  %244 = load i16, ptr %243, align 2, !tbaa !31
  %245 = zext i16 %244 to i64
  %246 = call ptr @page_node(ptr noundef %235, i64 noundef %245) #12
  store ptr %246, ptr %16, align 8, !tbaa !5
  %247 = load ptr, ptr %16, align 8, !tbaa !5
  %248 = call zeroext i8 @node_flags(ptr noundef %247) #12
  %249 = zext i8 %248 to i32
  %250 = and i32 %249, 4
  %251 = icmp ne i32 %250, 0
  br i1 %251, label %252, label %320

252:                                              ; preds = %226
  br label %253

253:                                              ; preds = %252
  %254 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %255 = zext i8 %254 to i32
  %256 = and i32 %255, 1
  %257 = icmp ne i32 %256, 0
  %258 = xor i1 %257, true
  %259 = xor i1 %258, true
  %260 = zext i1 %259 to i32
  %261 = sext i32 %260 to i64
  %262 = call i64 @llvm.expect.i64(i64 %261, i64 1)
  %263 = icmp ne i64 %262, 0
  br i1 %263, label %264, label %284

264:                                              ; preds = %253
  br label %265

265:                                              ; preds = %264
  %266 = load ptr, ptr %6, align 8, !tbaa !5
  %267 = call zeroext i1 @inner_pointed(ptr noundef %266) #12
  %268 = xor i1 %267, true
  %269 = xor i1 %268, true
  %270 = xor i1 %269, true
  %271 = zext i1 %270 to i32
  %272 = sext i32 %271 to i64
  %273 = call i64 @llvm.expect.i64(i64 %272, i64 0)
  %274 = icmp ne i64 %273, 0
  br i1 %274, label %275, label %281

275:                                              ; preds = %265
  %276 = load ptr, ptr %6, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.MDBX_cursor, ptr %276, i32 0, i32 5
  %278 = load ptr, ptr %277, align 8, !tbaa !11
  %279 = getelementptr inbounds %struct.MDBX_txn, ptr %278, i32 0, i32 9
  %280 = load ptr, ptr %279, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %280, ptr noundef @.str.45, ptr noundef @__func__.cursor_put, i32 noundef 746) #13
  unreachable

281:                                              ; preds = %265
  br label %282

282:                                              ; preds = %281
  br label %283

283:                                              ; preds = %282
  br label %284

284:                                              ; preds = %283, %253
  br label %285

285:                                              ; preds = %284
  br label %286

286:                                              ; preds = %285
  %287 = load ptr, ptr %6, align 8, !tbaa !5
  %288 = getelementptr inbounds %struct.MDBX_cursor, ptr %287, i32 0, i32 8
  %289 = load ptr, ptr %288, align 8, !tbaa !30
  %290 = getelementptr inbounds %struct.inner_cursor, ptr %289, i32 0, i32 1
  %291 = getelementptr inbounds %struct.tree, ptr %290, i32 0, i32 8
  %292 = load i64, ptr %291, align 8, !tbaa !33
  %293 = icmp ugt i64 %292, 1
  br i1 %293, label %301, label %294

294:                                              ; preds = %286
  %295 = getelementptr inbounds %struct.iovec, ptr %15, i32 0, i32 1
  %296 = load i64, ptr %295, align 8, !tbaa !24
  %297 = load ptr, ptr %8, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.iovec, ptr %297, i32 0, i32 1
  %299 = load i64, ptr %298, align 8, !tbaa !24
  %300 = icmp ne i64 %296, %299
  br i1 %300, label %301, label %319

301:                                              ; preds = %294, %286
  %302 = load ptr, ptr %6, align 8, !tbaa !5
  %303 = load i32, ptr %9, align 4, !tbaa !9
  %304 = and i32 %303, 128
  %305 = call i32 @cursor_del(ptr noundef %302, i32 noundef %304)
  store i32 %305, ptr %10, align 4, !tbaa !9
  %306 = load i32, ptr %10, align 4, !tbaa !9
  %307 = icmp ne i32 %306, 0
  %308 = xor i1 %307, true
  %309 = xor i1 %308, true
  %310 = zext i1 %309 to i32
  %311 = sext i32 %310 to i64
  %312 = call i64 @llvm.expect.i64(i64 %311, i64 0)
  %313 = icmp ne i64 %312, 0
  br i1 %313, label %314, label %316

314:                                              ; preds = %301
  %315 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %315, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %353

316:                                              ; preds = %301
  %317 = load i32, ptr %9, align 4, !tbaa !9
  %318 = sub i32 %317, 64
  store i32 %318, ptr %9, align 4, !tbaa !9
  store i32 4, ptr %13, align 4
  br label %353

319:                                              ; preds = %294
  br label %352

320:                                              ; preds = %226
  %321 = load ptr, ptr %7, align 8, !tbaa !5
  %322 = load ptr, ptr %8, align 8, !tbaa !5
  %323 = call i64 @node_size(ptr noundef %321, ptr noundef %322) #12
  %324 = load ptr, ptr %12, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.MDBX_env, ptr %324, i32 0, i32 8
  %326 = load i16, ptr %325, align 8, !tbaa !36
  %327 = zext i16 %326 to i64
  %328 = icmp ugt i64 %323, %327
  %329 = xor i1 %328, true
  %330 = xor i1 %329, true
  %331 = zext i1 %330 to i32
  %332 = sext i32 %331 to i64
  %333 = call i64 @llvm.expect.i64(i64 %332, i64 0)
  %334 = icmp ne i64 %333, 0
  br i1 %334, label %335, label %351

335:                                              ; preds = %320
  %336 = load ptr, ptr %6, align 8, !tbaa !5
  %337 = call i32 @cursor_del(ptr noundef %336, i32 noundef 0)
  store i32 %337, ptr %10, align 4, !tbaa !9
  %338 = load i32, ptr %10, align 4, !tbaa !9
  %339 = icmp ne i32 %338, 0
  %340 = xor i1 %339, true
  %341 = xor i1 %340, true
  %342 = zext i1 %341 to i32
  %343 = sext i32 %342 to i64
  %344 = call i64 @llvm.expect.i64(i64 %343, i64 0)
  %345 = icmp ne i64 %344, 0
  br i1 %345, label %346, label %348

346:                                              ; preds = %335
  %347 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %347, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %353

348:                                              ; preds = %335
  %349 = load i32, ptr %9, align 4, !tbaa !9
  %350 = sub i32 %349, 64
  store i32 %350, ptr %9, align 4, !tbaa !9
  store i32 4, ptr %13, align 4
  br label %353

351:                                              ; preds = %320
  br label %352

352:                                              ; preds = %351, %319
  store i32 0, ptr %13, align 4
  br label %353

353:                                              ; preds = %352, %348, %346, %316, %314
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #11
  %354 = load i32, ptr %13, align 4
  switch i32 %354, label %372 [
    i32 0, label %355
    i32 4, label %371
  ]

355:                                              ; preds = %353
  br label %356

356:                                              ; preds = %355, %221
  %357 = load i32, ptr %9, align 4, !tbaa !9
  %358 = and i32 %357, 65536
  %359 = icmp ne i32 %358, 0
  br i1 %359, label %370, label %360

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

369:                                              ; preds = %360
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %372

370:                                              ; preds = %360, %356
  br label %371

371:                                              ; preds = %370, %353, %218
  store i32 0, ptr %13, align 4
  br label %372

372:                                              ; preds = %371, %369, %353, %217, %203, %189, %166, %154
  call void @llvm.lifetime.end.p0(i64 16, ptr %15) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #11
  %373 = load i32, ptr %13, align 4
  switch i32 %373, label %4512 [
    i32 0, label %374
  ]

374:                                              ; preds = %372
  br label %375

375:                                              ; preds = %374, %124, %120
  store i32 0, ptr %17, align 4, !tbaa !9
  %376 = load ptr, ptr %6, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.MDBX_cursor, ptr %376, i32 0, i32 6
  %378 = load ptr, ptr %377, align 8, !tbaa !45
  %379 = getelementptr inbounds %struct.tree, ptr %378, i32 0, i32 1
  %380 = load i16, ptr %379, align 2, !tbaa !46
  %381 = zext i16 %380 to i32
  %382 = icmp eq i32 %381, 0
  br i1 %382, label %383, label %418

383:                                              ; preds = %375
  br label %384

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

395:                                              ; preds = %384
  br label %396

396:                                              ; preds = %395
  %397 = load ptr, ptr %6, align 8, !tbaa !5
  %398 = call zeroext i1 @is_poor(ptr noundef %397) #12
  %399 = xor i1 %398, true
  %400 = xor i1 %399, true
  %401 = xor i1 %400, true
  %402 = zext i1 %401 to i32
  %403 = sext i32 %402 to i64
  %404 = call i64 @llvm.expect.i64(i64 %403, i64 0)
  %405 = icmp ne i64 %404, 0
  br i1 %405, label %406, label %412

406:                                              ; preds = %396
  %407 = load ptr, ptr %6, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.MDBX_cursor, ptr %407, i32 0, i32 5
  %409 = load ptr, ptr %408, align 8, !tbaa !11
  %410 = getelementptr inbounds %struct.MDBX_txn, ptr %409, i32 0, i32 9
  %411 = load ptr, ptr %410, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %411, ptr noundef @.str.46, ptr noundef @__func__.cursor_put, i32 noundef 777) #13
  unreachable

412:                                              ; preds = %396
  br label %413

413:                                              ; preds = %412
  br label %414

414:                                              ; preds = %413
  br label %415

415:                                              ; preds = %414, %384
  br label %416

416:                                              ; preds = %415
  br label %417

417:                                              ; preds = %416
  store i32 -30377, ptr %17, align 4, !tbaa !9
  br label %927

418:                                              ; preds = %375
  %419 = load i32, ptr %9, align 4, !tbaa !9
  %420 = and i32 %419, 64
  %421 = icmp eq i32 %420, 0
  br i1 %421, label %422, label %926

422:                                              ; preds = %418
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #11
  store i8 0, ptr %18, align 1, !tbaa !47
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #11
  %423 = load i32, ptr %9, align 4, !tbaa !9
  %424 = and i32 %423, 131072
  %425 = icmp ne i32 %424, 0
  br i1 %425, label %426, label %507

426:                                              ; preds = %422
  %427 = load ptr, ptr %6, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.MDBX_cursor, ptr %427, i32 0, i32 6
  %429 = load ptr, ptr %428, align 8, !tbaa !45
  %430 = getelementptr inbounds %struct.tree, ptr %429, i32 0, i32 8
  %431 = load i64, ptr %430, align 4, !tbaa !48
  %432 = icmp ugt i64 %431, 0
  br i1 %432, label %433, label %507

433:                                              ; preds = %426
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #11
  %434 = getelementptr inbounds %struct.iovec, ptr %19, i32 0, i32 0
  store ptr null, ptr %434, align 8, !tbaa !22
  %435 = getelementptr inbounds %struct.iovec, ptr %19, i32 0, i32 1
  store i64 0, ptr %435, align 8, !tbaa !24
  %436 = load ptr, ptr %6, align 8, !tbaa !5
  %437 = getelementptr inbounds %struct.MDBX_cursor, ptr %436, i32 0, i32 1
  %438 = getelementptr inbounds %struct.anon, ptr %437, i32 0, i32 0
  %439 = load i8, ptr %438, align 4, !tbaa !25
  %440 = sext i8 %439 to i32
  %441 = and i32 %440, 1
  %442 = icmp ne i32 %441, 0
  br i1 %442, label %443, label %446

443:                                              ; preds = %433
  %444 = load ptr, ptr %6, align 8, !tbaa !5
  %445 = call i32 @inner_last(ptr noundef %444, ptr noundef %20) #14
  br label %449

446:                                              ; preds = %433
  %447 = load ptr, ptr %6, align 8, !tbaa !5
  %448 = call i32 @outer_last(ptr noundef %447, ptr noundef %20, ptr noundef %19) #14
  br label %449

449:                                              ; preds = %446, %443
  %450 = phi i32 [ %445, %443 ], [ %448, %446 ]
  store i32 %450, ptr %17, align 4, !tbaa !9
  %451 = load i32, ptr %17, align 4, !tbaa !9
  %452 = icmp eq i32 %451, 0
  %453 = xor i1 %452, true
  %454 = xor i1 %453, true
  %455 = zext i1 %454 to i32
  %456 = sext i32 %455 to i64
  %457 = call i64 @llvm.expect.i64(i64 %456, i64 1)
  %458 = icmp ne i64 %457, 0
  br i1 %458, label %459, label %503

459:                                              ; preds = %449
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #11
  %460 = load ptr, ptr %6, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.MDBX_cursor, ptr %460, i32 0, i32 7
  %462 = load ptr, ptr %461, align 8, !tbaa !26
  %463 = getelementptr inbounds %struct.clc2, ptr %462, i32 0, i32 0
  %464 = getelementptr inbounds %struct.clc, ptr %463, i32 0, i32 0
  %465 = load ptr, ptr %464, align 8, !tbaa !27
  %466 = load ptr, ptr %7, align 8, !tbaa !5
  %467 = call i32 %465(ptr noundef %466, ptr noundef %20)
  store i32 %467, ptr %21, align 4, !tbaa !9
  %468 = load i32, ptr %21, align 4, !tbaa !9
  %469 = icmp sgt i32 %468, 0
  %470 = xor i1 %469, true
  %471 = xor i1 %470, true
  %472 = zext i1 %471 to i32
  %473 = sext i32 %472 to i64
  %474 = call i64 @llvm.expect.i64(i64 %473, i64 1)
  %475 = icmp ne i64 %474, 0
  br i1 %475, label %476, label %487

476:                                              ; preds = %459
  %477 = load ptr, ptr %6, align 8, !tbaa !5
  %478 = getelementptr inbounds %struct.MDBX_cursor, ptr %477, i32 0, i32 10
  %479 = load ptr, ptr %6, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct.MDBX_cursor, ptr %479, i32 0, i32 1
  %481 = getelementptr inbounds %struct.anon, ptr %480, i32 0, i32 1
  %482 = load i8, ptr %481, align 1, !tbaa !25
  %483 = sext i8 %482 to i64
  %484 = getelementptr inbounds [32 x i16], ptr %478, i64 0, i64 %483
  %485 = load i16, ptr %484, align 2, !tbaa !31
  %486 = add i16 %485, 1
  store i16 %486, ptr %484, align 2, !tbaa !31
  store i32 -30798, ptr %17, align 4, !tbaa !9
  br label %499

487:                                              ; preds = %459
  %488 = load i32, ptr %21, align 4, !tbaa !9
  %489 = icmp ne i32 %488, 0
  %490 = xor i1 %489, true
  %491 = xor i1 %490, true
  %492 = zext i1 %491 to i32
  %493 = sext i32 %492 to i64
  %494 = call i64 @llvm.expect.i64(i64 %493, i64 0)
  %495 = icmp ne i64 %494, 0
  br i1 %495, label %496, label %497

496:                                              ; preds = %487
  store i32 -30418, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %500

497:                                              ; preds = %487
  store i32 0, ptr %17, align 4, !tbaa !9
  store i8 1, ptr %18, align 1, !tbaa !47
  br label %498

498:                                              ; preds = %497
  br label %499

499:                                              ; preds = %498, %476
  store i32 0, ptr %13, align 4
  br label %500

500:                                              ; preds = %499, %496
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #11
  %501 = load i32, ptr %13, align 4
  switch i32 %501, label %504 [
    i32 0, label %502
  ]

502:                                              ; preds = %500
  br label %503

503:                                              ; preds = %502, %449
  store i32 0, ptr %13, align 4
  br label %504

504:                                              ; preds = %503, %500
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #11
  %505 = load i32, ptr %13, align 4
  switch i32 %505, label %923 [
    i32 0, label %506
  ]

506:                                              ; preds = %504
  br label %517

507:                                              ; preds = %426, %422
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #11
  %508 = load ptr, ptr %6, align 8, !tbaa !5
  %509 = load ptr, ptr %7, align 8, !tbaa !5
  %510 = call i64 @cursor_seek(ptr noundef %508, ptr noundef %509, ptr noundef %19, i32 noundef 15)
  store i64 %510, ptr %22, align 4
  %511 = getelementptr inbounds %struct.cursor_set_result, ptr %22, i32 0, i32 0
  %512 = load i32, ptr %511, align 4, !tbaa !49
  store i32 %512, ptr %17, align 4, !tbaa !9
  %513 = getelementptr inbounds %struct.cursor_set_result, ptr %22, i32 0, i32 1
  %514 = load i8, ptr %513, align 4, !tbaa !51, !range !52, !noundef !53
  %515 = trunc i8 %514 to i1
  %516 = zext i1 %515 to i8
  store i8 %516, ptr %18, align 1, !tbaa !47
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #11
  br label %517

517:                                              ; preds = %507, %506
  %518 = load i8, ptr %18, align 1, !tbaa !47, !range !52, !noundef !53
  %519 = trunc i8 %518 to i1
  br i1 %519, label %520, label %910

520:                                              ; preds = %517
  br label %521

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

532:                                              ; preds = %521
  br label %533

533:                                              ; preds = %532
  %534 = load i32, ptr %17, align 4, !tbaa !9
  %535 = icmp eq i32 %534, 0
  %536 = xor i1 %535, true
  %537 = xor i1 %536, true
  %538 = xor i1 %537, true
  %539 = zext i1 %538 to i32
  %540 = sext i32 %539 to i64
  %541 = call i64 @llvm.expect.i64(i64 %540, i64 0)
  %542 = icmp ne i64 %541, 0
  br i1 %542, label %543, label %549

543:                                              ; preds = %533
  %544 = load ptr, ptr %6, align 8, !tbaa !5
  %545 = getelementptr inbounds %struct.MDBX_cursor, ptr %544, i32 0, i32 5
  %546 = load ptr, ptr %545, align 8, !tbaa !11
  %547 = getelementptr inbounds %struct.MDBX_txn, ptr %546, i32 0, i32 9
  %548 = load ptr, ptr %547, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %548, ptr noundef @.str.47, ptr noundef @__func__.cursor_put, i32 noundef 806) #13
  unreachable

549:                                              ; preds = %533
  br label %550

550:                                              ; preds = %549
  br label %551

551:                                              ; preds = %550
  br label %552

552:                                              ; preds = %551, %521
  br label %553

553:                                              ; preds = %552
  br label %554

554:                                              ; preds = %553
  %555 = load i32, ptr %9, align 4, !tbaa !9
  %556 = and i32 %555, 16
  %557 = icmp ne i32 %556, 0
  %558 = xor i1 %557, true
  %559 = xor i1 %558, true
  %560 = zext i1 %559 to i32
  %561 = sext i32 %560 to i64
  %562 = call i64 @llvm.expect.i64(i64 %561, i64 0)
  %563 = icmp ne i64 %562, 0
  br i1 %563, label %564, label %583

564:                                              ; preds = %554
  br label %565

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

575:                                              ; preds = %565
  %576 = load ptr, ptr %7, align 8, !tbaa !5
  %577 = getelementptr inbounds [510 x i8], ptr %11, i64 0, i64 0
  %578 = call ptr @mdbx_dump_val(ptr noundef %576, ptr noundef %577, i64 noundef 255)
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_put, i32 noundef 808, ptr noundef @.str.48, ptr noundef %578)
  br label %579

579:                                              ; preds = %575, %565
  br label %580

580:                                              ; preds = %579
  br label %581

581:                                              ; preds = %580
  %582 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %582, ptr align 8 %19, i64 16, i1 false), !tbaa.struct !54
  store i32 -30799, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %923

583:                                              ; preds = %554
  %584 = load ptr, ptr %6, align 8, !tbaa !5
  %585 = getelementptr inbounds %struct.MDBX_cursor, ptr %584, i32 0, i32 1
  %586 = getelementptr inbounds %struct.anon, ptr %585, i32 0, i32 0
  %587 = load i8, ptr %586, align 4, !tbaa !25
  %588 = sext i8 %587 to i32
  %589 = and i32 %588, 1
  %590 = icmp ne i32 %589, 0
  %591 = xor i1 %590, true
  %592 = xor i1 %591, true
  %593 = zext i1 %592 to i32
  %594 = sext i32 %593 to i64
  %595 = call i64 @llvm.expect.i64(i64 %594, i64 0)
  %596 = icmp ne i64 %595, 0
  br i1 %596, label %597, label %626

597:                                              ; preds = %583
  br label %598

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

609:                                              ; preds = %598
  br label %610

610:                                              ; preds = %609
  %611 = load ptr, ptr %6, align 8, !tbaa !5
  %612 = getelementptr inbounds %struct.MDBX_cursor, ptr %611, i32 0, i32 5
  %613 = load ptr, ptr %612, align 8, !tbaa !11
  %614 = getelementptr inbounds %struct.MDBX_txn, ptr %613, i32 0, i32 9
  %615 = load ptr, ptr %614, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %615, ptr noundef @.str.49, ptr noundef @__func__.cursor_put, i32 noundef 814) #13
  unreachable

616:                                              ; No predecessors!
  br label %617

617:                                              ; preds = %616
  br label %618

618:                                              ; preds = %617, %598
  br label %619

619:                                              ; preds = %618
  br label %620

620:                                              ; preds = %619
  %621 = load i32, ptr %9, align 4, !tbaa !9
  %622 = and i32 %621, 32
  %623 = icmp ne i32 %622, 0
  %624 = zext i1 %623 to i64
  %625 = select i1 %623, i32 -30799, i32 0
  store i32 %625, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %923

626:                                              ; preds = %583
  %627 = load ptr, ptr %6, align 8, !tbaa !5
  %628 = call zeroext i1 @inner_pointed(ptr noundef %627) #12
  br i1 %628, label %629, label %799

629:                                              ; preds = %626
  %630 = load i32, ptr %9, align 4, !tbaa !9
  %631 = and i32 %630, 128
  %632 = icmp ne i32 %631, 0
  %633 = xor i1 %632, true
  %634 = xor i1 %633, true
  %635 = zext i1 %634 to i32
  %636 = sext i32 %635 to i64
  %637 = call i64 @llvm.expect.i64(i64 %636, i64 0)
  %638 = icmp ne i64 %637, 0
  br i1 %638, label %639, label %708

639:                                              ; preds = %629
  %640 = load ptr, ptr %6, align 8, !tbaa !5
  %641 = call i32 @cursor_del(ptr noundef %640, i32 noundef 128)
  store i32 %641, ptr %17, align 4, !tbaa !9
  %642 = load i32, ptr %17, align 4, !tbaa !9
  %643 = icmp ne i32 %642, 0
  %644 = xor i1 %643, true
  %645 = xor i1 %644, true
  %646 = zext i1 %645 to i32
  %647 = sext i32 %646 to i64
  %648 = call i64 @llvm.expect.i64(i64 %647, i64 0)
  %649 = icmp ne i64 %648, 0
  br i1 %649, label %650, label %652

650:                                              ; preds = %639
  %651 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %651, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %923

652:                                              ; preds = %639
  %653 = load i32, ptr %9, align 4, !tbaa !9
  %654 = sub i32 %653, 128
  store i32 %654, ptr %9, align 4, !tbaa !9
  br label %655

655:                                              ; preds = %652
  %656 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %657 = zext i8 %656 to i32
  %658 = and i32 %657, 1
  %659 = icmp ne i32 %658, 0
  %660 = xor i1 %659, true
  %661 = xor i1 %660, true
  %662 = zext i1 %661 to i32
  %663 = sext i32 %662 to i64
  %664 = call i64 @llvm.expect.i64(i64 %663, i64 1)
  %665 = icmp ne i64 %664, 0
  br i1 %665, label %666, label %697

666:                                              ; preds = %655
  br label %667

667:                                              ; preds = %666
  %668 = load ptr, ptr %6, align 8, !tbaa !5
  %669 = getelementptr inbounds %struct.MDBX_cursor, ptr %668, i32 0, i32 1
  %670 = getelementptr inbounds %struct.anon, ptr %669, i32 0, i32 1
  %671 = load i8, ptr %670, align 1, !tbaa !25
  %672 = sext i8 %671 to i32
  %673 = add nsw i32 %672, 1
  %674 = load ptr, ptr %6, align 8, !tbaa !5
  %675 = getelementptr inbounds %struct.MDBX_cursor, ptr %674, i32 0, i32 6
  %676 = load ptr, ptr %675, align 8, !tbaa !45
  %677 = getelementptr inbounds %struct.tree, ptr %676, i32 0, i32 1
  %678 = load i16, ptr %677, align 2, !tbaa !46
  %679 = zext i16 %678 to i32
  %680 = icmp eq i32 %673, %679
  %681 = xor i1 %680, true
  %682 = xor i1 %681, true
  %683 = xor i1 %682, true
  %684 = zext i1 %683 to i32
  %685 = sext i32 %684 to i64
  %686 = call i64 @llvm.expect.i64(i64 %685, i64 0)
  %687 = icmp ne i64 %686, 0
  br i1 %687, label %688, label %694

688:                                              ; preds = %667
  %689 = load ptr, ptr %6, align 8, !tbaa !5
  %690 = getelementptr inbounds %struct.MDBX_cursor, ptr %689, i32 0, i32 5
  %691 = load ptr, ptr %690, align 8, !tbaa !11
  %692 = getelementptr inbounds %struct.MDBX_txn, ptr %691, i32 0, i32 9
  %693 = load ptr, ptr %692, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %693, ptr noundef @.str.50, ptr noundef @__func__.cursor_put, i32 noundef 823) #13
  unreachable

694:                                              ; preds = %667
  br label %695

695:                                              ; preds = %694
  br label %696

696:                                              ; preds = %695
  br label %697

697:                                              ; preds = %696, %655
  br label %698

698:                                              ; preds = %697
  br label %699

699:                                              ; preds = %698
  %700 = load ptr, ptr %6, align 8, !tbaa !5
  %701 = getelementptr inbounds %struct.MDBX_cursor, ptr %700, i32 0, i32 1
  %702 = getelementptr inbounds %struct.anon, ptr %701, i32 0, i32 1
  %703 = load i8, ptr %702, align 1, !tbaa !25
  %704 = sext i8 %703 to i32
  %705 = icmp sge i32 %704, 0
  %706 = zext i1 %705 to i64
  %707 = select i1 %705, i32 -30798, i32 -30377
  store i32 %707, ptr %17, align 4, !tbaa !9
  br label %798

708:                                              ; preds = %629
  %709 = load i32, ptr %9, align 4, !tbaa !9
  %710 = and i32 %709, 589824
  %711 = icmp eq i32 %710, 0
  br i1 %711, label %712, label %797

712:                                              ; preds = %708
  %713 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %19, ptr align 8 %713, i64 16, i1 false), !tbaa.struct !54
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #11
  %714 = load ptr, ptr %6, align 8, !tbaa !5
  %715 = getelementptr inbounds %struct.MDBX_cursor, ptr %714, i32 0, i32 8
  %716 = load ptr, ptr %715, align 8, !tbaa !30
  %717 = getelementptr inbounds %struct.inner_cursor, ptr %716, i32 0, i32 0
  %718 = call i64 @cursor_seek(ptr noundef %717, ptr noundef %19, ptr noundef null, i32 noundef 17)
  store i64 %718, ptr %23, align 4
  %719 = getelementptr inbounds %struct.cursor_set_result, ptr %23, i32 0, i32 1
  %720 = load i8, ptr %719, align 4, !tbaa !51, !range !52, !noundef !53
  %721 = trunc i8 %720 to i1
  %722 = xor i1 %721, true
  %723 = xor i1 %722, true
  %724 = zext i1 %723 to i32
  %725 = sext i32 %724 to i64
  %726 = call i64 @llvm.expect.i64(i64 %725, i64 0)
  %727 = icmp ne i64 %726, 0
  br i1 %727, label %728, label %774

728:                                              ; preds = %712
  br label %729

729:                                              ; preds = %728
  %730 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %731 = zext i8 %730 to i32
  %732 = and i32 %731, 1
  %733 = icmp ne i32 %732, 0
  %734 = xor i1 %733, true
  %735 = xor i1 %734, true
  %736 = zext i1 %735 to i32
  %737 = sext i32 %736 to i64
  %738 = call i64 @llvm.expect.i64(i64 %737, i64 1)
  %739 = icmp ne i64 %738, 0
  br i1 %739, label %740, label %761

740:                                              ; preds = %729
  br label %741

741:                                              ; preds = %740
  %742 = getelementptr inbounds %struct.cursor_set_result, ptr %23, i32 0, i32 0
  %743 = load i32, ptr %742, align 4, !tbaa !49
  %744 = icmp eq i32 %743, 0
  %745 = xor i1 %744, true
  %746 = xor i1 %745, true
  %747 = xor i1 %746, true
  %748 = zext i1 %747 to i32
  %749 = sext i32 %748 to i64
  %750 = call i64 @llvm.expect.i64(i64 %749, i64 0)
  %751 = icmp ne i64 %750, 0
  br i1 %751, label %752, label %758

752:                                              ; preds = %741
  %753 = load ptr, ptr %6, align 8, !tbaa !5
  %754 = getelementptr inbounds %struct.MDBX_cursor, ptr %753, i32 0, i32 5
  %755 = load ptr, ptr %754, align 8, !tbaa !11
  %756 = getelementptr inbounds %struct.MDBX_txn, ptr %755, i32 0, i32 9
  %757 = load ptr, ptr %756, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %757, ptr noundef @.str.51, ptr noundef @__func__.cursor_put, i32 noundef 829) #13
  unreachable

758:                                              ; preds = %741
  br label %759

759:                                              ; preds = %758
  br label %760

760:                                              ; preds = %759
  br label %761

761:                                              ; preds = %760, %729
  br label %762

762:                                              ; preds = %761
  br label %763

763:                                              ; preds = %762
  %764 = load i32, ptr %9, align 4, !tbaa !9
  %765 = and i32 %764, 32
  %766 = icmp ne i32 %765, 0
  br i1 %766, label %767, label %768

767:                                              ; preds = %763
  store i32 -30799, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %794

768:                                              ; preds = %763
  %769 = load i32, ptr %9, align 4, !tbaa !9
  %770 = and i32 %769, 262144
  %771 = icmp ne i32 %770, 0
  br i1 %771, label %772, label %773

772:                                              ; preds = %768
  store i32 -30418, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %794

773:                                              ; preds = %768
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %794

774:                                              ; preds = %712
  %775 = getelementptr inbounds %struct.cursor_set_result, ptr %23, i32 0, i32 0
  %776 = load i32, ptr %775, align 4, !tbaa !49
  %777 = icmp ne i32 %776, 0
  br i1 %777, label %778, label %792

778:                                              ; preds = %774
  %779 = getelementptr inbounds %struct.cursor_set_result, ptr %23, i32 0, i32 0
  %780 = load i32, ptr %779, align 4, !tbaa !49
  %781 = icmp ne i32 %780, -30798
  %782 = xor i1 %781, true
  %783 = xor i1 %782, true
  %784 = zext i1 %783 to i32
  %785 = sext i32 %784 to i64
  %786 = call i64 @llvm.expect.i64(i64 %785, i64 0)
  %787 = icmp ne i64 %786, 0
  br i1 %787, label %788, label %792

788:                                              ; preds = %778
  %789 = load ptr, ptr %6, align 8, !tbaa !5
  call void @be_poor(ptr noundef %789)
  %790 = getelementptr inbounds %struct.cursor_set_result, ptr %23, i32 0, i32 0
  %791 = load i32, ptr %790, align 4, !tbaa !49
  store i32 %791, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %794

792:                                              ; preds = %778, %774
  br label %793

793:                                              ; preds = %792
  store i32 0, ptr %13, align 4
  br label %794

794:                                              ; preds = %793, %788, %773, %772, %767
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  %795 = load i32, ptr %13, align 4
  switch i32 %795, label %923 [
    i32 0, label %796
  ]

796:                                              ; preds = %794
  br label %797

797:                                              ; preds = %796, %708
  br label %798

798:                                              ; preds = %797, %699
  br label %909

799:                                              ; preds = %626
  %800 = load i32, ptr %9, align 4, !tbaa !9
  %801 = and i32 %800, 589824
  %802 = icmp ne i32 %801, 0
  br i1 %802, label %908, label %803

803:                                              ; preds = %799
  %804 = load ptr, ptr %8, align 8, !tbaa !5
  %805 = call zeroext i1 @eq_fast(ptr noundef %804, ptr noundef %19) #12
  %806 = xor i1 %805, true
  %807 = xor i1 %806, true
  %808 = zext i1 %807 to i32
  %809 = sext i32 %808 to i64
  %810 = call i64 @llvm.expect.i64(i64 %809, i64 0)
  %811 = icmp ne i64 %810, 0
  br i1 %811, label %812, label %866

812:                                              ; preds = %803
  br label %813

813:                                              ; preds = %812
  %814 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %815 = zext i8 %814 to i32
  %816 = and i32 %815, 1
  %817 = icmp ne i32 %816, 0
  %818 = xor i1 %817, true
  %819 = xor i1 %818, true
  %820 = zext i1 %819 to i32
  %821 = sext i32 %820 to i64
  %822 = call i64 @llvm.expect.i64(i64 %821, i64 1)
  %823 = icmp ne i64 %822, 0
  br i1 %823, label %824, label %851

824:                                              ; preds = %813
  br label %825

825:                                              ; preds = %824
  %826 = load ptr, ptr %6, align 8, !tbaa !5
  %827 = getelementptr inbounds %struct.MDBX_cursor, ptr %826, i32 0, i32 7
  %828 = load ptr, ptr %827, align 8, !tbaa !26
  %829 = getelementptr inbounds %struct.clc2, ptr %828, i32 0, i32 1
  %830 = getelementptr inbounds %struct.clc, ptr %829, i32 0, i32 0
  %831 = load ptr, ptr %830, align 8, !tbaa !56
  %832 = load ptr, ptr %8, align 8, !tbaa !5
  %833 = call i32 %831(ptr noundef %832, ptr noundef %19)
  %834 = icmp eq i32 %833, 0
  %835 = xor i1 %834, true
  %836 = xor i1 %835, true
  %837 = xor i1 %836, true
  %838 = zext i1 %837 to i32
  %839 = sext i32 %838 to i64
  %840 = call i64 @llvm.expect.i64(i64 %839, i64 0)
  %841 = icmp ne i64 %840, 0
  br i1 %841, label %842, label %848

842:                                              ; preds = %825
  %843 = load ptr, ptr %6, align 8, !tbaa !5
  %844 = getelementptr inbounds %struct.MDBX_cursor, ptr %843, i32 0, i32 5
  %845 = load ptr, ptr %844, align 8, !tbaa !11
  %846 = getelementptr inbounds %struct.MDBX_txn, ptr %845, i32 0, i32 9
  %847 = load ptr, ptr %846, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %847, ptr noundef @.str.52, ptr noundef @__func__.cursor_put, i32 noundef 843) #13
  unreachable

848:                                              ; preds = %825
  br label %849

849:                                              ; preds = %848
  br label %850

850:                                              ; preds = %849
  br label %851

851:                                              ; preds = %850, %813
  br label %852

852:                                              ; preds = %851
  br label %853

853:                                              ; preds = %852
  %854 = load ptr, ptr %6, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.MDBX_cursor, ptr %854, i32 0, i32 8
  %856 = load ptr, ptr %855, align 8, !tbaa !30
  %857 = icmp ne ptr %856, null
  br i1 %857, label %858, label %862

858:                                              ; preds = %853
  %859 = load i32, ptr %9, align 4, !tbaa !9
  %860 = and i32 %859, 32
  %861 = icmp ne i32 %860, 0
  br label %862

862:                                              ; preds = %858, %853
  %863 = phi i1 [ false, %853 ], [ %861, %858 ]
  %864 = zext i1 %863 to i64
  %865 = select i1 %863, i32 -30799, i32 0
  store i32 %865, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %923

866:                                              ; preds = %803
  br label %867

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

878:                                              ; preds = %867
  br label %879

879:                                              ; preds = %878
  %880 = load ptr, ptr %6, align 8, !tbaa !5
  %881 = getelementptr inbounds %struct.MDBX_cursor, ptr %880, i32 0, i32 7
  %882 = load ptr, ptr %881, align 8, !tbaa !26
  %883 = getelementptr inbounds %struct.clc2, ptr %882, i32 0, i32 1
  %884 = getelementptr inbounds %struct.clc, ptr %883, i32 0, i32 0
  %885 = load ptr, ptr %884, align 8, !tbaa !56
  %886 = load ptr, ptr %8, align 8, !tbaa !5
  %887 = call i32 %885(ptr noundef %886, ptr noundef %19)
  %888 = icmp ne i32 %887, 0
  %889 = xor i1 %888, true
  %890 = xor i1 %889, true
  %891 = xor i1 %890, true
  %892 = zext i1 %891 to i32
  %893 = sext i32 %892 to i64
  %894 = call i64 @llvm.expect.i64(i64 %893, i64 0)
  %895 = icmp ne i64 %894, 0
  br i1 %895, label %896, label %902

896:                                              ; preds = %879
  %897 = load ptr, ptr %6, align 8, !tbaa !5
  %898 = getelementptr inbounds %struct.MDBX_cursor, ptr %897, i32 0, i32 5
  %899 = load ptr, ptr %898, align 8, !tbaa !11
  %900 = getelementptr inbounds %struct.MDBX_txn, ptr %899, i32 0, i32 9
  %901 = load ptr, ptr %900, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %901, ptr noundef @.str.53, ptr noundef @__func__.cursor_put, i32 noundef 847) #13
  unreachable

902:                                              ; preds = %879
  br label %903

903:                                              ; preds = %902
  br label %904

904:                                              ; preds = %903
  br label %905

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

906:                                              ; preds = %905
  br label %907

907:                                              ; preds = %906
  br label %908

908:                                              ; preds = %907, %799
  br label %909

909:                                              ; preds = %908, %798
  br label %922

910:                                              ; preds = %517
  %911 = load i32, ptr %17, align 4, !tbaa !9
  %912 = icmp ne i32 %911, -30798
  %913 = xor i1 %912, true
  %914 = xor i1 %913, true
  %915 = zext i1 %914 to i32
  %916 = sext i32 %915 to i64
  %917 = call i64 @llvm.expect.i64(i64 %916, i64 0)
  %918 = icmp ne i64 %917, 0
  br i1 %918, label %919, label %921

919:                                              ; preds = %910
  %920 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %920, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %923

921:                                              ; preds = %910
  br label %922

922:                                              ; preds = %921, %909
  store i32 0, ptr %13, align 4
  br label %923

923:                                              ; preds = %922, %919, %862, %794, %650, %620, %581, %504
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #11
  %924 = load i32, ptr %13, align 4
  switch i32 %924, label %4512 [
    i32 0, label %925
  ]

925:                                              ; preds = %923
  br label %926

926:                                              ; preds = %925, %418
  br label %927

927:                                              ; preds = %926, %417
  %928 = load ptr, ptr %6, align 8, !tbaa !5
  %929 = getelementptr inbounds %struct.MDBX_cursor, ptr %928, i32 0, i32 1
  %930 = getelementptr inbounds %struct.anon, ptr %929, i32 0, i32 0
  %931 = load i8, ptr %930, align 4, !tbaa !25
  %932 = sext i8 %931 to i32
  %933 = and i32 %932, -9
  %934 = trunc i32 %933 to i8
  store i8 %934, ptr %930, align 4, !tbaa !25
  %935 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %935, ptr %25, align 8, !tbaa !5
  store ptr null, ptr %26, align 8, !tbaa !5
  store i64 0, ptr %27, align 8, !tbaa !55
  %936 = load i32, ptr %9, align 4, !tbaa !9
  %937 = and i32 %936, 524288
  %938 = icmp ne i32 %937, 0
  %939 = xor i1 %938, true
  %940 = xor i1 %939, true
  %941 = zext i1 %940 to i32
  %942 = sext i32 %941 to i64
  %943 = call i64 @llvm.expect.i64(i64 %942, i64 0)
  %944 = icmp ne i64 %943, 0
  br i1 %944, label %945, label %967

945:                                              ; preds = %927
  %946 = load ptr, ptr %8, align 8, !tbaa !5
  %947 = getelementptr inbounds %struct.iovec, ptr %946, i64 1
  %948 = getelementptr inbounds %struct.iovec, ptr %947, i32 0, i32 1
  %949 = load i64, ptr %948, align 8, !tbaa !24
  store i64 %949, ptr %27, align 8, !tbaa !55
  %950 = load ptr, ptr %8, align 8, !tbaa !5
  %951 = getelementptr inbounds %struct.iovec, ptr %950, i64 1
  %952 = getelementptr inbounds %struct.iovec, ptr %951, i32 0, i32 1
  %953 = load i64, ptr %952, align 8, !tbaa !24
  %954 = icmp eq i64 %953, 0
  %955 = xor i1 %954, true
  %956 = xor i1 %955, true
  %957 = zext i1 %956 to i32
  %958 = sext i32 %957 to i64
  %959 = call i64 @llvm.expect.i64(i64 %958, i64 0)
  %960 = icmp ne i64 %959, 0
  br i1 %960, label %961, label %962

961:                                              ; preds = %945
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

962:                                              ; preds = %945
  %963 = load ptr, ptr %8, align 8, !tbaa !5
  %964 = getelementptr inbounds %struct.iovec, ptr %963, i64 1
  %965 = getelementptr inbounds %struct.iovec, ptr %964, i32 0, i32 1
  store ptr %965, ptr %26, align 8, !tbaa !5
  %966 = load ptr, ptr %26, align 8, !tbaa !5
  store i64 0, ptr %966, align 8, !tbaa !55
  br label %967

967:                                              ; preds = %962, %927
  %968 = load ptr, ptr %6, align 8, !tbaa !5
  %969 = load ptr, ptr %7, align 8, !tbaa !5
  %970 = load ptr, ptr %25, align 8, !tbaa !5
  %971 = call i32 @cursor_touch(ptr noundef %968, ptr noundef %969, ptr noundef %970) #14
  store i32 %971, ptr %10, align 4, !tbaa !9
  %972 = load i32, ptr %10, align 4, !tbaa !9
  %973 = icmp ne i32 %972, 0
  %974 = xor i1 %973, true
  %975 = xor i1 %974, true
  %976 = zext i1 %975 to i32
  %977 = sext i32 %976 to i64
  %978 = call i64 @llvm.expect.i64(i64 %977, i64 0)
  %979 = icmp ne i64 %978, 0
  br i1 %979, label %980, label %982

980:                                              ; preds = %967
  %981 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %981, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

982:                                              ; preds = %967
  %983 = load i32, ptr %17, align 4, !tbaa !9
  %984 = icmp eq i32 %983, -30377
  %985 = xor i1 %984, true
  %986 = xor i1 %985, true
  %987 = zext i1 %986 to i32
  %988 = sext i32 %987 to i64
  %989 = call i64 @llvm.expect.i64(i64 %988, i64 0)
  %990 = icmp ne i64 %989, 0
  br i1 %990, label %991, label %1354

991:                                              ; preds = %982
  br label %992

992:                                              ; preds = %991
  %993 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %994 = zext i8 %993 to i32
  %995 = icmp sle i32 5, %994
  %996 = xor i1 %995, true
  %997 = xor i1 %996, true
  %998 = zext i1 %997 to i32
  %999 = sext i32 %998 to i64
  %1000 = call i64 @llvm.expect.i64(i64 %999, i64 0)
  %1001 = icmp ne i64 %1000, 0
  br i1 %1001, label %1002, label %1003

1002:                                             ; preds = %992
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_put, i32 noundef 871, ptr noundef @.str.54, ptr noundef @.str.55)
  br label %1003

1003:                                             ; preds = %1002, %992
  br label %1004

1004:                                             ; preds = %1003
  br label %1005

1005:                                             ; preds = %1004
  call void @llvm.lifetime.start.p0(i64 16, ptr %28) #11
  %1006 = load ptr, ptr %6, align 8, !tbaa !5
  %1007 = call { ptr, i32 } @page_new(ptr noundef %1006, i32 noundef 2)
  %1008 = getelementptr inbounds { ptr, i32 }, ptr %28, i32 0, i32 0
  %1009 = extractvalue { ptr, i32 } %1007, 0
  store ptr %1009, ptr %1008, align 8
  %1010 = getelementptr inbounds { ptr, i32 }, ptr %28, i32 0, i32 1
  %1011 = extractvalue { ptr, i32 } %1007, 1
  store i32 %1011, ptr %1010, align 8
  %1012 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 1
  %1013 = load i32, ptr %1012, align 8, !tbaa !57
  %1014 = icmp ne i32 %1013, 0
  %1015 = xor i1 %1014, true
  %1016 = xor i1 %1015, true
  %1017 = zext i1 %1016 to i32
  %1018 = sext i32 %1017 to i64
  %1019 = call i64 @llvm.expect.i64(i64 %1018, i64 0)
  %1020 = icmp ne i64 %1019, 0
  br i1 %1020, label %1021, label %1024

1021:                                             ; preds = %1005
  %1022 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 1
  %1023 = load i32, ptr %1022, align 8, !tbaa !57
  store i32 %1023, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %1351

1024:                                             ; preds = %1005
  %1025 = load ptr, ptr %6, align 8, !tbaa !5
  %1026 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 0
  %1027 = load ptr, ptr %1026, align 8, !tbaa !59
  %1028 = call i32 @cursor_push(ptr noundef %1025, ptr noundef %1027, i16 noundef zeroext 0)
  %1029 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 1
  store i32 %1028, ptr %1029, align 8, !tbaa !57
  %1030 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 1
  %1031 = load i32, ptr %1030, align 8, !tbaa !57
  %1032 = icmp ne i32 %1031, 0
  %1033 = xor i1 %1032, true
  %1034 = xor i1 %1033, true
  %1035 = zext i1 %1034 to i32
  %1036 = sext i32 %1035 to i64
  %1037 = call i64 @llvm.expect.i64(i64 %1036, i64 0)
  %1038 = icmp ne i64 %1037, 0
  br i1 %1038, label %1039, label %1042

1039:                                             ; preds = %1024
  %1040 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 1
  %1041 = load i32, ptr %1040, align 8, !tbaa !57
  store i32 %1041, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %1351

1042:                                             ; preds = %1024
  %1043 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 0
  %1044 = load ptr, ptr %1043, align 8, !tbaa !59
  %1045 = getelementptr inbounds %struct.page, ptr %1044, i32 0, i32 4
  %1046 = load i32, ptr %1045, align 1, !tbaa !9
  %1047 = load ptr, ptr %6, align 8, !tbaa !5
  %1048 = getelementptr inbounds %struct.MDBX_cursor, ptr %1047, i32 0, i32 6
  %1049 = load ptr, ptr %1048, align 8, !tbaa !45
  %1050 = getelementptr inbounds %struct.tree, ptr %1049, i32 0, i32 3
  store i32 %1046, ptr %1050, align 4, !tbaa !60
  %1051 = load ptr, ptr %6, align 8, !tbaa !5
  %1052 = getelementptr inbounds %struct.MDBX_cursor, ptr %1051, i32 0, i32 6
  %1053 = load ptr, ptr %1052, align 8, !tbaa !45
  %1054 = getelementptr inbounds %struct.tree, ptr %1053, i32 0, i32 1
  %1055 = load i16, ptr %1054, align 2, !tbaa !46
  %1056 = add i16 %1055, 1
  store i16 %1056, ptr %1054, align 2, !tbaa !46
  %1057 = load ptr, ptr %6, align 8, !tbaa !5
  %1058 = getelementptr inbounds %struct.MDBX_cursor, ptr %1057, i32 0, i32 6
  %1059 = load ptr, ptr %1058, align 8, !tbaa !45
  %1060 = getelementptr inbounds %struct.tree, ptr %1059, i32 0, i32 0
  %1061 = load i16, ptr %1060, align 4, !tbaa !61
  %1062 = zext i16 %1061 to i32
  %1063 = and i32 %1062, 8
  %1064 = icmp ne i32 %1063, 0
  br i1 %1064, label %1065, label %1129

1065:                                             ; preds = %1042
  br label %1066

1066:                                             ; preds = %1065
  %1067 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1068 = zext i8 %1067 to i32
  %1069 = and i32 %1068, 1
  %1070 = icmp ne i32 %1069, 0
  %1071 = xor i1 %1070, true
  %1072 = xor i1 %1071, true
  %1073 = zext i1 %1072 to i32
  %1074 = sext i32 %1073 to i64
  %1075 = call i64 @llvm.expect.i64(i64 %1074, i64 1)
  %1076 = icmp ne i64 %1075, 0
  br i1 %1076, label %1077, label %1113

1077:                                             ; preds = %1066
  br label %1078

1078:                                             ; preds = %1077
  %1079 = load ptr, ptr %7, align 8, !tbaa !5
  %1080 = getelementptr inbounds %struct.iovec, ptr %1079, i32 0, i32 1
  %1081 = load i64, ptr %1080, align 8, !tbaa !24
  %1082 = load ptr, ptr %6, align 8, !tbaa !5
  %1083 = getelementptr inbounds %struct.MDBX_cursor, ptr %1082, i32 0, i32 7
  %1084 = load ptr, ptr %1083, align 8, !tbaa !26
  %1085 = getelementptr inbounds %struct.clc2, ptr %1084, i32 0, i32 0
  %1086 = getelementptr inbounds %struct.clc, ptr %1085, i32 0, i32 1
  %1087 = load i64, ptr %1086, align 8, !tbaa !62
  %1088 = icmp uge i64 %1081, %1087
  br i1 %1088, label %1089, label %1100

1089:                                             ; preds = %1078
  %1090 = load ptr, ptr %7, align 8, !tbaa !5
  %1091 = getelementptr inbounds %struct.iovec, ptr %1090, i32 0, i32 1
  %1092 = load i64, ptr %1091, align 8, !tbaa !24
  %1093 = load ptr, ptr %6, align 8, !tbaa !5
  %1094 = getelementptr inbounds %struct.MDBX_cursor, ptr %1093, i32 0, i32 7
  %1095 = load ptr, ptr %1094, align 8, !tbaa !26
  %1096 = getelementptr inbounds %struct.clc2, ptr %1095, i32 0, i32 0
  %1097 = getelementptr inbounds %struct.clc, ptr %1096, i32 0, i32 2
  %1098 = load i64, ptr %1097, align 8, !tbaa !63
  %1099 = icmp ule i64 %1092, %1098
  br label %1100

1100:                                             ; preds = %1089, %1078
  %1101 = phi i1 [ false, %1078 ], [ %1099, %1089 ]
  %1102 = xor i1 %1101, true
  %1103 = xor i1 %1102, true
  %1104 = xor i1 %1103, true
  %1105 = zext i1 %1104 to i32
  %1106 = sext i32 %1105 to i64
  %1107 = call i64 @llvm.expect.i64(i64 %1106, i64 0)
  %1108 = icmp ne i64 %1107, 0
  br i1 %1108, label %1109, label %1110

1109:                                             ; preds = %1100
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.56, ptr noundef @__func__.cursor_put, i32 noundef 881) #13
  unreachable

1110:                                             ; preds = %1100
  br label %1111

1111:                                             ; preds = %1110
  br label %1112

1112:                                             ; preds = %1111
  br label %1113

1113:                                             ; preds = %1112, %1066
  br label %1114

1114:                                             ; preds = %1113
  br label %1115

1115:                                             ; preds = %1114
  %1116 = load ptr, ptr %7, align 8, !tbaa !5
  %1117 = getelementptr inbounds %struct.iovec, ptr %1116, i32 0, i32 1
  %1118 = load i64, ptr %1117, align 8, !tbaa !24
  %1119 = load ptr, ptr %6, align 8, !tbaa !5
  %1120 = getelementptr inbounds %struct.MDBX_cursor, ptr %1119, i32 0, i32 7
  %1121 = load ptr, ptr %1120, align 8, !tbaa !26
  %1122 = getelementptr inbounds %struct.clc2, ptr %1121, i32 0, i32 0
  %1123 = getelementptr inbounds %struct.clc, ptr %1122, i32 0, i32 2
  store i64 %1118, ptr %1123, align 8, !tbaa !63
  %1124 = load ptr, ptr %6, align 8, !tbaa !5
  %1125 = getelementptr inbounds %struct.MDBX_cursor, ptr %1124, i32 0, i32 7
  %1126 = load ptr, ptr %1125, align 8, !tbaa !26
  %1127 = getelementptr inbounds %struct.clc2, ptr %1126, i32 0, i32 0
  %1128 = getelementptr inbounds %struct.clc, ptr %1127, i32 0, i32 1
  store i64 %1118, ptr %1128, align 8, !tbaa !62
  br label %1129

1129:                                             ; preds = %1115, %1042
  %1130 = load ptr, ptr %6, align 8, !tbaa !5
  %1131 = getelementptr inbounds %struct.MDBX_cursor, ptr %1130, i32 0, i32 6
  %1132 = load ptr, ptr %1131, align 8, !tbaa !45
  %1133 = getelementptr inbounds %struct.tree, ptr %1132, i32 0, i32 0
  %1134 = load i16, ptr %1133, align 4, !tbaa !61
  %1135 = zext i16 %1134 to i32
  %1136 = and i32 %1135, 48
  %1137 = icmp ne i32 %1136, 0
  br i1 %1137, label %1138, label %1350

1138:                                             ; preds = %1129
  br label %1139

1139:                                             ; preds = %1138
  %1140 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1141 = zext i8 %1140 to i32
  %1142 = and i32 %1141, 1
  %1143 = icmp ne i32 %1142, 0
  %1144 = xor i1 %1143, true
  %1145 = xor i1 %1144, true
  %1146 = zext i1 %1145 to i32
  %1147 = sext i32 %1146 to i64
  %1148 = call i64 @llvm.expect.i64(i64 %1147, i64 1)
  %1149 = icmp ne i64 %1148, 0
  br i1 %1149, label %1150, label %1186

1150:                                             ; preds = %1139
  br label %1151

1151:                                             ; preds = %1150
  %1152 = load ptr, ptr %8, align 8, !tbaa !5
  %1153 = getelementptr inbounds %struct.iovec, ptr %1152, i32 0, i32 1
  %1154 = load i64, ptr %1153, align 8, !tbaa !24
  %1155 = load ptr, ptr %6, align 8, !tbaa !5
  %1156 = getelementptr inbounds %struct.MDBX_cursor, ptr %1155, i32 0, i32 7
  %1157 = load ptr, ptr %1156, align 8, !tbaa !26
  %1158 = getelementptr inbounds %struct.clc2, ptr %1157, i32 0, i32 1
  %1159 = getelementptr inbounds %struct.clc, ptr %1158, i32 0, i32 1
  %1160 = load i64, ptr %1159, align 8, !tbaa !64
  %1161 = icmp uge i64 %1154, %1160
  br i1 %1161, label %1162, label %1173

1162:                                             ; preds = %1151
  %1163 = load ptr, ptr %8, align 8, !tbaa !5
  %1164 = getelementptr inbounds %struct.iovec, ptr %1163, i32 0, i32 1
  %1165 = load i64, ptr %1164, align 8, !tbaa !24
  %1166 = load ptr, ptr %6, align 8, !tbaa !5
  %1167 = getelementptr inbounds %struct.MDBX_cursor, ptr %1166, i32 0, i32 7
  %1168 = load ptr, ptr %1167, align 8, !tbaa !26
  %1169 = getelementptr inbounds %struct.clc2, ptr %1168, i32 0, i32 1
  %1170 = getelementptr inbounds %struct.clc, ptr %1169, i32 0, i32 2
  %1171 = load i64, ptr %1170, align 8, !tbaa !65
  %1172 = icmp ule i64 %1165, %1171
  br label %1173

1173:                                             ; preds = %1162, %1151
  %1174 = phi i1 [ false, %1151 ], [ %1172, %1162 ]
  %1175 = xor i1 %1174, true
  %1176 = xor i1 %1175, true
  %1177 = xor i1 %1176, true
  %1178 = zext i1 %1177 to i32
  %1179 = sext i32 %1178 to i64
  %1180 = call i64 @llvm.expect.i64(i64 %1179, i64 0)
  %1181 = icmp ne i64 %1180, 0
  br i1 %1181, label %1182, label %1183

1182:                                             ; preds = %1173
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.57, ptr noundef @__func__.cursor_put, i32 noundef 885) #13
  unreachable

1183:                                             ; preds = %1173
  br label %1184

1184:                                             ; preds = %1183
  br label %1185

1185:                                             ; preds = %1184
  br label %1186

1186:                                             ; preds = %1185, %1139
  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 !32
  %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 %1217

1200:                                             ; preds = %1189
  br label %1201

1201:                                             ; preds = %1200
  %1202 = load ptr, ptr %6, align 8, !tbaa !5
  %1203 = getelementptr inbounds %struct.MDBX_cursor, ptr %1202, i32 0, i32 8
  %1204 = load ptr, ptr %1203, align 8, !tbaa !30
  %1205 = icmp ne ptr %1204, null
  %1206 = xor i1 %1205, true
  %1207 = xor i1 %1206, true
  %1208 = xor i1 %1207, true
  %1209 = zext i1 %1208 to i32
  %1210 = sext i32 %1209 to i64
  %1211 = call i64 @llvm.expect.i64(i64 %1210, i64 0)
  %1212 = icmp ne i64 %1211, 0
  br i1 %1212, label %1213, label %1214

1213:                                             ; preds = %1201
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.58, ptr noundef @__func__.cursor_put, i32 noundef 886) #13
  unreachable

1214:                                             ; preds = %1201
  br label %1215

1215:                                             ; preds = %1214
  br label %1216

1216:                                             ; preds = %1215
  br label %1217

1217:                                             ; preds = %1216, %1189
  br label %1218

1218:                                             ; preds = %1217
  br label %1219

1219:                                             ; preds = %1218
  %1220 = load ptr, ptr %8, align 8, !tbaa !5
  %1221 = getelementptr inbounds %struct.iovec, ptr %1220, i32 0, i32 1
  %1222 = load i64, ptr %1221, align 8, !tbaa !24
  %1223 = load ptr, ptr %6, align 8, !tbaa !5
  %1224 = getelementptr inbounds %struct.MDBX_cursor, ptr %1223, i32 0, i32 7
  %1225 = load ptr, ptr %1224, align 8, !tbaa !26
  %1226 = getelementptr inbounds %struct.clc2, ptr %1225, i32 0, i32 1
  %1227 = getelementptr inbounds %struct.clc, ptr %1226, i32 0, i32 2
  store i64 %1222, ptr %1227, align 8, !tbaa !65
  %1228 = load ptr, ptr %6, align 8, !tbaa !5
  %1229 = getelementptr inbounds %struct.MDBX_cursor, ptr %1228, i32 0, i32 7
  %1230 = load ptr, ptr %1229, align 8, !tbaa !26
  %1231 = getelementptr inbounds %struct.clc2, ptr %1230, i32 0, i32 1
  %1232 = getelementptr inbounds %struct.clc, ptr %1231, i32 0, i32 1
  store i64 %1222, ptr %1232, align 8, !tbaa !64
  %1233 = trunc i64 %1222 to i32
  %1234 = load ptr, ptr %6, align 8, !tbaa !5
  %1235 = getelementptr inbounds %struct.MDBX_cursor, ptr %1234, i32 0, i32 6
  %1236 = load ptr, ptr %1235, align 8, !tbaa !45
  %1237 = getelementptr inbounds %struct.tree, ptr %1236, i32 0, i32 2
  store i32 %1233, ptr %1237, align 4, !tbaa !66
  br label %1238

1238:                                             ; preds = %1219
  %1239 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1240 = zext i8 %1239 to i32
  %1241 = and i32 %1240, 1
  %1242 = icmp ne i32 %1241, 0
  %1243 = xor i1 %1242, true
  %1244 = xor i1 %1243, true
  %1245 = zext i1 %1244 to i32
  %1246 = sext i32 %1245 to i64
  %1247 = call i64 @llvm.expect.i64(i64 %1246, i64 1)
  %1248 = icmp ne i64 %1247, 0
  br i1 %1248, label %1249, label %1283

1249:                                             ; preds = %1238
  br label %1250

1250:                                             ; preds = %1249
  %1251 = load ptr, ptr %6, align 8, !tbaa !5
  %1252 = getelementptr inbounds %struct.MDBX_cursor, ptr %1251, i32 0, i32 7
  %1253 = load ptr, ptr %1252, align 8, !tbaa !26
  %1254 = getelementptr inbounds %struct.clc2, ptr %1253, i32 0, i32 1
  %1255 = getelementptr inbounds %struct.clc, ptr %1254, i32 0, i32 1
  %1256 = load i64, ptr %1255, align 8, !tbaa !64
  %1257 = load ptr, ptr %6, align 8, !tbaa !5
  %1258 = getelementptr inbounds %struct.MDBX_cursor, ptr %1257, i32 0, i32 8
  %1259 = load ptr, ptr %1258, align 8, !tbaa !30
  %1260 = getelementptr inbounds %struct.inner_cursor, ptr %1259, i32 0, i32 0
  %1261 = getelementptr inbounds %struct.MDBX_cursor, ptr %1260, i32 0, i32 7
  %1262 = load ptr, ptr %1261, align 8, !tbaa !67
  %1263 = getelementptr inbounds %struct.clc2, ptr %1262, i32 0, i32 0
  %1264 = getelementptr inbounds %struct.clc, ptr %1263, i32 0, i32 1
  %1265 = load i64, ptr %1264, align 8, !tbaa !62
  %1266 = icmp eq i64 %1256, %1265
  %1267 = xor i1 %1266, true
  %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 %1280

1274:                                             ; preds = %1250
  %1275 = load ptr, ptr %6, align 8, !tbaa !5
  %1276 = getelementptr inbounds %struct.MDBX_cursor, ptr %1275, i32 0, i32 5
  %1277 = load ptr, ptr %1276, align 8, !tbaa !11
  %1278 = getelementptr inbounds %struct.MDBX_txn, ptr %1277, i32 0, i32 9
  %1279 = load ptr, ptr %1278, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %1279, ptr noundef @.str.59, ptr noundef @__func__.cursor_put, i32 noundef 889) #13
  unreachable

1280:                                             ; preds = %1250
  br label %1281

1281:                                             ; preds = %1280
  br label %1282

1282:                                             ; preds = %1281
  br label %1283

1283:                                             ; preds = %1282, %1238
  br label %1284

1284:                                             ; preds = %1283
  br label %1285

1285:                                             ; preds = %1284
  br label %1286

1286:                                             ; preds = %1285
  %1287 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1288 = zext i8 %1287 to i32
  %1289 = and i32 %1288, 1
  %1290 = icmp ne i32 %1289, 0
  %1291 = xor i1 %1290, true
  %1292 = xor i1 %1291, true
  %1293 = zext i1 %1292 to i32
  %1294 = sext i32 %1293 to i64
  %1295 = call i64 @llvm.expect.i64(i64 %1294, i64 1)
  %1296 = icmp ne i64 %1295, 0
  br i1 %1296, label %1297, label %1331

1297:                                             ; preds = %1286
  br label %1298

1298:                                             ; preds = %1297
  %1299 = load ptr, ptr %6, align 8, !tbaa !5
  %1300 = getelementptr inbounds %struct.MDBX_cursor, ptr %1299, i32 0, i32 7
  %1301 = load ptr, ptr %1300, align 8, !tbaa !26
  %1302 = getelementptr inbounds %struct.clc2, ptr %1301, i32 0, i32 1
  %1303 = getelementptr inbounds %struct.clc, ptr %1302, i32 0, i32 2
  %1304 = load i64, ptr %1303, align 8, !tbaa !65
  %1305 = load ptr, ptr %6, align 8, !tbaa !5
  %1306 = getelementptr inbounds %struct.MDBX_cursor, ptr %1305, i32 0, i32 8
  %1307 = load ptr, ptr %1306, align 8, !tbaa !30
  %1308 = getelementptr inbounds %struct.inner_cursor, ptr %1307, i32 0, i32 0
  %1309 = getelementptr inbounds %struct.MDBX_cursor, ptr %1308, i32 0, i32 7
  %1310 = load ptr, ptr %1309, align 8, !tbaa !67
  %1311 = getelementptr inbounds %struct.clc2, ptr %1310, i32 0, i32 0
  %1312 = getelementptr inbounds %struct.clc, ptr %1311, i32 0, i32 2
  %1313 = load i64, ptr %1312, align 8, !tbaa !63
  %1314 = icmp eq i64 %1304, %1313
  %1315 = xor i1 %1314, true
  %1316 = xor i1 %1315, true
  %1317 = xor i1 %1316, true
  %1318 = zext i1 %1317 to i32
  %1319 = sext i32 %1318 to i64
  %1320 = call i64 @llvm.expect.i64(i64 %1319, i64 0)
  %1321 = icmp ne i64 %1320, 0
  br i1 %1321, label %1322, label %1328

1322:                                             ; preds = %1298
  %1323 = load ptr, ptr %6, align 8, !tbaa !5
  %1324 = getelementptr inbounds %struct.MDBX_cursor, ptr %1323, i32 0, i32 5
  %1325 = load ptr, ptr %1324, align 8, !tbaa !11
  %1326 = getelementptr inbounds %struct.MDBX_txn, ptr %1325, i32 0, i32 9
  %1327 = load ptr, ptr %1326, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %1327, ptr noundef @.str.60, ptr noundef @__func__.cursor_put, i32 noundef 890) #13
  unreachable

1328:                                             ; preds = %1298
  br label %1329

1329:                                             ; preds = %1328
  br label %1330

1330:                                             ; preds = %1329
  br label %1331

1331:                                             ; preds = %1330, %1286
  br label %1332

1332:                                             ; preds = %1331
  br label %1333

1333:                                             ; preds = %1332
  %1334 = load ptr, ptr %6, align 8, !tbaa !5
  %1335 = getelementptr inbounds %struct.MDBX_cursor, ptr %1334, i32 0, i32 1
  %1336 = getelementptr inbounds %struct.anon, ptr %1335, i32 0, i32 0
  %1337 = load i8, ptr %1336, align 4, !tbaa !25
  %1338 = sext i8 %1337 to i32
  %1339 = and i32 %1338, 1
  %1340 = icmp ne i32 %1339, 0
  br i1 %1340, label %1341, label %1349

1341:                                             ; preds = %1333
  %1342 = getelementptr inbounds %struct.page_get_result, ptr %28, i32 0, i32 0
  %1343 = load ptr, ptr %1342, align 8, !tbaa !59
  %1344 = getelementptr inbounds %struct.page, ptr %1343, i32 0, i32 2
  %1345 = load i16, ptr %1344, align 1, !tbaa !31
  %1346 = zext i16 %1345 to i32
  %1347 = or i32 %1346, 32
  %1348 = trunc i32 %1347 to i16
  store i16 %1348, ptr %1344, align 1, !tbaa !31
  br label %1349

1349:                                             ; preds = %1341, %1333
  br label %1350

1350:                                             ; preds = %1349, %1129
  store i32 0, ptr %13, align 4
  br label %1351

1351:                                             ; preds = %1350, %1039, %1021
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #11
  %1352 = load i32, ptr %13, align 4
  switch i32 %1352, label %4512 [
    i32 0, label %1353
  ]

1353:                                             ; preds = %1351
  br label %1354

1354:                                             ; preds = %1353, %982
  store ptr null, ptr %32, align 8, !tbaa !5
  store i16 2, ptr %35, align 2, !tbaa !31
  %1355 = load ptr, ptr %12, align 8, !tbaa !5
  %1356 = getelementptr inbounds %struct.MDBX_env, ptr %1355, i32 0, i32 23
  %1357 = load ptr, ptr %1356, align 8, !tbaa !68
  store ptr %1357, ptr %36, align 8, !tbaa !5
  %1358 = load ptr, ptr %6, align 8, !tbaa !5
  %1359 = getelementptr inbounds %struct.MDBX_cursor, ptr %1358, i32 0, i32 5
  %1360 = load ptr, ptr %1359, align 8, !tbaa !11
  %1361 = getelementptr inbounds %struct.MDBX_txn, ptr %1360, i32 0, i32 8
  %1362 = load i64, ptr %1361, align 8, !tbaa !69
  %1363 = load ptr, ptr %36, align 8, !tbaa !5
  %1364 = getelementptr inbounds %struct.page, ptr %1363, i32 0, i32 0
  store i64 %1362, ptr %1364, align 1, !tbaa !55
  %1365 = load i32, ptr %17, align 4, !tbaa !9
  %1366 = icmp ne i32 %1365, 0
  %1367 = zext i1 %1366 to i8
  store i8 %1367, ptr %34, align 1, !tbaa !47
  %1368 = zext i1 %1366 to i8
  store i8 %1368, ptr %33, align 1, !tbaa !47
  %1369 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 0
  store ptr null, ptr %1369, align 8, !tbaa !22
  %1370 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 1
  store i64 0, ptr %1370, align 8, !tbaa !24
  %1371 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %1372 = trunc i8 %1371 to i1
  br i1 %1372, label %1373, label %1446

1373:                                             ; preds = %1354
  br label %1374

1374:                                             ; preds = %1373
  %1375 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %1376 = zext i8 %1375 to i32
  %1377 = icmp sle i32 5, %1376
  %1378 = xor i1 %1377, true
  %1379 = xor i1 %1378, true
  %1380 = zext i1 %1379 to i32
  %1381 = sext i32 %1380 to i64
  %1382 = call i64 @llvm.expect.i64(i64 %1381, i64 0)
  %1383 = icmp ne i64 %1382, 0
  br i1 %1383, label %1384, label %1395

1384:                                             ; preds = %1374
  %1385 = load ptr, ptr %6, align 8, !tbaa !5
  %1386 = getelementptr inbounds %struct.MDBX_cursor, ptr %1385, i32 0, i32 10
  %1387 = load ptr, ptr %6, align 8, !tbaa !5
  %1388 = getelementptr inbounds %struct.MDBX_cursor, ptr %1387, i32 0, i32 1
  %1389 = getelementptr inbounds %struct.anon, ptr %1388, i32 0, i32 1
  %1390 = load i8, ptr %1389, align 1, !tbaa !25
  %1391 = sext i8 %1390 to i64
  %1392 = getelementptr inbounds [32 x i16], ptr %1386, i64 0, i64 %1391
  %1393 = load i16, ptr %1392, align 2, !tbaa !31
  %1394 = zext i16 %1393 to i32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_put, i32 noundef 908, ptr noundef @.str.61, i32 noundef %1394)
  br label %1395

1395:                                             ; preds = %1384, %1374
  br label %1396

1396:                                             ; preds = %1395
  br label %1397

1397:                                             ; preds = %1396
  %1398 = load ptr, ptr %6, align 8, !tbaa !5
  %1399 = getelementptr inbounds %struct.MDBX_cursor, ptr %1398, i32 0, i32 6
  %1400 = load ptr, ptr %1399, align 8, !tbaa !45
  %1401 = getelementptr inbounds %struct.tree, ptr %1400, i32 0, i32 0
  %1402 = load i16, ptr %1401, align 4, !tbaa !61
  %1403 = zext i16 %1402 to i32
  %1404 = and i32 %1403, 4
  %1405 = icmp ne i32 %1404, 0
  br i1 %1405, label %1406, label %1445

1406:                                             ; preds = %1397
  %1407 = load ptr, ptr %6, align 8, !tbaa !5
  call void @inner_gone(ptr noundef %1407)
  %1408 = load ptr, ptr %7, align 8, !tbaa !5
  %1409 = load ptr, ptr %8, align 8, !tbaa !5
  %1410 = call i64 @node_size(ptr noundef %1408, ptr noundef %1409) #12
  %1411 = load ptr, ptr %12, align 8, !tbaa !5
  %1412 = getelementptr inbounds %struct.MDBX_env, ptr %1411, i32 0, i32 8
  %1413 = load i16, ptr %1412, align 8, !tbaa !36
  %1414 = zext i16 %1413 to i64
  %1415 = icmp ugt i64 %1410, %1414
  br i1 %1415, label %1416, label %1444

1416:                                             ; preds = %1406
  %1417 = load ptr, ptr %6, align 8, !tbaa !5
  %1418 = getelementptr inbounds %struct.MDBX_cursor, ptr %1417, i32 0, i32 6
  %1419 = load ptr, ptr %1418, align 8, !tbaa !45
  %1420 = getelementptr inbounds %struct.tree, ptr %1419, i32 0, i32 0
  %1421 = load i16, ptr %1420, align 4, !tbaa !61
  %1422 = zext i16 %1421 to i32
  %1423 = and i32 %1422, 16
  %1424 = icmp ne i32 %1423, 0
  br i1 %1424, label %1425, label %1431

1425:                                             ; preds = %1416
  %1426 = load ptr, ptr %8, align 8, !tbaa !5
  %1427 = getelementptr inbounds %struct.iovec, ptr %1426, i32 0, i32 1
  %1428 = load i64, ptr %1427, align 8, !tbaa !24
  %1429 = trunc i64 %1428 to i16
  %1430 = zext i16 %1429 to i32
  br label %1432

1431:                                             ; preds = %1416
  br label %1432

1432:                                             ; preds = %1431, %1425
  %1433 = phi i32 [ %1430, %1425 ], [ 0, %1431 ]
  %1434 = trunc i32 %1433 to i16
  %1435 = load ptr, ptr %36, align 8, !tbaa !5
  %1436 = getelementptr inbounds %struct.page, ptr %1435, i32 0, i32 1
  store i16 %1434, ptr %1436, align 1, !tbaa !31
  %1437 = load ptr, ptr %36, align 8, !tbaa !5
  %1438 = getelementptr inbounds %struct.page, ptr %1437, i32 0, i32 3
  %1439 = getelementptr inbounds %struct.anon.19, ptr %1438, i32 0, i32 1
  store i16 0, ptr %1439, align 1, !tbaa !25
  %1440 = load ptr, ptr %36, align 8, !tbaa !5
  %1441 = getelementptr inbounds %struct.page, ptr %1440, i32 0, i32 3
  %1442 = getelementptr inbounds %struct.anon.19, ptr %1441, i32 0, i32 0
  store i16 0, ptr %1442, align 1, !tbaa !25
  %1443 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  store i64 20, ptr %1443, align 8, !tbaa !24
  br label %2740

1444:                                             ; preds = %1406
  br label %1445

1445:                                             ; preds = %1444, %1397
  br label %3589

1446:                                             ; preds = %1354
  %1447 = load ptr, ptr %6, align 8, !tbaa !5
  %1448 = getelementptr inbounds %struct.MDBX_cursor, ptr %1447, i32 0, i32 9
  %1449 = load ptr, ptr %6, align 8, !tbaa !5
  %1450 = getelementptr inbounds %struct.MDBX_cursor, ptr %1449, i32 0, i32 1
  %1451 = getelementptr inbounds %struct.anon, ptr %1450, i32 0, i32 1
  %1452 = load i8, ptr %1451, align 1, !tbaa !25
  %1453 = sext i8 %1452 to i64
  %1454 = getelementptr inbounds [32 x ptr], ptr %1448, i64 0, i64 %1453
  %1455 = load ptr, ptr %1454, align 8, !tbaa !5
  %1456 = call zeroext i1 @is_dupfix_leaf(ptr noundef %1455) #12
  br i1 %1456, label %1457, label %1662

1457:                                             ; preds = %1446
  %1458 = load ptr, ptr %6, align 8, !tbaa !5
  %1459 = getelementptr inbounds %struct.MDBX_cursor, ptr %1458, i32 0, i32 6
  %1460 = load ptr, ptr %1459, align 8, !tbaa !45
  %1461 = getelementptr inbounds %struct.tree, ptr %1460, i32 0, i32 2
  %1462 = load i32, ptr %1461, align 4, !tbaa !66
  %1463 = zext i32 %1462 to i64
  store i64 %1463, ptr %37, align 8, !tbaa !55
  %1464 = load ptr, ptr %7, align 8, !tbaa !5
  %1465 = getelementptr inbounds %struct.iovec, ptr %1464, i32 0, i32 1
  %1466 = load i64, ptr %1465, align 8, !tbaa !24
  %1467 = load i64, ptr %37, align 8, !tbaa !55
  %1468 = icmp ne i64 %1466, %1467
  %1469 = xor i1 %1468, true
  %1470 = xor i1 %1469, true
  %1471 = zext i1 %1470 to i32
  %1472 = sext i32 %1471 to i64
  %1473 = call i64 @llvm.expect.i64(i64 %1472, i64 0)
  %1474 = icmp ne i64 %1473, 0
  br i1 %1474, label %1475, label %1476

1475:                                             ; preds = %1457
  store i32 -30781, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

1476:                                             ; preds = %1457
  %1477 = load ptr, ptr %6, align 8, !tbaa !5
  %1478 = getelementptr inbounds %struct.MDBX_cursor, ptr %1477, i32 0, i32 9
  %1479 = load ptr, ptr %6, align 8, !tbaa !5
  %1480 = getelementptr inbounds %struct.MDBX_cursor, ptr %1479, i32 0, i32 1
  %1481 = getelementptr inbounds %struct.anon, ptr %1480, i32 0, i32 1
  %1482 = load i8, ptr %1481, align 1, !tbaa !25
  %1483 = sext i8 %1482 to i64
  %1484 = getelementptr inbounds [32 x ptr], ptr %1478, i64 0, i64 %1483
  %1485 = load ptr, ptr %1484, align 8, !tbaa !5
  %1486 = load ptr, ptr %6, align 8, !tbaa !5
  %1487 = getelementptr inbounds %struct.MDBX_cursor, ptr %1486, i32 0, i32 10
  %1488 = load ptr, ptr %6, align 8, !tbaa !5
  %1489 = getelementptr inbounds %struct.MDBX_cursor, ptr %1488, i32 0, i32 1
  %1490 = getelementptr inbounds %struct.anon, ptr %1489, i32 0, i32 1
  %1491 = load i8, ptr %1490, align 1, !tbaa !25
  %1492 = sext i8 %1491 to i64
  %1493 = getelementptr inbounds [32 x i16], ptr %1487, i64 0, i64 %1492
  %1494 = load i16, ptr %1493, align 2, !tbaa !31
  %1495 = zext i16 %1494 to i64
  %1496 = load i64, ptr %37, align 8, !tbaa !55
  %1497 = call ptr @page_dupfix_ptr(ptr noundef %1485, i64 noundef %1495, i64 noundef %1496) #12
  store ptr %1497, ptr %38, align 8, !tbaa !5
  %1498 = load ptr, ptr %38, align 8, !tbaa !5
  %1499 = load ptr, ptr %7, align 8, !tbaa !5
  %1500 = getelementptr inbounds %struct.iovec, ptr %1499, i32 0, i32 0
  %1501 = load ptr, ptr %1500, align 8, !tbaa !22
  %1502 = load i64, ptr %37, align 8, !tbaa !55
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %1498, ptr align 1 %1501, i64 %1502, i1 false)
  br label %1503

1503:                                             ; preds = %3558, %1476
  %1504 = load ptr, ptr %6, align 8, !tbaa !5
  %1505 = getelementptr inbounds %struct.MDBX_cursor, ptr %1504, i32 0, i32 1
  %1506 = getelementptr inbounds %struct.anon, ptr %1505, i32 0, i32 1
  %1507 = load i8, ptr %1506, align 1, !tbaa !25
  %1508 = sext i8 %1507 to i32
  %1509 = icmp ne i32 %1508, 0
  br i1 %1509, label %1510, label %1636

1510:                                             ; preds = %1503
  %1511 = load ptr, ptr %6, align 8, !tbaa !5
  %1512 = getelementptr inbounds %struct.MDBX_cursor, ptr %1511, i32 0, i32 10
  %1513 = load ptr, ptr %6, align 8, !tbaa !5
  %1514 = getelementptr inbounds %struct.MDBX_cursor, ptr %1513, i32 0, i32 1
  %1515 = getelementptr inbounds %struct.anon, ptr %1514, i32 0, i32 1
  %1516 = load i8, ptr %1515, align 1, !tbaa !25
  %1517 = sext i8 %1516 to i64
  %1518 = getelementptr inbounds [32 x i16], ptr %1512, i64 0, i64 %1517
  %1519 = load i16, ptr %1518, align 2, !tbaa !31
  %1520 = icmp ne i16 %1519, 0
  br i1 %1520, label %1636, label %1521

1521:                                             ; preds = %1510
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #11
  store i64 1, ptr %39, align 8, !tbaa !55
  %1522 = load ptr, ptr %6, align 8, !tbaa !5
  %1523 = getelementptr inbounds %struct.MDBX_cursor, ptr %1522, i32 0, i32 1
  %1524 = getelementptr inbounds %struct.anon, ptr %1523, i32 0, i32 1
  %1525 = load i8, ptr %1524, align 1, !tbaa !25
  %1526 = add i8 %1525, -1
  store i8 %1526, ptr %1524, align 1, !tbaa !25
  br label %1527

1527:                                             ; preds = %1548, %1521
  %1528 = load ptr, ptr %6, align 8, !tbaa !5
  %1529 = getelementptr inbounds %struct.MDBX_cursor, ptr %1528, i32 0, i32 1
  %1530 = getelementptr inbounds %struct.anon, ptr %1529, i32 0, i32 1
  %1531 = load i8, ptr %1530, align 1, !tbaa !25
  %1532 = sext i8 %1531 to i32
  %1533 = icmp ne i32 %1532, 0
  br i1 %1533, label %1534, label %1546

1534:                                             ; preds = %1527
  %1535 = load ptr, ptr %6, align 8, !tbaa !5
  %1536 = getelementptr inbounds %struct.MDBX_cursor, ptr %1535, i32 0, i32 10
  %1537 = load ptr, ptr %6, align 8, !tbaa !5
  %1538 = getelementptr inbounds %struct.MDBX_cursor, ptr %1537, i32 0, i32 1
  %1539 = getelementptr inbounds %struct.anon, ptr %1538, i32 0, i32 1
  %1540 = load i8, ptr %1539, align 1, !tbaa !25
  %1541 = sext i8 %1540 to i64
  %1542 = getelementptr inbounds [32 x i16], ptr %1536, i64 0, i64 %1541
  %1543 = load i16, ptr %1542, align 2, !tbaa !31
  %1544 = icmp ne i16 %1543, 0
  %1545 = xor i1 %1544, true
  br label %1546

1546:                                             ; preds = %1534, %1527
  %1547 = phi i1 [ false, %1527 ], [ %1545, %1534 ]
  br i1 %1547, label %1548, label %1556

1548:                                             ; preds = %1546
  %1549 = load ptr, ptr %6, align 8, !tbaa !5
  %1550 = getelementptr inbounds %struct.MDBX_cursor, ptr %1549, i32 0, i32 1
  %1551 = getelementptr inbounds %struct.anon, ptr %1550, i32 0, i32 1
  %1552 = load i8, ptr %1551, align 1, !tbaa !25
  %1553 = add i8 %1552, -1
  store i8 %1553, ptr %1551, align 1, !tbaa !25
  %1554 = load i64, ptr %39, align 8, !tbaa !55
  %1555 = add i64 %1554, 1
  store i64 %1555, ptr %39, align 8, !tbaa !55
  br label %1527, !llvm.loop !70

1556:                                             ; preds = %1546
  store i32 0, ptr %10, align 4, !tbaa !9
  %1557 = load ptr, ptr %6, align 8, !tbaa !5
  %1558 = getelementptr inbounds %struct.MDBX_cursor, ptr %1557, i32 0, i32 10
  %1559 = load ptr, ptr %6, align 8, !tbaa !5
  %1560 = getelementptr inbounds %struct.MDBX_cursor, ptr %1559, i32 0, i32 1
  %1561 = getelementptr inbounds %struct.anon, ptr %1560, i32 0, i32 1
  %1562 = load i8, ptr %1561, align 1, !tbaa !25
  %1563 = sext i8 %1562 to i64
  %1564 = getelementptr inbounds [32 x i16], ptr %1558, i64 0, i64 %1563
  %1565 = load i16, ptr %1564, align 2, !tbaa !31
  %1566 = icmp ne i16 %1565, 0
  br i1 %1566, label %1567, label %1571

1567:                                             ; preds = %1556
  %1568 = load ptr, ptr %6, align 8, !tbaa !5
  %1569 = load ptr, ptr %7, align 8, !tbaa !5
  %1570 = call i32 @tree_propagate_key(ptr noundef %1568, ptr noundef %1569)
  store i32 %1570, ptr %10, align 4, !tbaa !9
  br label %1571

1571:                                             ; preds = %1567, %1556
  br label %1572

1572:                                             ; preds = %1571
  %1573 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1574 = zext i8 %1573 to i32
  %1575 = and i32 %1574, 1
  %1576 = icmp ne i32 %1575, 0
  %1577 = xor i1 %1576, true
  %1578 = xor i1 %1577, true
  %1579 = zext i1 %1578 to i32
  %1580 = sext i32 %1579 to i64
  %1581 = call i64 @llvm.expect.i64(i64 %1580, i64 1)
  %1582 = icmp ne i64 %1581, 0
  br i1 %1582, label %1583, label %1609

1583:                                             ; preds = %1572
  br label %1584

1584:                                             ; preds = %1583
  %1585 = load ptr, ptr %6, align 8, !tbaa !5
  %1586 = getelementptr inbounds %struct.MDBX_cursor, ptr %1585, i32 0, i32 1
  %1587 = getelementptr inbounds %struct.anon, ptr %1586, i32 0, i32 1
  %1588 = load i8, ptr %1587, align 1, !tbaa !25
  %1589 = sext i8 %1588 to i64
  %1590 = load i64, ptr %39, align 8, !tbaa !55
  %1591 = add i64 %1589, %1590
  %1592 = icmp ult i64 %1591, 65535
  %1593 = xor i1 %1592, true
  %1594 = xor i1 %1593, true
  %1595 = xor i1 %1594, true
  %1596 = zext i1 %1595 to i32
  %1597 = sext i32 %1596 to i64
  %1598 = call i64 @llvm.expect.i64(i64 %1597, i64 0)
  %1599 = icmp ne i64 %1598, 0
  br i1 %1599, label %1600, label %1606

1600:                                             ; preds = %1584
  %1601 = load ptr, ptr %6, align 8, !tbaa !5
  %1602 = getelementptr inbounds %struct.MDBX_cursor, ptr %1601, i32 0, i32 5
  %1603 = load ptr, ptr %1602, align 8, !tbaa !11
  %1604 = getelementptr inbounds %struct.MDBX_txn, ptr %1603, i32 0, i32 9
  %1605 = load ptr, ptr %1604, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %1605, ptr noundef @.str.62, ptr noundef @__func__.cursor_put, i32 noundef 942) #13
  unreachable

1606:                                             ; preds = %1584
  br label %1607

1607:                                             ; preds = %1606
  br label %1608

1608:                                             ; preds = %1607
  br label %1609

1609:                                             ; preds = %1608, %1572
  br label %1610

1610:                                             ; preds = %1609
  br label %1611

1611:                                             ; preds = %1610
  %1612 = load i64, ptr %39, align 8, !tbaa !55
  %1613 = trunc i64 %1612 to i8
  %1614 = zext i8 %1613 to i32
  %1615 = load ptr, ptr %6, align 8, !tbaa !5
  %1616 = getelementptr inbounds %struct.MDBX_cursor, ptr %1615, i32 0, i32 1
  %1617 = getelementptr inbounds %struct.anon, ptr %1616, i32 0, i32 1
  %1618 = load i8, ptr %1617, align 1, !tbaa !25
  %1619 = sext i8 %1618 to i32
  %1620 = add nsw i32 %1619, %1614
  %1621 = trunc i32 %1620 to i8
  store i8 %1621, ptr %1617, align 1, !tbaa !25
  %1622 = load i32, ptr %10, align 4, !tbaa !9
  %1623 = icmp ne i32 %1622, 0
  %1624 = xor i1 %1623, true
  %1625 = xor i1 %1624, true
  %1626 = zext i1 %1625 to i32
  %1627 = sext i32 %1626 to i64
  %1628 = call i64 @llvm.expect.i64(i64 %1627, i64 0)
  %1629 = icmp ne i64 %1628, 0
  br i1 %1629, label %1630, label %1632

1630:                                             ; preds = %1611
  %1631 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1631, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %1633

1632:                                             ; preds = %1611
  store i32 0, ptr %13, align 4
  br label %1633

1633:                                             ; preds = %1632, %1630
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #11
  %1634 = load i32, ptr %13, align 4
  switch i32 %1634, label %4512 [
    i32 0, label %1635
  ]

1635:                                             ; preds = %1633
  br label %1636

1636:                                             ; preds = %1635, %1510, %1503
  %1637 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1638 = zext i8 %1637 to i32
  %1639 = and i32 %1638, 2
  %1640 = icmp ne i32 %1639, 0
  %1641 = xor i1 %1640, true
  %1642 = xor i1 %1641, true
  %1643 = zext i1 %1642 to i32
  %1644 = sext i32 %1643 to i64
  %1645 = call i64 @llvm.expect.i64(i64 %1644, i64 0)
  %1646 = icmp ne i64 %1645, 0
  br i1 %1646, label %1647, label %1661

1647:                                             ; preds = %1636
  %1648 = load ptr, ptr %6, align 8, !tbaa !5
  %1649 = call i32 @cursor_validate(ptr noundef %1648) #15
  store i32 %1649, ptr %10, align 4, !tbaa !9
  %1650 = load i32, ptr %10, align 4, !tbaa !9
  %1651 = icmp ne i32 %1650, 0
  %1652 = xor i1 %1651, true
  %1653 = xor i1 %1652, true
  %1654 = zext i1 %1653 to i32
  %1655 = sext i32 %1654 to i64
  %1656 = call i64 @llvm.expect.i64(i64 %1655, i64 0)
  %1657 = icmp ne i64 %1656, 0
  br i1 %1657, label %1658, label %1660

1658:                                             ; preds = %1647
  %1659 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1659, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

1660:                                             ; preds = %1647
  br label %1661

1661:                                             ; preds = %1660, %1636
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

1662:                                             ; preds = %1446
  br label %1663

1663:                                             ; preds = %4444, %1662
  %1664 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1665 = zext i8 %1664 to i32
  %1666 = and i32 %1665, 2
  %1667 = icmp ne i32 %1666, 0
  %1668 = xor i1 %1667, true
  %1669 = xor i1 %1668, true
  %1670 = zext i1 %1669 to i32
  %1671 = sext i32 %1670 to i64
  %1672 = call i64 @llvm.expect.i64(i64 %1671, i64 0)
  %1673 = icmp ne i64 %1672, 0
  br i1 %1673, label %1674, label %1688

1674:                                             ; preds = %1663
  %1675 = load ptr, ptr %6, align 8, !tbaa !5
  %1676 = call i32 @cursor_validate(ptr noundef %1675) #15
  store i32 %1676, ptr %10, align 4, !tbaa !9
  %1677 = load i32, ptr %10, align 4, !tbaa !9
  %1678 = icmp ne i32 %1677, 0
  %1679 = xor i1 %1678, true
  %1680 = xor i1 %1679, true
  %1681 = zext i1 %1680 to i32
  %1682 = sext i32 %1681 to i64
  %1683 = call i64 @llvm.expect.i64(i64 %1682, i64 0)
  %1684 = icmp ne i64 %1683, 0
  br i1 %1684, label %1685, label %1687

1685:                                             ; preds = %1674
  %1686 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1686, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

1687:                                             ; preds = %1674
  br label %1688

1688:                                             ; preds = %1687, %1663
  %1689 = load ptr, ptr %6, align 8, !tbaa !5
  %1690 = getelementptr inbounds %struct.MDBX_cursor, ptr %1689, i32 0, i32 9
  %1691 = load ptr, ptr %6, align 8, !tbaa !5
  %1692 = getelementptr inbounds %struct.MDBX_cursor, ptr %1691, i32 0, i32 1
  %1693 = getelementptr inbounds %struct.anon, ptr %1692, i32 0, i32 1
  %1694 = load i8, ptr %1693, align 1, !tbaa !25
  %1695 = sext i8 %1694 to i64
  %1696 = getelementptr inbounds [32 x ptr], ptr %1690, i64 0, i64 %1695
  %1697 = load ptr, ptr %1696, align 8, !tbaa !5
  %1698 = load ptr, ptr %6, align 8, !tbaa !5
  %1699 = getelementptr inbounds %struct.MDBX_cursor, ptr %1698, i32 0, i32 10
  %1700 = load ptr, ptr %6, align 8, !tbaa !5
  %1701 = getelementptr inbounds %struct.MDBX_cursor, ptr %1700, i32 0, i32 1
  %1702 = getelementptr inbounds %struct.anon, ptr %1701, i32 0, i32 1
  %1703 = load i8, ptr %1702, align 1, !tbaa !25
  %1704 = sext i8 %1703 to i64
  %1705 = getelementptr inbounds [32 x i16], ptr %1699, i64 0, i64 %1704
  %1706 = load i16, ptr %1705, align 2, !tbaa !31
  %1707 = zext i16 %1706 to i64
  %1708 = call ptr @page_node(ptr noundef %1697, i64 noundef %1707) #12
  store ptr %1708, ptr %40, align 8, !tbaa !5
  %1709 = load ptr, ptr %40, align 8, !tbaa !5
  %1710 = call zeroext i8 @node_flags(ptr noundef %1709) #12
  %1711 = zext i8 %1710 to i32
  %1712 = and i32 %1711, 1
  %1713 = icmp ne i32 %1712, 0
  %1714 = xor i1 %1713, true
  %1715 = xor i1 %1714, true
  %1716 = zext i1 %1715 to i32
  %1717 = sext i32 %1716 to i64
  %1718 = call i64 @llvm.expect.i64(i64 %1717, i64 0)
  %1719 = icmp ne i64 %1718, 0
  br i1 %1719, label %1720, label %2078

1720:                                             ; preds = %1688
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #11
  %1721 = load ptr, ptr %7, align 8, !tbaa !5
  %1722 = load ptr, ptr %8, align 8, !tbaa !5
  %1723 = call i64 @node_size(ptr noundef %1721, ptr noundef %1722) #12
  %1724 = load ptr, ptr %12, align 8, !tbaa !5
  %1725 = getelementptr inbounds %struct.MDBX_env, ptr %1724, i32 0, i32 8
  %1726 = load i16, ptr %1725, align 8, !tbaa !36
  %1727 = zext i16 %1726 to i64
  %1728 = icmp ugt i64 %1723, %1727
  br i1 %1728, label %1729, label %1735

1729:                                             ; preds = %1720
  %1730 = load ptr, ptr %12, align 8, !tbaa !5
  %1731 = load ptr, ptr %8, align 8, !tbaa !5
  %1732 = getelementptr inbounds %struct.iovec, ptr %1731, i32 0, i32 1
  %1733 = load i64, ptr %1732, align 8, !tbaa !24
  %1734 = call i32 @largechunk_npages(ptr noundef %1730, i64 noundef %1733) #12
  br label %1736

1735:                                             ; preds = %1720
  br label %1736

1736:                                             ; preds = %1735, %1729
  %1737 = phi i32 [ %1734, %1729 ], [ 0, %1735 ]
  %1738 = zext i32 %1737 to i64
  store i64 %1738, ptr %41, align 8, !tbaa !55
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #11
  %1739 = load ptr, ptr %40, align 8, !tbaa !5
  %1740 = call i32 @node_largedata_pgno(ptr noundef %1739) #12
  store i32 %1740, ptr %42, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #11
  %1741 = load ptr, ptr %6, align 8, !tbaa !5
  %1742 = load i32, ptr %42, align 4, !tbaa !9
  %1743 = load ptr, ptr %6, align 8, !tbaa !5
  %1744 = getelementptr inbounds %struct.MDBX_cursor, ptr %1743, i32 0, i32 9
  %1745 = load ptr, ptr %6, align 8, !tbaa !5
  %1746 = getelementptr inbounds %struct.MDBX_cursor, ptr %1745, i32 0, i32 1
  %1747 = getelementptr inbounds %struct.anon, ptr %1746, i32 0, i32 1
  %1748 = load i8, ptr %1747, align 1, !tbaa !25
  %1749 = sext i8 %1748 to i64
  %1750 = getelementptr inbounds [32 x ptr], ptr %1744, i64 0, i64 %1749
  %1751 = load ptr, ptr %1750, align 8, !tbaa !5
  %1752 = getelementptr inbounds %struct.page, ptr %1751, i32 0, i32 0
  %1753 = load i64, ptr %1752, align 1, !tbaa !55
  %1754 = call { ptr, i32 } @page_get_large(ptr noundef %1741, i32 noundef %1742, i64 noundef %1753)
  %1755 = getelementptr inbounds { ptr, i32 }, ptr %43, i32 0, i32 0
  %1756 = extractvalue { ptr, i32 } %1754, 0
  store ptr %1756, ptr %1755, align 8
  %1757 = getelementptr inbounds { ptr, i32 }, ptr %43, i32 0, i32 1
  %1758 = extractvalue { ptr, i32 } %1754, 1
  store i32 %1758, ptr %1757, align 8
  %1759 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 1
  %1760 = load i32, ptr %1759, align 8, !tbaa !57
  %1761 = icmp ne i32 %1760, 0
  %1762 = xor i1 %1761, true
  %1763 = xor i1 %1762, true
  %1764 = zext i1 %1763 to i32
  %1765 = sext i32 %1764 to i64
  %1766 = call i64 @llvm.expect.i64(i64 %1765, i64 0)
  %1767 = icmp ne i64 %1766, 0
  br i1 %1767, label %1768, label %1771

1768:                                             ; preds = %1736
  %1769 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 1
  %1770 = load i32, ptr %1769, align 8, !tbaa !57
  store i32 %1770, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2075

1771:                                             ; preds = %1736
  br label %1772

1772:                                             ; preds = %1771
  %1773 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %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 %1806

1783:                                             ; preds = %1772
  br label %1784

1784:                                             ; preds = %1783
  %1785 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1786 = load ptr, ptr %1785, align 8, !tbaa !59
  %1787 = call zeroext i8 @page_type(ptr noundef %1786) #12
  %1788 = zext i8 %1787 to i32
  %1789 = icmp eq i32 %1788, 4
  %1790 = xor i1 %1789, true
  %1791 = xor i1 %1790, true
  %1792 = xor i1 %1791, true
  %1793 = zext i1 %1792 to i32
  %1794 = sext i32 %1793 to i64
  %1795 = call i64 @llvm.expect.i64(i64 %1794, i64 0)
  %1796 = icmp ne i64 %1795, 0
  br i1 %1796, label %1797, label %1803

1797:                                             ; preds = %1784
  %1798 = load ptr, ptr %6, align 8, !tbaa !5
  %1799 = getelementptr inbounds %struct.MDBX_cursor, ptr %1798, i32 0, i32 5
  %1800 = load ptr, ptr %1799, align 8, !tbaa !11
  %1801 = getelementptr inbounds %struct.MDBX_txn, ptr %1800, i32 0, i32 9
  %1802 = load ptr, ptr %1801, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %1802, ptr noundef @.str.63, ptr noundef @__func__.cursor_put, i32 noundef 972) #13
  unreachable

1803:                                             ; preds = %1784
  br label %1804

1804:                                             ; preds = %1803
  br label %1805

1805:                                             ; preds = %1804
  br label %1806

1806:                                             ; preds = %1805, %1772
  br label %1807

1807:                                             ; preds = %1806
  br label %1808

1808:                                             ; preds = %1807
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #11
  %1809 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1810 = load ptr, ptr %1809, align 8, !tbaa !59
  %1811 = getelementptr inbounds %struct.page, ptr %1810, i32 0, i32 3
  %1812 = load i32, ptr %1811, align 1, !tbaa !25
  %1813 = zext i32 %1812 to i64
  store i64 %1813, ptr %44, align 8, !tbaa !55
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #11
  %1814 = load ptr, ptr %6, align 8, !tbaa !5
  %1815 = getelementptr inbounds %struct.MDBX_cursor, ptr %1814, i32 0, i32 6
  %1816 = load ptr, ptr %1815, align 8, !tbaa !45
  %1817 = load ptr, ptr %6, align 8, !tbaa !5
  %1818 = getelementptr inbounds %struct.MDBX_cursor, ptr %1817, i32 0, i32 5
  %1819 = load ptr, ptr %1818, align 8, !tbaa !11
  %1820 = getelementptr inbounds %struct.MDBX_txn, ptr %1819, i32 0, i32 10
  %1821 = load ptr, ptr %1820, align 8, !tbaa !72
  %1822 = getelementptr inbounds %struct.tree, ptr %1821, i64 0
  %1823 = icmp eq ptr %1816, %1822
  %1824 = zext i1 %1823 to i64
  %1825 = select i1 %1823, i32 1, i32 0
  %1826 = sext i32 %1825 to i64
  store i64 %1826, ptr %45, align 8, !tbaa !55
  %1827 = load ptr, ptr %6, align 8, !tbaa !5
  %1828 = getelementptr inbounds %struct.MDBX_cursor, ptr %1827, i32 0, i32 5
  %1829 = load ptr, ptr %1828, align 8, !tbaa !11
  %1830 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1831 = load ptr, ptr %1830, align 8, !tbaa !59
  %1832 = call zeroext i1 @is_frozen(ptr noundef %1829, ptr noundef %1831) #12
  br i1 %1832, label %2065, label %1833

1833:                                             ; preds = %1808
  %1834 = load i64, ptr %44, align 8, !tbaa !55
  %1835 = load i64, ptr %41, align 8, !tbaa !55
  %1836 = icmp uge i64 %1834, %1835
  br i1 %1836, label %1837, label %2065

1837:                                             ; preds = %1833
  %1838 = load i64, ptr %44, align 8, !tbaa !55
  %1839 = load i64, ptr %41, align 8, !tbaa !55
  %1840 = load i64, ptr %45, align 8, !tbaa !55
  %1841 = add i64 %1839, %1840
  %1842 = icmp ule i64 %1838, %1841
  br i1 %1842, label %1843, label %2065

1843:                                             ; preds = %1837
  %1844 = load ptr, ptr %6, align 8, !tbaa !5
  %1845 = getelementptr inbounds %struct.MDBX_cursor, ptr %1844, i32 0, i32 5
  %1846 = load ptr, ptr %1845, align 8, !tbaa !11
  %1847 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1848 = load ptr, ptr %1847, align 8, !tbaa !59
  %1849 = call zeroext i1 @is_modifable(ptr noundef %1846, ptr noundef %1848) #12
  br i1 %1849, label %2015, label %1850

1850:                                             ; preds = %1843
  %1851 = load ptr, ptr %6, align 8, !tbaa !5
  %1852 = getelementptr inbounds %struct.MDBX_cursor, ptr %1851, i32 0, i32 5
  %1853 = load ptr, ptr %1852, align 8, !tbaa !11
  %1854 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1855 = load ptr, ptr %1854, align 8, !tbaa !59
  %1856 = call zeroext i1 @is_spilled(ptr noundef %1853, ptr noundef %1855) #12
  br i1 %1856, label %1857, label %1881

1857:                                             ; preds = %1850
  call void @llvm.lifetime.start.p0(i64 16, ptr %46) #11
  %1858 = load ptr, ptr %6, align 8, !tbaa !5
  %1859 = getelementptr inbounds %struct.MDBX_cursor, ptr %1858, i32 0, i32 5
  %1860 = load ptr, ptr %1859, align 8, !tbaa !11
  %1861 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1862 = load ptr, ptr %1861, align 8, !tbaa !59
  %1863 = call { ptr, i32 } @page_unspill(ptr noundef %1860, ptr noundef %1862)
  %1864 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 0
  %1865 = extractvalue { ptr, i32 } %1863, 0
  store ptr %1865, ptr %1864, align 8
  %1866 = getelementptr inbounds { ptr, i32 }, ptr %46, i32 0, i32 1
  %1867 = extractvalue { ptr, i32 } %1863, 1
  store i32 %1867, ptr %1866, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %43, ptr align 8 %46, i64 16, i1 false), !tbaa.struct !73
  call void @llvm.lifetime.end.p0(i64 16, ptr %46) #11
  %1868 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 1
  %1869 = load i32, ptr %1868, align 8, !tbaa !57
  %1870 = icmp ne i32 %1869, 0
  %1871 = xor i1 %1870, true
  %1872 = xor i1 %1871, true
  %1873 = zext i1 %1872 to i32
  %1874 = sext i32 %1873 to i64
  %1875 = call i64 @llvm.expect.i64(i64 %1874, i64 0)
  %1876 = icmp ne i64 %1875, 0
  br i1 %1876, label %1877, label %1880

1877:                                             ; preds = %1857
  %1878 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 1
  %1879 = load i32, ptr %1878, align 8, !tbaa !57
  store i32 %1879, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2074

1880:                                             ; preds = %1857
  br label %2014

1881:                                             ; preds = %1850
  %1882 = load ptr, ptr %6, align 8, !tbaa !5
  %1883 = getelementptr inbounds %struct.MDBX_cursor, ptr %1882, i32 0, i32 5
  %1884 = load ptr, ptr %1883, align 8, !tbaa !11
  %1885 = getelementptr inbounds %struct.MDBX_txn, ptr %1884, i32 0, i32 4
  %1886 = load ptr, ptr %1885, align 8, !tbaa !74
  %1887 = icmp ne ptr %1886, null
  %1888 = xor i1 %1887, true
  %1889 = xor i1 %1888, true
  %1890 = xor i1 %1889, true
  %1891 = zext i1 %1890 to i32
  %1892 = sext i32 %1891 to i64
  %1893 = call i64 @llvm.expect.i64(i64 %1892, i64 0)
  %1894 = icmp ne i64 %1893, 0
  br i1 %1894, label %1895, label %1925

1895:                                             ; preds = %1881
  br label %1896

1896:                                             ; preds = %1895
  %1897 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %1898 = zext i8 %1897 to i32
  %1899 = icmp sle i32 1, %1898
  %1900 = xor i1 %1899, true
  %1901 = xor i1 %1900, true
  %1902 = zext i1 %1901 to i32
  %1903 = sext i32 %1902 to i64
  %1904 = call i64 @llvm.expect.i64(i64 %1903, i64 0)
  %1905 = icmp ne i64 %1904, 0
  br i1 %1905, label %1906, label %1922

1906:                                             ; preds = %1896
  %1907 = load i32, ptr %42, align 4, !tbaa !9
  %1908 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1909 = load ptr, ptr %1908, align 8, !tbaa !59
  %1910 = getelementptr inbounds %struct.page, ptr %1909, i32 0, i32 0
  %1911 = load i64, ptr %1910, align 1, !tbaa !55
  %1912 = load ptr, ptr %6, align 8, !tbaa !5
  %1913 = getelementptr inbounds %struct.MDBX_cursor, ptr %1912, i32 0, i32 5
  %1914 = load ptr, ptr %1913, align 8, !tbaa !11
  %1915 = getelementptr inbounds %struct.MDBX_txn, ptr %1914, i32 0, i32 7
  %1916 = load i64, ptr %1915, align 8, !tbaa !75
  %1917 = load ptr, ptr %6, align 8, !tbaa !5
  %1918 = getelementptr inbounds %struct.MDBX_cursor, ptr %1917, i32 0, i32 5
  %1919 = load ptr, ptr %1918, align 8, !tbaa !11
  %1920 = getelementptr inbounds %struct.MDBX_txn, ptr %1919, i32 0, i32 8
  %1921 = load i64, ptr %1920, align 8, !tbaa !69
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.cursor_put, i32 noundef 992, ptr noundef @.str.64, ptr noundef @.str.65, i32 noundef %1907, i64 noundef %1911, i64 noundef %1916, i64 noundef %1921)
  br label %1922

1922:                                             ; preds = %1906, %1896
  br label %1923

1923:                                             ; preds = %1922
  br label %1924

1924:                                             ; preds = %1923
  store i32 -30779, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2074

1925:                                             ; preds = %1881
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #11
  %1926 = load ptr, ptr %6, align 8, !tbaa !5
  %1927 = getelementptr inbounds %struct.MDBX_cursor, ptr %1926, i32 0, i32 5
  %1928 = load ptr, ptr %1927, align 8, !tbaa !11
  %1929 = load i64, ptr %44, align 8, !tbaa !55
  %1930 = call ptr @page_shadow_alloc(ptr noundef %1928, i64 noundef %1929)
  store ptr %1930, ptr %47, align 8, !tbaa !5
  %1931 = load ptr, ptr %47, align 8, !tbaa !5
  %1932 = icmp ne ptr %1931, null
  %1933 = xor i1 %1932, true
  %1934 = xor i1 %1933, true
  %1935 = xor i1 %1934, true
  %1936 = zext i1 %1935 to i32
  %1937 = sext i32 %1936 to i64
  %1938 = call i64 @llvm.expect.i64(i64 %1937, i64 0)
  %1939 = icmp ne i64 %1938, 0
  br i1 %1939, label %1940, label %1941

1940:                                             ; preds = %1925
  store i32 12, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2011

1941:                                             ; preds = %1925
  %1942 = load ptr, ptr %47, align 8, !tbaa !5
  %1943 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %1944 = load ptr, ptr %1943, align 8, !tbaa !59
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %1942, ptr align 1 %1944, i64 20, i1 false)
  %1945 = load ptr, ptr %6, align 8, !tbaa !5
  %1946 = getelementptr inbounds %struct.MDBX_cursor, ptr %1945, i32 0, i32 5
  %1947 = load ptr, ptr %1946, align 8, !tbaa !11
  %1948 = load ptr, ptr %47, align 8, !tbaa !5
  %1949 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  store ptr %1948, ptr %1949, align 8, !tbaa !59
  %1950 = load i64, ptr %44, align 8, !tbaa !55
  %1951 = call i32 @page_dirty(ptr noundef %1947, ptr noundef %1948, i64 noundef %1950)
  store i32 %1951, ptr %10, align 4, !tbaa !9
  %1952 = load i32, ptr %10, align 4, !tbaa !9
  %1953 = icmp ne i32 %1952, 0
  %1954 = xor i1 %1953, true
  %1955 = xor i1 %1954, true
  %1956 = zext i1 %1955 to i32
  %1957 = sext i32 %1956 to i64
  %1958 = call i64 @llvm.expect.i64(i64 %1957, i64 0)
  %1959 = icmp ne i64 %1958, 0
  br i1 %1959, label %1960, label %1962

1960:                                             ; preds = %1941
  %1961 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1961, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2011

1962:                                             ; preds = %1941
  %1963 = load i64, ptr %44, align 8, !tbaa !55
  %1964 = load ptr, ptr %6, align 8, !tbaa !5
  %1965 = getelementptr inbounds %struct.MDBX_cursor, ptr %1964, i32 0, i32 5
  %1966 = load ptr, ptr %1965, align 8, !tbaa !11
  %1967 = getelementptr inbounds %struct.MDBX_txn, ptr %1966, i32 0, i32 9
  %1968 = load ptr, ptr %1967, align 8, !tbaa !13
  %1969 = getelementptr inbounds %struct.MDBX_env, ptr %1968, i32 0, i32 7
  %1970 = load ptr, ptr %1969, align 8, !tbaa !76
  %1971 = getelementptr inbounds %struct.shared_lck, ptr %1970, i32 0, i32 9
  %1972 = getelementptr inbounds %struct.pgops, ptr %1971, i32 0, i32 2
  %1973 = load volatile i64, ptr %1972, align 16, !tbaa !25
  %1974 = add i64 %1973, %1963
  store volatile i64 %1974, ptr %1972, align 16, !tbaa !25
  br label %1975

1975:                                             ; preds = %1962
  %1976 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %1977 = zext i8 %1976 to i32
  %1978 = and i32 %1977, 1
  %1979 = icmp ne i32 %1978, 0
  %1980 = xor i1 %1979, true
  %1981 = xor i1 %1980, true
  %1982 = zext i1 %1981 to i32
  %1983 = sext i32 %1982 to i64
  %1984 = call i64 @llvm.expect.i64(i64 %1983, i64 1)
  %1985 = icmp ne i64 %1984, 0
  br i1 %1985, label %1986, label %2008

1986:                                             ; preds = %1975
  br label %1987

1987:                                             ; preds = %1986
  %1988 = load ptr, ptr %6, align 8, !tbaa !5
  %1989 = getelementptr inbounds %struct.MDBX_cursor, ptr %1988, i32 0, i32 5
  %1990 = load ptr, ptr %1989, align 8, !tbaa !11
  %1991 = call zeroext i1 @dpl_check(ptr noundef %1990)
  %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 = %1987
  %2000 = load ptr, ptr %6, align 8, !tbaa !5
  %2001 = getelementptr inbounds %struct.MDBX_cursor, ptr %2000, i32 0, i32 5
  %2002 = load ptr, ptr %2001, align 8, !tbaa !11
  %2003 = getelementptr inbounds %struct.MDBX_txn, ptr %2002, i32 0, i32 9
  %2004 = load ptr, ptr %2003, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2004, ptr noundef @.str.66, ptr noundef @__func__.cursor_put, i32 noundef 1009) #13
  unreachable

2005:                                             ; preds = %1987
  br label %2006

2006:                                             ; preds = %2005
  br label %2007

2007:                                             ; preds = %2006
  br label %2008

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

2009:                                             ; preds = %2008
  br label %2010

2010:                                             ; preds = %2009
  store i32 0, ptr %13, align 4
  br label %2011

2011:                                             ; preds = %2010, %1960, %1940
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #11
  %2012 = load i32, ptr %13, align 4
  switch i32 %2012, label %2074 [
    i32 0, label %2013
  ]

2013:                                             ; preds = %2011
  br label %2014

2014:                                             ; preds = %2013, %1880
  br label %2015

2015:                                             ; preds = %2014, %1843
  %2016 = load ptr, ptr %40, align 8, !tbaa !5
  %2017 = load ptr, ptr %8, align 8, !tbaa !5
  %2018 = getelementptr inbounds %struct.iovec, ptr %2017, i32 0, i32 1
  %2019 = load i64, ptr %2018, align 8, !tbaa !24
  call void @node_set_ds(ptr noundef %2016, i64 noundef %2019)
  %2020 = load i32, ptr %9, align 4, !tbaa !9
  %2021 = and i32 %2020, 65536
  %2022 = icmp ne i32 %2021, 0
  br i1 %2022, label %2023, label %2029

2023:                                             ; preds = %2015
  %2024 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %2025 = load ptr, ptr %2024, align 8, !tbaa !59
  %2026 = call ptr @page_data(ptr noundef %2025) #12
  %2027 = load ptr, ptr %8, align 8, !tbaa !5
  %2028 = getelementptr inbounds %struct.iovec, ptr %2027, i32 0, i32 0
  store ptr %2026, ptr %2028, align 8, !tbaa !22
  br label %2039

2029:                                             ; preds = %2015
  %2030 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %2031 = load ptr, ptr %2030, align 8, !tbaa !59
  %2032 = call ptr @page_data(ptr noundef %2031) #12
  %2033 = load ptr, ptr %8, align 8, !tbaa !5
  %2034 = getelementptr inbounds %struct.iovec, ptr %2033, i32 0, i32 0
  %2035 = load ptr, ptr %2034, align 8, !tbaa !22
  %2036 = load ptr, ptr %8, align 8, !tbaa !5
  %2037 = getelementptr inbounds %struct.iovec, ptr %2036, i32 0, i32 1
  %2038 = load i64, ptr %2037, align 8, !tbaa !24
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %2032, ptr align 1 %2035, i64 %2038, i1 false)
  br label %2039

2039:                                             ; preds = %2029, %2023
  %2040 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2041 = zext i8 %2040 to i32
  %2042 = and i32 %2041, 2
  %2043 = icmp ne i32 %2042, 0
  %2044 = xor i1 %2043, true
  %2045 = xor i1 %2044, true
  %2046 = zext i1 %2045 to i32
  %2047 = sext i32 %2046 to i64
  %2048 = call i64 @llvm.expect.i64(i64 %2047, i64 0)
  %2049 = icmp ne i64 %2048, 0
  br i1 %2049, label %2050, label %2064

2050:                                             ; preds = %2039
  %2051 = load ptr, ptr %6, align 8, !tbaa !5
  %2052 = call i32 @cursor_validate(ptr noundef %2051) #15
  store i32 %2052, ptr %10, align 4, !tbaa !9
  %2053 = load i32, ptr %10, align 4, !tbaa !9
  %2054 = icmp ne i32 %2053, 0
  %2055 = xor i1 %2054, true
  %2056 = xor i1 %2055, true
  %2057 = zext i1 %2056 to i32
  %2058 = sext i32 %2057 to i64
  %2059 = call i64 @llvm.expect.i64(i64 %2058, i64 0)
  %2060 = icmp ne i64 %2059, 0
  br i1 %2060, label %2061, label %2063

2061:                                             ; preds = %2050
  %2062 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %2062, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2074

2063:                                             ; preds = %2050
  br label %2064

2064:                                             ; preds = %2063, %2039
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2074

2065:                                             ; preds = %1837, %1833, %1808
  %2066 = load ptr, ptr %6, align 8, !tbaa !5
  %2067 = getelementptr inbounds %struct.page_get_result, ptr %43, i32 0, i32 0
  %2068 = load ptr, ptr %2067, align 8, !tbaa !59
  %2069 = call i32 @page_retire(ptr noundef %2066, ptr noundef %2068)
  store i32 %2069, ptr %10, align 4, !tbaa !9
  %2070 = icmp ne i32 %2069, 0
  br i1 %2070, label %2071, label %2073

2071:                                             ; preds = %2065
  %2072 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %2072, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2074

2073:                                             ; preds = %2065
  store i32 0, ptr %13, align 4
  br label %2074

2074:                                             ; preds = %2073, %2071, %2064, %2061, %2011, %1924, %1877
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #11
  br label %2075

2075:                                             ; preds = %2074, %1768
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #11
  %2076 = load i32, ptr %13, align 4
  switch i32 %2076, label %4512 [
    i32 0, label %2077
  ]

2077:                                             ; preds = %2075
  br label %3587

2078:                                             ; preds = %1688
  %2079 = load ptr, ptr %40, align 8, !tbaa !5
  %2080 = call i64 @node_ds(ptr noundef %2079) #12
  %2081 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  store i64 %2080, ptr %2081, align 8, !tbaa !24
  %2082 = load ptr, ptr %40, align 8, !tbaa !5
  %2083 = call ptr @node_data(ptr noundef %2082) #12
  %2084 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  store ptr %2083, ptr %2084, align 8, !tbaa !22
  br label %2085

2085:                                             ; preds = %2078
  %2086 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2087 = zext i8 %2086 to i32
  %2088 = and i32 %2087, 1
  %2089 = icmp ne i32 %2088, 0
  %2090 = xor i1 %2089, true
  %2091 = xor i1 %2090, true
  %2092 = zext i1 %2091 to i32
  %2093 = sext i32 %2092 to i64
  %2094 = call i64 @llvm.expect.i64(i64 %2093, i64 1)
  %2095 = icmp ne i64 %2094, 0
  br i1 %2095, label %2096, label %2138

2096:                                             ; preds = %2085
  br label %2097

2097:                                             ; preds = %2096
  %2098 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  %2099 = load ptr, ptr %2098, align 8, !tbaa !22
  %2100 = ptrtoint ptr %2099 to i64
  %2101 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2102 = load i64, ptr %2101, align 8, !tbaa !24
  %2103 = add nsw i64 %2100, %2102
  %2104 = inttoptr i64 %2103 to ptr
  %2105 = load ptr, ptr %6, align 8, !tbaa !5
  %2106 = getelementptr inbounds %struct.MDBX_cursor, ptr %2105, i32 0, i32 9
  %2107 = load ptr, ptr %6, align 8, !tbaa !5
  %2108 = getelementptr inbounds %struct.MDBX_cursor, ptr %2107, i32 0, i32 1
  %2109 = getelementptr inbounds %struct.anon, ptr %2108, i32 0, i32 1
  %2110 = load i8, ptr %2109, align 1, !tbaa !25
  %2111 = sext i8 %2110 to i64
  %2112 = getelementptr inbounds [32 x ptr], ptr %2106, i64 0, i64 %2111
  %2113 = load ptr, ptr %2112, align 8, !tbaa !5
  %2114 = ptrtoint ptr %2113 to i64
  %2115 = load ptr, ptr %12, align 8, !tbaa !5
  %2116 = getelementptr inbounds %struct.MDBX_env, ptr %2115, i32 0, i32 2
  %2117 = load i32, ptr %2116, align 8, !tbaa !77
  %2118 = zext i32 %2117 to i64
  %2119 = add nsw i64 %2114, %2118
  %2120 = inttoptr i64 %2119 to ptr
  %2121 = icmp ule ptr %2104, %2120
  %2122 = xor i1 %2121, true
  %2123 = xor i1 %2122, true
  %2124 = xor i1 %2123, true
  %2125 = zext i1 %2124 to i32
  %2126 = sext i32 %2125 to i64
  %2127 = call i64 @llvm.expect.i64(i64 %2126, i64 0)
  %2128 = icmp ne i64 %2127, 0
  br i1 %2128, label %2129, label %2135

2129:                                             ; preds = %2097
  %2130 = load ptr, ptr %6, align 8, !tbaa !5
  %2131 = getelementptr inbounds %struct.MDBX_cursor, ptr %2130, i32 0, i32 5
  %2132 = load ptr, ptr %2131, align 8, !tbaa !11
  %2133 = getelementptr inbounds %struct.MDBX_txn, ptr %2132, i32 0, i32 9
  %2134 = load ptr, ptr %2133, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2134, ptr noundef @.str.67, ptr noundef @__func__.cursor_put, i32 noundef 1031) #13
  unreachable

2135:                                             ; preds = %2097
  br label %2136

2136:                                             ; preds = %2135
  br label %2137

2137:                                             ; preds = %2136
  br label %2138

2138:                                             ; preds = %2137, %2085
  br label %2139

2139:                                             ; preds = %2138
  br label %2140

2140:                                             ; preds = %2139
  %2141 = load ptr, ptr %6, align 8, !tbaa !5
  %2142 = getelementptr inbounds %struct.MDBX_cursor, ptr %2141, i32 0, i32 6
  %2143 = load ptr, ptr %2142, align 8, !tbaa !45
  %2144 = getelementptr inbounds %struct.tree, ptr %2143, i32 0, i32 0
  %2145 = load i16, ptr %2144, align 4, !tbaa !61
  %2146 = zext i16 %2145 to i32
  %2147 = and i32 %2146, 4
  %2148 = icmp ne i32 %2147, 0
  br i1 %2148, label %2149, label %3205

2149:                                             ; preds = %2140
  store i64 0, ptr %48, align 8, !tbaa !55
  %2150 = load ptr, ptr %12, align 8, !tbaa !5
  %2151 = getelementptr inbounds %struct.MDBX_env, ptr %2150, i32 0, i32 23
  %2152 = load ptr, ptr %2151, align 8, !tbaa !68
  %2153 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 0
  store ptr %2152, ptr %2153, align 8, !tbaa !22
  store ptr %2152, ptr %36, align 8, !tbaa !5
  store ptr %2152, ptr %49, align 8, !tbaa !5
  %2154 = load ptr, ptr %6, align 8, !tbaa !5
  %2155 = getelementptr inbounds %struct.MDBX_cursor, ptr %2154, i32 0, i32 9
  %2156 = load ptr, ptr %6, align 8, !tbaa !5
  %2157 = getelementptr inbounds %struct.MDBX_cursor, ptr %2156, i32 0, i32 1
  %2158 = getelementptr inbounds %struct.anon, ptr %2157, i32 0, i32 1
  %2159 = load i8, ptr %2158, align 1, !tbaa !25
  %2160 = sext i8 %2159 to i64
  %2161 = getelementptr inbounds [32 x ptr], ptr %2155, i64 0, i64 %2160
  %2162 = load ptr, ptr %2161, align 8, !tbaa !5
  %2163 = getelementptr inbounds %struct.page, ptr %2162, i32 0, i32 4
  %2164 = load i32, ptr %2163, align 1, !tbaa !9
  %2165 = load ptr, ptr %49, align 8, !tbaa !5
  %2166 = getelementptr inbounds %struct.page, ptr %2165, i32 0, i32 4
  store i32 %2164, ptr %2166, align 1, !tbaa !9
  %2167 = load ptr, ptr %40, align 8, !tbaa !5
  %2168 = call zeroext i8 @node_flags(ptr noundef %2167) #12
  %2169 = zext i8 %2168 to i32
  %2170 = and i32 %2169, 4
  %2171 = icmp ne i32 %2170, 0
  br i1 %2171, label %2540, label %2172

2172:                                             ; preds = %2149
  %2173 = load i32, ptr %9, align 4, !tbaa !9
  %2174 = and i32 %2173, 262144
  %2175 = icmp ne i32 %2174, 0
  br i1 %2175, label %2176, label %2237

2176:                                             ; preds = %2172
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #11
  %2177 = load ptr, ptr %6, align 8, !tbaa !5
  %2178 = getelementptr inbounds %struct.MDBX_cursor, ptr %2177, i32 0, i32 7
  %2179 = load ptr, ptr %2178, align 8, !tbaa !26
  %2180 = getelementptr inbounds %struct.clc2, ptr %2179, i32 0, i32 1
  %2181 = getelementptr inbounds %struct.clc, ptr %2180, i32 0, i32 0
  %2182 = load ptr, ptr %2181, align 8, !tbaa !56
  %2183 = load ptr, ptr %8, align 8, !tbaa !5
  %2184 = call i32 %2182(ptr noundef %2183, ptr noundef %30)
  store i32 %2184, ptr %50, align 4, !tbaa !9
  br label %2185

2185:                                             ; preds = %2176
  %2186 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2187 = zext i8 %2186 to i32
  %2188 = and i32 %2187, 1
  %2189 = icmp ne i32 %2188, 0
  %2190 = xor i1 %2189, true
  %2191 = xor i1 %2190, true
  %2192 = zext i1 %2191 to i32
  %2193 = sext i32 %2192 to i64
  %2194 = call i64 @llvm.expect.i64(i64 %2193, i64 1)
  %2195 = icmp ne i64 %2194, 0
  br i1 %2195, label %2196, label %2221

2196:                                             ; preds = %2185
  br label %2197

2197:                                             ; preds = %2196
  %2198 = load i32, ptr %50, align 4, !tbaa !9
  %2199 = icmp ne i32 %2198, 0
  br i1 %2199, label %2203, label %2200

2200:                                             ; preds = %2197
  %2201 = load ptr, ptr %8, align 8, !tbaa !5
  %2202 = call zeroext i1 @eq_fast(ptr noundef %2201, ptr noundef %30) #12
  br label %2203

2203:                                             ; preds = %2200, %2197
  %2204 = phi i1 [ true, %2197 ], [ %2202, %2200 ]
  %2205 = xor i1 %2204, true
  %2206 = xor i1 %2205, true
  %2207 = xor i1 %2206, true
  %2208 = zext i1 %2207 to i32
  %2209 = sext i32 %2208 to i64
  %2210 = call i64 @llvm.expect.i64(i64 %2209, i64 0)
  %2211 = icmp ne i64 %2210, 0
  br i1 %2211, label %2212, label %2218

2212:                                             ; preds = %2203
  %2213 = load ptr, ptr %6, align 8, !tbaa !5
  %2214 = getelementptr inbounds %struct.MDBX_cursor, ptr %2213, i32 0, i32 5
  %2215 = load ptr, ptr %2214, align 8, !tbaa !11
  %2216 = getelementptr inbounds %struct.MDBX_txn, ptr %2215, i32 0, i32 9
  %2217 = load ptr, ptr %2216, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2217, ptr noundef @.str.68, ptr noundef @__func__.cursor_put, i32 noundef 1048) #13
  unreachable

2218:                                             ; preds = %2203
  br label %2219

2219:                                             ; preds = %2218
  br label %2220

2220:                                             ; preds = %2219
  br label %2221

2221:                                             ; preds = %2220, %2185
  br label %2222

2222:                                             ; preds = %2221
  br label %2223

2223:                                             ; preds = %2222
  %2224 = load i32, ptr %50, align 4, !tbaa !9
  %2225 = icmp sle i32 %2224, 0
  %2226 = xor i1 %2225, true
  %2227 = xor i1 %2226, true
  %2228 = zext i1 %2227 to i32
  %2229 = sext i32 %2228 to i64
  %2230 = call i64 @llvm.expect.i64(i64 %2229, i64 0)
  %2231 = icmp ne i64 %2230, 0
  br i1 %2231, label %2232, label %2233

2232:                                             ; preds = %2223
  store i32 -30418, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %2234

2233:                                             ; preds = %2223
  store i32 0, ptr %13, align 4
  br label %2234

2234:                                             ; preds = %2233, %2232
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #11
  %2235 = load i32, ptr %13, align 4
  switch i32 %2235, label %4512 [
    i32 0, label %2236
  ]

2236:                                             ; preds = %2234
  br label %2333

2237:                                             ; preds = %2172
  %2238 = load ptr, ptr %8, align 8, !tbaa !5
  %2239 = call zeroext i1 @eq_fast(ptr noundef %2238, ptr noundef %30) #12
  br i1 %2239, label %2240, label %2332

2240:                                             ; preds = %2237
  br label %2241

2241:                                             ; preds = %2240
  %2242 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2243 = zext i8 %2242 to i32
  %2244 = and i32 %2243, 1
  %2245 = icmp ne i32 %2244, 0
  %2246 = xor i1 %2245, true
  %2247 = xor i1 %2246, true
  %2248 = zext i1 %2247 to i32
  %2249 = sext i32 %2248 to i64
  %2250 = call i64 @llvm.expect.i64(i64 %2249, i64 1)
  %2251 = icmp ne i64 %2250, 0
  br i1 %2251, label %2252, label %2279

2252:                                             ; preds = %2241
  br label %2253

2253:                                             ; preds = %2252
  %2254 = load ptr, ptr %6, align 8, !tbaa !5
  %2255 = getelementptr inbounds %struct.MDBX_cursor, ptr %2254, i32 0, i32 7
  %2256 = load ptr, ptr %2255, align 8, !tbaa !26
  %2257 = getelementptr inbounds %struct.clc2, ptr %2256, i32 0, i32 1
  %2258 = getelementptr inbounds %struct.clc, ptr %2257, i32 0, i32 0
  %2259 = load ptr, ptr %2258, align 8, !tbaa !56
  %2260 = load ptr, ptr %8, align 8, !tbaa !5
  %2261 = call i32 %2259(ptr noundef %2260, ptr noundef %30)
  %2262 = icmp eq i32 %2261, 0
  %2263 = xor i1 %2262, true
  %2264 = xor i1 %2263, true
  %2265 = xor i1 %2264, true
  %2266 = zext i1 %2265 to i32
  %2267 = sext i32 %2266 to i64
  %2268 = call i64 @llvm.expect.i64(i64 %2267, i64 0)
  %2269 = icmp ne i64 %2268, 0
  br i1 %2269, label %2270, label %2276

2270:                                             ; preds = %2253
  %2271 = load ptr, ptr %6, align 8, !tbaa !5
  %2272 = getelementptr inbounds %struct.MDBX_cursor, ptr %2271, i32 0, i32 5
  %2273 = load ptr, ptr %2272, align 8, !tbaa !11
  %2274 = getelementptr inbounds %struct.MDBX_txn, ptr %2273, i32 0, i32 9
  %2275 = load ptr, ptr %2274, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2275, ptr noundef @.str.52, ptr noundef @__func__.cursor_put, i32 noundef 1052) #13
  unreachable

2276:                                             ; preds = %2253
  br label %2277

2277:                                             ; preds = %2276
  br label %2278

2278:                                             ; preds = %2277
  br label %2279

2279:                                             ; preds = %2278, %2241
  br label %2280

2280:                                             ; preds = %2279
  br label %2281

2281:                                             ; preds = %2280
  br label %2282

2282:                                             ; preds = %2281
  %2283 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2284 = zext i8 %2283 to i32
  %2285 = and i32 %2284, 1
  %2286 = icmp ne i32 %2285, 0
  %2287 = xor i1 %2286, true
  %2288 = xor i1 %2287, true
  %2289 = zext i1 %2288 to i32
  %2290 = sext i32 %2289 to i64
  %2291 = call i64 @llvm.expect.i64(i64 %2290, i64 1)
  %2292 = icmp ne i64 %2291, 0
  br i1 %2292, label %2293, label %2313

2293:                                             ; preds = %2282
  br label %2294

2294:                                             ; preds = %2293
  %2295 = load ptr, ptr %26, align 8, !tbaa !5
  %2296 = icmp ne ptr %2295, null
  %2297 = xor i1 %2296, true
  %2298 = xor i1 %2297, true
  %2299 = xor i1 %2298, true
  %2300 = zext i1 %2299 to i32
  %2301 = sext i32 %2300 to i64
  %2302 = call i64 @llvm.expect.i64(i64 %2301, i64 0)
  %2303 = icmp ne i64 %2302, 0
  br i1 %2303, label %2304, label %2310

2304:                                             ; preds = %2294
  %2305 = load ptr, ptr %6, align 8, !tbaa !5
  %2306 = getelementptr inbounds %struct.MDBX_cursor, ptr %2305, i32 0, i32 5
  %2307 = load ptr, ptr %2306, align 8, !tbaa !11
  %2308 = getelementptr inbounds %struct.MDBX_txn, ptr %2307, i32 0, i32 9
  %2309 = load ptr, ptr %2308, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2309, ptr noundef @.str.69, ptr noundef @__func__.cursor_put, i32 noundef 1053) #13
  unreachable

2310:                                             ; preds = %2294
  br label %2311

2311:                                             ; preds = %2310
  br label %2312

2312:                                             ; preds = %2311
  br label %2313

2313:                                             ; preds = %2312, %2282
  br label %2314

2314:                                             ; preds = %2313
  br label %2315

2315:                                             ; preds = %2314
  %2316 = load i32, ptr %9, align 4, !tbaa !9
  %2317 = and i32 %2316, 32
  %2318 = icmp ne i32 %2317, 0
  br i1 %2318, label %2319, label %2320

2319:                                             ; preds = %2315
  store i32 -30799, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

2320:                                             ; preds = %2315
  store i32 0, ptr %17, align 4, !tbaa !9
  %2321 = load ptr, ptr %26, align 8, !tbaa !5
  %2322 = icmp ne ptr %2321, null
  %2323 = xor i1 %2322, true
  %2324 = xor i1 %2323, true
  %2325 = zext i1 %2324 to i32
  %2326 = sext i32 %2325 to i64
  %2327 = call i64 @llvm.expect.i64(i64 %2326, i64 0)
  %2328 = icmp ne i64 %2327, 0
  br i1 %2328, label %2329, label %2330

2329:                                             ; preds = %2320
  br label %4438

2330:                                             ; preds = %2320
  %2331 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %2331, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

2332:                                             ; preds = %2237
  br label %2333

2333:                                             ; preds = %2332, %2236
  %2334 = load i32, ptr %9, align 4, !tbaa !9
  %2335 = and i32 %2334, 64
  %2336 = icmp ne i32 %2335, 0
  br i1 %2336, label %2337, label %2378

2337:                                             ; preds = %2333
  br label %2338

2338:                                             ; preds = %2337
  %2339 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2340 = zext i8 %2339 to i32
  %2341 = and i32 %2340, 1
  %2342 = icmp ne i32 %2341, 0
  %2343 = xor i1 %2342, true
  %2344 = xor i1 %2343, true
  %2345 = zext i1 %2344 to i32
  %2346 = sext i32 %2345 to i64
  %2347 = call i64 @llvm.expect.i64(i64 %2346, i64 1)
  %2348 = icmp ne i64 %2347, 0
  br i1 %2348, label %2349, label %2375

2349:                                             ; preds = %2338
  br label %2350

2350:                                             ; preds = %2349
  %2351 = load ptr, ptr %7, align 8, !tbaa !5
  %2352 = load ptr, ptr %8, align 8, !tbaa !5
  %2353 = call i64 @node_size(ptr noundef %2351, ptr noundef %2352) #12
  %2354 = load ptr, ptr %12, align 8, !tbaa !5
  %2355 = getelementptr inbounds %struct.MDBX_env, ptr %2354, i32 0, i32 8
  %2356 = load i16, ptr %2355, align 8, !tbaa !36
  %2357 = zext i16 %2356 to i64
  %2358 = icmp ule i64 %2353, %2357
  %2359 = xor i1 %2358, true
  %2360 = xor i1 %2359, true
  %2361 = xor i1 %2360, true
  %2362 = zext i1 %2361 to i32
  %2363 = sext i32 %2362 to i64
  %2364 = call i64 @llvm.expect.i64(i64 %2363, i64 0)
  %2365 = icmp ne i64 %2364, 0
  br i1 %2365, label %2366, label %2372

2366:                                             ; preds = %2350
  %2367 = load ptr, ptr %6, align 8, !tbaa !5
  %2368 = getelementptr inbounds %struct.MDBX_cursor, ptr %2367, i32 0, i32 5
  %2369 = load ptr, ptr %2368, align 8, !tbaa !11
  %2370 = getelementptr inbounds %struct.MDBX_txn, ptr %2369, i32 0, i32 9
  %2371 = load ptr, ptr %2370, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2371, ptr noundef @.str.70, ptr noundef @__func__.cursor_put, i32 noundef 1065) #13
  unreachable

2372:                                             ; preds = %2350
  br label %2373

2373:                                             ; preds = %2372
  br label %2374

2374:                                             ; preds = %2373
  br label %2375

2375:                                             ; preds = %2374, %2338
  br label %2376

2376:                                             ; preds = %2375
  br label %2377

2377:                                             ; preds = %2376
  br label %3221

2378:                                             ; preds = %2333
  %2379 = load ptr, ptr %36, align 8, !tbaa !5
  %2380 = getelementptr inbounds %struct.page, ptr %2379, i64 1
  %2381 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 0
  store ptr %2380, ptr %2381, align 8, !tbaa !22
  %2382 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  %2383 = load ptr, ptr %2382, align 8, !tbaa !22
  %2384 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2385 = load i64, ptr %2384, align 8, !tbaa !24
  %2386 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 1
  store i64 %2385, ptr %2386, align 8, !tbaa !24
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %2380, ptr align 1 %2383, i64 %2385, i1 false)
  %2387 = load ptr, ptr %36, align 8, !tbaa !5
  %2388 = getelementptr inbounds %struct.page, ptr %2387, i32 0, i32 2
  store i16 66, ptr %2388, align 1, !tbaa !31
  %2389 = load ptr, ptr %36, align 8, !tbaa !5
  %2390 = getelementptr inbounds %struct.page, ptr %2389, i32 0, i32 3
  %2391 = getelementptr inbounds %struct.anon.19, ptr %2390, i32 0, i32 0
  store i16 0, ptr %2391, align 1, !tbaa !25
  %2392 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2393 = load i64, ptr %2392, align 8, !tbaa !24
  %2394 = add i64 20, %2393
  %2395 = load ptr, ptr %8, align 8, !tbaa !5
  %2396 = getelementptr inbounds %struct.iovec, ptr %2395, i32 0, i32 1
  %2397 = load i64, ptr %2396, align 8, !tbaa !24
  %2398 = add i64 %2394, %2397
  %2399 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  store i64 %2398, ptr %2399, align 8, !tbaa !24
  %2400 = load ptr, ptr %6, align 8, !tbaa !5
  %2401 = getelementptr inbounds %struct.MDBX_cursor, ptr %2400, i32 0, i32 6
  %2402 = load ptr, ptr %2401, align 8, !tbaa !45
  %2403 = getelementptr inbounds %struct.tree, ptr %2402, i32 0, i32 0
  %2404 = load i16, ptr %2403, align 4, !tbaa !61
  %2405 = zext i16 %2404 to i32
  %2406 = and i32 %2405, 16
  %2407 = icmp ne i32 %2406, 0
  br i1 %2407, label %2408, label %2480

2408:                                             ; preds = %2378
  %2409 = load ptr, ptr %36, align 8, !tbaa !5
  %2410 = getelementptr inbounds %struct.page, ptr %2409, i32 0, i32 2
  %2411 = load i16, ptr %2410, align 1, !tbaa !31
  %2412 = zext i16 %2411 to i32
  %2413 = or i32 %2412, 32
  %2414 = trunc i32 %2413 to i16
  store i16 %2414, ptr %2410, align 1, !tbaa !31
  %2415 = load ptr, ptr %8, align 8, !tbaa !5
  %2416 = getelementptr inbounds %struct.iovec, ptr %2415, i32 0, i32 1
  %2417 = load i64, ptr %2416, align 8, !tbaa !24
  %2418 = trunc i64 %2417 to i16
  %2419 = load ptr, ptr %36, align 8, !tbaa !5
  %2420 = getelementptr inbounds %struct.page, ptr %2419, i32 0, i32 1
  store i16 %2418, ptr %2420, align 1, !tbaa !31
  %2421 = load ptr, ptr %12, align 8, !tbaa !5
  %2422 = load ptr, ptr %6, align 8, !tbaa !5
  %2423 = getelementptr inbounds %struct.MDBX_cursor, ptr %2422, i32 0, i32 9
  %2424 = load ptr, ptr %6, align 8, !tbaa !5
  %2425 = getelementptr inbounds %struct.MDBX_cursor, ptr %2424, i32 0, i32 1
  %2426 = getelementptr inbounds %struct.anon, ptr %2425, i32 0, i32 1
  %2427 = load i8, ptr %2426, align 1, !tbaa !25
  %2428 = sext i8 %2427 to i64
  %2429 = getelementptr inbounds [32 x ptr], ptr %2423, i64 0, i64 %2428
  %2430 = load ptr, ptr %2429, align 8, !tbaa !5
  %2431 = call i64 @page_room(ptr noundef %2430) #12
  %2432 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2433 = load i64, ptr %2432, align 8, !tbaa !24
  %2434 = add i64 %2431, %2433
  %2435 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2436 = load i64, ptr %2435, align 8, !tbaa !24
  %2437 = load ptr, ptr %8, align 8, !tbaa !5
  %2438 = getelementptr inbounds %struct.iovec, ptr %2437, i32 0, i32 1
  %2439 = load i64, ptr %2438, align 8, !tbaa !24
  %2440 = call i64 @page_subleaf2_reserve(ptr noundef %2421, i64 noundef %2434, i64 noundef %2436, i64 noundef %2439)
  %2441 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2442 = load i64, ptr %2441, align 8, !tbaa !24
  %2443 = add i64 %2442, %2440
  store i64 %2443, ptr %2441, align 8, !tbaa !24
  br label %2444

2444:                                             ; preds = %2408
  %2445 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2446 = zext i8 %2445 to i32
  %2447 = and i32 %2446, 1
  %2448 = icmp ne i32 %2447, 0
  %2449 = xor i1 %2448, true
  %2450 = xor i1 %2449, true
  %2451 = zext i1 %2450 to i32
  %2452 = sext i32 %2451 to i64
  %2453 = call i64 @llvm.expect.i64(i64 %2452, i64 1)
  %2454 = icmp ne i64 %2453, 0
  br i1 %2454, label %2455, label %2477

2455:                                             ; preds = %2444
  br label %2456

2456:                                             ; preds = %2455
  %2457 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2458 = load i64, ptr %2457, align 8, !tbaa !24
  %2459 = and i64 %2458, 1
  %2460 = icmp eq i64 %2459, 0
  %2461 = xor i1 %2460, true
  %2462 = xor i1 %2461, true
  %2463 = xor i1 %2462, true
  %2464 = zext i1 %2463 to i32
  %2465 = sext i32 %2464 to i64
  %2466 = call i64 @llvm.expect.i64(i64 %2465, i64 0)
  %2467 = icmp ne i64 %2466, 0
  br i1 %2467, label %2468, label %2474

2468:                                             ; preds = %2456
  %2469 = load ptr, ptr %6, align 8, !tbaa !5
  %2470 = getelementptr inbounds %struct.MDBX_cursor, ptr %2469, i32 0, i32 5
  %2471 = load ptr, ptr %2470, align 8, !tbaa !11
  %2472 = getelementptr inbounds %struct.MDBX_txn, ptr %2471, i32 0, i32 9
  %2473 = load ptr, ptr %2472, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2473, ptr noundef @.str.71, ptr noundef @__func__.cursor_put, i32 noundef 1087) #13
  unreachable

2474:                                             ; preds = %2456
  br label %2475

2475:                                             ; preds = %2474
  br label %2476

2476:                                             ; preds = %2475
  br label %2477

2477:                                             ; preds = %2476, %2444
  br label %2478

2478:                                             ; preds = %2477
  br label %2479

2479:                                             ; preds = %2478
  br label %2493

2480:                                             ; preds = %2378
  %2481 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2482 = load i64, ptr %2481, align 8, !tbaa !24
  %2483 = and i64 %2482, 1
  %2484 = add i64 20, %2483
  %2485 = load ptr, ptr %8, align 8, !tbaa !5
  %2486 = getelementptr inbounds %struct.iovec, ptr %2485, i32 0, i32 1
  %2487 = load i64, ptr %2486, align 8, !tbaa !24
  %2488 = and i64 %2487, 1
  %2489 = add i64 %2484, %2488
  %2490 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2491 = load i64, ptr %2490, align 8, !tbaa !24
  %2492 = add i64 %2491, %2489
  store i64 %2492, ptr %2490, align 8, !tbaa !24
  br label %2493

2493:                                             ; preds = %2480, %2479
  br label %2494

2494:                                             ; preds = %2493
  %2495 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2496 = zext i8 %2495 to i32
  %2497 = and i32 %2496, 1
  %2498 = icmp ne i32 %2497, 0
  %2499 = xor i1 %2498, true
  %2500 = xor i1 %2499, true
  %2501 = zext i1 %2500 to i32
  %2502 = sext i32 %2501 to i64
  %2503 = call i64 @llvm.expect.i64(i64 %2502, i64 1)
  %2504 = icmp ne i64 %2503, 0
  br i1 %2504, label %2505, label %2527

2505:                                             ; preds = %2494
  br label %2506

2506:                                             ; preds = %2505
  %2507 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2508 = load i64, ptr %2507, align 8, !tbaa !24
  %2509 = and i64 %2508, 1
  %2510 = icmp eq i64 %2509, 0
  %2511 = xor i1 %2510, true
  %2512 = xor i1 %2511, true
  %2513 = xor i1 %2512, true
  %2514 = zext i1 %2513 to i32
  %2515 = sext i32 %2514 to i64
  %2516 = call i64 @llvm.expect.i64(i64 %2515, i64 0)
  %2517 = icmp ne i64 %2516, 0
  br i1 %2517, label %2518, label %2524

2518:                                             ; preds = %2506
  %2519 = load ptr, ptr %6, align 8, !tbaa !5
  %2520 = getelementptr inbounds %struct.MDBX_cursor, ptr %2519, i32 0, i32 5
  %2521 = load ptr, ptr %2520, align 8, !tbaa !11
  %2522 = getelementptr inbounds %struct.MDBX_txn, ptr %2521, i32 0, i32 9
  %2523 = load ptr, ptr %2522, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2523, ptr noundef @.str.71, ptr noundef @__func__.cursor_put, i32 noundef 1091) #13
  unreachable

2524:                                             ; preds = %2506
  br label %2525

2525:                                             ; preds = %2524
  br label %2526

2526:                                             ; preds = %2525
  br label %2527

2527:                                             ; preds = %2526, %2494
  br label %2528

2528:                                             ; preds = %2527
  br label %2529

2529:                                             ; preds = %2528
  %2530 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2531 = load i64, ptr %2530, align 8, !tbaa !24
  %2532 = sub i64 %2531, 20
  %2533 = trunc i64 %2532 to i16
  %2534 = load ptr, ptr %36, align 8, !tbaa !5
  %2535 = getelementptr inbounds %struct.page, ptr %2534, i32 0, i32 3
  %2536 = getelementptr inbounds %struct.anon.19, ptr %2535, i32 0, i32 1
  store i16 %2533, ptr %2536, align 1, !tbaa !25
  %2537 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2538 = load i64, ptr %2537, align 8, !tbaa !24
  %2539 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  store i64 %2538, ptr %2539, align 8, !tbaa !24
  br label %2683

2540:                                             ; preds = %2149
  %2541 = load ptr, ptr %40, align 8, !tbaa !5
  %2542 = call zeroext i8 @node_flags(ptr noundef %2541) #12
  %2543 = zext i8 %2542 to i32
  %2544 = and i32 %2543, 2
  %2545 = icmp ne i32 %2544, 0
  br i1 %2545, label %2546, label %2549

2546:                                             ; preds = %2540
  %2547 = load i32, ptr %9, align 4, !tbaa !9
  %2548 = or i32 %2547, 6
  store i32 %2548, ptr %9, align 4, !tbaa !9
  br label %3893

2549:                                             ; preds = %2540
  %2550 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  %2551 = load ptr, ptr %2550, align 8, !tbaa !22
  store ptr %2551, ptr %36, align 8, !tbaa !5
  %2552 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %2552, label %2553 [
    i32 96, label %2617
    i32 64, label %2617
  ]

2553:                                             ; preds = %2549
  %2554 = load ptr, ptr %36, align 8, !tbaa !5
  %2555 = call zeroext i1 @is_dupfix_leaf(ptr noundef %2554) #12
  br i1 %2555, label %2556, label %2561

2556:                                             ; preds = %2553
  %2557 = load ptr, ptr %36, align 8, !tbaa !5
  %2558 = getelementptr inbounds %struct.page, ptr %2557, i32 0, i32 1
  %2559 = load i16, ptr %2558, align 1, !tbaa !31
  %2560 = zext i16 %2559 to i64
  br label %2565

2561:                                             ; preds = %2553
  %2562 = load ptr, ptr %8, align 8, !tbaa !5
  %2563 = call i64 @node_size(ptr noundef %2562, ptr noundef null) #12
  %2564 = add i64 %2563, 2
  br label %2565

2565:                                             ; preds = %2561, %2556
  %2566 = phi i64 [ %2560, %2556 ], [ %2564, %2561 ]
  store i64 %2566, ptr %48, align 8, !tbaa !55
  %2567 = load ptr, ptr %36, align 8, !tbaa !5
  %2568 = call i64 @page_room(ptr noundef %2567) #12
  %2569 = load i64, ptr %48, align 8, !tbaa !55
  %2570 = icmp uge i64 %2568, %2569
  br i1 %2570, label %2571, label %2572

2571:                                             ; preds = %2565
  br label %2618

2572:                                             ; preds = %2565
  %2573 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2574 = load i64, ptr %2573, align 8, !tbaa !24
  %2575 = load i64, ptr %48, align 8, !tbaa !55
  %2576 = and i64 %2575, 1
  %2577 = load i64, ptr %48, align 8, !tbaa !55
  %2578 = add i64 %2577, %2576
  store i64 %2578, ptr %48, align 8, !tbaa !55
  %2579 = add i64 %2574, %2578
  %2580 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  store i64 %2579, ptr %2580, align 8, !tbaa !24
  %2581 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2582 = load i64, ptr %2581, align 8, !tbaa !24
  %2583 = load ptr, ptr %12, align 8, !tbaa !5
  %2584 = getelementptr inbounds %struct.MDBX_env, ptr %2583, i32 0, i32 10
  %2585 = load i16, ptr %2584, align 4, !tbaa !78
  %2586 = zext i16 %2585 to i64
  %2587 = icmp ugt i64 %2582, %2586
  br i1 %2587, label %2588, label %2589

2588:                                             ; preds = %2572
  br label %2740

2589:                                             ; preds = %2572
  %2590 = load ptr, ptr %36, align 8, !tbaa !5
  %2591 = call zeroext i1 @is_dupfix_leaf(ptr noundef %2590) #12
  br i1 %2591, label %2592, label %2615

2592:                                             ; preds = %2589
  %2593 = load ptr, ptr %12, align 8, !tbaa !5
  %2594 = load ptr, ptr %6, align 8, !tbaa !5
  %2595 = getelementptr inbounds %struct.MDBX_cursor, ptr %2594, i32 0, i32 9
  %2596 = load ptr, ptr %6, align 8, !tbaa !5
  %2597 = getelementptr inbounds %struct.MDBX_cursor, ptr %2596, i32 0, i32 1
  %2598 = getelementptr inbounds %struct.anon, ptr %2597, i32 0, i32 1
  %2599 = load i8, ptr %2598, align 1, !tbaa !25
  %2600 = sext i8 %2599 to i64
  %2601 = getelementptr inbounds [32 x ptr], ptr %2595, i64 0, i64 %2600
  %2602 = load ptr, ptr %2601, align 8, !tbaa !5
  %2603 = call i64 @page_room(ptr noundef %2602) #12
  %2604 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2605 = load i64, ptr %2604, align 8, !tbaa !24
  %2606 = add i64 %2603, %2605
  %2607 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2608 = load i64, ptr %2607, align 8, !tbaa !24
  %2609 = load ptr, ptr %8, align 8, !tbaa !5
  %2610 = getelementptr inbounds %struct.iovec, ptr %2609, i32 0, i32 1
  %2611 = load i64, ptr %2610, align 8, !tbaa !24
  %2612 = call i64 @page_subleaf2_reserve(ptr noundef %2593, i64 noundef %2606, i64 noundef %2608, i64 noundef %2611)
  %2613 = load i64, ptr %48, align 8, !tbaa !55
  %2614 = add i64 %2613, %2612
  store i64 %2614, ptr %48, align 8, !tbaa !55
  br label %2616

2615:                                             ; preds = %2589
  br label %2616

2616:                                             ; preds = %2615, %2592
  br label %2640

2617:                                             ; preds = %2549, %2549
  br label %2618

2618:                                             ; preds = %2617, %2571
  %2619 = load ptr, ptr %6, align 8, !tbaa !5
  %2620 = getelementptr inbounds %struct.MDBX_cursor, ptr %2619, i32 0, i32 5
  %2621 = load ptr, ptr %2620, align 8, !tbaa !11
  %2622 = getelementptr inbounds %struct.MDBX_txn, ptr %2621, i32 0, i32 8
  %2623 = load i64, ptr %2622, align 8, !tbaa !69
  %2624 = load ptr, ptr %36, align 8, !tbaa !5
  %2625 = getelementptr inbounds %struct.page, ptr %2624, i32 0, i32 0
  store i64 %2623, ptr %2625, align 1, !tbaa !55
  %2626 = load ptr, ptr %49, align 8, !tbaa !5
  %2627 = getelementptr inbounds %struct.page, ptr %2626, i32 0, i32 4
  %2628 = load i32, ptr %2627, align 1, !tbaa !9
  %2629 = load ptr, ptr %36, align 8, !tbaa !5
  %2630 = getelementptr inbounds %struct.page, ptr %2629, i32 0, i32 4
  store i32 %2628, ptr %2630, align 1, !tbaa !9
  %2631 = load ptr, ptr %36, align 8, !tbaa !5
  %2632 = load ptr, ptr %6, align 8, !tbaa !5
  %2633 = getelementptr inbounds %struct.MDBX_cursor, ptr %2632, i32 0, i32 8
  %2634 = load ptr, ptr %2633, align 8, !tbaa !30
  %2635 = getelementptr inbounds %struct.inner_cursor, ptr %2634, i32 0, i32 0
  %2636 = getelementptr inbounds %struct.MDBX_cursor, ptr %2635, i32 0, i32 9
  %2637 = getelementptr inbounds [32 x ptr], ptr %2636, i64 0, i64 0
  store ptr %2631, ptr %2637, align 8, !tbaa !5
  %2638 = load i32, ptr %9, align 4, !tbaa !9
  %2639 = or i32 %2638, 4
  store i32 %2639, ptr %9, align 4, !tbaa !9
  br label %3893

2640:                                             ; preds = %2616
  %2641 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2642 = load i64, ptr %2641, align 8, !tbaa !24
  %2643 = load i64, ptr %48, align 8, !tbaa !55
  %2644 = add i64 %2642, %2643
  %2645 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  store i64 %2644, ptr %2645, align 8, !tbaa !24
  br label %2646

2646:                                             ; preds = %2640
  %2647 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2648 = zext i8 %2647 to i32
  %2649 = and i32 %2648, 1
  %2650 = icmp ne i32 %2649, 0
  %2651 = xor i1 %2650, true
  %2652 = xor i1 %2651, true
  %2653 = zext i1 %2652 to i32
  %2654 = sext i32 %2653 to i64
  %2655 = call i64 @llvm.expect.i64(i64 %2654, i64 1)
  %2656 = icmp ne i64 %2655, 0
  br i1 %2656, label %2657, label %2679

2657:                                             ; preds = %2646
  br label %2658

2658:                                             ; preds = %2657
  %2659 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2660 = load i64, ptr %2659, align 8, !tbaa !24
  %2661 = and i64 %2660, 1
  %2662 = icmp eq i64 %2661, 0
  %2663 = xor i1 %2662, true
  %2664 = xor i1 %2663, true
  %2665 = xor i1 %2664, true
  %2666 = zext i1 %2665 to i32
  %2667 = sext i32 %2666 to i64
  %2668 = call i64 @llvm.expect.i64(i64 %2667, i64 0)
  %2669 = icmp ne i64 %2668, 0
  br i1 %2669, label %2670, label %2676

2670:                                             ; preds = %2658
  %2671 = load ptr, ptr %6, align 8, !tbaa !5
  %2672 = getelementptr inbounds %struct.MDBX_cursor, ptr %2671, i32 0, i32 5
  %2673 = load ptr, ptr %2672, align 8, !tbaa !11
  %2674 = getelementptr inbounds %struct.MDBX_txn, ptr %2673, i32 0, i32 9
  %2675 = load ptr, ptr %2674, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2675, ptr noundef @.str.71, ptr noundef @__func__.cursor_put, i32 noundef 1192) #13
  unreachable

2676:                                             ; preds = %2658
  br label %2677

2677:                                             ; preds = %2676
  br label %2678

2678:                                             ; preds = %2677
  br label %2679

2679:                                             ; preds = %2678, %2646
  br label %2680

2680:                                             ; preds = %2679
  br label %2681

2681:                                             ; preds = %2680
  br label %2682

2682:                                             ; preds = %2681
  br label %2683

2683:                                             ; preds = %2682, %2529
  %2684 = load ptr, ptr %36, align 8, !tbaa !5
  %2685 = getelementptr inbounds %struct.page, ptr %2684, i32 0, i32 2
  %2686 = load i16, ptr %2685, align 1, !tbaa !31
  store i16 %2686, ptr %35, align 2, !tbaa !31
  %2687 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2688 = load i64, ptr %2687, align 8, !tbaa !24
  %2689 = load ptr, ptr %12, align 8, !tbaa !5
  %2690 = getelementptr inbounds %struct.MDBX_env, ptr %2689, i32 0, i32 10
  %2691 = load i16, ptr %2690, align 4, !tbaa !78
  %2692 = zext i16 %2691 to i64
  %2693 = icmp ugt i64 %2688, %2692
  br i1 %2693, label %2739, label %2694

2694:                                             ; preds = %2683
  %2695 = load ptr, ptr %40, align 8, !tbaa !5
  %2696 = call i64 @node_ks(ptr noundef %2695) #12
  %2697 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2698 = load i64, ptr %2697, align 8, !tbaa !24
  %2699 = call i64 @node_size_len(i64 noundef %2696, i64 noundef %2698) #16
  %2700 = load ptr, ptr %12, align 8, !tbaa !5
  %2701 = getelementptr inbounds %struct.MDBX_env, ptr %2700, i32 0, i32 8
  %2702 = load i16, ptr %2701, align 8, !tbaa !36
  %2703 = zext i16 %2702 to i64
  %2704 = icmp ugt i64 %2699, %2703
  br i1 %2704, label %2739, label %2705

2705:                                             ; preds = %2694
  %2706 = load ptr, ptr %12, align 8, !tbaa !5
  %2707 = getelementptr inbounds %struct.MDBX_env, ptr %2706, i32 0, i32 11
  %2708 = load i16, ptr %2707, align 2, !tbaa !79
  %2709 = zext i16 %2708 to i32
  %2710 = icmp ne i32 %2709, 0
  br i1 %2710, label %2711, label %2904

2711:                                             ; preds = %2705
  %2712 = load ptr, ptr %6, align 8, !tbaa !5
  %2713 = getelementptr inbounds %struct.MDBX_cursor, ptr %2712, i32 0, i32 9
  %2714 = load ptr, ptr %6, align 8, !tbaa !5
  %2715 = getelementptr inbounds %struct.MDBX_cursor, ptr %2714, i32 0, i32 1
  %2716 = getelementptr inbounds %struct.anon, ptr %2715, i32 0, i32 1
  %2717 = load i8, ptr %2716, align 1, !tbaa !25
  %2718 = sext i8 %2717 to i64
  %2719 = getelementptr inbounds [32 x ptr], ptr %2713, i64 0, i64 %2718
  %2720 = load ptr, ptr %2719, align 8, !tbaa !5
  %2721 = call i64 @page_room(ptr noundef %2720) #12
  %2722 = load ptr, ptr %40, align 8, !tbaa !5
  %2723 = call i64 @node_ks(ptr noundef %2722) #12
  %2724 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2725 = load i64, ptr %2724, align 8, !tbaa !24
  %2726 = call i64 @node_size_len(i64 noundef %2723, i64 noundef %2725) #16
  %2727 = add i64 %2721, %2726
  %2728 = load ptr, ptr %12, align 8, !tbaa !5
  %2729 = getelementptr inbounds %struct.MDBX_env, ptr %2728, i32 0, i32 11
  %2730 = load i16, ptr %2729, align 2, !tbaa !79
  %2731 = zext i16 %2730 to i64
  %2732 = load ptr, ptr %40, align 8, !tbaa !5
  %2733 = call i64 @node_ks(ptr noundef %2732) #12
  %2734 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  %2735 = load i64, ptr %2734, align 8, !tbaa !24
  %2736 = call i64 @node_size_len(i64 noundef %2733, i64 noundef %2735) #16
  %2737 = add i64 %2731, %2736
  %2738 = icmp ult i64 %2727, %2737
  br i1 %2738, label %2739, label %2904

2739:                                             ; preds = %2711, %2694, %2683
  br label %2740

2740:                                             ; preds = %2739, %2588, %1432
  %2741 = load i16, ptr %35, align 2, !tbaa !31
  %2742 = zext i16 %2741 to i32
  %2743 = and i32 %2742, -65
  %2744 = trunc i32 %2743 to i16
  store i16 %2744, ptr %35, align 2, !tbaa !31
  %2745 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 2
  store i32 0, ptr %2745, align 4, !tbaa !66
  %2746 = load ptr, ptr %6, align 8, !tbaa !5
  %2747 = getelementptr inbounds %struct.MDBX_cursor, ptr %2746, i32 0, i32 6
  %2748 = load ptr, ptr %2747, align 8, !tbaa !45
  %2749 = getelementptr inbounds %struct.tree, ptr %2748, i32 0, i32 0
  %2750 = load i16, ptr %2749, align 4, !tbaa !61
  %2751 = call zeroext i16 @flags_db2sub(i16 noundef zeroext %2750) #16
  %2752 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 0
  store i16 %2751, ptr %2752, align 4, !tbaa !61
  %2753 = load ptr, ptr %6, align 8, !tbaa !5
  %2754 = getelementptr inbounds %struct.MDBX_cursor, ptr %2753, i32 0, i32 6
  %2755 = load ptr, ptr %2754, align 8, !tbaa !45
  %2756 = getelementptr inbounds %struct.tree, ptr %2755, i32 0, i32 0
  %2757 = load i16, ptr %2756, align 4, !tbaa !61
  %2758 = zext i16 %2757 to i32
  %2759 = and i32 %2758, 16
  %2760 = icmp ne i32 %2759, 0
  br i1 %2760, label %2761, label %2771

2761:                                             ; preds = %2740
  %2762 = load i16, ptr %35, align 2, !tbaa !31
  %2763 = zext i16 %2762 to i32
  %2764 = or i32 %2763, 32
  %2765 = trunc i32 %2764 to i16
  store i16 %2765, ptr %35, align 2, !tbaa !31
  %2766 = load ptr, ptr %36, align 8, !tbaa !5
  %2767 = getelementptr inbounds %struct.page, ptr %2766, i32 0, i32 1
  %2768 = load i16, ptr %2767, align 1, !tbaa !31
  %2769 = zext i16 %2768 to i32
  %2770 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 2
  store i32 %2769, ptr %2770, align 4, !tbaa !66
  br label %2771

2771:                                             ; preds = %2761, %2740
  %2772 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 1
  store i16 1, ptr %2772, align 2, !tbaa !46
  %2773 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 4
  store i32 0, ptr %2773, align 4, !tbaa !80
  %2774 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 5
  store i32 1, ptr %2774, align 4, !tbaa !81
  %2775 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 6
  store i32 0, ptr %2775, align 4, !tbaa !82
  %2776 = load ptr, ptr %36, align 8, !tbaa !5
  %2777 = call i64 @page_numkeys(ptr noundef %2776) #12
  %2778 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 8
  store i64 %2777, ptr %2778, align 4, !tbaa !48
  %2779 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 1
  store i64 48, ptr %2779, align 8, !tbaa !24
  %2780 = getelementptr inbounds %struct.iovec, ptr %24, i32 0, i32 0
  store ptr %31, ptr %2780, align 8, !tbaa !22
  %2781 = load ptr, ptr %6, align 8, !tbaa !5
  %2782 = call { ptr, i32 } @gc_alloc_single(ptr noundef %2781)
  %2783 = getelementptr inbounds { ptr, i32 }, ptr %51, i32 0, i32 0
  %2784 = extractvalue { ptr, i32 } %2782, 0
  store ptr %2784, ptr %2783, align 8
  %2785 = getelementptr inbounds { ptr, i32 }, ptr %51, i32 0, i32 1
  %2786 = extractvalue { ptr, i32 } %2782, 1
  store i32 %2786, ptr %2785, align 8
  %2787 = getelementptr inbounds %struct.page_get_result, ptr %51, i32 0, i32 0
  %2788 = load ptr, ptr %2787, align 8, !tbaa !59
  store ptr %2788, ptr %49, align 8, !tbaa !5
  %2789 = getelementptr inbounds %struct.page_get_result, ptr %51, i32 0, i32 1
  %2790 = load i32, ptr %2789, align 8, !tbaa !57
  %2791 = icmp ne i32 %2790, 0
  %2792 = xor i1 %2791, true
  %2793 = xor i1 %2792, true
  %2794 = zext i1 %2793 to i32
  %2795 = sext i32 %2794 to i64
  %2796 = call i64 @llvm.expect.i64(i64 %2795, i64 0)
  %2797 = icmp ne i64 %2796, 0
  br i1 %2797, label %2798, label %2801

2798:                                             ; preds = %2771
  %2799 = getelementptr inbounds %struct.page_get_result, ptr %51, i32 0, i32 1
  %2800 = load i32, ptr %2799, align 8, !tbaa !57
  store i32 %2800, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

2801:                                             ; preds = %2771
  %2802 = load ptr, ptr %6, align 8, !tbaa !5
  %2803 = getelementptr inbounds %struct.MDBX_cursor, ptr %2802, i32 0, i32 6
  %2804 = load ptr, ptr %2803, align 8, !tbaa !45
  %2805 = getelementptr inbounds %struct.tree, ptr %2804, i32 0, i32 5
  %2806 = load i32, ptr %2805, align 4, !tbaa !81
  %2807 = add i32 %2806, 1
  store i32 %2807, ptr %2805, align 4, !tbaa !81
  br label %2808

2808:                                             ; preds = %2801
  %2809 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2810 = zext i8 %2809 to i32
  %2811 = and i32 %2810, 1
  %2812 = icmp ne i32 %2811, 0
  %2813 = xor i1 %2812, true
  %2814 = xor i1 %2813, true
  %2815 = zext i1 %2814 to i32
  %2816 = sext i32 %2815 to i64
  %2817 = call i64 @llvm.expect.i64(i64 %2816, i64 1)
  %2818 = icmp ne i64 %2817, 0
  br i1 %2818, label %2819, label %2844

2819:                                             ; preds = %2808
  br label %2820

2820:                                             ; preds = %2819
  %2821 = load ptr, ptr %12, align 8, !tbaa !5
  %2822 = getelementptr inbounds %struct.MDBX_env, ptr %2821, i32 0, i32 2
  %2823 = load i32, ptr %2822, align 8, !tbaa !77
  %2824 = zext i32 %2823 to i64
  %2825 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2826 = load i64, ptr %2825, align 8, !tbaa !24
  %2827 = icmp ugt i64 %2824, %2826
  %2828 = xor i1 %2827, true
  %2829 = xor i1 %2828, true
  %2830 = xor i1 %2829, true
  %2831 = zext i1 %2830 to i32
  %2832 = sext i32 %2831 to i64
  %2833 = call i64 @llvm.expect.i64(i64 %2832, i64 0)
  %2834 = icmp ne i64 %2833, 0
  br i1 %2834, label %2835, label %2841

2835:                                             ; preds = %2820
  %2836 = load ptr, ptr %6, align 8, !tbaa !5
  %2837 = getelementptr inbounds %struct.MDBX_cursor, ptr %2836, i32 0, i32 5
  %2838 = load ptr, ptr %2837, align 8, !tbaa !11
  %2839 = getelementptr inbounds %struct.MDBX_txn, ptr %2838, i32 0, i32 9
  %2840 = load ptr, ptr %2839, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2840, ptr noundef @.str.72, ptr noundef @__func__.cursor_put, i32 noundef 1221) #13
  unreachable

2841:                                             ; preds = %2820
  br label %2842

2842:                                             ; preds = %2841
  br label %2843

2843:                                             ; preds = %2842
  br label %2844

2844:                                             ; preds = %2843, %2808
  br label %2845

2845:                                             ; preds = %2844
  br label %2846

2846:                                             ; preds = %2845
  %2847 = load ptr, ptr %12, align 8, !tbaa !5
  %2848 = getelementptr inbounds %struct.MDBX_env, ptr %2847, i32 0, i32 2
  %2849 = load i32, ptr %2848, align 8, !tbaa !77
  %2850 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %2851 = load i64, ptr %2850, align 8, !tbaa !24
  %2852 = trunc i64 %2851 to i32
  %2853 = sub i32 %2849, %2852
  %2854 = zext i32 %2853 to i64
  store i64 %2854, ptr %48, align 8, !tbaa !55
  br label %2855

2855:                                             ; preds = %2846
  %2856 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2857 = zext i8 %2856 to i32
  %2858 = and i32 %2857, 1
  %2859 = icmp ne i32 %2858, 0
  %2860 = xor i1 %2859, true
  %2861 = xor i1 %2860, true
  %2862 = zext i1 %2861 to i32
  %2863 = sext i32 %2862 to i64
  %2864 = call i64 @llvm.expect.i64(i64 %2863, i64 1)
  %2865 = icmp ne i64 %2864, 0
  br i1 %2865, label %2866, label %2887

2866:                                             ; preds = %2855
  br label %2867

2867:                                             ; preds = %2866
  %2868 = load i64, ptr %48, align 8, !tbaa !55
  %2869 = and i64 %2868, 1
  %2870 = icmp eq i64 %2869, 0
  %2871 = xor i1 %2870, true
  %2872 = xor i1 %2871, true
  %2873 = xor i1 %2872, true
  %2874 = zext i1 %2873 to i32
  %2875 = sext i32 %2874 to i64
  %2876 = call i64 @llvm.expect.i64(i64 %2875, i64 0)
  %2877 = icmp ne i64 %2876, 0
  br i1 %2877, label %2878, label %2884

2878:                                             ; preds = %2867
  %2879 = load ptr, ptr %6, align 8, !tbaa !5
  %2880 = getelementptr inbounds %struct.MDBX_cursor, ptr %2879, i32 0, i32 5
  %2881 = load ptr, ptr %2880, align 8, !tbaa !11
  %2882 = getelementptr inbounds %struct.MDBX_txn, ptr %2881, i32 0, i32 9
  %2883 = load ptr, ptr %2882, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2883, ptr noundef @.str.73, ptr noundef @__func__.cursor_put, i32 noundef 1223) #13
  unreachable

2884:                                             ; preds = %2867
  br label %2885

2885:                                             ; preds = %2884
  br label %2886

2886:                                             ; preds = %2885
  br label %2887

2887:                                             ; preds = %2886, %2855
  br label %2888

2888:                                             ; preds = %2887
  br label %2889

2889:                                             ; preds = %2888
  %2890 = load i32, ptr %9, align 4, !tbaa !9
  %2891 = or i32 %2890, 6
  store i32 %2891, ptr %9, align 4, !tbaa !9
  %2892 = load ptr, ptr %49, align 8, !tbaa !5
  %2893 = getelementptr inbounds %struct.page, ptr %2892, i32 0, i32 4
  %2894 = load i32, ptr %2893, align 1, !tbaa !9
  %2895 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 3
  store i32 %2894, ptr %2895, align 4, !tbaa !60
  %2896 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 7
  store i64 0, ptr %2896, align 4, !tbaa !83
  %2897 = load ptr, ptr %6, align 8, !tbaa !5
  %2898 = getelementptr inbounds %struct.MDBX_cursor, ptr %2897, i32 0, i32 5
  %2899 = load ptr, ptr %2898, align 8, !tbaa !11
  %2900 = getelementptr inbounds %struct.MDBX_txn, ptr %2899, i32 0, i32 7
  %2901 = load i64, ptr %2900, align 8, !tbaa !75
  %2902 = getelementptr inbounds %struct.tree, ptr %31, i32 0, i32 9
  store i64 %2901, ptr %2902, align 4, !tbaa !84
  %2903 = load ptr, ptr %49, align 8, !tbaa !5
  store ptr %2903, ptr %32, align 8, !tbaa !5
  br label %2904

2904:                                             ; preds = %2889, %2711, %2705
  %2905 = load ptr, ptr %49, align 8, !tbaa !5
  %2906 = load ptr, ptr %36, align 8, !tbaa !5
  %2907 = icmp ne ptr %2905, %2906
  br i1 %2907, label %2908, label %3197

2908:                                             ; preds = %2904
  %2909 = load i16, ptr %35, align 2, !tbaa !31
  %2910 = load ptr, ptr %49, align 8, !tbaa !5
  %2911 = getelementptr inbounds %struct.page, ptr %2910, i32 0, i32 2
  store i16 %2909, ptr %2911, align 1, !tbaa !31
  %2912 = load ptr, ptr %6, align 8, !tbaa !5
  %2913 = getelementptr inbounds %struct.MDBX_cursor, ptr %2912, i32 0, i32 5
  %2914 = load ptr, ptr %2913, align 8, !tbaa !11
  %2915 = getelementptr inbounds %struct.MDBX_txn, ptr %2914, i32 0, i32 8
  %2916 = load i64, ptr %2915, align 8, !tbaa !69
  %2917 = load ptr, ptr %49, align 8, !tbaa !5
  %2918 = getelementptr inbounds %struct.page, ptr %2917, i32 0, i32 0
  store i64 %2916, ptr %2918, align 1, !tbaa !55
  %2919 = load ptr, ptr %36, align 8, !tbaa !5
  %2920 = getelementptr inbounds %struct.page, ptr %2919, i32 0, i32 1
  %2921 = load i16, ptr %2920, align 1, !tbaa !31
  %2922 = load ptr, ptr %49, align 8, !tbaa !5
  %2923 = getelementptr inbounds %struct.page, ptr %2922, i32 0, i32 1
  store i16 %2921, ptr %2923, align 1, !tbaa !31
  %2924 = load ptr, ptr %36, align 8, !tbaa !5
  %2925 = getelementptr inbounds %struct.page, ptr %2924, i32 0, i32 3
  %2926 = getelementptr inbounds %struct.anon.19, ptr %2925, i32 0, i32 0
  %2927 = load i16, ptr %2926, align 1, !tbaa !25
  %2928 = load ptr, ptr %49, align 8, !tbaa !5
  %2929 = getelementptr inbounds %struct.page, ptr %2928, i32 0, i32 3
  %2930 = getelementptr inbounds %struct.anon.19, ptr %2929, i32 0, i32 0
  store i16 %2927, ptr %2930, align 1, !tbaa !25
  br label %2931

2931:                                             ; preds = %2908
  %2932 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %2933 = zext i8 %2932 to i32
  %2934 = and i32 %2933, 1
  %2935 = icmp ne i32 %2934, 0
  %2936 = xor i1 %2935, true
  %2937 = xor i1 %2936, true
  %2938 = zext i1 %2937 to i32
  %2939 = sext i32 %2938 to i64
  %2940 = call i64 @llvm.expect.i64(i64 %2939, i64 1)
  %2941 = icmp ne i64 %2940, 0
  br i1 %2941, label %2942, label %2968

2942:                                             ; preds = %2931
  br label %2943

2943:                                             ; preds = %2942
  %2944 = load ptr, ptr %36, align 8, !tbaa !5
  %2945 = getelementptr inbounds %struct.page, ptr %2944, i32 0, i32 3
  %2946 = getelementptr inbounds %struct.anon.19, ptr %2945, i32 0, i32 1
  %2947 = load i16, ptr %2946, align 1, !tbaa !25
  %2948 = zext i16 %2947 to i64
  %2949 = load i64, ptr %48, align 8, !tbaa !55
  %2950 = add i64 %2948, %2949
  %2951 = icmp ult i64 %2950, 65535
  %2952 = xor i1 %2951, true
  %2953 = xor i1 %2952, true
  %2954 = xor i1 %2953, true
  %2955 = zext i1 %2954 to i32
  %2956 = sext i32 %2955 to i64
  %2957 = call i64 @llvm.expect.i64(i64 %2956, i64 0)
  %2958 = icmp ne i64 %2957, 0
  br i1 %2958, label %2959, label %2965

2959:                                             ; preds = %2943
  %2960 = load ptr, ptr %6, align 8, !tbaa !5
  %2961 = getelementptr inbounds %struct.MDBX_cursor, ptr %2960, i32 0, i32 5
  %2962 = load ptr, ptr %2961, align 8, !tbaa !11
  %2963 = getelementptr inbounds %struct.MDBX_txn, ptr %2962, i32 0, i32 9
  %2964 = load ptr, ptr %2963, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %2964, ptr noundef @.str.74, ptr noundef @__func__.cursor_put, i32 noundef 1235) #13
  unreachable

2965:                                             ; preds = %2943
  br label %2966

2966:                                             ; preds = %2965
  br label %2967

2967:                                             ; preds = %2966
  br label %2968

2968:                                             ; preds = %2967, %2931
  br label %2969

2969:                                             ; preds = %2968
  br label %2970

2970:                                             ; preds = %2969
  %2971 = load ptr, ptr %36, align 8, !tbaa !5
  %2972 = getelementptr inbounds %struct.page, ptr %2971, i32 0, i32 3
  %2973 = getelementptr inbounds %struct.anon.19, ptr %2972, i32 0, i32 1
  %2974 = load i16, ptr %2973, align 1, !tbaa !25
  %2975 = zext i16 %2974 to i32
  %2976 = load i64, ptr %48, align 8, !tbaa !55
  %2977 = trunc i64 %2976 to i16
  %2978 = zext i16 %2977 to i32
  %2979 = add nsw i32 %2975, %2978
  %2980 = trunc i32 %2979 to i16
  %2981 = load ptr, ptr %49, align 8, !tbaa !5
  %2982 = getelementptr inbounds %struct.page, ptr %2981, i32 0, i32 3
  %2983 = getelementptr inbounds %struct.anon.19, ptr %2982, i32 0, i32 1
  store i16 %2980, ptr %2983, align 1, !tbaa !25
  %2984 = load i16, ptr %35, align 2, !tbaa !31
  %2985 = zext i16 %2984 to i32
  %2986 = and i32 %2985, 32
  %2987 = icmp ne i32 %2986, 0
  %2988 = xor i1 %2987, true
  %2989 = xor i1 %2988, true
  %2990 = zext i1 %2989 to i32
  %2991 = sext i32 %2990 to i64
  %2992 = call i64 @llvm.expect.i64(i64 %2991, i64 0)
  %2993 = icmp ne i64 %2992, 0
  br i1 %2993, label %2994, label %3053

2994:                                             ; preds = %2970
  %2995 = load ptr, ptr %49, align 8, !tbaa !5
  %2996 = call ptr @page_data(ptr noundef %2995) #12
  %2997 = load ptr, ptr %36, align 8, !tbaa !5
  %2998 = call ptr @page_data(ptr noundef %2997) #12
  %2999 = load ptr, ptr %36, align 8, !tbaa !5
  %3000 = call i64 @page_numkeys(ptr noundef %2999) #12
  %3001 = load ptr, ptr %36, align 8, !tbaa !5
  %3002 = getelementptr inbounds %struct.page, ptr %3001, i32 0, i32 1
  %3003 = load i16, ptr %3002, align 1, !tbaa !31
  %3004 = zext i16 %3003 to i64
  %3005 = mul i64 %3000, %3004
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %2996, ptr align 1 %2998, i64 %3005, i1 false)
  br label %3006

3006:                                             ; preds = %2994
  %3007 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3008 = zext i8 %3007 to i32
  %3009 = and i32 %3008, 1
  %3010 = icmp ne i32 %3009, 0
  %3011 = xor i1 %3010, true
  %3012 = xor i1 %3011, true
  %3013 = zext i1 %3012 to i32
  %3014 = sext i32 %3013 to i64
  %3015 = call i64 @llvm.expect.i64(i64 %3014, i64 1)
  %3016 = icmp ne i64 %3015, 0
  br i1 %3016, label %3017, label %3050

3017:                                             ; preds = %3006
  br label %3018

3018:                                             ; preds = %3017
  %3019 = load ptr, ptr %49, align 8, !tbaa !5
  %3020 = getelementptr inbounds %struct.page, ptr %3019, i32 0, i32 1
  %3021 = load i16, ptr %3020, align 1, !tbaa !31
  %3022 = zext i16 %3021 to i64
  %3023 = load ptr, ptr %49, align 8, !tbaa !5
  %3024 = call i64 @page_numkeys(ptr noundef %3023) #12
  %3025 = and i64 %3022, %3024
  %3026 = load ptr, ptr %49, align 8, !tbaa !5
  %3027 = getelementptr inbounds %struct.page, ptr %3026, i32 0, i32 3
  %3028 = getelementptr inbounds %struct.anon.19, ptr %3027, i32 0, i32 1
  %3029 = load i16, ptr %3028, align 1, !tbaa !25
  %3030 = zext i16 %3029 to i64
  %3031 = xor i64 %3025, %3030
  %3032 = and i64 %3031, 1
  %3033 = icmp eq i64 %3032, 0
  %3034 = xor i1 %3033, true
  %3035 = xor i1 %3034, true
  %3036 = xor i1 %3035, true
  %3037 = zext i1 %3036 to i32
  %3038 = sext i32 %3037 to i64
  %3039 = call i64 @llvm.expect.i64(i64 %3038, i64 0)
  %3040 = icmp ne i64 %3039, 0
  br i1 %3040, label %3041, label %3047

3041:                                             ; preds = %3018
  %3042 = load ptr, ptr %6, align 8, !tbaa !5
  %3043 = getelementptr inbounds %struct.MDBX_cursor, ptr %3042, i32 0, i32 5
  %3044 = load ptr, ptr %3043, align 8, !tbaa !11
  %3045 = getelementptr inbounds %struct.MDBX_txn, ptr %3044, i32 0, i32 9
  %3046 = load ptr, ptr %3045, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3046, ptr noundef @.str.75, ptr noundef @__func__.cursor_put, i32 noundef 1239) #13
  unreachable

3047:                                             ; preds = %3018
  br label %3048

3048:                                             ; preds = %3047
  br label %3049

3049:                                             ; preds = %3048
  br label %3050

3050:                                             ; preds = %3049, %3006
  br label %3051

3051:                                             ; preds = %3050
  br label %3052

3052:                                             ; preds = %3051
  br label %3196

3053:                                             ; preds = %2970
  br label %3054

3054:                                             ; preds = %3053
  %3055 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3056 = zext i8 %3055 to i32
  %3057 = and i32 %3056, 1
  %3058 = icmp ne i32 %3057, 0
  %3059 = xor i1 %3058, true
  %3060 = xor i1 %3059, true
  %3061 = zext i1 %3060 to i32
  %3062 = sext i32 %3061 to i64
  %3063 = call i64 @llvm.expect.i64(i64 %3062, i64 1)
  %3064 = icmp ne i64 %3063, 0
  br i1 %3064, label %3065, label %3090

3065:                                             ; preds = %3054
  br label %3066

3066:                                             ; preds = %3065
  %3067 = load ptr, ptr %49, align 8, !tbaa !5
  %3068 = getelementptr inbounds %struct.page, ptr %3067, i32 0, i32 3
  %3069 = getelementptr inbounds %struct.anon.19, ptr %3068, i32 0, i32 1
  %3070 = load i16, ptr %3069, align 1, !tbaa !25
  %3071 = zext i16 %3070 to i32
  %3072 = and i32 %3071, 1
  %3073 = icmp eq i32 %3072, 0
  %3074 = xor i1 %3073, true
  %3075 = xor i1 %3074, true
  %3076 = xor i1 %3075, true
  %3077 = zext i1 %3076 to i32
  %3078 = sext i32 %3077 to i64
  %3079 = call i64 @llvm.expect.i64(i64 %3078, i64 0)
  %3080 = icmp ne i64 %3079, 0
  br i1 %3080, label %3081, label %3087

3081:                                             ; preds = %3066
  %3082 = load ptr, ptr %6, align 8, !tbaa !5
  %3083 = getelementptr inbounds %struct.MDBX_cursor, ptr %3082, i32 0, i32 5
  %3084 = load ptr, ptr %3083, align 8, !tbaa !11
  %3085 = getelementptr inbounds %struct.MDBX_txn, ptr %3084, i32 0, i32 9
  %3086 = load ptr, ptr %3085, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3086, ptr noundef @.str.76, ptr noundef @__func__.cursor_put, i32 noundef 1241) #13
  unreachable

3087:                                             ; preds = %3066
  br label %3088

3088:                                             ; preds = %3087
  br label %3089

3089:                                             ; preds = %3088
  br label %3090

3090:                                             ; preds = %3089, %3054
  br label %3091

3091:                                             ; preds = %3090
  br label %3092

3092:                                             ; preds = %3091
  %3093 = load ptr, ptr %49, align 8, !tbaa !5
  %3094 = ptrtoint ptr %3093 to i64
  %3095 = load ptr, ptr %49, align 8, !tbaa !5
  %3096 = getelementptr inbounds %struct.page, ptr %3095, i32 0, i32 3
  %3097 = getelementptr inbounds %struct.anon.19, ptr %3096, i32 0, i32 1
  %3098 = load i16, ptr %3097, align 1, !tbaa !25
  %3099 = zext i16 %3098 to i32
  %3100 = add i32 %3099, 20
  %3101 = zext i32 %3100 to i64
  %3102 = add nsw i64 %3094, %3101
  %3103 = inttoptr i64 %3102 to ptr
  %3104 = load ptr, ptr %36, align 8, !tbaa !5
  %3105 = ptrtoint ptr %3104 to i64
  %3106 = load ptr, ptr %36, align 8, !tbaa !5
  %3107 = getelementptr inbounds %struct.page, ptr %3106, i32 0, i32 3
  %3108 = getelementptr inbounds %struct.anon.19, ptr %3107, i32 0, i32 1
  %3109 = load i16, ptr %3108, align 1, !tbaa !25
  %3110 = zext i16 %3109 to i32
  %3111 = add i32 %3110, 20
  %3112 = zext i32 %3111 to i64
  %3113 = add nsw i64 %3105, %3112
  %3114 = inttoptr i64 %3113 to ptr
  %3115 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %3116 = load i64, ptr %3115, align 8, !tbaa !24
  %3117 = load ptr, ptr %36, align 8, !tbaa !5
  %3118 = getelementptr inbounds %struct.page, ptr %3117, i32 0, i32 3
  %3119 = getelementptr inbounds %struct.anon.19, ptr %3118, i32 0, i32 1
  %3120 = load i16, ptr %3119, align 1, !tbaa !25
  %3121 = zext i16 %3120 to i64
  %3122 = sub i64 %3116, %3121
  %3123 = sub i64 %3122, 20
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %3103, ptr align 1 %3114, i64 %3123, i1 false)
  %3124 = load ptr, ptr %49, align 8, !tbaa !5
  %3125 = getelementptr inbounds %struct.page, ptr %3124, i32 0, i32 5
  %3126 = getelementptr inbounds [0 x i16], ptr %3125, i64 0, i64 0
  %3127 = load ptr, ptr %36, align 8, !tbaa !5
  %3128 = getelementptr inbounds %struct.page, ptr %3127, i32 0, i32 5
  %3129 = getelementptr inbounds [0 x i16], ptr %3128, i64 0, i64 0
  %3130 = load ptr, ptr %36, align 8, !tbaa !5
  %3131 = call i64 @page_numkeys(ptr noundef %3130) #12
  %3132 = mul i64 %3131, 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %3126, ptr align 1 %3129, i64 %3132, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #11
  store i64 0, ptr %52, align 8, !tbaa !55
  br label %3133

3133:                                             ; preds = %3192, %3092
  %3134 = load i64, ptr %52, align 8, !tbaa !55
  %3135 = load ptr, ptr %36, align 8, !tbaa !5
  %3136 = call i64 @page_numkeys(ptr noundef %3135) #12
  %3137 = icmp ult i64 %3134, %3136
  br i1 %3137, label %3139, label %3138

3138:                                             ; preds = %3133
  store i32 139, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #11
  br label %3195

3139:                                             ; preds = %3133
  br label %3140

3140:                                             ; preds = %3139
  %3141 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3142 = zext i8 %3141 to i32
  %3143 = and i32 %3142, 1
  %3144 = icmp ne i32 %3143, 0
  %3145 = xor i1 %3144, true
  %3146 = xor i1 %3145, true
  %3147 = zext i1 %3146 to i32
  %3148 = sext i32 %3147 to i64
  %3149 = call i64 @llvm.expect.i64(i64 %3148, i64 1)
  %3150 = icmp ne i64 %3149, 0
  br i1 %3150, label %3151, label %3178

3151:                                             ; preds = %3140
  br label %3152

3152:                                             ; preds = %3151
  %3153 = load ptr, ptr %49, align 8, !tbaa !5
  %3154 = getelementptr inbounds %struct.page, ptr %3153, i32 0, i32 5
  %3155 = load i64, ptr %52, align 8, !tbaa !55
  %3156 = getelementptr inbounds [0 x i16], ptr %3154, i64 0, i64 %3155
  %3157 = load i16, ptr %3156, align 1, !tbaa !31
  %3158 = zext i16 %3157 to i64
  %3159 = load i64, ptr %48, align 8, !tbaa !55
  %3160 = add i64 %3158, %3159
  %3161 = icmp ule i64 %3160, 65535
  %3162 = xor i1 %3161, true
  %3163 = xor i1 %3162, true
  %3164 = xor i1 %3163, true
  %3165 = zext i1 %3164 to i32
  %3166 = sext i32 %3165 to i64
  %3167 = call i64 @llvm.expect.i64(i64 %3166, i64 0)
  %3168 = icmp ne i64 %3167, 0
  br i1 %3168, label %3169, label %3175

3169:                                             ; preds = %3152
  %3170 = load ptr, ptr %6, align 8, !tbaa !5
  %3171 = getelementptr inbounds %struct.MDBX_cursor, ptr %3170, i32 0, i32 5
  %3172 = load ptr, ptr %3171, align 8, !tbaa !11
  %3173 = getelementptr inbounds %struct.MDBX_txn, ptr %3172, i32 0, i32 9
  %3174 = load ptr, ptr %3173, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3174, ptr noundef @.str.77, ptr noundef @__func__.cursor_put, i32 noundef 1246) #13
  unreachable

3175:                                             ; preds = %3152
  br label %3176

3176:                                             ; preds = %3175
  br label %3177

3177:                                             ; preds = %3176
  br label %3178

3178:                                             ; preds = %3177, %3140
  br label %3179

3179:                                             ; preds = %3178
  br label %3180

3180:                                             ; preds = %3179
  %3181 = load i64, ptr %48, align 8, !tbaa !55
  %3182 = trunc i64 %3181 to i16
  %3183 = zext i16 %3182 to i32
  %3184 = load ptr, ptr %49, align 8, !tbaa !5
  %3185 = getelementptr inbounds %struct.page, ptr %3184, i32 0, i32 5
  %3186 = load i64, ptr %52, align 8, !tbaa !55
  %3187 = getelementptr inbounds [0 x i16], ptr %3185, i64 0, i64 %3186
  %3188 = load i16, ptr %3187, align 1, !tbaa !31
  %3189 = zext i16 %3188 to i32
  %3190 = add nsw i32 %3189, %3183
  %3191 = trunc i32 %3190 to i16
  store i16 %3191, ptr %3187, align 1, !tbaa !31
  br label %3192

3192:                                             ; preds = %3180
  %3193 = load i64, ptr %52, align 8, !tbaa !55
  %3194 = add i64 %3193, 1
  store i64 %3194, ptr %52, align 8, !tbaa !55
  br label %3133, !llvm.loop !85

3195:                                             ; preds = %3138
  br label %3196

3196:                                             ; preds = %3195, %3052
  br label %3197

3197:                                             ; preds = %3196, %2904
  %3198 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %3199 = trunc i8 %3198 to i1
  br i1 %3199, label %3202, label %3200

3200:                                             ; preds = %3197
  %3201 = load ptr, ptr %6, align 8, !tbaa !5
  call void @node_del(ptr noundef %3201, i64 noundef 0)
  br label %3202

3202:                                             ; preds = %3200, %3197
  store ptr %24, ptr %25, align 8, !tbaa !5
  %3203 = load i32, ptr %9, align 4, !tbaa !9
  %3204 = or i32 %3203, 4
  store i32 %3204, ptr %9, align 4, !tbaa !9
  br label %3591

3205:                                             ; preds = %2140
  %3206 = load ptr, ptr %40, align 8, !tbaa !5
  %3207 = call zeroext i8 @node_flags(ptr noundef %3206) #12
  %3208 = zext i8 %3207 to i32
  %3209 = load i32, ptr %9, align 4, !tbaa !9
  %3210 = xor i32 %3208, %3209
  %3211 = and i32 %3210, 2
  %3212 = icmp ne i32 %3211, 0
  %3213 = xor i1 %3212, true
  %3214 = xor i1 %3213, true
  %3215 = zext i1 %3214 to i32
  %3216 = sext i32 %3215 to i64
  %3217 = call i64 @llvm.expect.i64(i64 %3216, i64 0)
  %3218 = icmp ne i64 %3217, 0
  br i1 %3218, label %3219, label %3220

3219:                                             ; preds = %3205
  store i32 -30784, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

3220:                                             ; preds = %3205
  br label %3221

3221:                                             ; preds = %3220, %2377
  %3222 = load ptr, ptr %8, align 8, !tbaa !5
  %3223 = getelementptr inbounds %struct.iovec, ptr %3222, i32 0, i32 1
  %3224 = load i64, ptr %3223, align 8, !tbaa !24
  %3225 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 1
  %3226 = load i64, ptr %3225, align 8, !tbaa !24
  %3227 = icmp eq i64 %3224, %3226
  br i1 %3227, label %3228, label %3586

3228:                                             ; preds = %3221
  br label %3229

3229:                                             ; preds = %3228
  %3230 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3231 = zext i8 %3230 to i32
  %3232 = and i32 %3231, 1
  %3233 = icmp ne i32 %3232, 0
  %3234 = xor i1 %3233, true
  %3235 = xor i1 %3234, true
  %3236 = zext i1 %3235 to i32
  %3237 = sext i32 %3236 to i64
  %3238 = call i64 @llvm.expect.i64(i64 %3237, i64 1)
  %3239 = icmp ne i64 %3238, 0
  br i1 %3239, label %3240, label %3268

3240:                                             ; preds = %3229
  br label %3241

3241:                                             ; preds = %3240
  %3242 = load ptr, ptr %7, align 8, !tbaa !5
  %3243 = getelementptr inbounds %struct.iovec, ptr %3242, i32 0, i32 1
  %3244 = load i64, ptr %3243, align 8, !tbaa !24
  %3245 = add i64 %3244, 1
  %3246 = and i64 %3245, -2
  %3247 = load ptr, ptr %40, align 8, !tbaa !5
  %3248 = call i64 @node_ks(ptr noundef %3247) #12
  %3249 = add i64 %3248, 1
  %3250 = and i64 %3249, -2
  %3251 = icmp eq i64 %3246, %3250
  %3252 = xor i1 %3251, true
  %3253 = xor i1 %3252, true
  %3254 = xor i1 %3253, true
  %3255 = zext i1 %3254 to i32
  %3256 = sext i32 %3255 to i64
  %3257 = call i64 @llvm.expect.i64(i64 %3256, i64 0)
  %3258 = icmp ne i64 %3257, 0
  br i1 %3258, label %3259, label %3265

3259:                                             ; preds = %3241
  %3260 = load ptr, ptr %6, align 8, !tbaa !5
  %3261 = getelementptr inbounds %struct.MDBX_cursor, ptr %3260, i32 0, i32 5
  %3262 = load ptr, ptr %3261, align 8, !tbaa !11
  %3263 = getelementptr inbounds %struct.MDBX_txn, ptr %3262, i32 0, i32 9
  %3264 = load ptr, ptr %3263, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3264, ptr noundef @.str.78, ptr noundef @__func__.cursor_put, i32 noundef 1265) #13
  unreachable

3265:                                             ; preds = %3241
  br label %3266

3266:                                             ; preds = %3265
  br label %3267

3267:                                             ; preds = %3266
  br label %3268

3268:                                             ; preds = %3267, %3229
  br label %3269

3269:                                             ; preds = %3268
  br label %3270

3270:                                             ; preds = %3269
  %3271 = load i32, ptr %9, align 4, !tbaa !9
  %3272 = and i32 %3271, 65536
  %3273 = icmp ne i32 %3272, 0
  br i1 %3273, label %3274, label %3279

3274:                                             ; preds = %3270
  %3275 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  %3276 = load ptr, ptr %3275, align 8, !tbaa !22
  %3277 = load ptr, ptr %8, align 8, !tbaa !5
  %3278 = getelementptr inbounds %struct.iovec, ptr %3277, i32 0, i32 0
  store ptr %3276, ptr %3278, align 8, !tbaa !22
  br label %3560

3279:                                             ; preds = %3270
  %3280 = load ptr, ptr %6, align 8, !tbaa !5
  %3281 = getelementptr inbounds %struct.MDBX_cursor, ptr %3280, i32 0, i32 1
  %3282 = getelementptr inbounds %struct.anon, ptr %3281, i32 0, i32 0
  %3283 = load i8, ptr %3282, align 4, !tbaa !25
  %3284 = sext i8 %3283 to i32
  %3285 = and i32 %3284, 1
  %3286 = icmp ne i32 %3285, 0
  br i1 %3286, label %3296, label %3287

3287:                                             ; preds = %3279
  %3288 = getelementptr inbounds %struct.iovec, ptr %30, i32 0, i32 0
  %3289 = load ptr, ptr %3288, align 8, !tbaa !22
  %3290 = load ptr, ptr %8, align 8, !tbaa !5
  %3291 = getelementptr inbounds %struct.iovec, ptr %3290, i32 0, i32 0
  %3292 = load ptr, ptr %3291, align 8, !tbaa !22
  %3293 = load ptr, ptr %8, align 8, !tbaa !5
  %3294 = getelementptr inbounds %struct.iovec, ptr %3293, i32 0, i32 1
  %3295 = load i64, ptr %3294, align 8, !tbaa !24
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %3289, ptr align 1 %3292, i64 %3295, i1 false)
  br label %3559

3296:                                             ; preds = %3279
  br label %3297

3297:                                             ; preds = %3296
  %3298 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3299 = zext i8 %3298 to i32
  %3300 = and i32 %3299, 1
  %3301 = icmp ne i32 %3300, 0
  %3302 = xor i1 %3301, true
  %3303 = xor i1 %3302, true
  %3304 = zext i1 %3303 to i32
  %3305 = sext i32 %3304 to i64
  %3306 = call i64 @llvm.expect.i64(i64 %3305, i64 1)
  %3307 = icmp ne i64 %3306, 0
  br i1 %3307, label %3308, label %3337

3308:                                             ; preds = %3297
  br label %3309

3309:                                             ; preds = %3308
  %3310 = load ptr, ptr %6, align 8, !tbaa !5
  %3311 = getelementptr inbounds %struct.MDBX_cursor, ptr %3310, i32 0, i32 9
  %3312 = load ptr, ptr %6, align 8, !tbaa !5
  %3313 = getelementptr inbounds %struct.MDBX_cursor, ptr %3312, i32 0, i32 1
  %3314 = getelementptr inbounds %struct.anon, ptr %3313, i32 0, i32 1
  %3315 = load i8, ptr %3314, align 1, !tbaa !25
  %3316 = sext i8 %3315 to i64
  %3317 = getelementptr inbounds [32 x ptr], ptr %3311, i64 0, i64 %3316
  %3318 = load ptr, ptr %3317, align 8, !tbaa !5
  %3319 = call i64 @page_numkeys(ptr noundef %3318) #12
  %3320 = icmp eq i64 %3319, 1
  %3321 = xor i1 %3320, true
  %3322 = xor i1 %3321, true
  %3323 = xor i1 %3322, true
  %3324 = zext i1 %3323 to i32
  %3325 = sext i32 %3324 to i64
  %3326 = call i64 @llvm.expect.i64(i64 %3325, i64 0)
  %3327 = icmp ne i64 %3326, 0
  br i1 %3327, label %3328, label %3334

3328:                                             ; preds = %3309
  %3329 = load ptr, ptr %6, align 8, !tbaa !5
  %3330 = getelementptr inbounds %struct.MDBX_cursor, ptr %3329, i32 0, i32 5
  %3331 = load ptr, ptr %3330, align 8, !tbaa !11
  %3332 = getelementptr inbounds %struct.MDBX_txn, ptr %3331, i32 0, i32 9
  %3333 = load ptr, ptr %3332, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3333, ptr noundef @.str.79, ptr noundef @__func__.cursor_put, i32 noundef 1274) #13
  unreachable

3334:                                             ; preds = %3309
  br label %3335

3335:                                             ; preds = %3334
  br label %3336

3336:                                             ; preds = %3335
  br label %3337

3337:                                             ; preds = %3336, %3297
  br label %3338

3338:                                             ; preds = %3337
  br label %3339

3339:                                             ; preds = %3338
  br label %3340

3340:                                             ; preds = %3339
  %3341 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3342 = zext i8 %3341 to i32
  %3343 = and i32 %3342, 1
  %3344 = icmp ne i32 %3343, 0
  %3345 = xor i1 %3344, true
  %3346 = xor i1 %3345, true
  %3347 = zext i1 %3346 to i32
  %3348 = sext i32 %3347 to i64
  %3349 = call i64 @llvm.expect.i64(i64 %3348, i64 1)
  %3350 = icmp ne i64 %3349, 0
  br i1 %3350, label %3351, label %3381

3351:                                             ; preds = %3340
  br label %3352

3352:                                             ; preds = %3351
  %3353 = load ptr, ptr %6, align 8, !tbaa !5
  %3354 = getelementptr inbounds %struct.MDBX_cursor, ptr %3353, i32 0, i32 9
  %3355 = load ptr, ptr %6, align 8, !tbaa !5
  %3356 = getelementptr inbounds %struct.MDBX_cursor, ptr %3355, i32 0, i32 1
  %3357 = getelementptr inbounds %struct.anon, ptr %3356, i32 0, i32 1
  %3358 = load i8, ptr %3357, align 1, !tbaa !25
  %3359 = sext i8 %3358 to i64
  %3360 = getelementptr inbounds [32 x ptr], ptr %3354, i64 0, i64 %3359
  %3361 = load ptr, ptr %3360, align 8, !tbaa !5
  %3362 = call zeroext i8 @page_type_compat(ptr noundef %3361) #12
  %3363 = zext i8 %3362 to i32
  %3364 = icmp eq i32 %3363, 2
  %3365 = xor i1 %3364, true
  %3366 = xor i1 %3365, true
  %3367 = xor i1 %3366, true
  %3368 = zext i1 %3367 to i32
  %3369 = sext i32 %3368 to i64
  %3370 = call i64 @llvm.expect.i64(i64 %3369, i64 0)
  %3371 = icmp ne i64 %3370, 0
  br i1 %3371, label %3372, label %3378

3372:                                             ; preds = %3352
  %3373 = load ptr, ptr %6, align 8, !tbaa !5
  %3374 = getelementptr inbounds %struct.MDBX_cursor, ptr %3373, i32 0, i32 5
  %3375 = load ptr, ptr %3374, align 8, !tbaa !11
  %3376 = getelementptr inbounds %struct.MDBX_txn, ptr %3375, i32 0, i32 9
  %3377 = load ptr, ptr %3376, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3377, ptr noundef @.str.80, ptr noundef @__func__.cursor_put, i32 noundef 1275) #13
  unreachable

3378:                                             ; preds = %3352
  br label %3379

3379:                                             ; preds = %3378
  br label %3380

3380:                                             ; preds = %3379
  br label %3381

3381:                                             ; preds = %3380, %3340
  br label %3382

3382:                                             ; preds = %3381
  br label %3383

3383:                                             ; preds = %3382
  br label %3384

3384:                                             ; preds = %3383
  %3385 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3386 = zext i8 %3385 to i32
  %3387 = and i32 %3386, 1
  %3388 = icmp ne i32 %3387, 0
  %3389 = xor i1 %3388, true
  %3390 = xor i1 %3389, true
  %3391 = zext i1 %3390 to i32
  %3392 = sext i32 %3391 to i64
  %3393 = call i64 @llvm.expect.i64(i64 %3392, i64 1)
  %3394 = icmp ne i64 %3393, 0
  br i1 %3394, label %3395, label %3416

3395:                                             ; preds = %3384
  br label %3396

3396:                                             ; preds = %3395
  %3397 = load ptr, ptr %40, align 8, !tbaa !5
  %3398 = call i64 @node_ds(ptr noundef %3397) #12
  %3399 = icmp eq i64 %3398, 0
  %3400 = xor i1 %3399, true
  %3401 = xor i1 %3400, true
  %3402 = xor i1 %3401, true
  %3403 = zext i1 %3402 to i32
  %3404 = sext i32 %3403 to i64
  %3405 = call i64 @llvm.expect.i64(i64 %3404, i64 0)
  %3406 = icmp ne i64 %3405, 0
  br i1 %3406, label %3407, label %3413

3407:                                             ; preds = %3396
  %3408 = load ptr, ptr %6, align 8, !tbaa !5
  %3409 = getelementptr inbounds %struct.MDBX_cursor, ptr %3408, i32 0, i32 5
  %3410 = load ptr, ptr %3409, align 8, !tbaa !11
  %3411 = getelementptr inbounds %struct.MDBX_txn, ptr %3410, i32 0, i32 9
  %3412 = load ptr, ptr %3411, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3412, ptr noundef @.str.81, ptr noundef @__func__.cursor_put, i32 noundef 1276) #13
  unreachable

3413:                                             ; preds = %3396
  br label %3414

3414:                                             ; preds = %3413
  br label %3415

3415:                                             ; preds = %3414
  br label %3416

3416:                                             ; preds = %3415, %3384
  br label %3417

3417:                                             ; preds = %3416
  br label %3418

3418:                                             ; preds = %3417
  br label %3419

3419:                                             ; preds = %3418
  %3420 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3421 = zext i8 %3420 to i32
  %3422 = and i32 %3421, 1
  %3423 = icmp ne i32 %3422, 0
  %3424 = xor i1 %3423, true
  %3425 = xor i1 %3424, true
  %3426 = zext i1 %3425 to i32
  %3427 = sext i32 %3426 to i64
  %3428 = call i64 @llvm.expect.i64(i64 %3427, i64 1)
  %3429 = icmp ne i64 %3428, 0
  br i1 %3429, label %3430, label %3452

3430:                                             ; preds = %3419
  br label %3431

3431:                                             ; preds = %3430
  %3432 = load ptr, ptr %40, align 8, !tbaa !5
  %3433 = call zeroext i8 @node_flags(ptr noundef %3432) #12
  %3434 = zext i8 %3433 to i32
  %3435 = icmp eq i32 %3434, 0
  %3436 = xor i1 %3435, true
  %3437 = xor i1 %3436, true
  %3438 = xor i1 %3437, true
  %3439 = zext i1 %3438 to i32
  %3440 = sext i32 %3439 to i64
  %3441 = call i64 @llvm.expect.i64(i64 %3440, i64 0)
  %3442 = icmp ne i64 %3441, 0
  br i1 %3442, label %3443, label %3449

3443:                                             ; preds = %3431
  %3444 = load ptr, ptr %6, align 8, !tbaa !5
  %3445 = getelementptr inbounds %struct.MDBX_cursor, ptr %3444, i32 0, i32 5
  %3446 = load ptr, ptr %3445, align 8, !tbaa !11
  %3447 = getelementptr inbounds %struct.MDBX_txn, ptr %3446, i32 0, i32 9
  %3448 = load ptr, ptr %3447, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3448, ptr noundef @.str.9, ptr noundef @__func__.cursor_put, i32 noundef 1277) #13
  unreachable

3449:                                             ; preds = %3431
  br label %3450

3450:                                             ; preds = %3449
  br label %3451

3451:                                             ; preds = %3450
  br label %3452

3452:                                             ; preds = %3451, %3419
  br label %3453

3453:                                             ; preds = %3452
  br label %3454

3454:                                             ; preds = %3453
  br label %3455

3455:                                             ; preds = %3454
  %3456 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3457 = zext i8 %3456 to i32
  %3458 = and i32 %3457, 1
  %3459 = icmp ne i32 %3458, 0
  %3460 = xor i1 %3459, true
  %3461 = xor i1 %3460, true
  %3462 = zext i1 %3461 to i32
  %3463 = sext i32 %3462 to i64
  %3464 = call i64 @llvm.expect.i64(i64 %3463, i64 1)
  %3465 = icmp ne i64 %3464, 0
  br i1 %3465, label %3466, label %3488

3466:                                             ; preds = %3455
  br label %3467

3467:                                             ; preds = %3466
  %3468 = load ptr, ptr %7, align 8, !tbaa !5
  %3469 = getelementptr inbounds %struct.iovec, ptr %3468, i32 0, i32 1
  %3470 = load i64, ptr %3469, align 8, !tbaa !24
  %3471 = icmp ult i64 %3470, 65535
  %3472 = xor i1 %3471, true
  %3473 = xor i1 %3472, true
  %3474 = xor i1 %3473, true
  %3475 = zext i1 %3474 to i32
  %3476 = sext i32 %3475 to i64
  %3477 = call i64 @llvm.expect.i64(i64 %3476, i64 0)
  %3478 = icmp ne i64 %3477, 0
  br i1 %3478, label %3479, label %3485

3479:                                             ; preds = %3467
  %3480 = load ptr, ptr %6, align 8, !tbaa !5
  %3481 = getelementptr inbounds %struct.MDBX_cursor, ptr %3480, i32 0, i32 5
  %3482 = load ptr, ptr %3481, align 8, !tbaa !11
  %3483 = getelementptr inbounds %struct.MDBX_txn, ptr %3482, i32 0, i32 9
  %3484 = load ptr, ptr %3483, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3484, ptr noundef @.str.82, ptr noundef @__func__.cursor_put, i32 noundef 1278) #13
  unreachable

3485:                                             ; preds = %3467
  br label %3486

3486:                                             ; preds = %3485
  br label %3487

3487:                                             ; preds = %3486
  br label %3488

3488:                                             ; preds = %3487, %3455
  br label %3489

3489:                                             ; preds = %3488
  br label %3490

3490:                                             ; preds = %3489
  %3491 = load ptr, ptr %40, align 8, !tbaa !5
  %3492 = load ptr, ptr %7, align 8, !tbaa !5
  %3493 = getelementptr inbounds %struct.iovec, ptr %3492, i32 0, i32 1
  %3494 = load i64, ptr %3493, align 8, !tbaa !24
  call void @node_set_ks(ptr noundef %3491, i64 noundef %3494)
  %3495 = load ptr, ptr %40, align 8, !tbaa !5
  %3496 = call ptr @node_key(ptr noundef %3495) #12
  %3497 = load ptr, ptr %7, align 8, !tbaa !5
  %3498 = getelementptr inbounds %struct.iovec, ptr %3497, i32 0, i32 0
  %3499 = load ptr, ptr %3498, align 8, !tbaa !22
  %3500 = load ptr, ptr %7, align 8, !tbaa !5
  %3501 = getelementptr inbounds %struct.iovec, ptr %3500, i32 0, i32 1
  %3502 = load i64, ptr %3501, align 8, !tbaa !24
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %3496, ptr align 1 %3499, i64 %3502, i1 false)
  br label %3503

3503:                                             ; preds = %3490
  %3504 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3505 = zext i8 %3504 to i32
  %3506 = and i32 %3505, 1
  %3507 = icmp ne i32 %3506, 0
  %3508 = xor i1 %3507, true
  %3509 = xor i1 %3508, true
  %3510 = zext i1 %3509 to i32
  %3511 = sext i32 %3510 to i64
  %3512 = call i64 @llvm.expect.i64(i64 %3511, i64 1)
  %3513 = icmp ne i64 %3512, 0
  br i1 %3513, label %3514, label %3556

3514:                                             ; preds = %3503
  br label %3515

3515:                                             ; preds = %3514
  %3516 = load ptr, ptr %40, align 8, !tbaa !5
  %3517 = call ptr @node_key(ptr noundef %3516) #12
  %3518 = ptrtoint ptr %3517 to i64
  %3519 = load ptr, ptr %40, align 8, !tbaa !5
  %3520 = call i64 @node_ds(ptr noundef %3519) #12
  %3521 = add nsw i64 %3518, %3520
  %3522 = inttoptr i64 %3521 to ptr
  %3523 = load ptr, ptr %6, align 8, !tbaa !5
  %3524 = getelementptr inbounds %struct.MDBX_cursor, ptr %3523, i32 0, i32 9
  %3525 = load ptr, ptr %6, align 8, !tbaa !5
  %3526 = getelementptr inbounds %struct.MDBX_cursor, ptr %3525, i32 0, i32 1
  %3527 = getelementptr inbounds %struct.anon, ptr %3526, i32 0, i32 1
  %3528 = load i8, ptr %3527, align 1, !tbaa !25
  %3529 = sext i8 %3528 to i64
  %3530 = getelementptr inbounds [32 x ptr], ptr %3524, i64 0, i64 %3529
  %3531 = load ptr, ptr %3530, align 8, !tbaa !5
  %3532 = ptrtoint ptr %3531 to i64
  %3533 = load ptr, ptr %12, align 8, !tbaa !5
  %3534 = getelementptr inbounds %struct.MDBX_env, ptr %3533, i32 0, i32 2
  %3535 = load i32, ptr %3534, align 8, !tbaa !77
  %3536 = zext i32 %3535 to i64
  %3537 = add nsw i64 %3532, %3536
  %3538 = inttoptr i64 %3537 to ptr
  %3539 = icmp ult ptr %3522, %3538
  %3540 = xor i1 %3539, true
  %3541 = xor i1 %3540, true
  %3542 = xor i1 %3541, true
  %3543 = zext i1 %3542 to i32
  %3544 = sext i32 %3543 to i64
  %3545 = call i64 @llvm.expect.i64(i64 %3544, i64 0)
  %3546 = icmp ne i64 %3545, 0
  br i1 %3546, label %3547, label %3553

3547:                                             ; preds = %3515
  %3548 = load ptr, ptr %6, align 8, !tbaa !5
  %3549 = getelementptr inbounds %struct.MDBX_cursor, ptr %3548, i32 0, i32 5
  %3550 = load ptr, ptr %3549, align 8, !tbaa !11
  %3551 = getelementptr inbounds %struct.MDBX_txn, ptr %3550, i32 0, i32 9
  %3552 = load ptr, ptr %3551, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3552, ptr noundef @.str.83, ptr noundef @__func__.cursor_put, i32 noundef 1281) #13
  unreachable

3553:                                             ; preds = %3515
  br label %3554

3554:                                             ; preds = %3553
  br label %3555

3555:                                             ; preds = %3554
  br label %3556

3556:                                             ; preds = %3555, %3503
  br label %3557

3557:                                             ; preds = %3556
  br label %3558

3558:                                             ; preds = %3557
  br label %1503

3559:                                             ; preds = %3287
  br label %3560

3560:                                             ; preds = %3559, %3274
  %3561 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3562 = zext i8 %3561 to i32
  %3563 = and i32 %3562, 2
  %3564 = icmp ne i32 %3563, 0
  %3565 = xor i1 %3564, true
  %3566 = xor i1 %3565, true
  %3567 = zext i1 %3566 to i32
  %3568 = sext i32 %3567 to i64
  %3569 = call i64 @llvm.expect.i64(i64 %3568, i64 0)
  %3570 = icmp ne i64 %3569, 0
  br i1 %3570, label %3571, label %3585

3571:                                             ; preds = %3560
  %3572 = load ptr, ptr %6, align 8, !tbaa !5
  %3573 = call i32 @cursor_validate(ptr noundef %3572) #15
  store i32 %3573, ptr %10, align 4, !tbaa !9
  %3574 = load i32, ptr %10, align 4, !tbaa !9
  %3575 = icmp ne i32 %3574, 0
  %3576 = xor i1 %3575, true
  %3577 = xor i1 %3576, true
  %3578 = zext i1 %3577 to i32
  %3579 = sext i32 %3578 to i64
  %3580 = call i64 @llvm.expect.i64(i64 %3579, i64 0)
  %3581 = icmp ne i64 %3580, 0
  br i1 %3581, label %3582, label %3584

3582:                                             ; preds = %3571
  %3583 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %3583, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

3584:                                             ; preds = %3571
  br label %3585

3585:                                             ; preds = %3584, %3560
  store i32 0, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

3586:                                             ; preds = %3221
  br label %3587

3587:                                             ; preds = %3586, %2077
  %3588 = load ptr, ptr %6, align 8, !tbaa !5
  call void @node_del(ptr noundef %3588, i64 noundef 0)
  br label %3589

3589:                                             ; preds = %3587, %1445
  %3590 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %3590, ptr %25, align 8, !tbaa !5
  br label %3591

3591:                                             ; preds = %3589, %3202
  %3592 = load i32, ptr %9, align 4, !tbaa !9
  %3593 = and i32 %3592, 196614
  store i32 %3593, ptr %53, align 4, !tbaa !9
  %3594 = load ptr, ptr %6, align 8, !tbaa !5
  %3595 = getelementptr inbounds %struct.MDBX_cursor, ptr %3594, i32 0, i32 9
  %3596 = load ptr, ptr %6, align 8, !tbaa !5
  %3597 = getelementptr inbounds %struct.MDBX_cursor, ptr %3596, i32 0, i32 1
  %3598 = getelementptr inbounds %struct.anon, ptr %3597, i32 0, i32 1
  %3599 = load i8, ptr %3598, align 1, !tbaa !25
  %3600 = sext i8 %3599 to i64
  %3601 = getelementptr inbounds [32 x ptr], ptr %3595, i64 0, i64 %3600
  %3602 = load ptr, ptr %3601, align 8, !tbaa !5
  %3603 = call zeroext i1 @is_dupfix_leaf(ptr noundef %3602) #12
  br i1 %3603, label %3604, label %3608

3604:                                             ; preds = %3591
  %3605 = load ptr, ptr %7, align 8, !tbaa !5
  %3606 = getelementptr inbounds %struct.iovec, ptr %3605, i32 0, i32 1
  %3607 = load i64, ptr %3606, align 8, !tbaa !24
  br label %3613

3608:                                             ; preds = %3591
  %3609 = load ptr, ptr %12, align 8, !tbaa !5
  %3610 = load ptr, ptr %7, align 8, !tbaa !5
  %3611 = load ptr, ptr %25, align 8, !tbaa !5
  %3612 = call i64 @leaf_size(ptr noundef %3609, ptr noundef %3610, ptr noundef %3611) #12
  br label %3613

3613:                                             ; preds = %3608, %3604
  %3614 = phi i64 [ %3607, %3604 ], [ %3612, %3608 ]
  store i64 %3614, ptr %54, align 8, !tbaa !55
  %3615 = load ptr, ptr %6, align 8, !tbaa !5
  %3616 = getelementptr inbounds %struct.MDBX_cursor, ptr %3615, i32 0, i32 9
  %3617 = load ptr, ptr %6, align 8, !tbaa !5
  %3618 = getelementptr inbounds %struct.MDBX_cursor, ptr %3617, i32 0, i32 1
  %3619 = getelementptr inbounds %struct.anon, ptr %3618, i32 0, i32 1
  %3620 = load i8, ptr %3619, align 1, !tbaa !25
  %3621 = sext i8 %3620 to i64
  %3622 = getelementptr inbounds [32 x ptr], ptr %3616, i64 0, i64 %3621
  %3623 = load ptr, ptr %3622, align 8, !tbaa !5
  %3624 = call i64 @page_room(ptr noundef %3623) #12
  %3625 = load i64, ptr %54, align 8, !tbaa !55
  %3626 = icmp ult i64 %3624, %3625
  br i1 %3626, label %3627, label %3666

3627:                                             ; preds = %3613
  %3628 = load ptr, ptr %6, align 8, !tbaa !5
  %3629 = load ptr, ptr %7, align 8, !tbaa !5
  %3630 = load ptr, ptr %25, align 8, !tbaa !5
  %3631 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %3632 = trunc i8 %3631 to i1
  br i1 %3632, label %3633, label %3635

3633:                                             ; preds = %3627
  %3634 = load i32, ptr %53, align 4, !tbaa !9
  br label %3638

3635:                                             ; preds = %3627
  %3636 = load i32, ptr %53, align 4, !tbaa !9
  %3637 = or i32 %3636, 262144
  br label %3638

3638:                                             ; preds = %3635, %3633
  %3639 = phi i32 [ %3634, %3633 ], [ %3637, %3635 ]
  %3640 = call i32 @page_split(ptr noundef %3628, ptr noundef %3629, ptr noundef %3630, i32 noundef -1, i32 noundef %3639)
  store i32 %3640, ptr %17, align 4, !tbaa !9
  %3641 = load i32, ptr %17, align 4, !tbaa !9
  %3642 = icmp eq i32 %3641, 0
  br i1 %3642, label %3643, label %3665

3643:                                             ; preds = %3638
  %3644 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3645 = zext i8 %3644 to i32
  %3646 = and i32 %3645, 2
  %3647 = icmp ne i32 %3646, 0
  %3648 = xor i1 %3647, true
  %3649 = xor i1 %3648, true
  %3650 = zext i1 %3649 to i32
  %3651 = sext i32 %3650 to i64
  %3652 = call i64 @llvm.expect.i64(i64 %3651, i64 0)
  %3653 = icmp ne i64 %3652, 0
  br i1 %3653, label %3654, label %3665

3654:                                             ; preds = %3643
  %3655 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %3656 = trunc i8 %3655 to i1
  br i1 %3656, label %3657, label %3660

3657:                                             ; preds = %3654
  %3658 = load ptr, ptr %6, align 8, !tbaa !5
  %3659 = call i32 @cursor_validate(ptr noundef %3658) #15
  br label %3663

3660:                                             ; preds = %3654
  %3661 = load ptr, ptr %6, align 8, !tbaa !5
  %3662 = call i32 @cursor_validate_updating(ptr noundef %3661) #15
  br label %3663

3663:                                             ; preds = %3660, %3657
  %3664 = phi i32 [ %3659, %3657 ], [ %3662, %3660 ]
  store i32 %3664, ptr %17, align 4, !tbaa !9
  br label %3665

3665:                                             ; preds = %3663, %3643, %3638
  br label %3879

3666:                                             ; preds = %3613
  %3667 = load ptr, ptr %6, align 8, !tbaa !5
  %3668 = getelementptr inbounds %struct.MDBX_cursor, ptr %3667, i32 0, i32 9
  %3669 = load ptr, ptr %6, align 8, !tbaa !5
  %3670 = getelementptr inbounds %struct.MDBX_cursor, ptr %3669, i32 0, i32 1
  %3671 = getelementptr inbounds %struct.anon, ptr %3670, i32 0, i32 1
  %3672 = load i8, ptr %3671, align 1, !tbaa !25
  %3673 = sext i8 %3672 to i64
  %3674 = getelementptr inbounds [32 x ptr], ptr %3668, i64 0, i64 %3673
  %3675 = load ptr, ptr %3674, align 8, !tbaa !5
  %3676 = call zeroext i1 @is_dupfix_leaf(ptr noundef %3675) #12
  br i1 %3676, label %3677, label %3733

3677:                                             ; preds = %3666
  br label %3678

3678:                                             ; preds = %3677
  %3679 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3680 = zext i8 %3679 to i32
  %3681 = and i32 %3680, 1
  %3682 = icmp ne i32 %3681, 0
  %3683 = xor i1 %3682, true
  %3684 = xor i1 %3683, true
  %3685 = zext i1 %3684 to i32
  %3686 = sext i32 %3685 to i64
  %3687 = call i64 @llvm.expect.i64(i64 %3686, i64 1)
  %3688 = icmp ne i64 %3687, 0
  br i1 %3688, label %3689, label %3717

3689:                                             ; preds = %3678
  br label %3690

3690:                                             ; preds = %3689
  %3691 = load i32, ptr %53, align 4, !tbaa !9
  %3692 = and i32 %3691, 7
  %3693 = icmp ne i32 %3692, 0
  br i1 %3693, label %3699, label %3694

3694:                                             ; preds = %3690
  %3695 = load ptr, ptr %25, align 8, !tbaa !5
  %3696 = getelementptr inbounds %struct.iovec, ptr %3695, i32 0, i32 1
  %3697 = load i64, ptr %3696, align 8, !tbaa !24
  %3698 = icmp eq i64 %3697, 0
  br label %3699

3699:                                             ; preds = %3694, %3690
  %3700 = phi i1 [ false, %3690 ], [ %3698, %3694 ]
  %3701 = xor i1 %3700, true
  %3702 = xor i1 %3701, true
  %3703 = xor i1 %3702, true
  %3704 = zext i1 %3703 to i32
  %3705 = sext i32 %3704 to i64
  %3706 = call i64 @llvm.expect.i64(i64 %3705, i64 0)
  %3707 = icmp ne i64 %3706, 0
  br i1 %3707, label %3708, label %3714

3708:                                             ; preds = %3699
  %3709 = load ptr, ptr %6, align 8, !tbaa !5
  %3710 = getelementptr inbounds %struct.MDBX_cursor, ptr %3709, i32 0, i32 5
  %3711 = load ptr, ptr %3710, align 8, !tbaa !11
  %3712 = getelementptr inbounds %struct.MDBX_txn, ptr %3711, i32 0, i32 9
  %3713 = load ptr, ptr %3712, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3713, ptr noundef @.str.84, ptr noundef @__func__.cursor_put, i32 noundef 1308) #13
  unreachable

3714:                                             ; preds = %3699
  br label %3715

3715:                                             ; preds = %3714
  br label %3716

3716:                                             ; preds = %3715
  br label %3717

3717:                                             ; preds = %3716, %3678
  br label %3718

3718:                                             ; preds = %3717
  br label %3719

3719:                                             ; preds = %3718
  %3720 = load ptr, ptr %6, align 8, !tbaa !5
  %3721 = load ptr, ptr %6, align 8, !tbaa !5
  %3722 = getelementptr inbounds %struct.MDBX_cursor, ptr %3721, i32 0, i32 10
  %3723 = load ptr, ptr %6, align 8, !tbaa !5
  %3724 = getelementptr inbounds %struct.MDBX_cursor, ptr %3723, i32 0, i32 1
  %3725 = getelementptr inbounds %struct.anon, ptr %3724, i32 0, i32 1
  %3726 = load i8, ptr %3725, align 1, !tbaa !25
  %3727 = sext i8 %3726 to i64
  %3728 = getelementptr inbounds [32 x i16], ptr %3722, i64 0, i64 %3727
  %3729 = load i16, ptr %3728, align 2, !tbaa !31
  %3730 = zext i16 %3729 to i64
  %3731 = load ptr, ptr %7, align 8, !tbaa !5
  %3732 = call i32 @node_add_dupfix(ptr noundef %3720, i64 noundef %3730, ptr noundef %3731)
  store i32 %3732, ptr %17, align 4, !tbaa !9
  br label %3749

3733:                                             ; preds = %3666
  %3734 = load ptr, ptr %6, align 8, !tbaa !5
  %3735 = load ptr, ptr %6, align 8, !tbaa !5
  %3736 = getelementptr inbounds %struct.MDBX_cursor, ptr %3735, i32 0, i32 10
  %3737 = load ptr, ptr %6, align 8, !tbaa !5
  %3738 = getelementptr inbounds %struct.MDBX_cursor, ptr %3737, i32 0, i32 1
  %3739 = getelementptr inbounds %struct.anon, ptr %3738, i32 0, i32 1
  %3740 = load i8, ptr %3739, align 1, !tbaa !25
  %3741 = sext i8 %3740 to i64
  %3742 = getelementptr inbounds [32 x i16], ptr %3736, i64 0, i64 %3741
  %3743 = load i16, ptr %3742, align 2, !tbaa !31
  %3744 = zext i16 %3743 to i64
  %3745 = load ptr, ptr %7, align 8, !tbaa !5
  %3746 = load ptr, ptr %25, align 8, !tbaa !5
  %3747 = load i32, ptr %53, align 4, !tbaa !9
  %3748 = call i32 @node_add_leaf(ptr noundef %3734, i64 noundef %3744, ptr noundef %3745, ptr noundef %3746, i32 noundef %3747)
  store i32 %3748, ptr %17, align 4, !tbaa !9
  br label %3749

3749:                                             ; preds = %3733, %3719
  %3750 = load i32, ptr %17, align 4, !tbaa !9
  %3751 = icmp eq i32 %3750, 0
  %3752 = xor i1 %3751, true
  %3753 = xor i1 %3752, true
  %3754 = zext i1 %3753 to i32
  %3755 = sext i32 %3754 to i64
  %3756 = call i64 @llvm.expect.i64(i64 %3755, i64 1)
  %3757 = icmp ne i64 %3756, 0
  br i1 %3757, label %3758, label %3878

3758:                                             ; preds = %3749
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #11
  %3759 = load ptr, ptr %6, align 8, !tbaa !5
  %3760 = getelementptr inbounds %struct.MDBX_cursor, ptr %3759, i32 0, i32 9
  %3761 = load ptr, ptr %6, align 8, !tbaa !5
  %3762 = getelementptr inbounds %struct.MDBX_cursor, ptr %3761, i32 0, i32 1
  %3763 = getelementptr inbounds %struct.anon, ptr %3762, i32 0, i32 1
  %3764 = load i8, ptr %3763, align 1, !tbaa !25
  %3765 = sext i8 %3764 to i64
  %3766 = getelementptr inbounds [32 x ptr], ptr %3760, i64 0, i64 %3765
  %3767 = load ptr, ptr %3766, align 8, !tbaa !5
  store ptr %3767, ptr %55, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #11
  %3768 = load ptr, ptr %6, align 8, !tbaa !5
  %3769 = call i64 @cursor_dbi(ptr noundef %3768) #12
  store i64 %3769, ptr %56, align 8, !tbaa !55
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #11
  %3770 = load ptr, ptr %6, align 8, !tbaa !5
  %3771 = getelementptr inbounds %struct.MDBX_cursor, ptr %3770, i32 0, i32 5
  %3772 = load ptr, ptr %3771, align 8, !tbaa !11
  %3773 = getelementptr inbounds %struct.MDBX_txn, ptr %3772, i32 0, i32 14
  %3774 = load ptr, ptr %3773, align 8, !tbaa !86
  %3775 = load i64, ptr %56, align 8, !tbaa !55
  %3776 = getelementptr inbounds ptr, ptr %3774, i64 %3775
  %3777 = load ptr, ptr %3776, align 8, !tbaa !5
  store ptr %3777, ptr %57, align 8, !tbaa !5
  br label %3778

3778:                                             ; preds = %3873, %3758
  %3779 = load ptr, ptr %57, align 8, !tbaa !5
  %3780 = icmp ne ptr %3779, null
  br i1 %3780, label %3782, label %3781

3781:                                             ; preds = %3778
  store i32 179, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #11
  br label %3877

3782:                                             ; preds = %3778
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #11
  %3783 = load ptr, ptr %6, align 8, !tbaa !5
  %3784 = getelementptr inbounds %struct.MDBX_cursor, ptr %3783, i32 0, i32 1
  %3785 = getelementptr inbounds %struct.anon, ptr %3784, i32 0, i32 0
  %3786 = load i8, ptr %3785, align 4, !tbaa !25
  %3787 = sext i8 %3786 to i32
  %3788 = and i32 %3787, 1
  %3789 = icmp ne i32 %3788, 0
  br i1 %3789, label %3790, label %3795

3790:                                             ; preds = %3782
  %3791 = load ptr, ptr %57, align 8, !tbaa !5
  %3792 = getelementptr inbounds %struct.MDBX_cursor, ptr %3791, i32 0, i32 8
  %3793 = load ptr, ptr %3792, align 8, !tbaa !30
  %3794 = getelementptr inbounds %struct.inner_cursor, ptr %3793, i32 0, i32 0
  br label %3797

3795:                                             ; preds = %3782
  %3796 = load ptr, ptr %57, align 8, !tbaa !5
  br label %3797

3797:                                             ; preds = %3795, %3790
  %3798 = phi ptr [ %3794, %3790 ], [ %3796, %3795 ]
  store ptr %3798, ptr %58, align 8, !tbaa !5
  %3799 = load ptr, ptr %6, align 8, !tbaa !5
  %3800 = load ptr, ptr %58, align 8, !tbaa !5
  %3801 = call zeroext i1 @is_related(ptr noundef %3799, ptr noundef %3800)
  br i1 %3801, label %3802, label %3814

3802:                                             ; preds = %3797
  %3803 = load ptr, ptr %58, align 8, !tbaa !5
  %3804 = getelementptr inbounds %struct.MDBX_cursor, ptr %3803, i32 0, i32 9
  %3805 = load ptr, ptr %6, align 8, !tbaa !5
  %3806 = getelementptr inbounds %struct.MDBX_cursor, ptr %3805, i32 0, i32 1
  %3807 = getelementptr inbounds %struct.anon, ptr %3806, i32 0, i32 1
  %3808 = load i8, ptr %3807, align 1, !tbaa !25
  %3809 = sext i8 %3808 to i64
  %3810 = getelementptr inbounds [32 x ptr], ptr %3804, i64 0, i64 %3809
  %3811 = load ptr, ptr %3810, align 8, !tbaa !5
  %3812 = load ptr, ptr %55, align 8, !tbaa !5
  %3813 = icmp ne ptr %3811, %3812
  br i1 %3813, label %3814, label %3815

3814:                                             ; preds = %3802, %3797
  store i32 181, ptr %13, align 4
  br label %3870

3815:                                             ; preds = %3802
  %3816 = load ptr, ptr %58, align 8, !tbaa !5
  %3817 = getelementptr inbounds %struct.MDBX_cursor, ptr %3816, i32 0, i32 10
  %3818 = load ptr, ptr %6, align 8, !tbaa !5
  %3819 = getelementptr inbounds %struct.MDBX_cursor, ptr %3818, i32 0, i32 1
  %3820 = getelementptr inbounds %struct.anon, ptr %3819, i32 0, i32 1
  %3821 = load i8, ptr %3820, align 1, !tbaa !25
  %3822 = sext i8 %3821 to i64
  %3823 = getelementptr inbounds [32 x i16], ptr %3817, i64 0, i64 %3822
  %3824 = load i16, ptr %3823, align 2, !tbaa !31
  %3825 = zext i16 %3824 to i32
  %3826 = load ptr, ptr %6, align 8, !tbaa !5
  %3827 = getelementptr inbounds %struct.MDBX_cursor, ptr %3826, i32 0, i32 10
  %3828 = load ptr, ptr %6, align 8, !tbaa !5
  %3829 = getelementptr inbounds %struct.MDBX_cursor, ptr %3828, i32 0, i32 1
  %3830 = getelementptr inbounds %struct.anon, ptr %3829, i32 0, i32 1
  %3831 = load i8, ptr %3830, align 1, !tbaa !25
  %3832 = sext i8 %3831 to i64
  %3833 = getelementptr inbounds [32 x i16], ptr %3827, i64 0, i64 %3832
  %3834 = load i16, ptr %3833, align 2, !tbaa !31
  %3835 = zext i16 %3834 to i32
  %3836 = icmp sge i32 %3825, %3835
  br i1 %3836, label %3837, label %3853

3837:                                             ; preds = %3815
  %3838 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %3839 = trunc i8 %3838 to i1
  %3840 = zext i1 %3839 to i32
  %3841 = load ptr, ptr %58, align 8, !tbaa !5
  %3842 = getelementptr inbounds %struct.MDBX_cursor, ptr %3841, i32 0, i32 10
  %3843 = load ptr, ptr %6, align 8, !tbaa !5
  %3844 = getelementptr inbounds %struct.MDBX_cursor, ptr %3843, i32 0, i32 1
  %3845 = getelementptr inbounds %struct.anon, ptr %3844, i32 0, i32 1
  %3846 = load i8, ptr %3845, align 1, !tbaa !25
  %3847 = sext i8 %3846 to i64
  %3848 = getelementptr inbounds [32 x i16], ptr %3842, i64 0, i64 %3847
  %3849 = load i16, ptr %3848, align 2, !tbaa !31
  %3850 = zext i16 %3849 to i32
  %3851 = add nsw i32 %3850, %3840
  %3852 = trunc i32 %3851 to i16
  store i16 %3852, ptr %3848, align 2, !tbaa !31
  br label %3853

3853:                                             ; preds = %3837, %3815
  %3854 = load ptr, ptr %58, align 8, !tbaa !5
  %3855 = call zeroext i1 @inner_pointed(ptr noundef %3854) #12
  br i1 %3855, label %3856, label %3869

3856:                                             ; preds = %3853
  %3857 = load ptr, ptr %58, align 8, !tbaa !5
  %3858 = load ptr, ptr %55, align 8, !tbaa !5
  %3859 = load ptr, ptr %58, align 8, !tbaa !5
  %3860 = getelementptr inbounds %struct.MDBX_cursor, ptr %3859, i32 0, i32 10
  %3861 = load ptr, ptr %6, align 8, !tbaa !5
  %3862 = getelementptr inbounds %struct.MDBX_cursor, ptr %3861, i32 0, i32 1
  %3863 = getelementptr inbounds %struct.anon, ptr %3862, i32 0, i32 1
  %3864 = load i8, ptr %3863, align 1, !tbaa !25
  %3865 = sext i8 %3864 to i64
  %3866 = getelementptr inbounds [32 x i16], ptr %3860, i64 0, i64 %3865
  %3867 = load i16, ptr %3866, align 2, !tbaa !31
  %3868 = zext i16 %3867 to i32
  call void @cursor_inner_refresh(ptr noundef %3857, ptr noundef %3858, i32 noundef %3868)
  br label %3869

3869:                                             ; preds = %3856, %3853
  store i32 0, ptr %13, align 4
  br label %3870

3870:                                             ; preds = %3869, %3814
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #11
  %3871 = load i32, ptr %13, align 4
  switch i32 %3871, label %4514 [
    i32 0, label %3872
    i32 181, label %3873
  ]

3872:                                             ; preds = %3870
  br label %3873

3873:                                             ; preds = %3872, %3870
  %3874 = load ptr, ptr %57, align 8, !tbaa !5
  %3875 = getelementptr inbounds %struct.MDBX_cursor, ptr %3874, i32 0, i32 11
  %3876 = load ptr, ptr %3875, align 8, !tbaa !87
  store ptr %3876, ptr %57, align 8, !tbaa !5
  br label %3778, !llvm.loop !88

3877:                                             ; preds = %3781
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #11
  br label %3878

3878:                                             ; preds = %3877, %3749
  br label %3879

3879:                                             ; preds = %3878, %3665
  %3880 = load i32, ptr %17, align 4, !tbaa !9
  %3881 = icmp eq i32 %3880, 0
  %3882 = xor i1 %3881, true
  %3883 = xor i1 %3882, true
  %3884 = zext i1 %3883 to i32
  %3885 = sext i32 %3884 to i64
  %3886 = call i64 @llvm.expect.i64(i64 %3885, i64 1)
  %3887 = icmp ne i64 %3886, 0
  br i1 %3887, label %3888, label %4504

3888:                                             ; preds = %3879
  %3889 = load i32, ptr %9, align 4, !tbaa !9
  %3890 = and i32 %3889, 4
  %3891 = icmp ne i32 %3890, 0
  br i1 %3891, label %3892, label %4360

3892:                                             ; preds = %3888
  br label %3893

3893:                                             ; preds = %3892, %2618, %2546
  %3894 = getelementptr inbounds %struct.iovec, ptr %59, i32 0, i32 1
  store i64 0, ptr %3894, align 8, !tbaa !24
  %3895 = getelementptr inbounds %struct.iovec, ptr %59, i32 0, i32 0
  store ptr null, ptr %3895, align 8, !tbaa !22
  %3896 = load ptr, ptr %6, align 8, !tbaa !5
  %3897 = getelementptr inbounds %struct.MDBX_cursor, ptr %3896, i32 0, i32 9
  %3898 = load ptr, ptr %6, align 8, !tbaa !5
  %3899 = getelementptr inbounds %struct.MDBX_cursor, ptr %3898, i32 0, i32 1
  %3900 = getelementptr inbounds %struct.anon, ptr %3899, i32 0, i32 1
  %3901 = load i8, ptr %3900, align 1, !tbaa !25
  %3902 = sext i8 %3901 to i64
  %3903 = getelementptr inbounds [32 x ptr], ptr %3897, i64 0, i64 %3902
  %3904 = load ptr, ptr %3903, align 8, !tbaa !5
  %3905 = load ptr, ptr %6, align 8, !tbaa !5
  %3906 = getelementptr inbounds %struct.MDBX_cursor, ptr %3905, i32 0, i32 10
  %3907 = load ptr, ptr %6, align 8, !tbaa !5
  %3908 = getelementptr inbounds %struct.MDBX_cursor, ptr %3907, i32 0, i32 1
  %3909 = getelementptr inbounds %struct.anon, ptr %3908, i32 0, i32 1
  %3910 = load i8, ptr %3909, align 1, !tbaa !25
  %3911 = sext i8 %3910 to i64
  %3912 = getelementptr inbounds [32 x i16], ptr %3906, i64 0, i64 %3911
  %3913 = load i16, ptr %3912, align 2, !tbaa !31
  %3914 = zext i16 %3913 to i64
  %3915 = call ptr @page_node(ptr noundef %3904, i64 noundef %3914) #12
  store ptr %3915, ptr %60, align 8, !tbaa !5
  %3916 = load i32, ptr %9, align 4, !tbaa !9
  %3917 = and i32 %3916, 32
  %3918 = lshr i32 %3917, 1
  %3919 = or i32 64, %3918
  store i32 %3919, ptr %61, align 4, !tbaa !9
  %3920 = load i32, ptr %9, align 4, !tbaa !9
  %3921 = and i32 %3920, 64
  %3922 = icmp eq i32 %3921, 0
  br i1 %3922, label %3923, label %3948

3923:                                             ; preds = %3893
  %3924 = load i32, ptr %61, align 4, !tbaa !9
  %3925 = sub i32 %3924, 64
  store i32 %3925, ptr %61, align 4, !tbaa !9
  %3926 = load ptr, ptr %6, align 8, !tbaa !5
  %3927 = load ptr, ptr %60, align 8, !tbaa !5
  %3928 = load ptr, ptr %6, align 8, !tbaa !5
  %3929 = getelementptr inbounds %struct.MDBX_cursor, ptr %3928, i32 0, i32 9
  %3930 = load ptr, ptr %6, align 8, !tbaa !5
  %3931 = getelementptr inbounds %struct.MDBX_cursor, ptr %3930, i32 0, i32 1
  %3932 = getelementptr inbounds %struct.anon, ptr %3931, i32 0, i32 1
  %3933 = load i8, ptr %3932, align 1, !tbaa !25
  %3934 = sext i8 %3933 to i64
  %3935 = getelementptr inbounds [32 x ptr], ptr %3929, i64 0, i64 %3934
  %3936 = load ptr, ptr %3935, align 8, !tbaa !5
  %3937 = call i32 @cursor_dupsort_setup(ptr noundef %3926, ptr noundef %3927, ptr noundef %3936)
  store i32 %3937, ptr %17, align 4, !tbaa !9
  %3938 = load i32, ptr %17, align 4, !tbaa !9
  %3939 = icmp ne i32 %3938, 0
  %3940 = xor i1 %3939, true
  %3941 = xor i1 %3940, true
  %3942 = zext i1 %3941 to i32
  %3943 = sext i32 %3942 to i64
  %3944 = call i64 @llvm.expect.i64(i64 %3943, i64 0)
  %3945 = icmp ne i64 %3944, 0
  br i1 %3945, label %3946, label %3947

3946:                                             ; preds = %3923
  br label %4478

3947:                                             ; preds = %3923
  br label %3948

3948:                                             ; preds = %3947, %3893
  %3949 = load ptr, ptr %6, align 8, !tbaa !5
  %3950 = getelementptr inbounds %struct.MDBX_cursor, ptr %3949, i32 0, i32 8
  %3951 = load ptr, ptr %3950, align 8, !tbaa !30
  store ptr %3951, ptr %62, align 8, !tbaa !5
  %3952 = load ptr, ptr %32, align 8, !tbaa !5
  %3953 = icmp ne ptr %3952, null
  br i1 %3953, label %3954, label %4021

3954:                                             ; preds = %3948
  br label %3955

3955:                                             ; preds = %3954
  %3956 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %3957 = zext i8 %3956 to i32
  %3958 = and i32 %3957, 1
  %3959 = icmp ne i32 %3958, 0
  %3960 = xor i1 %3959, true
  %3961 = xor i1 %3960, true
  %3962 = zext i1 %3961 to i32
  %3963 = sext i32 %3962 to i64
  %3964 = call i64 @llvm.expect.i64(i64 %3963, i64 1)
  %3965 = icmp ne i64 %3964, 0
  br i1 %3965, label %3966, label %4001

3966:                                             ; preds = %3955
  br label %3967

3967:                                             ; preds = %3966
  %3968 = load ptr, ptr %62, align 8, !tbaa !5
  %3969 = getelementptr inbounds %struct.inner_cursor, ptr %3968, i32 0, i32 1
  %3970 = getelementptr inbounds %struct.tree, ptr %3969, i32 0, i32 1
  %3971 = load i16, ptr %3970, align 2, !tbaa !89
  %3972 = zext i16 %3971 to i32
  %3973 = icmp eq i32 %3972, 1
  br i1 %3973, label %3974, label %3983

3974:                                             ; preds = %3967
  %3975 = load ptr, ptr %62, align 8, !tbaa !5
  %3976 = getelementptr inbounds %struct.inner_cursor, ptr %3975, i32 0, i32 1
  %3977 = getelementptr inbounds %struct.tree, ptr %3976, i32 0, i32 3
  %3978 = load i32, ptr %3977, align 8, !tbaa !90
  %3979 = load ptr, ptr %32, align 8, !tbaa !5
  %3980 = getelementptr inbounds %struct.page, ptr %3979, i32 0, i32 4
  %3981 = load i32, ptr %3980, align 1, !tbaa !9
  %3982 = icmp eq i32 %3978, %3981
  br label %3983

3983:                                             ; preds = %3974, %3967
  %3984 = phi i1 [ false, %3967 ], [ %3982, %3974 ]
  %3985 = xor i1 %3984, true
  %3986 = xor i1 %3985, true
  %3987 = xor i1 %3986, true
  %3988 = zext i1 %3987 to i32
  %3989 = sext i32 %3988 to i64
  %3990 = call i64 @llvm.expect.i64(i64 %3989, i64 0)
  %3991 = icmp ne i64 %3990, 0
  br i1 %3991, label %3992, label %3998

3992:                                             ; preds = %3983
  %3993 = load ptr, ptr %6, align 8, !tbaa !5
  %3994 = getelementptr inbounds %struct.MDBX_cursor, ptr %3993, i32 0, i32 5
  %3995 = load ptr, ptr %3994, align 8, !tbaa !11
  %3996 = getelementptr inbounds %struct.MDBX_txn, ptr %3995, i32 0, i32 9
  %3997 = load ptr, ptr %3996, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %3997, ptr noundef @.str.85, ptr noundef @__func__.cursor_put, i32 noundef 1350) #13
  unreachable

3998:                                             ; preds = %3983
  br label %3999

3999:                                             ; preds = %3998
  br label %4000

4000:                                             ; preds = %3999
  br label %4001

4001:                                             ; preds = %4000, %3955
  br label %4002

4002:                                             ; preds = %4001
  br label %4003

4003:                                             ; preds = %4002
  %4004 = load ptr, ptr %62, align 8, !tbaa !5
  %4005 = getelementptr inbounds %struct.inner_cursor, ptr %4004, i32 0, i32 0
  %4006 = getelementptr inbounds %struct.MDBX_cursor, ptr %4005, i32 0, i32 1
  %4007 = getelementptr inbounds %struct.anon, ptr %4006, i32 0, i32 0
  store i8 1, ptr %4007, align 4, !tbaa !25
  %4008 = load ptr, ptr %62, align 8, !tbaa !5
  %4009 = getelementptr inbounds %struct.inner_cursor, ptr %4008, i32 0, i32 0
  %4010 = getelementptr inbounds %struct.MDBX_cursor, ptr %4009, i32 0, i32 1
  %4011 = getelementptr inbounds %struct.anon, ptr %4010, i32 0, i32 1
  store i8 0, ptr %4011, align 1, !tbaa !25
  %4012 = load ptr, ptr %32, align 8, !tbaa !5
  %4013 = load ptr, ptr %62, align 8, !tbaa !5
  %4014 = getelementptr inbounds %struct.inner_cursor, ptr %4013, i32 0, i32 0
  %4015 = getelementptr inbounds %struct.MDBX_cursor, ptr %4014, i32 0, i32 9
  %4016 = getelementptr inbounds [32 x ptr], ptr %4015, i64 0, i64 0
  store ptr %4012, ptr %4016, align 8, !tbaa !5
  %4017 = load ptr, ptr %62, align 8, !tbaa !5
  %4018 = getelementptr inbounds %struct.inner_cursor, ptr %4017, i32 0, i32 0
  %4019 = getelementptr inbounds %struct.MDBX_cursor, ptr %4018, i32 0, i32 10
  %4020 = getelementptr inbounds [32 x i16], ptr %4019, i64 0, i64 0
  store i16 0, ptr %4020, align 8, !tbaa !31
  br label %4021

4021:                                             ; preds = %4003, %3948
  %4022 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 0
  %4023 = load ptr, ptr %4022, align 8, !tbaa !22
  %4024 = icmp ne ptr %4023, null
  br i1 %4024, label %4025, label %4056

4025:                                             ; preds = %4021
  %4026 = load ptr, ptr %62, align 8, !tbaa !5
  %4027 = getelementptr inbounds %struct.inner_cursor, ptr %4026, i32 0, i32 0
  %4028 = getelementptr inbounds %struct.MDBX_cursor, ptr %4027, i32 0, i32 9
  %4029 = getelementptr inbounds [32 x ptr], ptr %4028, i64 0, i64 0
  %4030 = load ptr, ptr %4029, align 8, !tbaa !5
  %4031 = call zeroext i1 @is_dupfix_leaf(ptr noundef %4030) #12
  br i1 %4031, label %4032, label %4036

4032:                                             ; preds = %4025
  %4033 = load ptr, ptr %62, align 8, !tbaa !5
  %4034 = getelementptr inbounds %struct.inner_cursor, ptr %4033, i32 0, i32 0
  %4035 = call i32 @node_add_dupfix(ptr noundef %4034, i64 noundef 0, ptr noundef %29)
  store i32 %4035, ptr %17, align 4, !tbaa !9
  br label %4040

4036:                                             ; preds = %4025
  %4037 = load ptr, ptr %62, align 8, !tbaa !5
  %4038 = getelementptr inbounds %struct.inner_cursor, ptr %4037, i32 0, i32 0
  %4039 = call i32 @node_add_leaf(ptr noundef %4038, i64 noundef 0, ptr noundef %29, ptr noundef %59, i32 noundef 0)
  store i32 %4039, ptr %17, align 4, !tbaa !9
  br label %4040

4040:                                             ; preds = %4036, %4032
  %4041 = load i32, ptr %17, align 4, !tbaa !9
  %4042 = icmp ne i32 %4041, 0
  %4043 = xor i1 %4042, true
  %4044 = xor i1 %4043, true
  %4045 = zext i1 %4044 to i32
  %4046 = sext i32 %4045 to i64
  %4047 = call i64 @llvm.expect.i64(i64 %4046, i64 0)
  %4048 = icmp ne i64 %4047, 0
  br i1 %4048, label %4049, label %4050

4049:                                             ; preds = %4040
  br label %4478

4050:                                             ; preds = %4040
  %4051 = load ptr, ptr %62, align 8, !tbaa !5
  %4052 = getelementptr inbounds %struct.inner_cursor, ptr %4051, i32 0, i32 0
  %4053 = getelementptr inbounds %struct.MDBX_cursor, ptr %4052, i32 0, i32 6
  %4054 = load ptr, ptr %4053, align 8, !tbaa !91
  %4055 = getelementptr inbounds %struct.tree, ptr %4054, i32 0, i32 8
  store i64 1, ptr %4055, align 4, !tbaa !48
  br label %4056

4056:                                             ; preds = %4050, %4021
  %4057 = load ptr, ptr %60, align 8, !tbaa !5
  %4058 = call zeroext i8 @node_flags(ptr noundef %4057) #12
  %4059 = zext i8 %4058 to i32
  %4060 = and i32 %4059, 2
  %4061 = icmp ne i32 %4060, 0
  br i1 %4061, label %4062, label %4065

4062:                                             ; preds = %4056
  %4063 = load ptr, ptr %32, align 8, !tbaa !5
  %4064 = icmp ne ptr %4063, null
  br i1 %4064, label %4065, label %4271

4065:                                             ; preds = %4062, %4056
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #11
  %4066 = load ptr, ptr %6, align 8, !tbaa !5
  %4067 = getelementptr inbounds %struct.MDBX_cursor, ptr %4066, i32 0, i32 9
  %4068 = load ptr, ptr %6, align 8, !tbaa !5
  %4069 = getelementptr inbounds %struct.MDBX_cursor, ptr %4068, i32 0, i32 1
  %4070 = getelementptr inbounds %struct.anon, ptr %4069, i32 0, i32 1
  %4071 = load i8, ptr %4070, align 1, !tbaa !25
  %4072 = sext i8 %4071 to i64
  %4073 = getelementptr inbounds [32 x ptr], ptr %4067, i64 0, i64 %4072
  %4074 = load ptr, ptr %4073, align 8, !tbaa !5
  store ptr %4074, ptr %63, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #11
  %4075 = load ptr, ptr %63, align 8, !tbaa !5
  %4076 = call i64 @page_numkeys(ptr noundef %4075) #12
  store i64 %4076, ptr %64, align 8, !tbaa !55
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #11
  %4077 = load ptr, ptr %6, align 8, !tbaa !5
  %4078 = call i64 @cursor_dbi(ptr noundef %4077) #12
  store i64 %4078, ptr %65, align 8, !tbaa !55
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #11
  %4079 = load ptr, ptr %6, align 8, !tbaa !5
  %4080 = getelementptr inbounds %struct.MDBX_cursor, ptr %4079, i32 0, i32 5
  %4081 = load ptr, ptr %4080, align 8, !tbaa !11
  %4082 = getelementptr inbounds %struct.MDBX_txn, ptr %4081, i32 0, i32 14
  %4083 = load ptr, ptr %4082, align 8, !tbaa !86
  %4084 = load i64, ptr %65, align 8, !tbaa !55
  %4085 = getelementptr inbounds ptr, ptr %4083, i64 %4084
  %4086 = load ptr, ptr %4085, align 8, !tbaa !5
  store ptr %4086, ptr %66, align 8, !tbaa !5
  br label %4087

4087:                                             ; preds = %4266, %4065
  %4088 = load ptr, ptr %66, align 8, !tbaa !5
  %4089 = icmp ne ptr %4088, null
  br i1 %4089, label %4091, label %4090

4090:                                             ; preds = %4087
  store i32 187, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #11
  br label %4270

4091:                                             ; preds = %4087
  %4092 = load ptr, ptr %6, align 8, !tbaa !5
  %4093 = load ptr, ptr %66, align 8, !tbaa !5
  %4094 = call zeroext i1 @is_related(ptr noundef %4092, ptr noundef %4093)
  br i1 %4094, label %4095, label %4107

4095:                                             ; preds = %4091
  %4096 = load ptr, ptr %66, align 8, !tbaa !5
  %4097 = getelementptr inbounds %struct.MDBX_cursor, ptr %4096, i32 0, i32 9
  %4098 = load ptr, ptr %6, align 8, !tbaa !5
  %4099 = getelementptr inbounds %struct.MDBX_cursor, ptr %4098, i32 0, i32 1
  %4100 = getelementptr inbounds %struct.anon, ptr %4099, i32 0, i32 1
  %4101 = load i8, ptr %4100, align 1, !tbaa !25
  %4102 = sext i8 %4101 to i64
  %4103 = getelementptr inbounds [32 x ptr], ptr %4097, i64 0, i64 %4102
  %4104 = load ptr, ptr %4103, align 8, !tbaa !5
  %4105 = load ptr, ptr %63, align 8, !tbaa !5
  %4106 = icmp ne ptr %4104, %4105
  br i1 %4106, label %4107, label %4108

4107:                                             ; preds = %4095, %4091
  br label %4266

4108:                                             ; preds = %4095
  %4109 = load ptr, ptr %66, align 8, !tbaa !5
  %4110 = call zeroext i1 @is_filled(ptr noundef %4109) #12
  br i1 %4110, label %4111, label %4235

4111:                                             ; preds = %4108
  %4112 = load ptr, ptr %66, align 8, !tbaa !5
  %4113 = getelementptr inbounds %struct.MDBX_cursor, ptr %4112, i32 0, i32 10
  %4114 = load ptr, ptr %6, align 8, !tbaa !5
  %4115 = getelementptr inbounds %struct.MDBX_cursor, ptr %4114, i32 0, i32 1
  %4116 = getelementptr inbounds %struct.anon, ptr %4115, i32 0, i32 1
  %4117 = load i8, ptr %4116, align 1, !tbaa !25
  %4118 = sext i8 %4117 to i64
  %4119 = getelementptr inbounds [32 x i16], ptr %4113, i64 0, i64 %4118
  %4120 = load i16, ptr %4119, align 2, !tbaa !31
  %4121 = zext i16 %4120 to i32
  %4122 = load ptr, ptr %6, align 8, !tbaa !5
  %4123 = getelementptr inbounds %struct.MDBX_cursor, ptr %4122, i32 0, i32 10
  %4124 = load ptr, ptr %6, align 8, !tbaa !5
  %4125 = getelementptr inbounds %struct.MDBX_cursor, ptr %4124, i32 0, i32 1
  %4126 = getelementptr inbounds %struct.anon, ptr %4125, i32 0, i32 1
  %4127 = load i8, ptr %4126, align 1, !tbaa !25
  %4128 = sext i8 %4127 to i64
  %4129 = getelementptr inbounds [32 x i16], ptr %4123, i64 0, i64 %4128
  %4130 = load i16, ptr %4129, align 2, !tbaa !31
  %4131 = zext i16 %4130 to i32
  %4132 = icmp eq i32 %4121, %4131
  br i1 %4132, label %4133, label %4235

4133:                                             ; preds = %4111
  br label %4134

4134:                                             ; preds = %4133
  %4135 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %4136 = zext i8 %4135 to i32
  %4137 = and i32 %4136, 1
  %4138 = icmp ne i32 %4137, 0
  %4139 = xor i1 %4138, true
  %4140 = xor i1 %4139, true
  %4141 = zext i1 %4140 to i32
  %4142 = sext i32 %4141 to i64
  %4143 = call i64 @llvm.expect.i64(i64 %4142, i64 1)
  %4144 = icmp ne i64 %4143, 0
  br i1 %4144, label %4145, label %4174

4145:                                             ; preds = %4134
  br label %4146

4146:                                             ; preds = %4145
  %4147 = load ptr, ptr %66, align 8, !tbaa !5
  %4148 = getelementptr inbounds %struct.MDBX_cursor, ptr %4147, i32 0, i32 8
  %4149 = load ptr, ptr %4148, align 8, !tbaa !30
  %4150 = getelementptr inbounds %struct.inner_cursor, ptr %4149, i32 0, i32 0
  %4151 = getelementptr inbounds %struct.MDBX_cursor, ptr %4150, i32 0, i32 7
  %4152 = load ptr, ptr %4151, align 8, !tbaa !67
  %4153 = load ptr, ptr %62, align 8, !tbaa !5
  %4154 = getelementptr inbounds %struct.inner_cursor, ptr %4153, i32 0, i32 0
  %4155 = getelementptr inbounds %struct.MDBX_cursor, ptr %4154, i32 0, i32 7
  %4156 = load ptr, ptr %4155, align 8, !tbaa !67
  %4157 = icmp eq ptr %4152, %4156
  %4158 = xor i1 %4157, true
  %4159 = xor i1 %4158, true
  %4160 = xor i1 %4159, true
  %4161 = zext i1 %4160 to i32
  %4162 = sext i32 %4161 to i64
  %4163 = call i64 @llvm.expect.i64(i64 %4162, i64 0)
  %4164 = icmp ne i64 %4163, 0
  br i1 %4164, label %4165, label %4171

4165:                                             ; preds = %4146
  %4166 = load ptr, ptr %66, align 8, !tbaa !5
  %4167 = getelementptr inbounds %struct.MDBX_cursor, ptr %4166, i32 0, i32 5
  %4168 = load ptr, ptr %4167, align 8, !tbaa !11
  %4169 = getelementptr inbounds %struct.MDBX_txn, ptr %4168, i32 0, i32 9
  %4170 = load ptr, ptr %4169, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %4170, ptr noundef @.str.86, ptr noundef @__func__.cursor_put, i32 noundef 1378) #13
  unreachable

4171:                                             ; preds = %4146
  br label %4172

4172:                                             ; preds = %4171
  br label %4173

4173:                                             ; preds = %4172
  br label %4174

4174:                                             ; preds = %4173, %4134
  br label %4175

4175:                                             ; preds = %4174
  br label %4176

4176:                                             ; preds = %4175
  %4177 = load ptr, ptr %66, align 8, !tbaa !5
  %4178 = getelementptr inbounds %struct.MDBX_cursor, ptr %4177, i32 0, i32 8
  %4179 = load ptr, ptr %4178, align 8, !tbaa !30
  %4180 = getelementptr inbounds %struct.inner_cursor, ptr %4179, i32 0, i32 1
  %4181 = load ptr, ptr %62, align 8, !tbaa !5
  %4182 = getelementptr inbounds %struct.inner_cursor, ptr %4181, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %4180, ptr align 8 %4182, i64 48, i1 false), !tbaa.struct !92
  %4183 = load ptr, ptr %62, align 8, !tbaa !5
  %4184 = getelementptr inbounds %struct.inner_cursor, ptr %4183, i32 0, i32 0
  %4185 = getelementptr inbounds %struct.MDBX_cursor, ptr %4184, i32 0, i32 9
  %4186 = getelementptr inbounds [32 x ptr], ptr %4185, i64 0, i64 0
  %4187 = load ptr, ptr %4186, align 8, !tbaa !5
  %4188 = load ptr, ptr %66, align 8, !tbaa !5
  %4189 = getelementptr inbounds %struct.MDBX_cursor, ptr %4188, i32 0, i32 8
  %4190 = load ptr, ptr %4189, align 8, !tbaa !30
  %4191 = getelementptr inbounds %struct.inner_cursor, ptr %4190, i32 0, i32 0
  %4192 = getelementptr inbounds %struct.MDBX_cursor, ptr %4191, i32 0, i32 9
  %4193 = getelementptr inbounds [32 x ptr], ptr %4192, i64 0, i64 0
  store ptr %4187, ptr %4193, align 8, !tbaa !5
  %4194 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 0
  %4195 = load ptr, ptr %4194, align 8, !tbaa !22
  %4196 = icmp ne ptr %4195, null
  br i1 %4196, label %4197, label %4209

4197:                                             ; preds = %4176
  %4198 = load ptr, ptr %66, align 8, !tbaa !5
  %4199 = getelementptr inbounds %struct.MDBX_cursor, ptr %4198, i32 0, i32 8
  %4200 = load ptr, ptr %4199, align 8, !tbaa !30
  %4201 = getelementptr inbounds %struct.inner_cursor, ptr %4200, i32 0, i32 0
  %4202 = getelementptr inbounds %struct.MDBX_cursor, ptr %4201, i32 0, i32 1
  store i16 1, ptr %4202, align 4, !tbaa !25
  %4203 = load ptr, ptr %66, align 8, !tbaa !5
  %4204 = getelementptr inbounds %struct.MDBX_cursor, ptr %4203, i32 0, i32 8
  %4205 = load ptr, ptr %4204, align 8, !tbaa !30
  %4206 = getelementptr inbounds %struct.inner_cursor, ptr %4205, i32 0, i32 0
  %4207 = getelementptr inbounds %struct.MDBX_cursor, ptr %4206, i32 0, i32 10
  %4208 = getelementptr inbounds [32 x i16], ptr %4207, i64 0, i64 0
  store i16 0, ptr %4208, align 8, !tbaa !31
  br label %4209

4209:                                             ; preds = %4197, %4176
  br label %4210

4210:                                             ; preds = %4209
  %4211 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %4212 = zext i8 %4211 to i32
  %4213 = icmp sle i32 5, %4212
  %4214 = xor i1 %4213, true
  %4215 = xor i1 %4214, true
  %4216 = zext i1 %4215 to i32
  %4217 = sext i32 %4216 to i64
  %4218 = call i64 @llvm.expect.i64(i64 %4217, i64 0)
  %4219 = icmp ne i64 %4218, 0
  br i1 %4219, label %4220, label %4232

4220:                                             ; preds = %4210
  %4221 = load ptr, ptr %66, align 8, !tbaa !5
  %4222 = getelementptr inbounds %struct.MDBX_cursor, ptr %4221, i32 0, i32 8
  %4223 = load ptr, ptr %4222, align 8, !tbaa !30
  %4224 = getelementptr inbounds %struct.inner_cursor, ptr %4223, i32 0, i32 0
  %4225 = call i64 @cursor_dbi(ptr noundef %4224) #12
  %4226 = load ptr, ptr %66, align 8, !tbaa !5
  %4227 = getelementptr inbounds %struct.MDBX_cursor, ptr %4226, i32 0, i32 8
  %4228 = load ptr, ptr %4227, align 8, !tbaa !30
  %4229 = getelementptr inbounds %struct.inner_cursor, ptr %4228, i32 0, i32 1
  %4230 = getelementptr inbounds %struct.tree, ptr %4229, i32 0, i32 3
  %4231 = load i32, ptr %4230, align 8, !tbaa !90
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_put, i32 noundef 1385, ptr noundef @.str.87, i64 noundef %4225, i32 noundef %4231)
  br label %4232

4232:                                             ; preds = %4220, %4210
  br label %4233

4233:                                             ; preds = %4232
  br label %4234

4234:                                             ; preds = %4233
  br label %4265

4235:                                             ; preds = %4111, %4108
  %4236 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %4237 = trunc i8 %4236 to i1
  br i1 %4237, label %4264, label %4238

4238:                                             ; preds = %4235
  %4239 = load ptr, ptr %66, align 8, !tbaa !5
  %4240 = getelementptr inbounds %struct.MDBX_cursor, ptr %4239, i32 0, i32 10
  %4241 = load ptr, ptr %6, align 8, !tbaa !5
  %4242 = getelementptr inbounds %struct.MDBX_cursor, ptr %4241, i32 0, i32 1
  %4243 = getelementptr inbounds %struct.anon, ptr %4242, i32 0, i32 1
  %4244 = load i8, ptr %4243, align 1, !tbaa !25
  %4245 = sext i8 %4244 to i64
  %4246 = getelementptr inbounds [32 x i16], ptr %4240, i64 0, i64 %4245
  %4247 = load i16, ptr %4246, align 2, !tbaa !31
  %4248 = zext i16 %4247 to i64
  %4249 = load i64, ptr %64, align 8, !tbaa !55
  %4250 = icmp slt i64 %4248, %4249
  br i1 %4250, label %4251, label %4264

4251:                                             ; preds = %4238
  %4252 = load ptr, ptr %66, align 8, !tbaa !5
  %4253 = load ptr, ptr %63, align 8, !tbaa !5
  %4254 = load ptr, ptr %66, align 8, !tbaa !5
  %4255 = getelementptr inbounds %struct.MDBX_cursor, ptr %4254, i32 0, i32 10
  %4256 = load ptr, ptr %6, align 8, !tbaa !5
  %4257 = getelementptr inbounds %struct.MDBX_cursor, ptr %4256, i32 0, i32 1
  %4258 = getelementptr inbounds %struct.anon, ptr %4257, i32 0, i32 1
  %4259 = load i8, ptr %4258, align 1, !tbaa !25
  %4260 = sext i8 %4259 to i64
  %4261 = getelementptr inbounds [32 x i16], ptr %4255, i64 0, i64 %4260
  %4262 = load i16, ptr %4261, align 2, !tbaa !31
  %4263 = zext i16 %4262 to i32
  call void @cursor_inner_refresh(ptr noundef %4252, ptr noundef %4253, i32 noundef %4263)
  br label %4264

4264:                                             ; preds = %4251, %4238, %4235
  br label %4265

4265:                                             ; preds = %4264, %4234
  br label %4266

4266:                                             ; preds = %4265, %4107
  %4267 = load ptr, ptr %66, align 8, !tbaa !5
  %4268 = getelementptr inbounds %struct.MDBX_cursor, ptr %4267, i32 0, i32 11
  %4269 = load ptr, ptr %4268, align 8, !tbaa !87
  store ptr %4269, ptr %66, align 8, !tbaa !5
  br label %4087, !llvm.loop !93

4270:                                             ; preds = %4090
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #11
  br label %4271

4271:                                             ; preds = %4270, %4062
  br label %4272

4272:                                             ; preds = %4271
  %4273 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %4274 = zext i8 %4273 to i32
  %4275 = and i32 %4274, 1
  %4276 = icmp ne i32 %4275, 0
  %4277 = xor i1 %4276, true
  %4278 = xor i1 %4277, true
  %4279 = zext i1 %4278 to i32
  %4280 = sext i32 %4279 to i64
  %4281 = call i64 @llvm.expect.i64(i64 %4280, i64 1)
  %4282 = icmp ne i64 %4281, 0
  br i1 %4282, label %4283, label %4308

4283:                                             ; preds = %4272
  br label %4284

4284:                                             ; preds = %4283
  %4285 = load ptr, ptr %6, align 8, !tbaa !5
  %4286 = getelementptr inbounds %struct.MDBX_cursor, ptr %4285, i32 0, i32 8
  %4287 = load ptr, ptr %4286, align 8, !tbaa !30
  %4288 = getelementptr inbounds %struct.inner_cursor, ptr %4287, i32 0, i32 1
  %4289 = getelementptr inbounds %struct.tree, ptr %4288, i32 0, i32 8
  %4290 = load i64, ptr %4289, align 8, !tbaa !33
  %4291 = icmp ult i64 %4290, 9223372036854775807
  %4292 = xor i1 %4291, true
  %4293 = xor i1 %4292, true
  %4294 = xor i1 %4293, true
  %4295 = zext i1 %4294 to i32
  %4296 = sext i32 %4295 to i64
  %4297 = call i64 @llvm.expect.i64(i64 %4296, i64 0)
  %4298 = icmp ne i64 %4297, 0
  br i1 %4298, label %4299, label %4305

4299:                                             ; preds = %4284
  %4300 = load ptr, ptr %6, align 8, !tbaa !5
  %4301 = getelementptr inbounds %struct.MDBX_cursor, ptr %4300, i32 0, i32 5
  %4302 = load ptr, ptr %4301, align 8, !tbaa !11
  %4303 = getelementptr inbounds %struct.MDBX_txn, ptr %4302, i32 0, i32 9
  %4304 = load ptr, ptr %4303, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %4304, ptr noundef @.str.88, ptr noundef @__func__.cursor_put, i32 noundef 1390) #13
  unreachable

4305:                                             ; preds = %4284
  br label %4306

4306:                                             ; preds = %4305
  br label %4307

4307:                                             ; preds = %4306
  br label %4308

4308:                                             ; preds = %4307, %4272
  br label %4309

4309:                                             ; preds = %4308
  br label %4310

4310:                                             ; preds = %4309
  %4311 = load ptr, ptr %6, align 8, !tbaa !5
  %4312 = getelementptr inbounds %struct.MDBX_cursor, ptr %4311, i32 0, i32 8
  %4313 = load ptr, ptr %4312, align 8, !tbaa !30
  %4314 = getelementptr inbounds %struct.inner_cursor, ptr %4313, i32 0, i32 1
  %4315 = getelementptr inbounds %struct.tree, ptr %4314, i32 0, i32 8
  %4316 = load i64, ptr %4315, align 8, !tbaa !33
  store i64 %4316, ptr %67, align 8, !tbaa !55
  %4317 = load i32, ptr %9, align 4, !tbaa !9
  %4318 = and i32 %4317, 262144
  %4319 = lshr i32 %4318, 1
  %4320 = load i32, ptr %61, align 4, !tbaa !9
  %4321 = or i32 %4320, %4319
  store i32 %4321, ptr %61, align 4, !tbaa !9
  %4322 = load ptr, ptr %6, align 8, !tbaa !5
  %4323 = getelementptr inbounds %struct.MDBX_cursor, ptr %4322, i32 0, i32 8
  %4324 = load ptr, ptr %4323, align 8, !tbaa !30
  %4325 = getelementptr inbounds %struct.inner_cursor, ptr %4324, i32 0, i32 0
  %4326 = load ptr, ptr %8, align 8, !tbaa !5
  %4327 = load i32, ptr %61, align 4, !tbaa !9
  %4328 = call i32 @cursor_put(ptr noundef %4325, ptr noundef %4326, ptr noundef %59, i32 noundef %4327) #14
  store i32 %4328, ptr %17, align 4, !tbaa !9
  %4329 = load i32, ptr %9, align 4, !tbaa !9
  %4330 = and i32 %4329, 2
  %4331 = icmp ne i32 %4330, 0
  br i1 %4331, label %4332, label %4350

4332:                                             ; preds = %4310
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #11
  %4333 = load ptr, ptr %60, align 8, !tbaa !5
  %4334 = call ptr @node_data(ptr noundef %4333) #12
  store ptr %4334, ptr %68, align 8, !tbaa !5
  %4335 = load ptr, ptr %6, align 8, !tbaa !5
  %4336 = getelementptr inbounds %struct.MDBX_cursor, ptr %4335, i32 0, i32 5
  %4337 = load ptr, ptr %4336, align 8, !tbaa !11
  %4338 = getelementptr inbounds %struct.MDBX_txn, ptr %4337, i32 0, i32 7
  %4339 = load i64, ptr %4338, align 8, !tbaa !75
  %4340 = load ptr, ptr %6, align 8, !tbaa !5
  %4341 = getelementptr inbounds %struct.MDBX_cursor, ptr %4340, i32 0, i32 8
  %4342 = load ptr, ptr %4341, align 8, !tbaa !30
  %4343 = getelementptr inbounds %struct.inner_cursor, ptr %4342, i32 0, i32 1
  %4344 = getelementptr inbounds %struct.tree, ptr %4343, i32 0, i32 9
  store i64 %4339, ptr %4344, align 8, !tbaa !94
  %4345 = load ptr, ptr %68, align 8, !tbaa !5
  %4346 = load ptr, ptr %6, align 8, !tbaa !5
  %4347 = getelementptr inbounds %struct.MDBX_cursor, ptr %4346, i32 0, i32 8
  %4348 = load ptr, ptr %4347, align 8, !tbaa !30
  %4349 = getelementptr inbounds %struct.inner_cursor, ptr %4348, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %4345, ptr align 8 %4349, i64 48, i1 false)
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #11
  br label %4350

4350:                                             ; preds = %4332, %4310
  %4351 = load i64, ptr %67, align 8, !tbaa !55
  %4352 = load ptr, ptr %6, align 8, !tbaa !5
  %4353 = getelementptr inbounds %struct.MDBX_cursor, ptr %4352, i32 0, i32 8
  %4354 = load ptr, ptr %4353, align 8, !tbaa !30
  %4355 = getelementptr inbounds %struct.inner_cursor, ptr %4354, i32 0, i32 1
  %4356 = getelementptr inbounds %struct.tree, ptr %4355, i32 0, i32 8
  %4357 = load i64, ptr %4356, align 8, !tbaa !33
  %4358 = icmp ne i64 %4351, %4357
  %4359 = zext i1 %4358 to i8
  store i8 %4359, ptr %34, align 1, !tbaa !47
  br label %4360

4360:                                             ; preds = %4350, %3888
  %4361 = load i8, ptr %34, align 1, !tbaa !47, !range !52, !noundef !53
  %4362 = trunc i8 %4361 to i1
  br i1 %4362, label %4363, label %4370

4363:                                             ; preds = %4360
  %4364 = load ptr, ptr %6, align 8, !tbaa !5
  %4365 = getelementptr inbounds %struct.MDBX_cursor, ptr %4364, i32 0, i32 6
  %4366 = load ptr, ptr %4365, align 8, !tbaa !45
  %4367 = getelementptr inbounds %struct.tree, ptr %4366, i32 0, i32 8
  %4368 = load i64, ptr %4367, align 4, !tbaa !48
  %4369 = add i64 %4368, 1
  store i64 %4369, ptr %4367, align 4, !tbaa !48
  br label %4370

4370:                                             ; preds = %4363, %4360
  %4371 = load i8, ptr %33, align 1, !tbaa !47, !range !52, !noundef !53
  %4372 = trunc i8 %4371 to i1
  br i1 %4372, label %4373, label %4385

4373:                                             ; preds = %4370
  %4374 = load i32, ptr %17, align 4, !tbaa !9
  %4375 = icmp ne i32 %4374, 0
  %4376 = xor i1 %4375, true
  %4377 = xor i1 %4376, true
  %4378 = zext i1 %4377 to i32
  %4379 = sext i32 %4378 to i64
  %4380 = call i64 @llvm.expect.i64(i64 %4379, i64 0)
  %4381 = icmp ne i64 %4380, 0
  br i1 %4381, label %4382, label %4383

4382:                                             ; preds = %4373
  br label %4478

4383:                                             ; preds = %4373
  %4384 = load ptr, ptr %6, align 8, !tbaa !5
  call void @be_filled(ptr noundef %4384)
  br label %4385

4385:                                             ; preds = %4383, %4370
  %4386 = load i32, ptr %17, align 4, !tbaa !9
  %4387 = icmp eq i32 %4386, 0
  %4388 = xor i1 %4387, true
  %4389 = xor i1 %4388, true
  %4390 = zext i1 %4389 to i32
  %4391 = sext i32 %4390 to i64
  %4392 = call i64 @llvm.expect.i64(i64 %4391, i64 1)
  %4393 = icmp ne i64 %4392, 0
  br i1 %4393, label %4394, label %4476

4394:                                             ; preds = %4385
  br label %4395

4395:                                             ; preds = %4394
  %4396 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %4397 = zext i8 %4396 to i32
  %4398 = and i32 %4397, 1
  %4399 = icmp ne i32 %4398, 0
  %4400 = xor i1 %4399, true
  %4401 = xor i1 %4400, true
  %4402 = zext i1 %4401 to i32
  %4403 = sext i32 %4402 to i64
  %4404 = call i64 @llvm.expect.i64(i64 %4403, i64 1)
  %4405 = icmp ne i64 %4404, 0
  br i1 %4405, label %4406, label %4426

4406:                                             ; preds = %4395
  br label %4407

4407:                                             ; preds = %4406
  %4408 = load ptr, ptr %6, align 8, !tbaa !5
  %4409 = call zeroext i1 @is_filled(ptr noundef %4408) #12
  %4410 = xor i1 %4409, true
  %4411 = xor i1 %4410, true
  %4412 = xor i1 %4411, true
  %4413 = zext i1 %4412 to i32
  %4414 = sext i32 %4413 to i64
  %4415 = call i64 @llvm.expect.i64(i64 %4414, i64 0)
  %4416 = icmp ne i64 %4415, 0
  br i1 %4416, label %4417, label %4423

4417:                                             ; preds = %4407
  %4418 = load ptr, ptr %6, align 8, !tbaa !5
  %4419 = getelementptr inbounds %struct.MDBX_cursor, ptr %4418, i32 0, i32 5
  %4420 = load ptr, ptr %4419, align 8, !tbaa !11
  %4421 = getelementptr inbounds %struct.MDBX_txn, ptr %4420, i32 0, i32 9
  %4422 = load ptr, ptr %4421, align 8, !tbaa !13
  call void @mdbx_assert_fail(ptr noundef %4422, ptr noundef @.str.5, ptr noundef @__func__.cursor_put, i32 noundef 1414) #13
  unreachable

4423:                                             ; preds = %4407
  br label %4424

4424:                                             ; preds = %4423
  br label %4425

4425:                                             ; preds = %4424
  br label %4426

4426:                                             ; preds = %4425, %4395
  br label %4427

4427:                                             ; preds = %4426
  br label %4428

4428:                                             ; preds = %4427
  %4429 = load ptr, ptr %26, align 8, !tbaa !5
  %4430 = icmp ne ptr %4429, null
  %4431 = xor i1 %4430, true
  %4432 = xor i1 %4431, true
  %4433 = zext i1 %4432 to i32
  %4434 = sext i32 %4433 to i64
  %4435 = call i64 @llvm.expect.i64(i64 %4434, i64 0)
  %4436 = icmp ne i64 %4435, 0
  br i1 %4436, label %4437, label %4461

4437:                                             ; preds = %4428
  br label %4438

4438:                                             ; preds = %4437, %2329
  %4439 = load ptr, ptr %26, align 8, !tbaa !5
  %4440 = load i64, ptr %4439, align 8, !tbaa !55
  %4441 = add i64 %4440, 1
  store i64 %4441, ptr %4439, align 8, !tbaa !55
  %4442 = load i64, ptr %27, align 8, !tbaa !55
  %4443 = icmp ult i64 %4441, %4442
  br i1 %4443, label %4444, label %4460

4444:                                             ; preds = %4438
  %4445 = load ptr, ptr %8, align 8, !tbaa !5
  %4446 = getelementptr inbounds %struct.iovec, ptr %4445, i64 0
  %4447 = getelementptr inbounds %struct.iovec, ptr %4446, i32 0, i32 0
  %4448 = load ptr, ptr %4447, align 8, !tbaa !22
  %4449 = ptrtoint ptr %4448 to i64
  %4450 = load ptr, ptr %8, align 8, !tbaa !5
  %4451 = getelementptr inbounds %struct.iovec, ptr %4450, i64 0
  %4452 = getelementptr inbounds %struct.iovec, ptr %4451, i32 0, i32 1
  %4453 = load i64, ptr %4452, align 8, !tbaa !24
  %4454 = add nsw i64 %4449, %4453
  %4455 = inttoptr i64 %4454 to ptr
  %4456 = load ptr, ptr %8, align 8, !tbaa !5
  %4457 = getelementptr inbounds %struct.iovec, ptr %4456, i64 0
  %4458 = getelementptr inbounds %struct.iovec, ptr %4457, i32 0, i32 0
  store ptr %4455, ptr %4458, align 8, !tbaa !22
  store i8 0, ptr %34, align 1, !tbaa !47
  store i8 0, ptr %33, align 1, !tbaa !47
  %4459 = getelementptr inbounds %struct.iovec, ptr %29, i32 0, i32 0
  store ptr null, ptr %4459, align 8, !tbaa !22
  store ptr null, ptr %32, align 8, !tbaa !5
  br label %1663

4460:                                             ; preds = %4438
  br label %4461

4461:                                             ; preds = %4460, %4428
  %4462 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !32
  %4463 = zext i8 %4462 to i32
  %4464 = and i32 %4463, 2
  %4465 = icmp ne i32 %4464, 0
  %4466 = xor i1 %4465, true
  %4467 = xor i1 %4466, true
  %4468 = zext i1 %4467 to i32
  %4469 = sext i32 %4468 to i64
  %4470 = call i64 @llvm.expect.i64(i64 %4469, i64 0)
  %4471 = icmp ne i64 %4470, 0
  br i1 %4471, label %4472, label %4475

4472:                                             ; preds = %4461
  %4473 = load ptr, ptr %6, align 8, !tbaa !5
  %4474 = call i32 @cursor_validate(ptr noundef %4473) #15
  store i32 %4474, ptr %17, align 4, !tbaa !9
  br label %4475

4475:                                             ; preds = %4472, %4461
  br label %4476

4476:                                             ; preds = %4475, %4385
  %4477 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %4477, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

4478:                                             ; preds = %4382, %4049, %3946
  %4479 = load i32, ptr %17, align 4, !tbaa !9
  %4480 = icmp eq i32 %4479, -30799
  %4481 = xor i1 %4480, true
  %4482 = xor i1 %4481, true
  %4483 = zext i1 %4482 to i32
  %4484 = sext i32 %4483 to i64
  %4485 = call i64 @llvm.expect.i64(i64 %4484, i64 0)
  %4486 = icmp ne i64 %4485, 0
  br i1 %4486, label %4487, label %4503

4487:                                             ; preds = %4478
  br label %4488

4488:                                             ; preds = %4487
  %4489 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !19
  %4490 = zext i8 %4489 to i32
  %4491 = icmp sle i32 1, %4490
  %4492 = xor i1 %4491, true
  %4493 = xor i1 %4492, true
  %4494 = zext i1 %4493 to i32
  %4495 = sext i32 %4494 to i64
  %4496 = call i64 @llvm.expect.i64(i64 %4495, i64 0)
  %4497 = icmp ne i64 %4496, 0
  br i1 %4497, label %4498, label %4500

4498:                                             ; preds = %4488
  %4499 = load i32, ptr %17, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.cursor_put, i32 noundef 1434, ptr noundef @.str.89, i32 noundef %4499)
  br label %4500

4500:                                             ; preds = %4498, %4488
  br label %4501

4501:                                             ; preds = %4500
  br label %4502

4502:                                             ; preds = %4501
  store i32 -30779, ptr %17, align 4, !tbaa !9
  br label %4503

4503:                                             ; preds = %4502, %4478
  br label %4504

4504:                                             ; preds = %4503, %3879
  %4505 = load ptr, ptr %6, align 8, !tbaa !5
  %4506 = getelementptr inbounds %struct.MDBX_cursor, ptr %4505, i32 0, i32 5
  %4507 = load ptr, ptr %4506, align 8, !tbaa !11
  %4508 = getelementptr inbounds %struct.MDBX_txn, ptr %4507, i32 0, i32 1
  %4509 = load i32, ptr %4508, align 4, !tbaa !95
  %4510 = or i32 %4509, 2
  store i32 %4510, ptr %4508, align 4, !tbaa !95
  %4511 = load i32, ptr %17, align 4, !tbaa !9
  store i32 %4511, ptr %5, align 4
  store i32 1, ptr %13, align 4
  br label %4512

4512:                                             ; preds = %4504, %4476, %3585, %3582, %3219, %2798, %2330, %2319, %2234, %2075, %1685, %1661, %1658, %1633, %1475, %1351, %980, %961, %923, %372, %142
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #11
  call void @llvm.lifetime.end.p0(i64 510, ptr %11) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #11
  %4513 = load i32, ptr %5, align 4
  ret i32 %4513

4514:                                             ; preds = %3870
  unreachable
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @cursor_dbi_dbg(ptr noundef) #10

declare ptr @mdbx_dump_val(ptr noundef, ptr noundef, i64 noundef) #8

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_ops(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #5

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_del(ptr noundef, i32 noundef) #5

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

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

; Function Attrs: hot nounwind uwtable
declare dso_local i64 @cursor_seek(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #5

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

declare { ptr, i32 } @page_new(ptr noundef, i32 noundef) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @cursor_push(ptr noundef, ptr noundef, i16 noundef zeroext) #10

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

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

declare i32 @tree_propagate_key(ptr noundef, ptr noundef) #8

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

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

declare { ptr, i32 } @page_get_large(ptr noundef, i32 noundef, i64 noundef) #8

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

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

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

declare { ptr, i32 } @page_unspill(ptr noundef, ptr noundef) #8

declare ptr @page_shadow_alloc(ptr noundef, i64 noundef) #8

declare i32 @page_dirty(ptr noundef, ptr noundef, i64 noundef) #8

declare zeroext i1 @dpl_check(ptr noundef) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @node_set_ds(ptr noalias noundef, i64 noundef) #10

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

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

declare i64 @page_subleaf2_reserve(ptr noundef, i64 noundef, i64 noundef, i64 noundef) #8

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

; Function Attrs: inlinehint nounwind willreturn memory(none) uwtable
declare hidden i64 @node_size_len(i64 noundef, i64 noundef) #9

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

declare { ptr, i32 } @gc_alloc_single(ptr noundef) #8

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @node_set_ks(ptr noalias noundef, i64 noundef) #10

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden ptr @node_key(ptr noalias noundef) #4

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

declare i32 @page_split(ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) #8

declare i32 @node_add_dupfix(ptr noundef, i64 noundef, ptr noundef) #8

declare i32 @node_add_leaf(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 noundef) #8

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cursor_inner_refresh(ptr noundef, ptr noundef, i32 noundef) #10

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 16}
!12 = !{!"MDBX_cursor", !10, i64 0, !7, i64 4, !7, i64 6, !7, i64 7, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !7, i64 48, !7, i64 304, !6, i64 368, !6, i64 376}
!13 = !{!14, !6, i64 80}
!14 = !{!"MDBX_txn", !10, i64 0, !10, i64 4, !15, i64 8, !15, i64 16, !6, i64 24, !6, i64 32, !16, i64 40, !15, i64 64, !15, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !18, i64 128, !6, i64 160, !7, i64 168}
!15 = !{!"long", !7, i64 0}
!16 = !{!"geo", !17, i64 0, !17, i64 2, !10, i64 4, !10, i64 8, !7, i64 12, !7, i64 16}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MDBX_canary", !15, i64 0, !15, i64 8, !15, i64 16, !15, i64 24}
!19 = !{!20, !7, i64 26}
!20 = !{!"libmdbx_globals", !7, i64 0, !10, i64 16, !10, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !21, i64 27, !10, i64 28, !7, i64 32, !7, i64 40, !15, i64 80, !6, i64 88}
!21 = !{!"_Bool", !7, i64 0}
!22 = !{!23, !6, i64 0}
!23 = !{!"iovec", !6, i64 0, !15, i64 8}
!24 = !{!23, !15, i64 8}
!25 = !{!7, !7, i64 0}
!26 = !{!12, !6, i64 32}
!27 = !{!28, !6, i64 0}
!28 = !{!"clc2", !29, i64 0, !29, i64 24}
!29 = !{!"clc", !6, i64 0, !15, i64 8, !15, i64 16}
!30 = !{!12, !6, i64 40}
!31 = !{!17, !17, i64 0}
!32 = !{!20, !7, i64 25}
!33 = !{!34, !15, i64 416}
!34 = !{!"inner_cursor", !12, i64 0, !35, i64 384}
!35 = !{!"tree", !17, i64 0, !17, i64 2, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !15, i64 24, !15, i64 32, !15, i64 40}
!36 = !{!37, !17, i64 112}
!37 = !{!"MDBX_env", !7, i64 0, !10, i64 4, !10, i64 8, !38, i64 16, !10, i64 56, !10, i64 60, !38, i64 64, !6, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144, !39, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !10, i64 224, !10, i64 228, !10, i64 232, !6, i64 240, !6, i64 248, !15, i64 256, !40, i64 264, !42, i64 320, !21, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !43, i64 392, !7, i64 400, !10, i64 440, !10, i64 444, !6, i64 448, !44, i64 456, !7, i64 496, !7, i64 536}
!38 = !{!"osal_mmap", !7, i64 0, !10, i64 8, !15, i64 16, !15, i64 24, !15, i64 32}
!39 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!40 = !{!"", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !15, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !10, i64 28, !10, i64 32, !21, i64 36, !21, i64 37, !21, i64 38, !41, i64 40, !7, i64 48}
!41 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!42 = !{!"", !15, i64 0, !15, i64 8, !15, i64 16, !15, i64 24, !15, i64 32}
!43 = !{!"", !15, i64 0}
!44 = !{!"osal_ioring", !10, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!45 = !{!12, !6, i64 24}
!46 = !{!35, !17, i64 2}
!47 = !{!21, !21, i64 0}
!48 = !{!35, !15, i64 32}
!49 = !{!50, !10, i64 0}
!50 = !{!"cursor_set_result", !10, i64 0, !21, i64 4}
!51 = !{!50, !21, i64 4}
!52 = !{i8 0, i8 2}
!53 = !{}
!54 = !{i64 0, i64 8, !5, i64 8, i64 8, !55}
!55 = !{!15, !15, i64 0}
!56 = !{!28, !6, i64 24}
!57 = !{!58, !10, i64 8}
!58 = !{!"page_get_result", !6, i64 0, !10, i64 8}
!59 = !{!58, !6, i64 0}
!60 = !{!35, !10, i64 8}
!61 = !{!35, !17, i64 0}
!62 = !{!28, !15, i64 8}
!63 = !{!28, !15, i64 16}
!64 = !{!28, !15, i64 32}
!65 = !{!28, !15, i64 40}
!66 = !{!35, !10, i64 4}
!67 = !{!34, !6, i64 32}
!68 = !{!37, !6, i64 184}
!69 = !{!14, !15, i64 72}
!70 = distinct !{!70, !71}
!71 = !{!"llvm.loop.mustprogress"}
!72 = !{!14, !6, i64 88}
!73 = !{i64 0, i64 8, !5, i64 8, i64 4, !9}
!74 = !{!14, !6, i64 24}
!75 = !{!14, !15, i64 64}
!76 = !{!37, !6, i64 104}
!77 = !{!37, !10, i64 8}
!78 = !{!37, !17, i64 116}
!79 = !{!37, !17, i64 118}
!80 = !{!35, !10, i64 12}
!81 = !{!35, !10, i64 16}
!82 = !{!35, !10, i64 20}
!83 = !{!35, !15, i64 24}
!84 = !{!35, !15, i64 40}
!85 = distinct !{!85, !71}
!86 = !{!14, !6, i64 120}
!87 = !{!12, !6, i64 368}
!88 = distinct !{!88, !71}
!89 = !{!34, !17, i64 386}
!90 = !{!34, !10, i64 392}
!91 = !{!34, !6, i64 24}
!92 = !{i64 0, i64 2, !31, i64 2, i64 2, !31, i64 4, i64 4, !9, i64 8, i64 4, !9, i64 12, i64 4, !9, i64 16, i64 4, !9, i64 20, i64 4, !9, i64 24, i64 8, !55, i64 32, i64 8, !55, i64 40, i64 8, !55}
!93 = distinct !{!93, !71}
!94 = !{!34, !15, i64 424}
!95 = !{!14, !10, i64 4}


; 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.8 }
%struct.anon.8 = 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.iovec = type { ptr, i64 }
%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 [14 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [22 x i8], align 1
@__func__.cursor_put = external hidden unnamed_addr constant [11 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [135 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.67 = external hidden unnamed_addr constant [146 x i8], align 1
@.str.68 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.69 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.70 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.71 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.72 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.73 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.74 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.75 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.76 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.77 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.78 = external hidden unnamed_addr constant [66 x i8], align 1
@.str.79 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.81 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.82 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.83 = external hidden unnamed_addr constant [139 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [56 x i8], align 1

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @cursor_validate(ptr noundef) local_unnamed_addr #0

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

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

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

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

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

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

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

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

; Function Attrs: cold nounwind optsize uwtable
declare dso_local i32 @cursor_validate_updating(ptr noundef) local_unnamed_addr #0

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

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_touch(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

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

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

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #5

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

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

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

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

; Function Attrs: inlinehint mustprogress nofree nosync nounwind willreturn memory(none) uwtable
declare hidden zeroext i16 @flags_db2sub(i16 noundef zeroext) local_unnamed_addr #8

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

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @inner_last(ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @outer_last(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: hot nounwind uwtable
define dso_local i32 @cursor_put(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) local_unnamed_addr #4 {
  %5 = alloca [510 x i8], align 16
  %6 = alloca %struct.iovec, align 8
  %7 = alloca %struct.iovec, align 8
  %8 = alloca %struct.iovec, align 8
  %9 = alloca %struct.iovec, align 8
  %10 = alloca %struct.iovec, align 8
  %11 = alloca %struct.iovec, align 8
  %12 = alloca %struct.iovec, align 8
  %13 = alloca %struct.tree, align 4
  %14 = alloca %struct.iovec, align 8
  call void @llvm.lifetime.start.p0(i64 510, ptr nonnull %5) #11
  %15 = getelementptr inbounds i8, ptr %0, i64 16
  %16 = load ptr, ptr %15, align 8, !tbaa !5
  %17 = getelementptr inbounds i8, ptr %16, i64 80
  %18 = load ptr, ptr %17, align 8, !tbaa !11
  %19 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %20 = icmp ugt i8 %19, 4
  %.0717.sroa.gep = getelementptr inbounds i8, ptr %10, i64 8
  %.0717.sroa.gep757 = getelementptr inbounds i8, ptr %2, i64 8
  br i1 %20, label %21, label %32, !prof !20

21:                                               ; preds = %4
  %22 = and i32 %3, 65536
  %.not = icmp eq i32 %22, 0
  br i1 %.not, label %24, label %23

23:                                               ; preds = %21
  store ptr null, ptr %2, align 8, !tbaa !21
  br label %24

24:                                               ; preds = %21, %23
  %25 = tail call i32 @cursor_dbi_dbg(ptr noundef nonnull %0)
  %26 = call ptr @mdbx_dump_val(ptr noundef %1, ptr noundef nonnull %5, i64 noundef 255) #11
  %27 = getelementptr inbounds i8, ptr %1, i64 8
  %28 = load i64, ptr %27, align 8, !tbaa !23
  %29 = getelementptr inbounds i8, ptr %5, i64 255
  %30 = call ptr @mdbx_dump_val(ptr noundef %2, ptr noundef nonnull %29, i64 noundef 255) #11
  %31 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 715, ptr noundef nonnull @.str.44, i32 noundef %25, ptr noundef %26, i64 noundef %28, ptr noundef %30, i64 noundef %31) #11
  br label %32

32:                                               ; preds = %4, %24
  %33 = and i32 %3, 64
  %.not794 = icmp eq i32 %33, 0
  br i1 %.not794, label %113, label %34

34:                                               ; preds = %32
  %35 = getelementptr inbounds i8, ptr %0, i64 4
  %36 = load i8, ptr %35, align 4, !tbaa !24
  %37 = and i8 %36, 1
  %38 = icmp eq i8 %37, 0
  br i1 %38, label %39, label %113

39:                                               ; preds = %34
  %40 = and i32 %3, 131088
  %.not795 = icmp eq i32 %40, 0
  br i1 %.not795, label %41, label %.thread1031, !prof !25

41:                                               ; preds = %39
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #11
  %42 = call i32 @cursor_ops(ptr noundef nonnull %0, ptr noundef nonnull %6, ptr noundef nonnull %7, i32 noundef 4)
  %.not796 = icmp eq i32 %42, 0
  br i1 %.not796, label %43, label %.thread997, !prof !25

43:                                               ; preds = %41
  %44 = getelementptr inbounds i8, ptr %0, i64 32
  %45 = load ptr, ptr %44, align 8, !tbaa !26
  %46 = load ptr, ptr %45, align 8, !tbaa !27
  %47 = call i32 %46(ptr noundef %1, ptr noundef nonnull %6) #11
  %.not797 = icmp eq i32 %47, 0
  br i1 %.not797, label %48, label %.thread997

48:                                               ; preds = %43
  %49 = and i32 %3, 524288
  %.not798 = icmp eq i32 %49, 0
  %50 = getelementptr inbounds i8, ptr %0, i64 40
  %51 = load ptr, ptr %50, align 8, !tbaa !30
  %.not799 = icmp eq ptr %51, null
  br i1 %.not798, label %62, label %52, !prof !25

52:                                               ; preds = %48
  br i1 %.not799, label %.thread997, label %53, !prof !20

53:                                               ; preds = %52
  %54 = and i32 %3, 128
  %55 = call i32 @cursor_del(ptr noundef nonnull %0, i32 noundef %54)
  %.not807 = icmp eq i32 %55, 0
  br i1 %.not807, label %56, label %.thread997, !prof !25

56:                                               ; preds = %53
  %57 = getelementptr inbounds i8, ptr %2, i64 24
  %58 = load i64, ptr %57, align 8, !tbaa !23
  %59 = icmp eq i64 %58, 0
  br i1 %59, label %.thread997, label %60, !prof !20

60:                                               ; preds = %56
  %61 = add nsw i32 %3, -64
  br label %112

62:                                               ; preds = %48
  br i1 %.not799, label %.thread992, label %63

63:                                               ; preds = %62
  %64 = getelementptr inbounds i8, ptr %0, i64 48
  %65 = getelementptr inbounds i8, ptr %0, i64 5
  %66 = load i8, ptr %65, align 1, !tbaa !24
  %67 = sext i8 %66 to i64
  %68 = getelementptr inbounds [32 x ptr], ptr %64, i64 0, i64 %67
  %69 = load ptr, ptr %68, align 8, !tbaa !31
  %70 = getelementptr inbounds i8, ptr %0, i64 304
  %71 = getelementptr inbounds [32 x i16], ptr %70, i64 0, i64 %67
  %72 = load i16, ptr %71, align 2, !tbaa !32
  %73 = zext i16 %72 to i64
  %74 = call ptr @page_node(ptr noundef %69, i64 noundef %73) #12
  %75 = call zeroext i8 @node_flags(ptr noundef %74) #12
  %76 = and i8 %75, 4
  %.not800 = icmp eq i8 %76, 0
  br i1 %.not800, label %99, label %77

77:                                               ; preds = %63
  %78 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %79 = and i8 %78, 1
  %.not802 = icmp eq i8 %79, 0
  br i1 %.not802, label %86, label %80, !prof !20

80:                                               ; preds = %77
  %81 = call zeroext i1 @inner_pointed(ptr noundef nonnull %0) #12
  br i1 %81, label %86, label %82, !prof !25

82:                                               ; preds = %80
  %83 = load ptr, ptr %15, align 8, !tbaa !5
  %84 = getelementptr inbounds i8, ptr %83, i64 80
  %85 = load ptr, ptr %84, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %85, ptr noundef nonnull @.str.45, ptr noundef nonnull @__func__.cursor_put, i32 noundef 746) #13
  unreachable

86:                                               ; preds = %80, %77
  %87 = getelementptr inbounds i8, ptr %51, i64 416
  %88 = load i64, ptr %87, align 8, !tbaa !34
  %89 = icmp ugt i64 %88, 1
  br i1 %89, label %94, label %90

90:                                               ; preds = %86
  %91 = getelementptr inbounds i8, ptr %7, i64 8
  %92 = load i64, ptr %91, align 8, !tbaa !23
  %93 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %.not803 = icmp eq i64 %92, %93
  br i1 %.not803, label %.thread992, label %94

94:                                               ; preds = %90, %86
  %95 = and i32 %3, 128
  %96 = call i32 @cursor_del(ptr noundef nonnull %0, i32 noundef %95)
  %.not804 = icmp eq i32 %96, 0
  br i1 %.not804, label %97, label %.thread997, !prof !25

97:                                               ; preds = %94
  %98 = add nsw i32 %3, -64
  br label %112

99:                                               ; preds = %63
  %100 = call i64 @node_size(ptr noundef %1, ptr noundef %2) #12
  %101 = getelementptr inbounds i8, ptr %18, i64 112
  %102 = load i16, ptr %101, align 8, !tbaa !37
  %103 = zext i16 %102 to i64
  %104 = icmp ugt i64 %100, %103
  br i1 %104, label %105, label %.thread992, !prof !20

105:                                              ; preds = %99
  %106 = call i32 @cursor_del(ptr noundef nonnull %0, i32 noundef 0)
  %.not801 = icmp eq i32 %106, 0
  br i1 %.not801, label %107, label %.thread997, !prof !25

107:                                              ; preds = %105
  %108 = add nsw i32 %3, -64
  br label %112

.thread992:                                       ; preds = %90, %99, %62
  %109 = and i32 %3, 65536
  %.not805 = icmp eq i32 %109, 0
  br i1 %.not805, label %110, label %112

110:                                              ; preds = %.thread992
  %111 = call zeroext i1 @eq_fast(ptr noundef nonnull %7, ptr noundef %2) #12
  br i1 %111, label %.thread997, label %112, !prof !20

.thread997:                                       ; preds = %41, %43, %52, %53, %56, %110, %94, %105
  %.3.ph = phi i32 [ 0, %110 ], [ 0, %56 ], [ %55, %53 ], [ 22, %52 ], [ -30418, %43 ], [ %42, %41 ], [ %106, %105 ], [ %96, %94 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #11
  br label %.thread1031

112:                                              ; preds = %110, %60, %.thread992, %107, %97
  %.3667 = phi i32 [ %61, %60 ], [ %3, %.thread992 ], [ %98, %97 ], [ %108, %107 ], [ %3, %110 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #11
  br label %113

113:                                              ; preds = %112, %34, %32
  %.4668 = phi i32 [ %.3667, %112 ], [ %3, %34 ], [ %3, %32 ]
  %114 = getelementptr inbounds i8, ptr %0, i64 24
  %115 = load ptr, ptr %114, align 8, !tbaa !46
  %116 = getelementptr inbounds i8, ptr %115, i64 2
  %117 = load i16, ptr %116, align 2, !tbaa !47
  %118 = icmp eq i16 %117, 0
  br i1 %118, label %119, label %128

119:                                              ; preds = %113
  %120 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %121 = and i8 %120, 1
  %.not835 = icmp eq i8 %121, 0
  br i1 %.not835, label %273, label %122, !prof !20

122:                                              ; preds = %119
  %123 = call zeroext i1 @is_poor(ptr noundef nonnull %0) #12
  br i1 %123, label %273, label %124, !prof !25

124:                                              ; preds = %122
  %125 = load ptr, ptr %15, align 8, !tbaa !5
  %126 = getelementptr inbounds i8, ptr %125, i64 80
  %127 = load ptr, ptr %126, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %127, ptr noundef nonnull @.str.46, ptr noundef nonnull @__func__.cursor_put, i32 noundef 777) #13
  unreachable

128:                                              ; preds = %113
  %129 = and i32 %.4668, 64
  %130 = icmp eq i32 %129, 0
  br i1 %130, label %131, label %273

131:                                              ; preds = %128
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #11
  %132 = and i32 %.4668, 131072
  %.not808 = icmp eq i32 %132, 0
  br i1 %.not808, label %162, label %133

133:                                              ; preds = %131
  %134 = getelementptr inbounds i8, ptr %115, i64 32
  %135 = load i64, ptr %134, align 4, !tbaa !48
  %.not809 = icmp eq i64 %135, 0
  br i1 %.not809, label %162, label %136

136:                                              ; preds = %133
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #11
  %137 = getelementptr inbounds i8, ptr %0, i64 4
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %8, i8 0, i64 16, i1 false)
  %138 = load i8, ptr %137, align 4, !tbaa !24
  %139 = and i8 %138, 1
  %.not810 = icmp eq i8 %139, 0
  br i1 %.not810, label %142, label %140

140:                                              ; preds = %136
  %141 = call i32 @inner_last(ptr noundef nonnull %0, ptr noundef nonnull %9) #14
  br label %144

142:                                              ; preds = %136
  %143 = call i32 @outer_last(ptr noundef nonnull %0, ptr noundef nonnull %9, ptr noundef nonnull %8) #14
  br label %144

144:                                              ; preds = %142, %140
  %145 = phi i32 [ %141, %140 ], [ %143, %142 ]
  %146 = icmp eq i32 %145, 0
  br i1 %146, label %147, label %.thread, !prof !25

147:                                              ; preds = %144
  %148 = getelementptr inbounds i8, ptr %0, i64 32
  %149 = load ptr, ptr %148, align 8, !tbaa !26
  %150 = load ptr, ptr %149, align 8, !tbaa !27
  %151 = call i32 %150(ptr noundef %1, ptr noundef nonnull %9) #11
  %152 = icmp sgt i32 %151, 0
  br i1 %152, label %153, label %161, !prof !25

153:                                              ; preds = %147
  %154 = getelementptr inbounds i8, ptr %0, i64 304
  %155 = getelementptr inbounds i8, ptr %0, i64 5
  %156 = load i8, ptr %155, align 1, !tbaa !24
  %157 = sext i8 %156 to i64
  %158 = getelementptr inbounds [32 x i16], ptr %154, i64 0, i64 %157
  %159 = load i16, ptr %158, align 2, !tbaa !32
  %160 = add i16 %159, 1
  store i16 %160, ptr %158, align 2, !tbaa !32
  br label %.thread

161:                                              ; preds = %147
  %.not811 = icmp eq i32 %151, 0
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #11
  br i1 %.not811, label %.thread1116, label %.thread1009, !prof !25

162:                                              ; preds = %133, %131
  %163 = call i64 @cursor_seek(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %8, i32 noundef 15)
  %.sroa.0232.0.extract.trunc = trunc i64 %163 to i32
  %164 = and i64 %163, 4294967296
  %.not1136 = icmp eq i64 %164, 0
  br i1 %.not1136, label %272, label %167

.thread:                                          ; preds = %153, %144
  %.3697.ph.ph = phi i32 [ %145, %144 ], [ -30798, %153 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #11
  br label %272

.thread1116:                                      ; preds = %161
  %165 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %166 = and i8 %165, 1
  %.not8131118 = icmp eq i8 %166, 0
  br label %174

167:                                              ; preds = %162
  %168 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %169 = and i8 %168, 1
  %.not813 = icmp eq i8 %169, 0
  %.not814 = icmp eq i32 %.sroa.0232.0.extract.trunc, 0
  %or.cond964 = or i1 %.not813, %.not814
  br i1 %or.cond964, label %174, label %170, !prof !49

170:                                              ; preds = %167
  %171 = load ptr, ptr %15, align 8, !tbaa !5
  %172 = getelementptr inbounds i8, ptr %171, i64 80
  %173 = load ptr, ptr %172, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %173, ptr noundef nonnull @.str.47, ptr noundef nonnull @__func__.cursor_put, i32 noundef 806) #13
  unreachable

174:                                              ; preds = %.thread1116, %167
  %.not8131122 = phi i1 [ %.not8131118, %.thread1116 ], [ %.not813, %167 ]
  %.469811131121 = phi i32 [ 0, %.thread1116 ], [ %.sroa.0232.0.extract.trunc, %167 ]
  %175 = and i32 %.4668, 16
  %.not815 = icmp eq i32 %175, 0
  br i1 %.not815, label %182, label %176, !prof !25

176:                                              ; preds = %174
  %177 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %178 = icmp ugt i8 %177, 4
  br i1 %178, label %179, label %181, !prof !20

179:                                              ; preds = %176
  %180 = call ptr @mdbx_dump_val(ptr noundef %1, ptr noundef nonnull %5, i64 noundef 255) #11
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 808, ptr noundef nonnull @.str.48, ptr noundef %180) #11
  br label %181

181:                                              ; preds = %179, %176
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %2, ptr noundef nonnull align 8 dereferenceable(16) %8, i64 16, i1 false), !tbaa.struct !50
  br label %.thread1009

182:                                              ; preds = %174
  %183 = getelementptr inbounds i8, ptr %0, i64 4
  %184 = load i8, ptr %183, align 4, !tbaa !24
  %185 = and i8 %184, 1
  %.not816 = icmp eq i8 %185, 0
  br i1 %.not816, label %194, label %186, !prof !25

186:                                              ; preds = %182
  br i1 %.not8131122, label %191, label %187, !prof !20

187:                                              ; preds = %186
  %188 = load ptr, ptr %15, align 8, !tbaa !5
  %189 = getelementptr inbounds i8, ptr %188, i64 80
  %190 = load ptr, ptr %189, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %190, ptr noundef nonnull @.str.49, ptr noundef nonnull @__func__.cursor_put, i32 noundef 814) #13
  unreachable

191:                                              ; preds = %186
  %192 = and i32 %.4668, 32
  %.not834 = icmp eq i32 %192, 0
  %193 = select i1 %.not834, i32 0, i32 -30799
  br label %.thread1009

194:                                              ; preds = %182
  %195 = call zeroext i1 @inner_pointed(ptr noundef nonnull %0) #12
  br i1 %195, label %196, label %238

196:                                              ; preds = %194
  %197 = and i32 %.4668, 128
  %.not822 = icmp eq i32 %197, 0
  br i1 %.not822, label %217, label %198, !prof !25

198:                                              ; preds = %196
  %199 = call i32 @cursor_del(ptr noundef nonnull %0, i32 noundef 128)
  %.not830 = icmp eq i32 %199, 0
  br i1 %.not830, label %200, label %.thread1009, !prof !25

200:                                              ; preds = %198
  %201 = add nsw i32 %.4668, -128
  %202 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %203 = and i8 %202, 1
  %.not831 = icmp eq i8 %203, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 5
  %.pre = load i8, ptr %.phi.trans.insert, align 1, !tbaa !24
  br i1 %.not831, label %._crit_edge, label %204, !prof !20

204:                                              ; preds = %200
  %205 = sext i8 %.pre to i32
  %206 = add nsw i32 %205, 1
  %207 = load ptr, ptr %114, align 8, !tbaa !46
  %208 = getelementptr inbounds i8, ptr %207, i64 2
  %209 = load i16, ptr %208, align 2, !tbaa !47
  %210 = zext i16 %209 to i32
  %.not832 = icmp eq i32 %206, %210
  br i1 %.not832, label %._crit_edge, label %211, !prof !25

211:                                              ; preds = %204
  %212 = load ptr, ptr %15, align 8, !tbaa !5
  %213 = getelementptr inbounds i8, ptr %212, i64 80
  %214 = load ptr, ptr %213, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %214, ptr noundef nonnull @.str.50, ptr noundef nonnull @__func__.cursor_put, i32 noundef 823) #13
  unreachable

._crit_edge:                                      ; preds = %200, %204
  %215 = icmp sgt i8 %.pre, -1
  %216 = select i1 %215, i32 -30798, i32 -30377
  br label %.thread1013

217:                                              ; preds = %196
  %218 = and i32 %.4668, 589824
  %219 = icmp eq i32 %218, 0
  br i1 %219, label %220, label %.thread1013

220:                                              ; preds = %217
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %8, ptr noundef nonnull align 8 dereferenceable(16) %2, i64 16, i1 false), !tbaa.struct !50
  %221 = getelementptr inbounds i8, ptr %0, i64 40
  %222 = load ptr, ptr %221, align 8, !tbaa !30
  %223 = call i64 @cursor_seek(ptr noundef %222, ptr noundef nonnull %8, ptr noundef null, i32 noundef 17)
  %.sroa.0228.0.extract.trunc = trunc i64 %223 to i32
  %224 = and i64 %223, 4294967296
  %.not823 = icmp eq i64 %224, 0
  br i1 %.not823, label %236, label %225, !prof !25

225:                                              ; preds = %220
  %226 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %227 = and i8 %226, 1
  %.not826 = icmp eq i8 %227, 0
  %.not827 = icmp eq i32 %.sroa.0228.0.extract.trunc, 0
  %or.cond965 = or i1 %.not827, %.not826
  br i1 %or.cond965, label %232, label %228, !prof !52

228:                                              ; preds = %225
  %229 = load ptr, ptr %15, align 8, !tbaa !5
  %230 = getelementptr inbounds i8, ptr %229, i64 80
  %231 = load ptr, ptr %230, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %231, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.cursor_put, i32 noundef 829) #13
  unreachable

232:                                              ; preds = %225
  %233 = and i32 %.4668, 32
  %.not828 = icmp eq i32 %233, 0
  br i1 %.not828, label %234, label %.thread1009

234:                                              ; preds = %232
  %235 = and i32 %.4668, 262144
  %.not829 = icmp eq i32 %235, 0
  %. = select i1 %.not829, i32 0, i32 -30418
  br label %.thread1009

236:                                              ; preds = %220
  switch i32 %.sroa.0228.0.extract.trunc, label %237 [
    i32 0, label %.thread1013
    i32 -30798, label %.thread1013
  ], !prof !53

237:                                              ; preds = %236
  call void @be_poor(ptr noundef nonnull %0)
  br label %.thread1009

238:                                              ; preds = %194
  %239 = and i32 %.4668, 589824
  %.not817 = icmp eq i32 %239, 0
  br i1 %.not817, label %240, label %.thread1013

240:                                              ; preds = %238
  %241 = call zeroext i1 @eq_fast(ptr noundef %2, ptr noundef nonnull %8) #12
  br i1 %241, label %242, label %261, !prof !20

242:                                              ; preds = %240
  br i1 %.not8131122, label %253, label %243, !prof !20

243:                                              ; preds = %242
  %244 = getelementptr inbounds i8, ptr %0, i64 32
  %245 = load ptr, ptr %244, align 8, !tbaa !26
  %246 = getelementptr inbounds i8, ptr %245, i64 24
  %247 = load ptr, ptr %246, align 8, !tbaa !54
  %248 = call i32 %247(ptr noundef %2, ptr noundef nonnull %8) #11
  %.not821 = icmp eq i32 %248, 0
  br i1 %.not821, label %253, label %249, !prof !25

249:                                              ; preds = %243
  %250 = load ptr, ptr %15, align 8, !tbaa !5
  %251 = getelementptr inbounds i8, ptr %250, i64 80
  %252 = load ptr, ptr %251, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %252, ptr noundef nonnull @.str.52, ptr noundef nonnull @__func__.cursor_put, i32 noundef 843) #13
  unreachable

253:                                              ; preds = %243, %242
  %254 = getelementptr inbounds i8, ptr %0, i64 40
  %255 = load ptr, ptr %254, align 8, !tbaa !30
  %256 = icmp ne ptr %255, null
  %257 = and i32 %.4668, 32
  %258 = icmp ne i32 %257, 0
  %259 = select i1 %256, i1 %258, i1 false
  %260 = select i1 %259, i32 -30799, i32 0
  br label %.thread1009

261:                                              ; preds = %240
  br i1 %.not8131122, label %.thread1013, label %262, !prof !20

262:                                              ; preds = %261
  %263 = getelementptr inbounds i8, ptr %0, i64 32
  %264 = load ptr, ptr %263, align 8, !tbaa !26
  %265 = getelementptr inbounds i8, ptr %264, i64 24
  %266 = load ptr, ptr %265, align 8, !tbaa !54
  %267 = call i32 %266(ptr noundef %2, ptr noundef nonnull %8) #11
  %.not819 = icmp eq i32 %267, 0
  br i1 %.not819, label %268, label %.thread1013, !prof !20

268:                                              ; preds = %262
  %269 = load ptr, ptr %15, align 8, !tbaa !5
  %270 = getelementptr inbounds i8, ptr %269, i64 80
  %271 = load ptr, ptr %270, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %271, ptr noundef nonnull @.str.53, ptr noundef nonnull @__func__.cursor_put, i32 noundef 847) #13
  unreachable

272:                                              ; preds = %.thread, %162
  %.46981112 = phi i32 [ %.sroa.0232.0.extract.trunc, %162 ], [ %.3697.ph.ph, %.thread ]
  %.not812 = icmp eq i32 %.46981112, -30798
  br i1 %.not812, label %.thread1013, label %.thread1009, !prof !25

.thread1013:                                      ; preds = %236, %236, %217, %._crit_edge, %261, %262, %238, %272
  %.6700.ph = phi i32 [ %.469811131121, %236 ], [ %.469811131121, %236 ], [ %.469811131121, %261 ], [ %.469811131121, %262 ], [ %.469811131121, %238 ], [ %.469811131121, %217 ], [ %216, %._crit_edge ], [ -30798, %272 ]
  %.6670.ph = phi i32 [ %.4668, %236 ], [ %.4668, %236 ], [ %.4668, %261 ], [ %.4668, %262 ], [ %.4668, %238 ], [ %.4668, %217 ], [ %201, %._crit_edge ], [ %.4668, %272 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #11
  br label %273

.thread1009:                                      ; preds = %161, %234, %232, %237, %272, %198, %253, %191, %181
  %.11 = phi i32 [ -30799, %181 ], [ %193, %191 ], [ %260, %253 ], [ %199, %198 ], [ %.46981112, %272 ], [ %., %234 ], [ -30799, %232 ], [ %.sroa.0228.0.extract.trunc, %237 ], [ -30418, %161 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #11
  br label %.thread1031

273:                                              ; preds = %.thread1013, %119, %122, %128
  %.7701 = phi i32 [ 0, %128 ], [ -30377, %122 ], [ -30377, %119 ], [ %.6700.ph, %.thread1013 ]
  %.7671 = phi i32 [ %.4668, %128 ], [ %.4668, %122 ], [ %.4668, %119 ], [ %.6670.ph, %.thread1013 ]
  %274 = getelementptr inbounds i8, ptr %0, i64 4
  %275 = load i8, ptr %274, align 4, !tbaa !24
  %276 = and i8 %275, -9
  store i8 %276, ptr %274, align 4, !tbaa !24
  %277 = and i32 %.7671, 524288
  %.not836 = icmp eq i32 %277, 0
  br i1 %.not836, label %283, label %278, !prof !25

278:                                              ; preds = %273
  %279 = getelementptr inbounds i8, ptr %2, i64 24
  %280 = load i64, ptr %279, align 8, !tbaa !23
  %281 = icmp eq i64 %280, 0
  br i1 %281, label %.thread1031, label %282, !prof !20

282:                                              ; preds = %278
  store i64 0, ptr %279, align 8, !tbaa !51
  br label %283

283:                                              ; preds = %282, %273
  %.0720 = phi i64 [ %280, %282 ], [ 0, %273 ]
  %.0718 = phi ptr [ %279, %282 ], [ null, %273 ]
  %284 = call i32 @cursor_touch(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2) #14
  %.not837 = icmp eq i32 %284, 0
  br i1 %.not837, label %285, label %.thread1031, !prof !25

285:                                              ; preds = %283
  %286 = icmp eq i32 %.7701, -30377
  br i1 %286, label %287, label %.thread1022, !prof !20

287:                                              ; preds = %285
  %288 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %289 = icmp ugt i8 %288, 4
  br i1 %289, label %290, label %291, !prof !20

290:                                              ; preds = %287
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 871, ptr noundef nonnull @.str.54, ptr noundef nonnull @.str.55) #11
  br label %291

291:                                              ; preds = %290, %287
  %292 = call { ptr, i32 } @page_new(ptr noundef nonnull %0, i32 noundef 2) #11
  %293 = extractvalue { ptr, i32 } %292, 0
  %294 = extractvalue { ptr, i32 } %292, 1
  %.not838 = icmp eq i32 %294, 0
  br i1 %.not838, label %295, label %.thread1031, !prof !25

295:                                              ; preds = %291
  %296 = call i32 @cursor_push(ptr noundef nonnull %0, ptr noundef %293, i16 noundef zeroext 0)
  %.not839 = icmp eq i32 %296, 0
  br i1 %.not839, label %297, label %.thread1031, !prof !25

297:                                              ; preds = %295
  %298 = getelementptr inbounds i8, ptr %293, i64 16
  %299 = load i32, ptr %298, align 1, !tbaa !55
  %300 = load ptr, ptr %114, align 8, !tbaa !46
  %301 = getelementptr inbounds i8, ptr %300, i64 8
  store i32 %299, ptr %301, align 4, !tbaa !56
  %302 = getelementptr inbounds i8, ptr %300, i64 2
  %303 = load i16, ptr %302, align 2, !tbaa !47
  %304 = add i16 %303, 1
  store i16 %304, ptr %302, align 2, !tbaa !47
  %305 = load i16, ptr %300, align 4, !tbaa !57
  %306 = and i16 %305, 8
  %.not840 = icmp eq i16 %306, 0
  br i1 %.not840, label %318, label %307

307:                                              ; preds = %297
  %308 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %309 = and i8 %308, 1
  %.not841 = icmp eq i8 %309, 0
  %.phi.trans.insert1078 = getelementptr inbounds i8, ptr %1, i64 8
  %.pre1079 = load i64, ptr %.phi.trans.insert1078, align 8, !tbaa !23
  %.phi.trans.insert1080 = getelementptr inbounds i8, ptr %0, i64 32
  %.pre1081 = load ptr, ptr %.phi.trans.insert1080, align 8, !tbaa !26
  br i1 %.not841, label %._crit_edge1077, label %310, !prof !20

310:                                              ; preds = %307
  %311 = getelementptr inbounds i8, ptr %.pre1081, i64 8
  %312 = load i64, ptr %311, align 8, !tbaa !58
  %.not842 = icmp ult i64 %.pre1079, %312
  br i1 %.not842, label %.critedge967, label %313, !prof !20

313:                                              ; preds = %310
  %314 = getelementptr inbounds i8, ptr %.pre1081, i64 16
  %315 = load i64, ptr %314, align 8, !tbaa !59
  %.not1052 = icmp ugt i64 %.pre1079, %315
  br i1 %.not1052, label %.critedge967, label %._crit_edge1077, !prof !20

.critedge967:                                     ; preds = %310, %313
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.56, ptr noundef nonnull @__func__.cursor_put, i32 noundef 881) #13
  unreachable

._crit_edge1077:                                  ; preds = %307, %313
  %316 = getelementptr inbounds i8, ptr %.pre1081, i64 16
  store i64 %.pre1079, ptr %316, align 8, !tbaa !59
  %317 = getelementptr inbounds i8, ptr %.pre1081, i64 8
  store i64 %.pre1079, ptr %317, align 8, !tbaa !58
  br label %318

318:                                              ; preds = %._crit_edge1077, %297
  %319 = and i16 %305, 48
  %.not843 = icmp eq i16 %319, 0
  br i1 %.not843, label %.thread1022, label %320

320:                                              ; preds = %318
  %321 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %322 = and i8 %321, 1
  %.not844 = icmp eq i8 %322, 0
  %323 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %324 = getelementptr inbounds i8, ptr %0, i64 32
  %325 = load ptr, ptr %324, align 8, !tbaa !26
  br i1 %.not844, label %.thread1020, label %330, !prof !20

.thread1020:                                      ; preds = %320
  %326 = getelementptr inbounds i8, ptr %325, i64 40
  store i64 %323, ptr %326, align 8, !tbaa !60
  %327 = getelementptr inbounds i8, ptr %325, i64 32
  store i64 %323, ptr %327, align 8, !tbaa !61
  %328 = trunc i64 %323 to i32
  %329 = getelementptr inbounds i8, ptr %300, i64 4
  store i32 %328, ptr %329, align 4, !tbaa !62
  br label %358

330:                                              ; preds = %320
  %331 = getelementptr inbounds i8, ptr %325, i64 32
  %332 = load i64, ptr %331, align 8, !tbaa !61
  %.not845 = icmp ult i64 %323, %332
  br i1 %.not845, label %.critedge969, label %333, !prof !20

333:                                              ; preds = %330
  %334 = getelementptr inbounds i8, ptr %325, i64 40
  %335 = load i64, ptr %334, align 8, !tbaa !60
  %.not1053 = icmp ugt i64 %323, %335
  br i1 %.not1053, label %.critedge969, label %336, !prof !20

.critedge969:                                     ; preds = %330, %333
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.57, ptr noundef nonnull @__func__.cursor_put, i32 noundef 885) #13
  unreachable

336:                                              ; preds = %333
  %337 = getelementptr inbounds i8, ptr %0, i64 40
  %338 = load ptr, ptr %337, align 8, !tbaa !30
  %.not847 = icmp eq ptr %338, null
  br i1 %.not847, label %339, label %340, !prof !20

339:                                              ; preds = %336
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.58, ptr noundef nonnull @__func__.cursor_put, i32 noundef 886) #13
  unreachable

340:                                              ; preds = %336
  store i64 %323, ptr %334, align 8, !tbaa !60
  store i64 %323, ptr %331, align 8, !tbaa !61
  %341 = trunc i64 %323 to i32
  %342 = getelementptr inbounds i8, ptr %300, i64 4
  store i32 %341, ptr %342, align 4, !tbaa !62
  %343 = getelementptr inbounds i8, ptr %338, i64 32
  %344 = load ptr, ptr %343, align 8, !tbaa !63
  %345 = getelementptr inbounds i8, ptr %344, i64 8
  %346 = load i64, ptr %345, align 8, !tbaa !58
  %.not849 = icmp eq i64 %323, %346
  br i1 %.not849, label %351, label %347, !prof !25

347:                                              ; preds = %340
  %348 = load ptr, ptr %15, align 8, !tbaa !5
  %349 = getelementptr inbounds i8, ptr %348, i64 80
  %350 = load ptr, ptr %349, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %350, ptr noundef nonnull @.str.59, ptr noundef nonnull @__func__.cursor_put, i32 noundef 889) #13
  unreachable

351:                                              ; preds = %340
  %352 = getelementptr inbounds i8, ptr %344, i64 16
  %353 = load i64, ptr %352, align 8, !tbaa !59
  %.not851 = icmp eq i64 %323, %353
  br i1 %.not851, label %358, label %354, !prof !25

354:                                              ; preds = %351
  %355 = load ptr, ptr %15, align 8, !tbaa !5
  %356 = getelementptr inbounds i8, ptr %355, i64 80
  %357 = load ptr, ptr %356, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %357, ptr noundef nonnull @.str.60, ptr noundef nonnull @__func__.cursor_put, i32 noundef 890) #13
  unreachable

358:                                              ; preds = %.thread1020, %351
  %359 = load i8, ptr %274, align 4, !tbaa !24
  %360 = and i8 %359, 1
  %.not852 = icmp eq i8 %360, 0
  br i1 %.not852, label %.thread1022, label %361

361:                                              ; preds = %358
  %362 = getelementptr inbounds i8, ptr %293, i64 10
  %363 = load i16, ptr %362, align 1, !tbaa !32
  %364 = or i16 %363, 32
  store i16 %364, ptr %362, align 1, !tbaa !32
  br label %.thread1022

.thread1022:                                      ; preds = %318, %361, %358, %285
  %365 = getelementptr inbounds i8, ptr %18, i64 184
  %366 = load ptr, ptr %365, align 8, !tbaa !64
  %367 = load ptr, ptr %15, align 8, !tbaa !5
  %368 = getelementptr inbounds i8, ptr %367, i64 72
  %369 = load i64, ptr %368, align 8, !tbaa !65
  store i64 %369, ptr %366, align 1, !tbaa !51
  %.not1054 = icmp eq i32 %.7701, 0
  %370 = getelementptr inbounds i8, ptr %11, i64 8
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %11, i8 0, i64 16, i1 false)
  br i1 %.not1054, label %405, label %371

371:                                              ; preds = %.thread1022
  %372 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %373 = icmp ugt i8 %372, 4
  br i1 %373, label %374, label %382, !prof !20

374:                                              ; preds = %371
  %375 = getelementptr inbounds i8, ptr %0, i64 304
  %376 = getelementptr inbounds i8, ptr %0, i64 5
  %377 = load i8, ptr %376, align 1, !tbaa !24
  %378 = sext i8 %377 to i64
  %379 = getelementptr inbounds [32 x i16], ptr %375, i64 0, i64 %378
  %380 = load i16, ptr %379, align 2, !tbaa !32
  %381 = zext i16 %380 to i32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 908, ptr noundef nonnull @.str.61, i32 noundef %381) #11
  br label %382

382:                                              ; preds = %374, %371
  %383 = load ptr, ptr %114, align 8, !tbaa !46
  %384 = load i16, ptr %383, align 4, !tbaa !57
  %385 = and i16 %384, 4
  %.not854 = icmp eq i16 %385, 0
  br i1 %.not854, label %1075, label %386

386:                                              ; preds = %382
  call void @inner_gone(ptr noundef nonnull %0)
  %387 = call i64 @node_size(ptr noundef %1, ptr noundef %2) #12
  %388 = getelementptr inbounds i8, ptr %18, i64 112
  %389 = load i16, ptr %388, align 8, !tbaa !37
  %390 = zext i16 %389 to i64
  %391 = icmp ugt i64 %387, %390
  br i1 %391, label %392, label %1075

392:                                              ; preds = %386
  %393 = load ptr, ptr %114, align 8, !tbaa !46
  %394 = load i16, ptr %393, align 4, !tbaa !57
  %395 = and i16 %394, 16
  %.not855 = icmp eq i16 %395, 0
  br i1 %.not855, label %399, label %396

396:                                              ; preds = %392
  %397 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %398 = trunc i64 %397 to i16
  br label %399

399:                                              ; preds = %392, %396
  %400 = phi i16 [ %398, %396 ], [ 0, %392 ]
  %401 = getelementptr inbounds i8, ptr %366, i64 8
  store i16 %400, ptr %401, align 1, !tbaa !32
  %402 = getelementptr inbounds i8, ptr %366, i64 12
  %403 = getelementptr inbounds i8, ptr %366, i64 14
  store i16 0, ptr %403, align 1, !tbaa !24
  store i16 0, ptr %402, align 1, !tbaa !24
  %404 = getelementptr inbounds i8, ptr %12, i64 8
  store i64 20, ptr %404, align 8, !tbaa !23
  br label %803

405:                                              ; preds = %.thread1022
  %406 = getelementptr inbounds i8, ptr %0, i64 48
  %407 = getelementptr inbounds i8, ptr %0, i64 5
  %408 = load i8, ptr %407, align 1, !tbaa !24
  %409 = sext i8 %408 to i64
  %410 = getelementptr inbounds [32 x ptr], ptr %406, i64 0, i64 %409
  %411 = load ptr, ptr %410, align 8, !tbaa !31
  %412 = call zeroext i1 @is_dupfix_leaf(ptr noundef %411) #12
  br i1 %412, label %413, label %._crit_edge1082

._crit_edge1082:                                  ; preds = %405
  %.pre1083 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  br label %472

413:                                              ; preds = %405
  %414 = load ptr, ptr %114, align 8, !tbaa !46
  %415 = getelementptr inbounds i8, ptr %414, i64 4
  %416 = load i32, ptr %415, align 4, !tbaa !62
  %417 = zext i32 %416 to i64
  %418 = getelementptr inbounds i8, ptr %1, i64 8
  %419 = load i64, ptr %418, align 8, !tbaa !23
  %.not853 = icmp eq i64 %419, %417
  br i1 %.not853, label %420, label %.thread1031, !prof !25

420:                                              ; preds = %413
  %421 = getelementptr inbounds i8, ptr %0, i64 304
  %422 = getelementptr inbounds [32 x i16], ptr %421, i64 0, i64 %409
  %423 = load i16, ptr %422, align 2, !tbaa !32
  %424 = zext i16 %423 to i64
  %425 = call ptr @page_dupfix_ptr(ptr noundef %411, i64 noundef %424, i64 noundef %417) #12
  %426 = load ptr, ptr %1, align 8, !tbaa !21
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %425, ptr align 1 %426, i64 %417, i1 false)
  br label %427

427:                                              ; preds = %.thread1042, %1048, %420
  %428 = getelementptr inbounds i8, ptr %0, i64 5
  %429 = load i8, ptr %428, align 1, !tbaa !24
  %.not928 = icmp eq i8 %429, 0
  br i1 %.not928, label %466, label %430

430:                                              ; preds = %427
  %431 = getelementptr inbounds i8, ptr %0, i64 304
  %432 = sext i8 %429 to i64
  %433 = getelementptr inbounds [32 x i16], ptr %431, i64 0, i64 %432
  %434 = load i16, ptr %433, align 2, !tbaa !32
  %.not929 = icmp eq i16 %434, 0
  br i1 %.not929, label %435, label %466

435:                                              ; preds = %430
  %436 = add i8 %429, -1
  store i8 %436, ptr %428, align 1, !tbaa !24
  %.not9301067 = icmp eq i8 %436, 0
  br i1 %.not9301067, label %.critedge, label %.lr.ph1069.preheader

.lr.ph1069.preheader:                             ; preds = %435
  %437 = add i8 %429, -2
  %438 = zext i8 %437 to i64
  %439 = add nuw nsw i64 %438, 2
  br label %.lr.ph1069

.lr.ph1069:                                       ; preds = %.lr.ph1069.preheader, %444
  %.07561068 = phi i64 [ %446, %444 ], [ 1, %.lr.ph1069.preheader ]
  %440 = phi i8 [ %445, %444 ], [ %436, %.lr.ph1069.preheader ]
  %441 = sext i8 %440 to i64
  %442 = getelementptr inbounds [32 x i16], ptr %431, i64 0, i64 %441
  %443 = load i16, ptr %442, align 2, !tbaa !32
  %.not931 = icmp eq i16 %443, 0
  br i1 %.not931, label %444, label %.critedge

444:                                              ; preds = %.lr.ph1069
  %445 = add i8 %440, -1
  store i8 %445, ptr %428, align 1, !tbaa !24
  %446 = add nuw nsw i64 %.07561068, 1
  %.not930 = icmp eq i8 %445, 0
  br i1 %.not930, label %.critedge, label %.lr.ph1069, !llvm.loop !66

.critedge:                                        ; preds = %.lr.ph1069, %444, %435
  %.pre11011104 = phi i8 [ 0, %435 ], [ 0, %444 ], [ %440, %.lr.ph1069 ]
  %.0756.lcssa = phi i64 [ 1, %435 ], [ %439, %444 ], [ %.07561068, %.lr.ph1069 ]
  %447 = sext i8 %.pre11011104 to i64
  %448 = getelementptr inbounds [32 x i16], ptr %431, i64 0, i64 %447
  %449 = load i16, ptr %448, align 2, !tbaa !32
  %.not932 = icmp eq i16 %449, 0
  br i1 %.not932, label %452, label %450

450:                                              ; preds = %.critedge
  %451 = call i32 @tree_propagate_key(ptr noundef nonnull %0, ptr noundef %1) #11
  %.pre1101.pre = load i8, ptr %428, align 1, !tbaa !24
  br label %452

452:                                              ; preds = %.critedge, %450
  %.pre1101 = phi i8 [ %.pre1101.pre, %450 ], [ %.pre11011104, %.critedge ]
  %.0681 = phi i32 [ %451, %450 ], [ 0, %.critedge ]
  %453 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %454 = and i8 %453, 1
  %.not933 = icmp eq i8 %454, 0
  br i1 %.not933, label %463, label %455, !prof !20

455:                                              ; preds = %452
  %456 = sext i8 %.pre1101 to i64
  %457 = add i64 %.0756.lcssa, %456
  %458 = icmp ugt i64 %457, 65534
  br i1 %458, label %459, label %463, !prof !20

459:                                              ; preds = %455
  %460 = load ptr, ptr %15, align 8, !tbaa !5
  %461 = getelementptr inbounds i8, ptr %460, i64 80
  %462 = load ptr, ptr %461, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %462, ptr noundef nonnull @.str.62, ptr noundef nonnull @__func__.cursor_put, i32 noundef 942) #13
  unreachable

463:                                              ; preds = %455, %452
  %464 = trunc i64 %.0756.lcssa to i8
  %465 = add i8 %.pre1101, %464
  store i8 %465, ptr %428, align 1, !tbaa !24
  %.not934 = icmp eq i32 %.0681, 0
  br i1 %.not934, label %466, label %.thread1031

466:                                              ; preds = %463, %430, %427
  %467 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %468 = and i8 %467, 2
  %.not935 = icmp eq i8 %468, 0
  br i1 %.not935, label %471, label %469, !prof !25

469:                                              ; preds = %466
  %470 = call i32 @cursor_validate(ptr noundef nonnull %0) #15
  %.not936 = icmp eq i32 %470, 0
  br i1 %.not936, label %471, label %.thread1031, !prof !25

471:                                              ; preds = %469, %466
  br label %.thread1031

472:                                              ; preds = %._crit_edge1082, %1367
  %473 = phi i8 [ %1363, %1367 ], [ %.pre1083, %._crit_edge1082 ]
  %.0740 = phi i16 [ %.8748, %1367 ], [ 2, %._crit_edge1082 ]
  %.8672 = phi i32 [ %.15679, %1367 ], [ %.7671, %._crit_edge1082 ]
  %474 = and i8 %473, 2
  %.not889 = icmp eq i8 %474, 0
  br i1 %.not889, label %477, label %475, !prof !25

475:                                              ; preds = %472
  %476 = call i32 @cursor_validate(ptr noundef %0) #15
  %.not890 = icmp eq i32 %476, 0
  br i1 %.not890, label %477, label %.thread1031, !prof !25

477:                                              ; preds = %475, %472
  %478 = getelementptr inbounds i8, ptr %0, i64 48
  %479 = getelementptr inbounds i8, ptr %0, i64 5
  %480 = load i8, ptr %479, align 1, !tbaa !24
  %481 = sext i8 %480 to i64
  %482 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %481
  %483 = load ptr, ptr %482, align 8, !tbaa !31
  %484 = getelementptr inbounds i8, ptr %0, i64 304
  %485 = getelementptr inbounds [32 x i16], ptr %484, i64 0, i64 %481
  %486 = load i16, ptr %485, align 2, !tbaa !32
  %487 = zext i16 %486 to i64
  %488 = call ptr @page_node(ptr noundef %483, i64 noundef %487) #12
  %489 = call zeroext i8 @node_flags(ptr noundef %488) #12
  %490 = and i8 %489, 1
  %.not891 = icmp eq i8 %490, 0
  br i1 %.not891, label %586, label %491, !prof !25

491:                                              ; preds = %477
  %492 = call i64 @node_size(ptr noundef %1, ptr noundef %2) #12
  %493 = getelementptr inbounds i8, ptr %18, i64 112
  %494 = load i16, ptr %493, align 8, !tbaa !37
  %495 = zext i16 %494 to i64
  %496 = icmp ugt i64 %492, %495
  br i1 %496, label %497, label %500

497:                                              ; preds = %491
  %498 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %499 = call i32 @largechunk_npages(ptr noundef nonnull %18, i64 noundef %498) #12
  br label %500

500:                                              ; preds = %491, %497
  %501 = phi i32 [ %499, %497 ], [ 0, %491 ]
  %502 = zext i32 %501 to i64
  %503 = call i32 @node_largedata_pgno(ptr noundef %488) #12
  %504 = load i64, ptr %483, align 1, !tbaa !51
  %505 = call { ptr, i32 } @page_get_large(ptr noundef nonnull %0, i32 noundef %503, i64 noundef %504) #11
  %506 = extractvalue { ptr, i32 } %505, 0
  %507 = extractvalue { ptr, i32 } %505, 1
  %.not944 = icmp eq i32 %507, 0
  br i1 %.not944, label %508, label %.thread1031, !prof !25

508:                                              ; preds = %500
  %509 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %510 = and i8 %509, 1
  %.not945 = icmp eq i8 %510, 0
  br i1 %.not945, label %517, label %511, !prof !20

511:                                              ; preds = %508
  %512 = call zeroext i8 @page_type(ptr noundef %506) #12
  %.not946 = icmp eq i8 %512, 4
  br i1 %.not946, label %517, label %513, !prof !25

513:                                              ; preds = %511
  %514 = load ptr, ptr %15, align 8, !tbaa !5
  %515 = getelementptr inbounds i8, ptr %514, i64 80
  %516 = load ptr, ptr %515, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %516, ptr noundef nonnull @.str.63, ptr noundef nonnull @__func__.cursor_put, i32 noundef 972) #13
  unreachable

517:                                              ; preds = %511, %508
  %518 = getelementptr inbounds i8, ptr %506, i64 12
  %519 = load i32, ptr %518, align 1, !tbaa !24
  %520 = zext i32 %519 to i64
  %521 = load ptr, ptr %114, align 8, !tbaa !46
  %522 = load ptr, ptr %15, align 8, !tbaa !5
  %523 = getelementptr inbounds i8, ptr %522, i64 88
  %524 = load ptr, ptr %523, align 8, !tbaa !68
  %525 = icmp eq ptr %521, %524
  %526 = zext i1 %525 to i64
  %527 = call zeroext i1 @is_frozen(ptr noundef %522, ptr noundef %506) #12
  %.not947 = icmp ult i32 %519, %501
  %or.cond970 = select i1 %527, i1 true, i1 %.not947
  %528 = add nuw nsw i64 %526, %502
  %.not948 = icmp ult i64 %528, %520
  %or.cond971 = select i1 %or.cond970, i1 true, i1 %.not948
  br i1 %or.cond971, label %584, label %529

529:                                              ; preds = %517
  %530 = call zeroext i1 @is_modifable(ptr noundef nonnull %522, ptr noundef nonnull %506) #12
  br i1 %530, label %.thread1026, label %531

531:                                              ; preds = %529
  %532 = call zeroext i1 @is_spilled(ptr noundef nonnull %522, ptr noundef nonnull %506) #12
  br i1 %532, label %533, label %537

533:                                              ; preds = %531
  %534 = call { ptr, i32 } @page_unspill(ptr noundef nonnull %522, ptr noundef nonnull %506) #11
  %535 = extractvalue { ptr, i32 } %534, 0
  %536 = extractvalue { ptr, i32 } %534, 1
  %.not954 = icmp eq i32 %536, 0
  br i1 %.not954, label %.thread1026, label %.thread1031, !prof !25

537:                                              ; preds = %531
  %538 = getelementptr inbounds i8, ptr %522, i64 24
  %539 = load ptr, ptr %538, align 8, !tbaa !69
  %.not949 = icmp eq ptr %539, null
  br i1 %.not949, label %540, label %548, !prof !20

540:                                              ; preds = %537
  %541 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %.not953 = icmp eq i8 %541, 0
  br i1 %.not953, label %.thread1031, label %542, !prof !25

542:                                              ; preds = %540
  %543 = load i64, ptr %506, align 1, !tbaa !51
  %544 = getelementptr inbounds i8, ptr %522, i64 64
  %545 = load i64, ptr %544, align 8, !tbaa !70
  %546 = getelementptr inbounds i8, ptr %522, i64 72
  %547 = load i64, ptr %546, align 8, !tbaa !65
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.cursor_put, i32 noundef 992, ptr noundef nonnull @.str.64, ptr noundef nonnull @.str.65, i32 noundef %503, i64 noundef %543, i64 noundef %545, i64 noundef %547) #11
  br label %.thread1031

548:                                              ; preds = %537
  %549 = call ptr @page_shadow_alloc(ptr noundef nonnull %522, i64 noundef %520) #11
  %.not950 = icmp eq ptr %549, null
  br i1 %.not950, label %.thread1031, label %550, !prof !20

550:                                              ; preds = %548
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(20) %549, ptr noundef nonnull align 1 dereferenceable(20) %506, i64 20, i1 false)
  %551 = load ptr, ptr %15, align 8, !tbaa !5
  %552 = call i32 @page_dirty(ptr noundef %551, ptr noundef nonnull %549, i64 noundef %520) #11
  %.not951 = icmp eq i32 %552, 0
  br i1 %.not951, label %553, label %.thread1031, !prof !25

553:                                              ; preds = %550
  %554 = load ptr, ptr %15, align 8, !tbaa !5
  %555 = getelementptr inbounds i8, ptr %554, i64 80
  %556 = load ptr, ptr %555, align 8, !tbaa !11
  %557 = getelementptr inbounds i8, ptr %556, i64 104
  %558 = load ptr, ptr %557, align 8, !tbaa !71
  %559 = getelementptr inbounds i8, ptr %558, i64 80
  %560 = load volatile i64, ptr %559, align 16, !tbaa !24
  %561 = add i64 %560, %520
  store volatile i64 %561, ptr %559, align 16, !tbaa !24
  %562 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %563 = and i8 %562, 1
  %.not952 = icmp eq i8 %563, 0
  br i1 %.not952, label %.thread1026, label %564, !prof !20

564:                                              ; preds = %553
  %565 = load ptr, ptr %15, align 8, !tbaa !5
  %566 = call zeroext i1 @dpl_check(ptr noundef %565) #11
  br i1 %566, label %.thread1026, label %567, !prof !25

567:                                              ; preds = %564
  %568 = load ptr, ptr %15, align 8, !tbaa !5
  %569 = getelementptr inbounds i8, ptr %568, i64 80
  %570 = load ptr, ptr %569, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %570, ptr noundef nonnull @.str.66, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1009) #13
  unreachable

.thread1026:                                      ; preds = %553, %564, %533, %529
  %.sroa.0118.1 = phi ptr [ %506, %529 ], [ %535, %533 ], [ %549, %564 ], [ %549, %553 ]
  %571 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  call void @node_set_ds(ptr noundef %488, i64 noundef %571)
  %572 = and i32 %.8672, 65536
  %.not955 = icmp eq i32 %572, 0
  %573 = call ptr @page_data(ptr noundef %.sroa.0118.1) #12
  br i1 %.not955, label %575, label %574

574:                                              ; preds = %.thread1026
  store ptr %573, ptr %2, align 8, !tbaa !21
  br label %578

575:                                              ; preds = %.thread1026
  %576 = load ptr, ptr %2, align 8, !tbaa !21
  %577 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %573, ptr align 1 %576, i64 %577, i1 false)
  br label %578

578:                                              ; preds = %575, %574
  %579 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %580 = and i8 %579, 2
  %.not956 = icmp eq i8 %580, 0
  br i1 %.not956, label %583, label %581, !prof !25

581:                                              ; preds = %578
  %582 = call i32 @cursor_validate(ptr noundef nonnull %0) #15
  %.not957 = icmp eq i32 %582, 0
  br i1 %.not957, label %583, label %.thread1031, !prof !25

583:                                              ; preds = %581, %578
  br label %.thread1031

584:                                              ; preds = %517
  %585 = call i32 @page_retire(ptr noundef nonnull %0, ptr noundef nonnull %506)
  %.not958 = icmp eq i32 %585, 0
  br i1 %.not958, label %1074, label %.thread1031

586:                                              ; preds = %477
  %587 = call i64 @node_ds(ptr noundef %488) #12
  %588 = getelementptr inbounds i8, ptr %12, i64 8
  store i64 %587, ptr %588, align 8, !tbaa !23
  %589 = call ptr @node_data(ptr noundef %488) #12
  store ptr %589, ptr %12, align 8, !tbaa !21
  %590 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %591 = and i8 %590, 1
  %.not892 = icmp eq i8 %591, 0
  br i1 %.not892, label %606, label %592, !prof !20

592:                                              ; preds = %586
  %593 = ptrtoint ptr %589 to i64
  %594 = add nsw i64 %587, %593
  %595 = inttoptr i64 %594 to ptr
  %596 = ptrtoint ptr %483 to i64
  %597 = getelementptr inbounds i8, ptr %18, i64 8
  %598 = load i32, ptr %597, align 8, !tbaa !72
  %599 = zext i32 %598 to i64
  %600 = add nsw i64 %599, %596
  %601 = inttoptr i64 %600 to ptr
  %.not893 = icmp ugt ptr %595, %601
  br i1 %.not893, label %602, label %606, !prof !20

602:                                              ; preds = %592
  %603 = load ptr, ptr %15, align 8, !tbaa !5
  %604 = getelementptr inbounds i8, ptr %603, i64 80
  %605 = load ptr, ptr %604, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %605, ptr noundef nonnull @.str.67, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1031) #13
  unreachable

606:                                              ; preds = %592, %586
  %607 = load ptr, ptr %114, align 8, !tbaa !46
  %608 = load i16, ptr %607, align 4, !tbaa !57
  %609 = and i16 %608, 4
  %.not894 = icmp eq i16 %609, 0
  br i1 %.not894, label %970, label %610

610:                                              ; preds = %606
  %611 = load ptr, ptr %365, align 8, !tbaa !64
  store ptr %611, ptr %10, align 8, !tbaa !21
  %612 = getelementptr inbounds i8, ptr %483, i64 16
  %613 = load i32, ptr %612, align 1, !tbaa !55
  %614 = getelementptr inbounds i8, ptr %611, i64 16
  store i32 %613, ptr %614, align 1, !tbaa !55
  %615 = call zeroext i8 @node_flags(ptr noundef %488) #12
  %616 = zext i8 %615 to i32
  %617 = and i32 %616, 4
  %.not896 = icmp eq i32 %617, 0
  br i1 %.not896, label %618, label %720

618:                                              ; preds = %610
  %619 = and i32 %.8672, 262144
  %.not897 = icmp eq i32 %619, 0
  br i1 %.not897, label %635, label %620

620:                                              ; preds = %618
  %621 = getelementptr inbounds i8, ptr %0, i64 32
  %622 = load ptr, ptr %621, align 8, !tbaa !26
  %623 = getelementptr inbounds i8, ptr %622, i64 24
  %624 = load ptr, ptr %623, align 8, !tbaa !54
  %625 = call i32 %624(ptr noundef %2, ptr noundef nonnull %12) #11
  %626 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %627 = and i8 %626, 1
  %.not904 = icmp ne i8 %627, 0
  %.not905 = icmp eq i32 %625, 0
  %or.cond985 = select i1 %.not904, i1 %.not905, i1 false
  br i1 %or.cond985, label %628, label %.critedge974, !prof !73

628:                                              ; preds = %620
  %629 = call zeroext i1 @eq_fast(ptr noundef %2, ptr noundef nonnull %12) #12
  br i1 %629, label %.thread1031, label %630, !prof !25

630:                                              ; preds = %628
  %631 = load ptr, ptr %15, align 8, !tbaa !5
  %632 = getelementptr inbounds i8, ptr %631, i64 80
  %633 = load ptr, ptr %632, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %633, ptr noundef nonnull @.str.68, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1048) #13
  unreachable

.critedge974:                                     ; preds = %620
  %634 = icmp sgt i32 %625, 0
  br i1 %634, label %656, label %.thread1031

635:                                              ; preds = %618
  %636 = call zeroext i1 @eq_fast(ptr noundef %2, ptr noundef nonnull %12) #12
  br i1 %636, label %637, label %656

637:                                              ; preds = %635
  br i1 %.not892, label %.thread1123, label %638, !prof !20

.thread1123:                                      ; preds = %637
  %.not9011126 = icmp eq ptr %.0718, null
  br label %653

638:                                              ; preds = %637
  %639 = getelementptr inbounds i8, ptr %0, i64 32
  %640 = load ptr, ptr %639, align 8, !tbaa !26
  %641 = getelementptr inbounds i8, ptr %640, i64 24
  %642 = load ptr, ptr %641, align 8, !tbaa !54
  %643 = call i32 %642(ptr noundef %2, ptr noundef nonnull %12) #11
  %.not899 = icmp eq i32 %643, 0
  br i1 %.not899, label %648, label %644, !prof !25

644:                                              ; preds = %638
  %645 = load ptr, ptr %15, align 8, !tbaa !5
  %646 = getelementptr inbounds i8, ptr %645, i64 80
  %647 = load ptr, ptr %646, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %647, ptr noundef nonnull @.str.52, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1052) #13
  unreachable

648:                                              ; preds = %638
  %.pre1091 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %.pre1105 = and i8 %.pre1091, 1
  %.not900 = icmp ne i8 %.pre1105, 0
  %.not901 = icmp eq ptr %.0718, null
  %or.cond976 = and i1 %.not901, %.not900
  br i1 %or.cond976, label %649, label %653, !prof !74

649:                                              ; preds = %648
  %650 = load ptr, ptr %15, align 8, !tbaa !5
  %651 = getelementptr inbounds i8, ptr %650, i64 80
  %652 = load ptr, ptr %651, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %652, ptr noundef nonnull @.str.69, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1053) #13
  unreachable

653:                                              ; preds = %.thread1123, %648
  %.not9011128 = phi i1 [ %.not9011126, %.thread1123 ], [ %.not901, %648 ]
  %654 = phi i8 [ %590, %.thread1123 ], [ %.pre1091, %648 ]
  %655 = and i32 %.8672, 32
  %.not902 = icmp ne i32 %655, 0
  %brmerge = or i1 %.not9011128, %.not902
  %.mux = select i1 %.not902, i32 -30799, i32 0, !prof !75
  br i1 %brmerge, label %.thread1031, label %1362, !prof !76

656:                                              ; preds = %635, %.critedge974
  %657 = phi i8 [ %590, %635 ], [ %626, %.critedge974 ]
  %658 = and i32 %.8672, 64
  %.not906 = icmp eq i32 %658, 0
  br i1 %.not906, label %670, label %659

659:                                              ; preds = %656
  %660 = and i8 %657, 1
  %.not912 = icmp eq i8 %660, 0
  br i1 %.not912, label %975, label %661, !prof !20

661:                                              ; preds = %659
  %662 = call i64 @node_size(ptr noundef %1, ptr noundef %2) #12
  %663 = getelementptr inbounds i8, ptr %18, i64 112
  %664 = load i16, ptr %663, align 8, !tbaa !37
  %665 = zext i16 %664 to i64
  %.not913 = icmp ugt i64 %662, %665
  br i1 %.not913, label %666, label %975, !prof !20

666:                                              ; preds = %661
  %667 = load ptr, ptr %15, align 8, !tbaa !5
  %668 = getelementptr inbounds i8, ptr %667, i64 80
  %669 = load ptr, ptr %668, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %669, ptr noundef nonnull @.str.70, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1065) #13
  unreachable

670:                                              ; preds = %656
  %671 = getelementptr inbounds i8, ptr %611, i64 20
  store ptr %671, ptr %11, align 8, !tbaa !21
  %672 = load ptr, ptr %12, align 8, !tbaa !21
  %673 = load i64, ptr %588, align 8, !tbaa !23
  store i64 %673, ptr %370, align 8, !tbaa !23
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %671, ptr align 1 %672, i64 %673, i1 false)
  %674 = getelementptr inbounds i8, ptr %611, i64 10
  store i16 66, ptr %674, align 1, !tbaa !32
  %675 = getelementptr inbounds i8, ptr %611, i64 12
  store i16 0, ptr %675, align 1, !tbaa !24
  %676 = load i64, ptr %588, align 8, !tbaa !23
  %677 = add i64 %676, 20
  %678 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %679 = add i64 %677, %678
  store i64 %679, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %680 = load ptr, ptr %114, align 8, !tbaa !46
  %681 = load i16, ptr %680, align 4, !tbaa !57
  %682 = and i16 %681, 16
  %.not907 = icmp eq i16 %682, 0
  br i1 %.not907, label %702, label %683

683:                                              ; preds = %670
  store i16 98, ptr %674, align 1, !tbaa !32
  %684 = trunc i64 %678 to i16
  %685 = getelementptr inbounds i8, ptr %611, i64 8
  store i16 %684, ptr %685, align 1, !tbaa !32
  %686 = load i8, ptr %479, align 1, !tbaa !24
  %687 = sext i8 %686 to i64
  %688 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %687
  %689 = load ptr, ptr %688, align 8, !tbaa !31
  %690 = call i64 @page_room(ptr noundef %689) #12
  %691 = add i64 %690, %676
  %692 = call i64 @page_subleaf2_reserve(ptr noundef nonnull %18, i64 noundef %691, i64 noundef %679, i64 noundef %678) #11
  %693 = load i64, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %694 = add i64 %693, %692
  store i64 %694, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %695 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %696 = and i8 %695, 1
  %.not908 = icmp eq i8 %696, 0
  %697 = and i64 %694, 1
  %.not909 = icmp eq i64 %697, 0
  %or.cond977 = select i1 %.not908, i1 true, i1 %.not909
  br i1 %or.cond977, label %708, label %698, !prof !52

698:                                              ; preds = %683
  %699 = load ptr, ptr %15, align 8, !tbaa !5
  %700 = getelementptr inbounds i8, ptr %699, i64 80
  %701 = load ptr, ptr %700, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %701, ptr noundef nonnull @.str.71, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1087) #13
  unreachable

702:                                              ; preds = %670
  %703 = and i64 %676, 1
  %704 = or disjoint i64 %703, 20
  %705 = and i64 %678, 1
  %706 = add nuw nsw i64 %704, %705
  %707 = add i64 %706, %679
  store i64 %707, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %.pre1086 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %.pre1106 = and i8 %.pre1086, 1
  br label %708

708:                                              ; preds = %702, %683
  %.pre-phi1107 = phi i8 [ %.pre1106, %702 ], [ %696, %683 ]
  %709 = phi i64 [ %707, %702 ], [ %694, %683 ]
  %.not910 = icmp eq i8 %.pre-phi1107, 0
  %710 = and i64 %709, 1
  %.not911 = icmp eq i64 %710, 0
  %or.cond1131 = select i1 %.not910, i1 true, i1 %.not911
  br i1 %or.cond1131, label %715, label %711, !prof !52

711:                                              ; preds = %708
  %712 = load ptr, ptr %15, align 8, !tbaa !5
  %713 = getelementptr inbounds i8, ptr %712, i64 80
  %714 = load ptr, ptr %713, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %714, ptr noundef nonnull @.str.71, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1091) #13
  unreachable

715:                                              ; preds = %708
  %716 = trunc i64 %709 to i16
  %717 = add i16 %716, -20
  %718 = getelementptr inbounds i8, ptr %611, i64 14
  store i16 %717, ptr %718, align 1, !tbaa !24
  %719 = load i64, ptr %.0717.sroa.gep, align 8, !tbaa !23
  store i64 %719, ptr %588, align 8, !tbaa !23
  br label %773

720:                                              ; preds = %610
  %721 = and i32 %616, 2
  %.not939 = icmp eq i32 %721, 0
  br i1 %.not939, label %724, label %722

722:                                              ; preds = %720
  %723 = or i32 %.8672, 6
  br label %1179

724:                                              ; preds = %720
  switch i32 %.8672, label %725 [
    i32 96, label %757
    i32 64, label %757
  ]

725:                                              ; preds = %724
  %726 = call zeroext i1 @is_dupfix_leaf(ptr noundef %589) #12
  br i1 %726, label %727, label %731

727:                                              ; preds = %725
  %728 = getelementptr inbounds i8, ptr %589, i64 8
  %729 = load i16, ptr %728, align 1, !tbaa !32
  %730 = zext i16 %729 to i64
  br label %734

731:                                              ; preds = %725
  %732 = call i64 @node_size(ptr noundef %2, ptr noundef null) #12
  %733 = add i64 %732, 2
  br label %734

734:                                              ; preds = %731, %727
  %735 = phi i64 [ %730, %727 ], [ %733, %731 ]
  %736 = call i64 @page_room(ptr noundef %589) #12
  %.not940 = icmp ult i64 %736, %735
  br i1 %.not940, label %737, label %757

737:                                              ; preds = %734
  %738 = and i64 %735, 1
  %739 = add i64 %738, %735
  %740 = add i64 %739, %587
  store i64 %740, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %741 = getelementptr inbounds i8, ptr %18, i64 116
  %742 = load i16, ptr %741, align 4, !tbaa !77
  %743 = zext i16 %742 to i64
  %744 = icmp ugt i64 %740, %743
  br i1 %744, label %803, label %745

745:                                              ; preds = %737
  %746 = call zeroext i1 @is_dupfix_leaf(ptr noundef %589) #12
  br i1 %746, label %747, label %766

747:                                              ; preds = %745
  %748 = load i8, ptr %479, align 1, !tbaa !24
  %749 = sext i8 %748 to i64
  %750 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %749
  %751 = load ptr, ptr %750, align 8, !tbaa !31
  %752 = call i64 @page_room(ptr noundef %751) #12
  %753 = add i64 %752, %587
  %754 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %755 = call i64 @page_subleaf2_reserve(ptr noundef nonnull %18, i64 noundef %753, i64 noundef %740, i64 noundef %754) #11
  %756 = add i64 %755, %739
  %.pre1084 = load i64, ptr %588, align 8, !tbaa !23
  %.pre1085 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %.pre1108 = add i64 %.pre1084, %756
  %.pre1110 = and i8 %.pre1085, 1
  br label %766

757:                                              ; preds = %724, %724, %734
  %758 = load ptr, ptr %15, align 8, !tbaa !5
  %759 = getelementptr inbounds i8, ptr %758, i64 72
  %760 = load i64, ptr %759, align 8, !tbaa !65
  store i64 %760, ptr %589, align 1, !tbaa !51
  %761 = getelementptr inbounds i8, ptr %589, i64 16
  store i32 %613, ptr %761, align 1, !tbaa !55
  %762 = getelementptr inbounds i8, ptr %0, i64 40
  %763 = load ptr, ptr %762, align 8, !tbaa !30
  %764 = getelementptr inbounds i8, ptr %763, i64 48
  store ptr %589, ptr %764, align 8, !tbaa !31
  %765 = or i32 %.8672, 4
  br label %1179

766:                                              ; preds = %747, %745
  %.pre-phi1111 = phi i8 [ %.pre1110, %747 ], [ %591, %745 ]
  %.pre-phi1109 = phi i64 [ %.pre1108, %747 ], [ %740, %745 ]
  %767 = phi i64 [ %.pre1084, %747 ], [ %587, %745 ]
  %.0753 = phi i64 [ %756, %747 ], [ %739, %745 ]
  store i64 %.pre-phi1109, ptr %.0717.sroa.gep, align 8, !tbaa !23
  %.not941 = icmp eq i8 %.pre-phi1111, 0
  %768 = and i64 %.pre-phi1109, 1
  %.not942 = icmp eq i64 %768, 0
  %or.cond978 = select i1 %.not941, i1 true, i1 %.not942
  br i1 %or.cond978, label %773, label %769, !prof !52

769:                                              ; preds = %766
  %770 = load ptr, ptr %15, align 8, !tbaa !5
  %771 = getelementptr inbounds i8, ptr %770, i64 80
  %772 = load ptr, ptr %771, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %772, ptr noundef nonnull @.str.71, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1192) #13
  unreachable

773:                                              ; preds = %766, %715
  %774 = phi i64 [ %767, %766 ], [ %719, %715 ]
  %775 = phi i64 [ %.pre-phi1109, %766 ], [ %719, %715 ]
  %.1754 = phi i64 [ %.0753, %766 ], [ 0, %715 ]
  %.0749 = phi ptr [ %589, %766 ], [ %611, %715 ]
  %776 = getelementptr inbounds i8, ptr %.0749, i64 10
  %777 = load i16, ptr %776, align 1, !tbaa !32
  %778 = getelementptr inbounds i8, ptr %18, i64 116
  %779 = load i16, ptr %778, align 4, !tbaa !77
  %780 = zext i16 %779 to i64
  %781 = icmp ugt i64 %775, %780
  br i1 %781, label %803, label %782

782:                                              ; preds = %773
  %783 = call i64 @node_ks(ptr noundef %488) #12
  %784 = call i64 @node_size_len(i64 noundef %783, i64 noundef %775) #16
  %785 = getelementptr inbounds i8, ptr %18, i64 112
  %786 = load i16, ptr %785, align 8, !tbaa !37
  %787 = zext i16 %786 to i64
  %788 = icmp ugt i64 %784, %787
  br i1 %788, label %803, label %789

789:                                              ; preds = %782
  %790 = getelementptr inbounds i8, ptr %18, i64 118
  %791 = load i16, ptr %790, align 2, !tbaa !78
  %.not943 = icmp eq i16 %791, 0
  br i1 %.not943, label %868, label %792

792:                                              ; preds = %789
  %793 = load i8, ptr %479, align 1, !tbaa !24
  %794 = sext i8 %793 to i64
  %795 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %794
  %796 = load ptr, ptr %795, align 8, !tbaa !31
  %797 = call i64 @page_room(ptr noundef %796) #12
  %798 = call i64 @node_size_len(i64 noundef %783, i64 noundef %774) #16
  %799 = add i64 %798, %797
  %800 = zext i16 %791 to i64
  %801 = add nuw nsw i64 %784, %800
  %802 = icmp ult i64 %799, %801
  br i1 %802, label %803, label %868

803:                                              ; preds = %773, %782, %792, %737, %399
  %.1750 = phi ptr [ %366, %399 ], [ %589, %737 ], [ %.0749, %792 ], [ %.0749, %782 ], [ %.0749, %773 ]
  %.1741 = phi i16 [ 2, %399 ], [ %.0740, %737 ], [ %777, %792 ], [ %777, %782 ], [ %777, %773 ]
  %.1727 = phi i8 [ 1, %399 ], [ 0, %737 ], [ 0, %792 ], [ 0, %782 ], [ 0, %773 ]
  %.9673 = phi i32 [ %.7671, %399 ], [ %.8672, %737 ], [ %.8672, %792 ], [ %.8672, %782 ], [ %.8672, %773 ]
  %804 = and i16 %.1741, -65
  %805 = getelementptr inbounds i8, ptr %13, i64 4
  store i32 0, ptr %805, align 4, !tbaa !62
  %806 = load ptr, ptr %114, align 8, !tbaa !46
  %807 = load i16, ptr %806, align 4, !tbaa !57
  %808 = call zeroext i16 @flags_db2sub(i16 noundef zeroext %807) #16
  store i16 %808, ptr %13, align 4, !tbaa !57
  %809 = load i16, ptr %806, align 4, !tbaa !57
  %810 = and i16 %809, 16
  %.not856 = icmp eq i16 %810, 0
  br i1 %.not856, label %816, label %811

811:                                              ; preds = %803
  %812 = or i16 %804, 32
  %813 = getelementptr inbounds i8, ptr %.1750, i64 8
  %814 = load i16, ptr %813, align 1, !tbaa !32
  %815 = zext i16 %814 to i32
  store i32 %815, ptr %805, align 4, !tbaa !62
  br label %816

816:                                              ; preds = %811, %803
  %.2742 = phi i16 [ %812, %811 ], [ %804, %803 ]
  %817 = getelementptr inbounds i8, ptr %13, i64 2
  store i16 1, ptr %817, align 2, !tbaa !47
  %818 = getelementptr inbounds i8, ptr %13, i64 12
  store i32 0, ptr %818, align 4, !tbaa !79
  %819 = getelementptr inbounds i8, ptr %13, i64 16
  store i32 1, ptr %819, align 4, !tbaa !80
  %820 = getelementptr inbounds i8, ptr %13, i64 20
  store i32 0, ptr %820, align 4, !tbaa !81
  %821 = call i64 @page_numkeys(ptr noundef %.1750) #12
  %822 = getelementptr inbounds i8, ptr %13, i64 32
  store i64 %821, ptr %822, align 4, !tbaa !48
  store i64 48, ptr %.0717.sroa.gep, align 8, !tbaa !23
  store ptr %13, ptr %10, align 8, !tbaa !21
  %823 = call { ptr, i32 } @gc_alloc_single(ptr noundef nonnull %0) #11
  %824 = extractvalue { ptr, i32 } %823, 0
  %825 = extractvalue { ptr, i32 } %823, 1
  %.not857 = icmp eq i32 %825, 0
  br i1 %.not857, label %826, label %.thread1031, !prof !25

826:                                              ; preds = %816
  %827 = load ptr, ptr %114, align 8, !tbaa !46
  %828 = getelementptr inbounds i8, ptr %827, i64 16
  %829 = load i32, ptr %828, align 4, !tbaa !80
  %830 = add i32 %829, 1
  store i32 %830, ptr %828, align 4, !tbaa !80
  %831 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %832 = and i8 %831, 1
  %.not858 = icmp eq i8 %832, 0
  %833 = getelementptr inbounds i8, ptr %18, i64 8
  %834 = load i32, ptr %833, align 8, !tbaa !72
  br i1 %.not858, label %.thread1036, label %840, !prof !20

.thread1036:                                      ; preds = %826
  %835 = getelementptr inbounds i8, ptr %12, i64 8
  %836 = load i64, ptr %835, align 8, !tbaa !23
  %837 = trunc i64 %836 to i32
  %838 = sub i32 %834, %837
  %839 = zext i32 %838 to i64
  br label %857

840:                                              ; preds = %826
  %841 = zext i32 %834 to i64
  %842 = getelementptr inbounds i8, ptr %12, i64 8
  %843 = load i64, ptr %842, align 8, !tbaa !23
  %.not859 = icmp ult i64 %843, %841
  br i1 %.not859, label %848, label %844, !prof !25

844:                                              ; preds = %840
  %845 = load ptr, ptr %15, align 8, !tbaa !5
  %846 = getelementptr inbounds i8, ptr %845, i64 80
  %847 = load ptr, ptr %846, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %847, ptr noundef nonnull @.str.72, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1221) #13
  unreachable

848:                                              ; preds = %840
  %849 = trunc i64 %843 to i32
  %850 = sub i32 %834, %849
  %851 = zext i32 %850 to i64
  %852 = and i64 %851, 1
  %.not861 = icmp eq i64 %852, 0
  br i1 %.not861, label %857, label %853, !prof !82

853:                                              ; preds = %848
  %854 = load ptr, ptr %15, align 8, !tbaa !5
  %855 = getelementptr inbounds i8, ptr %854, i64 80
  %856 = load ptr, ptr %855, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %856, ptr noundef nonnull @.str.73, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1223) #13
  unreachable

857:                                              ; preds = %.thread1036, %848
  %858 = phi i64 [ %839, %.thread1036 ], [ %851, %848 ]
  %859 = or i32 %.9673, 6
  %860 = getelementptr inbounds i8, ptr %824, i64 16
  %861 = load i32, ptr %860, align 1, !tbaa !55
  %862 = getelementptr inbounds i8, ptr %13, i64 8
  store i32 %861, ptr %862, align 4, !tbaa !56
  %863 = getelementptr inbounds i8, ptr %13, i64 24
  store i64 0, ptr %863, align 4, !tbaa !83
  %864 = load ptr, ptr %15, align 8, !tbaa !5
  %865 = getelementptr inbounds i8, ptr %864, i64 64
  %866 = load i64, ptr %865, align 8, !tbaa !70
  %867 = getelementptr inbounds i8, ptr %13, i64 40
  store i64 %866, ptr %867, align 4, !tbaa !84
  br label %868

868:                                              ; preds = %857, %792, %789
  %.2755 = phi i64 [ %858, %857 ], [ %.1754, %792 ], [ %.1754, %789 ]
  %.0752 = phi ptr [ %824, %857 ], [ %611, %792 ], [ %611, %789 ]
  %.2751 = phi ptr [ %.1750, %857 ], [ %.0749, %792 ], [ %.0749, %789 ]
  %.3743 = phi i16 [ %.2742, %857 ], [ %777, %792 ], [ %777, %789 ]
  %.2728 = phi i8 [ %.1727, %857 ], [ 0, %792 ], [ 0, %789 ]
  %.1722 = phi ptr [ %824, %857 ], [ null, %792 ], [ null, %789 ]
  %.10674 = phi i32 [ %859, %857 ], [ %.8672, %792 ], [ %.8672, %789 ]
  %.not862 = icmp eq ptr %.0752, %.2751
  br i1 %.not862, label %.loopexit1055, label %869

869:                                              ; preds = %868
  %870 = getelementptr inbounds i8, ptr %.0752, i64 10
  store i16 %.3743, ptr %870, align 1, !tbaa !32
  %871 = load ptr, ptr %15, align 8, !tbaa !5
  %872 = getelementptr inbounds i8, ptr %871, i64 72
  %873 = load i64, ptr %872, align 8, !tbaa !65
  store i64 %873, ptr %.0752, align 1, !tbaa !51
  %874 = getelementptr inbounds i8, ptr %.2751, i64 8
  %875 = load i16, ptr %874, align 1, !tbaa !32
  %876 = getelementptr inbounds i8, ptr %.0752, i64 8
  store i16 %875, ptr %876, align 1, !tbaa !32
  %877 = getelementptr inbounds i8, ptr %.2751, i64 12
  %878 = load i16, ptr %877, align 1, !tbaa !24
  %879 = getelementptr inbounds i8, ptr %.0752, i64 12
  store i16 %878, ptr %879, align 1, !tbaa !24
  %880 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %881 = and i8 %880, 1
  %.not863 = icmp ne i8 %881, 0
  %.phi.trans.insert1088 = getelementptr inbounds i8, ptr %.2751, i64 14
  %.pre1089 = load i16, ptr %.phi.trans.insert1088, align 1, !tbaa !24
  %882 = zext i16 %.pre1089 to i64
  %883 = add i64 %.2755, %882
  %884 = icmp ugt i64 %883, 65534
  %or.cond1134 = select i1 %.not863, i1 %884, i1 false
  br i1 %or.cond1134, label %885, label %._crit_edge1087, !prof !85

885:                                              ; preds = %869
  %886 = load ptr, ptr %15, align 8, !tbaa !5
  %887 = getelementptr inbounds i8, ptr %886, i64 80
  %888 = load ptr, ptr %887, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %888, ptr noundef nonnull @.str.74, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1235) #13
  unreachable

._crit_edge1087:                                  ; preds = %869
  %889 = getelementptr inbounds i8, ptr %.2751, i64 14
  %890 = trunc i64 %.2755 to i16
  %891 = add i16 %.pre1089, %890
  %892 = getelementptr inbounds i8, ptr %.0752, i64 14
  store i16 %891, ptr %892, align 1, !tbaa !24
  %893 = and i16 %.3743, 32
  %.not864 = icmp eq i16 %893, 0
  br i1 %.not864, label %916, label %894, !prof !25

894:                                              ; preds = %._crit_edge1087
  %895 = call ptr @page_data(ptr noundef nonnull %.0752) #12
  %896 = call ptr @page_data(ptr noundef nonnull %.2751) #12
  %897 = call i64 @page_numkeys(ptr noundef nonnull %.2751) #12
  %898 = load i16, ptr %874, align 1, !tbaa !32
  %899 = zext i16 %898 to i64
  %900 = mul i64 %897, %899
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %895, ptr align 1 %896, i64 %900, i1 false)
  %901 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %902 = and i8 %901, 1
  %.not868 = icmp eq i8 %902, 0
  br i1 %.not868, label %.loopexit1055, label %903, !prof !20

903:                                              ; preds = %894
  %904 = load i16, ptr %876, align 1, !tbaa !32
  %905 = zext i16 %904 to i64
  %906 = call i64 @page_numkeys(ptr noundef nonnull %.0752) #12
  %907 = and i64 %906, %905
  %908 = load i16, ptr %892, align 1, !tbaa !24
  %909 = zext i16 %908 to i64
  %910 = xor i64 %907, %909
  %911 = and i64 %910, 1
  %.not869 = icmp eq i64 %911, 0
  br i1 %.not869, label %.loopexit1055, label %912, !prof !25

912:                                              ; preds = %903
  %913 = load ptr, ptr %15, align 8, !tbaa !5
  %914 = getelementptr inbounds i8, ptr %913, i64 80
  %915 = load ptr, ptr %914, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %915, ptr noundef nonnull @.str.75, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1239) #13
  unreachable

916:                                              ; preds = %._crit_edge1087
  %917 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %918 = and i8 %917, 1
  %.not865 = icmp eq i8 %918, 0
  %919 = and i16 %891, 1
  %.not866 = icmp eq i16 %919, 0
  %or.cond980 = select i1 %.not865, i1 true, i1 %.not866
  br i1 %or.cond980, label %924, label %920, !prof !52

920:                                              ; preds = %916
  %921 = load ptr, ptr %15, align 8, !tbaa !5
  %922 = getelementptr inbounds i8, ptr %921, i64 80
  %923 = load ptr, ptr %922, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %923, ptr noundef nonnull @.str.76, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1241) #13
  unreachable

924:                                              ; preds = %916
  %925 = ptrtoint ptr %.0752 to i64
  %926 = zext i16 %891 to i64
  %927 = add i64 %925, 20
  %928 = add i64 %927, %926
  %929 = inttoptr i64 %928 to ptr
  %930 = ptrtoint ptr %.2751 to i64
  %931 = load i16, ptr %889, align 1, !tbaa !24
  %932 = zext i16 %931 to i64
  %933 = add i64 %930, 20
  %934 = add i64 %933, %932
  %935 = inttoptr i64 %934 to ptr
  %936 = getelementptr inbounds i8, ptr %12, i64 8
  %937 = load i64, ptr %936, align 8, !tbaa !23
  %reass.sub = sub i64 %937, %932
  %938 = add i64 %reass.sub, -20
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %929, ptr align 1 %935, i64 %938, i1 false)
  %939 = getelementptr inbounds i8, ptr %.0752, i64 20
  %940 = getelementptr inbounds i8, ptr %.2751, i64 20
  %941 = call i64 @page_numkeys(ptr noundef nonnull %.2751) #12
  %942 = shl i64 %941, 1
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %939, ptr nonnull align 1 %940, i64 %942, i1 false)
  %943 = call i64 @page_numkeys(ptr noundef nonnull %.2751) #12
  %.not1074 = icmp eq i64 %943, 0
  br i1 %.not1074, label %.loopexit1055, label %.lr.ph

.lr.ph:                                           ; preds = %924
  %944 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %945 = and i8 %944, 1
  %.not867 = icmp eq i8 %945, 0
  br i1 %.not867, label %.lr.ph.split.us, label %.lr.ph.split, !prof !20

.lr.ph.split.us:                                  ; preds = %.lr.ph, %.lr.ph.split.us
  %.07331057.us = phi i64 [ %949, %.lr.ph.split.us ], [ 0, %.lr.ph ]
  %946 = getelementptr inbounds [0 x i16], ptr %939, i64 0, i64 %.07331057.us
  %947 = load i16, ptr %946, align 1, !tbaa !32
  %948 = add i16 %947, %890
  store i16 %948, ptr %946, align 1, !tbaa !32
  %949 = add nuw i64 %.07331057.us, 1
  %950 = call i64 @page_numkeys(ptr noundef %.2751) #12
  %951 = icmp ult i64 %949, %950
  br i1 %951, label %.lr.ph.split.us, label %.loopexit1055, !llvm.loop !86

.lr.ph.split:                                     ; preds = %.lr.ph, %961
  %.07331057 = phi i64 [ %963, %961 ], [ 0, %.lr.ph ]
  %952 = getelementptr inbounds [0 x i16], ptr %939, i64 0, i64 %.07331057
  %953 = load i16, ptr %952, align 1, !tbaa !32
  %954 = zext i16 %953 to i64
  %955 = add i64 %.2755, %954
  %956 = icmp ugt i64 %955, 65535
  br i1 %956, label %957, label %961, !prof !20

957:                                              ; preds = %.lr.ph.split
  %958 = load ptr, ptr %15, align 8, !tbaa !5
  %959 = getelementptr inbounds i8, ptr %958, i64 80
  %960 = load ptr, ptr %959, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %960, ptr noundef nonnull @.str.77, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1246) #13
  unreachable

961:                                              ; preds = %.lr.ph.split
  %962 = add i16 %953, %890
  store i16 %962, ptr %952, align 1, !tbaa !32
  %963 = add nuw i64 %.07331057, 1
  %964 = call i64 @page_numkeys(ptr noundef %.2751) #12
  %965 = icmp ult i64 %963, %964
  br i1 %965, label %.lr.ph.split, label %.loopexit1055, !llvm.loop !86

.loopexit1055:                                    ; preds = %961, %.lr.ph.split.us, %924, %903, %894, %868
  %966 = trunc nuw i8 %.2728 to i1
  br i1 %966, label %968, label %967

967:                                              ; preds = %.loopexit1055
  call void @node_del(ptr noundef %0, i64 noundef 0) #11
  br label %968

968:                                              ; preds = %967, %.loopexit1055
  %969 = or i32 %.10674, 4
  br label %1075

970:                                              ; preds = %606
  %971 = call zeroext i8 @node_flags(ptr noundef %488) #12
  %972 = zext i8 %971 to i32
  %973 = xor i32 %.8672, %972
  %974 = and i32 %973, 2
  %.not895 = icmp eq i32 %974, 0
  br i1 %.not895, label %975, label %.thread1031, !prof !25

975:                                              ; preds = %970, %659, %661
  %976 = phi i8 [ %590, %970 ], [ %657, %659 ], [ %657, %661 ]
  %977 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %978 = load i64, ptr %588, align 8, !tbaa !23
  %979 = icmp eq i64 %977, %978
  br i1 %979, label %980, label %1074

980:                                              ; preds = %975
  %981 = and i8 %976, 1
  %.not914 = icmp eq i8 %981, 0
  br i1 %.not914, label %994, label %982, !prof !20

982:                                              ; preds = %980
  %983 = getelementptr inbounds i8, ptr %1, i64 8
  %984 = load i64, ptr %983, align 8, !tbaa !23
  %985 = add i64 %984, 1
  %986 = call i64 @node_ks(ptr noundef %488) #12
  %987 = add i64 %986, 1
  %988 = xor i64 %987, %985
  %989 = icmp ugt i64 %988, 1
  br i1 %989, label %990, label %994, !prof !20

990:                                              ; preds = %982
  %991 = load ptr, ptr %15, align 8, !tbaa !5
  %992 = getelementptr inbounds i8, ptr %991, i64 80
  %993 = load ptr, ptr %992, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %993, ptr noundef nonnull @.str.78, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1265) #13
  unreachable

994:                                              ; preds = %982, %980
  %995 = and i32 %.8672, 65536
  %.not915 = icmp eq i32 %995, 0
  br i1 %.not915, label %998, label %996

996:                                              ; preds = %994
  %997 = load ptr, ptr %12, align 8, !tbaa !21
  store ptr %997, ptr %2, align 8, !tbaa !21
  br label %1068

998:                                              ; preds = %994
  %999 = load i8, ptr %274, align 4, !tbaa !24
  %1000 = and i8 %999, 1
  %.not916 = icmp eq i8 %1000, 0
  br i1 %.not916, label %1001, label %1004

1001:                                             ; preds = %998
  %1002 = load ptr, ptr %12, align 8, !tbaa !21
  %1003 = load ptr, ptr %2, align 8, !tbaa !21
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %1002, ptr align 1 %1003, i64 %977, i1 false)
  %.pre1100 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  br label %1068

1004:                                             ; preds = %998
  br i1 %.not914, label %..thread1042_crit_edge, label %1005, !prof !20

..thread1042_crit_edge:                           ; preds = %1004
  %.phi.trans.insert1098 = getelementptr inbounds i8, ptr %1, i64 8
  %.pre1099 = load i64, ptr %.phi.trans.insert1098, align 8, !tbaa !23
  br label %.thread1042

1005:                                             ; preds = %1004
  %1006 = load i8, ptr %479, align 1, !tbaa !24
  %1007 = sext i8 %1006 to i64
  %1008 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %1007
  %1009 = load ptr, ptr %1008, align 8, !tbaa !31
  %1010 = call i64 @page_numkeys(ptr noundef %1009) #12
  %.not918 = icmp eq i64 %1010, 1
  br i1 %.not918, label %1015, label %1011, !prof !25

1011:                                             ; preds = %1005
  %1012 = load ptr, ptr %15, align 8, !tbaa !5
  %1013 = getelementptr inbounds i8, ptr %1012, i64 80
  %1014 = load ptr, ptr %1013, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1014, ptr noundef nonnull @.str.79, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1274) #13
  unreachable

1015:                                             ; preds = %1005
  %1016 = call zeroext i8 @page_type_compat(ptr noundef %1009) #12
  %.not920 = icmp eq i8 %1016, 2
  br i1 %.not920, label %1021, label %1017, !prof !25

1017:                                             ; preds = %1015
  %1018 = load ptr, ptr %15, align 8, !tbaa !5
  %1019 = getelementptr inbounds i8, ptr %1018, i64 80
  %1020 = load ptr, ptr %1019, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1020, ptr noundef nonnull @.str.80, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1275) #13
  unreachable

1021:                                             ; preds = %1015
  %1022 = call i64 @node_ds(ptr noundef %488) #12
  %.not922 = icmp eq i64 %1022, 0
  br i1 %.not922, label %1027, label %1023, !prof !25

1023:                                             ; preds = %1021
  %1024 = load ptr, ptr %15, align 8, !tbaa !5
  %1025 = getelementptr inbounds i8, ptr %1024, i64 80
  %1026 = load ptr, ptr %1025, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1026, ptr noundef nonnull @.str.81, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1276) #13
  unreachable

1027:                                             ; preds = %1021
  %1028 = call zeroext i8 @node_flags(ptr noundef %488) #12
  %.not924 = icmp eq i8 %1028, 0
  br i1 %.not924, label %1033, label %1029, !prof !25

1029:                                             ; preds = %1027
  %1030 = load ptr, ptr %15, align 8, !tbaa !5
  %1031 = getelementptr inbounds i8, ptr %1030, i64 80
  %1032 = load ptr, ptr %1031, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1032, ptr noundef nonnull @.str.9, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1277) #13
  unreachable

1033:                                             ; preds = %1027
  %1034 = getelementptr inbounds i8, ptr %1, i64 8
  %1035 = load i64, ptr %1034, align 8, !tbaa !23
  %1036 = icmp ugt i64 %1035, 65534
  br i1 %1036, label %1037, label %.thread1042, !prof !20

1037:                                             ; preds = %1033
  %1038 = load ptr, ptr %15, align 8, !tbaa !5
  %1039 = getelementptr inbounds i8, ptr %1038, i64 80
  %1040 = load ptr, ptr %1039, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1040, ptr noundef nonnull @.str.82, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1278) #13
  unreachable

.thread1042:                                      ; preds = %..thread1042_crit_edge, %1033
  %1041 = phi i64 [ %.pre1099, %..thread1042_crit_edge ], [ %1035, %1033 ]
  %1042 = getelementptr inbounds i8, ptr %1, i64 8
  call void @node_set_ks(ptr noundef %488, i64 noundef %1041)
  %1043 = call ptr @node_key(ptr noundef %488) #12
  %1044 = load ptr, ptr %1, align 8, !tbaa !21
  %1045 = load i64, ptr %1042, align 8, !tbaa !23
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %1043, ptr align 1 %1044, i64 %1045, i1 false)
  %1046 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1047 = and i8 %1046, 1
  %.not926 = icmp eq i8 %1047, 0
  br i1 %.not926, label %427, label %1048, !prof !20

1048:                                             ; preds = %.thread1042
  %1049 = call ptr @node_key(ptr noundef %488) #12
  %1050 = ptrtoint ptr %1049 to i64
  %1051 = call i64 @node_ds(ptr noundef %488) #12
  %1052 = add nsw i64 %1051, %1050
  %1053 = inttoptr i64 %1052 to ptr
  %1054 = load i8, ptr %479, align 1, !tbaa !24
  %1055 = sext i8 %1054 to i64
  %1056 = getelementptr inbounds [32 x ptr], ptr %478, i64 0, i64 %1055
  %1057 = load ptr, ptr %1056, align 8, !tbaa !31
  %1058 = ptrtoint ptr %1057 to i64
  %1059 = getelementptr inbounds i8, ptr %18, i64 8
  %1060 = load i32, ptr %1059, align 8, !tbaa !72
  %1061 = zext i32 %1060 to i64
  %1062 = add nsw i64 %1061, %1058
  %1063 = inttoptr i64 %1062 to ptr
  %.not927 = icmp ult ptr %1053, %1063
  br i1 %.not927, label %427, label %1064, !prof !25

1064:                                             ; preds = %1048
  %1065 = load ptr, ptr %15, align 8, !tbaa !5
  %1066 = getelementptr inbounds i8, ptr %1065, i64 80
  %1067 = load ptr, ptr %1066, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1067, ptr noundef nonnull @.str.83, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1281) #13
  unreachable

1068:                                             ; preds = %1001, %996
  %1069 = phi i8 [ %.pre1100, %1001 ], [ %976, %996 ]
  %1070 = and i8 %1069, 2
  %.not937 = icmp eq i8 %1070, 0
  br i1 %.not937, label %1073, label %1071, !prof !25

1071:                                             ; preds = %1068
  %1072 = call i32 @cursor_validate(ptr noundef nonnull %0) #15
  %.not938 = icmp eq i32 %1072, 0
  br i1 %.not938, label %1073, label %.thread1031, !prof !25

1073:                                             ; preds = %1071, %1068
  br label %.thread1031

1074:                                             ; preds = %584, %975
  call void @node_del(ptr noundef nonnull %0, i64 noundef 0) #11
  br label %1075

1075:                                             ; preds = %1074, %386, %382, %968
  %.5745 = phi i16 [ %.3743, %968 ], [ %.0740, %1074 ], [ 2, %386 ], [ 2, %382 ]
  %.4730 = phi i8 [ %.2728, %968 ], [ 0, %1074 ], [ 1, %386 ], [ 1, %382 ]
  %.3724 = phi ptr [ %.1722, %968 ], [ null, %1074 ], [ null, %386 ], [ null, %382 ]
  %.0717.sroa.phi = phi ptr [ %.0717.sroa.gep, %968 ], [ %.0717.sroa.gep757, %1074 ], [ %.0717.sroa.gep757, %386 ], [ %.0717.sroa.gep757, %382 ]
  %.0717 = phi ptr [ %10, %968 ], [ %2, %1074 ], [ %2, %386 ], [ %2, %382 ]
  %.12676 = phi i32 [ %969, %968 ], [ %.8672, %1074 ], [ %.7671, %386 ], [ %.7671, %382 ]
  %1076 = and i32 %.12676, 196614
  %1077 = getelementptr inbounds i8, ptr %0, i64 48
  %1078 = getelementptr inbounds i8, ptr %0, i64 5
  %1079 = load i8, ptr %1078, align 1, !tbaa !24
  %1080 = sext i8 %1079 to i64
  %1081 = getelementptr inbounds [32 x ptr], ptr %1077, i64 0, i64 %1080
  %1082 = load ptr, ptr %1081, align 8, !tbaa !31
  %1083 = call zeroext i1 @is_dupfix_leaf(ptr noundef %1082) #12
  br i1 %1083, label %1084, label %.thread1043

1084:                                             ; preds = %1075
  %1085 = getelementptr inbounds i8, ptr %1, i64 8
  %1086 = load i64, ptr %1085, align 8, !tbaa !23
  %1087 = call i64 @page_room(ptr noundef %1082) #12
  %1088 = icmp ult i64 %1087, %1086
  br i1 %1088, label %1092, label %1106

.thread1043:                                      ; preds = %1075
  %1089 = call i64 @leaf_size(ptr noundef %18, ptr noundef %1, ptr noundef %.0717) #12
  %1090 = call i64 @page_room(ptr noundef %1082) #12
  %1091 = icmp ult i64 %1090, %1089
  br i1 %1091, label %1092, label %.thread1044

1092:                                             ; preds = %.thread1043, %1084
  %1093 = trunc nuw i8 %.4730 to i1
  %1094 = or disjoint i32 %1076, 262144
  %1095 = select i1 %1093, i32 %1076, i32 %1094
  %1096 = call i32 @page_split(ptr noundef %0, ptr noundef %1, ptr noundef %.0717, i32 noundef -1, i32 noundef %1095) #11
  %1097 = icmp eq i32 %1096, 0
  br i1 %1097, label %1098, label %.thread1049

1098:                                             ; preds = %1092
  %1099 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1100 = and i8 %1099, 2
  %.not876 = icmp eq i8 %1100, 0
  br i1 %.not876, label %.thread1046, label %1101, !prof !25

1101:                                             ; preds = %1098
  br i1 %1093, label %1102, label %1104

1102:                                             ; preds = %1101
  %1103 = call i32 @cursor_validate(ptr noundef %0) #15
  br label %1176

1104:                                             ; preds = %1101
  %1105 = call i32 @cursor_validate_updating(ptr noundef %0) #15
  br label %1176

1106:                                             ; preds = %1084
  %1107 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1108 = and i8 %1107, 1
  %.not870 = icmp eq i8 %1108, 0
  br i1 %.not870, label %1117, label %1109, !prof !20

1109:                                             ; preds = %1106
  %1110 = and i32 %.12676, 6
  %.not871 = icmp eq i32 %1110, 0
  br i1 %.not871, label %1111, label %.critedge982, !prof !25

1111:                                             ; preds = %1109
  %1112 = load i64, ptr %.0717.sroa.phi, align 8, !tbaa !23
  %1113 = icmp eq i64 %1112, 0
  br i1 %1113, label %1117, label %.critedge982, !prof !25

.critedge982:                                     ; preds = %1109, %1111
  %1114 = load ptr, ptr %15, align 8, !tbaa !5
  %1115 = getelementptr inbounds i8, ptr %1114, i64 80
  %1116 = load ptr, ptr %1115, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1116, ptr noundef nonnull @.str.84, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1308) #13
  unreachable

1117:                                             ; preds = %1111, %1106
  %1118 = getelementptr inbounds i8, ptr %0, i64 304
  %1119 = getelementptr inbounds [32 x i16], ptr %1118, i64 0, i64 %1080
  %1120 = load i16, ptr %1119, align 2, !tbaa !32
  %1121 = zext i16 %1120 to i64
  %1122 = call i32 @node_add_dupfix(ptr noundef %0, i64 noundef %1121, ptr noundef nonnull %1) #11
  br label %1128

.thread1044:                                      ; preds = %.thread1043
  %1123 = getelementptr inbounds i8, ptr %0, i64 304
  %1124 = getelementptr inbounds [32 x i16], ptr %1123, i64 0, i64 %1080
  %1125 = load i16, ptr %1124, align 2, !tbaa !32
  %1126 = zext i16 %1125 to i64
  %1127 = call i32 @node_add_leaf(ptr noundef nonnull %0, i64 noundef %1126, ptr noundef %1, ptr noundef %.0717, i32 noundef %1076) #11
  br label %1128

1128:                                             ; preds = %.thread1044, %1117
  %.8702 = phi i32 [ %1122, %1117 ], [ %1127, %.thread1044 ]
  %1129 = icmp eq i32 %.8702, 0
  br i1 %1129, label %1130, label %.thread1049, !prof !25

1130:                                             ; preds = %1128
  %1131 = load i8, ptr %1078, align 1, !tbaa !24
  %1132 = sext i8 %1131 to i64
  %1133 = getelementptr inbounds [32 x ptr], ptr %1077, i64 0, i64 %1132
  %1134 = load ptr, ptr %1133, align 8, !tbaa !31
  %1135 = call i64 @cursor_dbi(ptr noundef nonnull %0) #12
  %1136 = load ptr, ptr %15, align 8, !tbaa !5
  %1137 = getelementptr inbounds i8, ptr %1136, i64 120
  %1138 = load ptr, ptr %1137, align 8, !tbaa !87
  %1139 = getelementptr inbounds ptr, ptr %1138, i64 %1135
  %.07191058 = load ptr, ptr %1139, align 8, !tbaa !31
  %.not8721059 = icmp eq ptr %.07191058, null
  br i1 %.not8721059, label %.thread1046, label %.lr.ph1061

.lr.ph1061:                                       ; preds = %1130
  %1140 = getelementptr inbounds i8, ptr %0, i64 304
  %1141 = and i8 %.4730, 1
  %1142 = zext nneg i8 %1141 to i16
  br label %1143

1143:                                             ; preds = %.lr.ph1061, %1174
  %.07191060 = phi ptr [ %.07191058, %.lr.ph1061 ], [ %.0719, %1174 ]
  %1144 = load i8, ptr %274, align 4, !tbaa !24
  %1145 = and i8 %1144, 1
  %.not873 = icmp eq i8 %1145, 0
  br i1 %.not873, label %1149, label %1146

1146:                                             ; preds = %1143
  %1147 = getelementptr inbounds i8, ptr %.07191060, i64 40
  %1148 = load ptr, ptr %1147, align 8, !tbaa !30
  br label %1149

1149:                                             ; preds = %1143, %1146
  %1150 = phi ptr [ %1148, %1146 ], [ %.07191060, %1143 ]
  %1151 = call zeroext i1 @is_related(ptr noundef nonnull %0, ptr noundef %1150)
  br i1 %1151, label %1152, label %1174

1152:                                             ; preds = %1149
  %1153 = getelementptr inbounds i8, ptr %1150, i64 48
  %1154 = load i8, ptr %1078, align 1, !tbaa !24
  %1155 = sext i8 %1154 to i64
  %1156 = getelementptr inbounds [32 x ptr], ptr %1153, i64 0, i64 %1155
  %1157 = load ptr, ptr %1156, align 8, !tbaa !31
  %.not874 = icmp eq ptr %1157, %1134
  br i1 %.not874, label %1158, label %1174

1158:                                             ; preds = %1152
  %1159 = getelementptr inbounds i8, ptr %1150, i64 304
  %1160 = getelementptr inbounds [32 x i16], ptr %1159, i64 0, i64 %1155
  %1161 = load i16, ptr %1160, align 2, !tbaa !32
  %1162 = getelementptr inbounds [32 x i16], ptr %1140, i64 0, i64 %1155
  %1163 = load i16, ptr %1162, align 2, !tbaa !32
  %.not875 = icmp ult i16 %1161, %1163
  br i1 %.not875, label %1166, label %1164

1164:                                             ; preds = %1158
  %1165 = add i16 %1161, %1142
  store i16 %1165, ptr %1160, align 2, !tbaa !32
  br label %1166

1166:                                             ; preds = %1164, %1158
  %1167 = call zeroext i1 @inner_pointed(ptr noundef nonnull %1150) #12
  br i1 %1167, label %1168, label %1174

1168:                                             ; preds = %1166
  %1169 = load i8, ptr %1078, align 1, !tbaa !24
  %1170 = sext i8 %1169 to i64
  %1171 = getelementptr inbounds [32 x i16], ptr %1159, i64 0, i64 %1170
  %1172 = load i16, ptr %1171, align 2, !tbaa !32
  %1173 = zext i16 %1172 to i32
  call void @cursor_inner_refresh(ptr noundef nonnull %1150, ptr noundef %1134, i32 noundef %1173)
  br label %1174

1174:                                             ; preds = %1166, %1168, %1149, %1152
  %1175 = getelementptr inbounds i8, ptr %.07191060, i64 368
  %.0719 = load ptr, ptr %1175, align 8, !tbaa !31
  %.not872 = icmp eq ptr %.0719, null
  br i1 %.not872, label %.thread1046, label %1143, !llvm.loop !88

1176:                                             ; preds = %1102, %1104
  %.9703 = phi i32 [ %1103, %1102 ], [ %1105, %1104 ]
  %1177 = icmp eq i32 %.9703, 0
  br i1 %1177, label %.thread1046, label %.thread1049, !prof !89

.thread1046:                                      ; preds = %1174, %1130, %1098, %1176
  %1178 = and i32 %.12676, 4
  %.not877 = icmp eq i32 %1178, 0
  br i1 %.not877, label %1341, label %1179

1179:                                             ; preds = %.thread1046, %757, %722
  %.6746 = phi i16 [ %.5745, %.thread1046 ], [ %.0740, %722 ], [ %.0740, %757 ]
  %.5731 = phi i8 [ %.4730, %.thread1046 ], [ 0, %722 ], [ 0, %757 ]
  %.4725 = phi ptr [ %.3724, %.thread1046 ], [ null, %722 ], [ null, %757 ]
  %.13677 = phi i32 [ %.12676, %.thread1046 ], [ %723, %722 ], [ %765, %757 ]
  %1180 = getelementptr inbounds i8, ptr %0, i64 48
  %1181 = getelementptr inbounds i8, ptr %0, i64 5
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %14, i8 0, i64 16, i1 false)
  %1182 = load i8, ptr %1181, align 1, !tbaa !24
  %1183 = sext i8 %1182 to i64
  %1184 = getelementptr inbounds [32 x ptr], ptr %1180, i64 0, i64 %1183
  %1185 = load ptr, ptr %1184, align 8, !tbaa !31
  %1186 = getelementptr inbounds i8, ptr %0, i64 304
  %1187 = getelementptr inbounds [32 x i16], ptr %1186, i64 0, i64 %1183
  %1188 = load i16, ptr %1187, align 2, !tbaa !32
  %1189 = zext i16 %1188 to i64
  %1190 = call ptr @page_node(ptr noundef %1185, i64 noundef %1189) #12
  %1191 = lshr i32 %.13677, 1
  %1192 = and i32 %1191, 16
  %1193 = or disjoint i32 %1192, 64
  %1194 = and i32 %.13677, 64
  %1195 = icmp eq i32 %1194, 0
  br i1 %1195, label %1196, label %1198

1196:                                             ; preds = %1179
  %1197 = call i32 @cursor_dupsort_setup(ptr noundef nonnull %0, ptr noundef %1190, ptr noundef %1185)
  %.not878 = icmp eq i32 %1197, 0
  br i1 %.not878, label %1198, label %1378, !prof !25

1198:                                             ; preds = %1196, %1179
  %.0716 = phi i32 [ %1192, %1196 ], [ %1193, %1179 ]
  %1199 = getelementptr inbounds i8, ptr %0, i64 40
  %1200 = load ptr, ptr %1199, align 8, !tbaa !30
  %1201 = icmp ne ptr %.4725, null
  br i1 %1201, label %1202, label %1223

1202:                                             ; preds = %1198
  %1203 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1204 = and i8 %1203, 1
  %.not879 = icmp eq i8 %1204, 0
  br i1 %.not879, label %1218, label %1205, !prof !20

1205:                                             ; preds = %1202
  %1206 = getelementptr inbounds i8, ptr %1200, i64 386
  %1207 = load i16, ptr %1206, align 2, !tbaa !90
  %1208 = icmp eq i16 %1207, 1
  br i1 %1208, label %1209, label %.critedge984, !prof !25

1209:                                             ; preds = %1205
  %1210 = getelementptr inbounds i8, ptr %1200, i64 392
  %1211 = load i32, ptr %1210, align 8, !tbaa !91
  %1212 = getelementptr inbounds i8, ptr %.4725, i64 16
  %1213 = load i32, ptr %1212, align 1, !tbaa !55
  %1214 = icmp eq i32 %1211, %1213
  br i1 %1214, label %1218, label %.critedge984, !prof !25

.critedge984:                                     ; preds = %1205, %1209
  %1215 = load ptr, ptr %15, align 8, !tbaa !5
  %1216 = getelementptr inbounds i8, ptr %1215, i64 80
  %1217 = load ptr, ptr %1216, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1217, ptr noundef nonnull @.str.85, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1350) #13
  unreachable

1218:                                             ; preds = %1209, %1202
  %1219 = getelementptr inbounds i8, ptr %1200, i64 4
  store i8 1, ptr %1219, align 4, !tbaa !24
  %1220 = getelementptr inbounds i8, ptr %1200, i64 5
  store i8 0, ptr %1220, align 1, !tbaa !24
  %1221 = getelementptr inbounds i8, ptr %1200, i64 48
  store ptr %.4725, ptr %1221, align 8, !tbaa !31
  %1222 = getelementptr inbounds i8, ptr %1200, i64 304
  store i16 0, ptr %1222, align 8, !tbaa !32
  br label %1223

1223:                                             ; preds = %1218, %1198
  %1224 = load ptr, ptr %11, align 8, !tbaa !21
  %.not880 = icmp eq ptr %1224, null
  br i1 %.not880, label %1238, label %1225

1225:                                             ; preds = %1223
  %1226 = getelementptr inbounds i8, ptr %1200, i64 48
  %1227 = load ptr, ptr %1226, align 8, !tbaa !31
  %1228 = call zeroext i1 @is_dupfix_leaf(ptr noundef %1227) #12
  br i1 %1228, label %1229, label %1231

1229:                                             ; preds = %1225
  %1230 = call i32 @node_add_dupfix(ptr noundef nonnull %1200, i64 noundef 0, ptr noundef nonnull %11) #11
  br label %1233

1231:                                             ; preds = %1225
  %1232 = call i32 @node_add_leaf(ptr noundef nonnull %1200, i64 noundef 0, ptr noundef nonnull %11, ptr noundef nonnull %14, i32 noundef 0) #11
  br label %1233

1233:                                             ; preds = %1231, %1229
  %.10704 = phi i32 [ %1230, %1229 ], [ %1232, %1231 ]
  %.not881 = icmp eq i32 %.10704, 0
  br i1 %.not881, label %1234, label %1378, !prof !25

1234:                                             ; preds = %1233
  %1235 = getelementptr inbounds i8, ptr %1200, i64 24
  %1236 = load ptr, ptr %1235, align 8, !tbaa !92
  %1237 = getelementptr inbounds i8, ptr %1236, i64 32
  store i64 1, ptr %1237, align 4, !tbaa !48
  br label %1238

1238:                                             ; preds = %1234, %1223
  %1239 = call zeroext i8 @node_flags(ptr noundef %1190) #12
  %1240 = and i8 %1239, 2
  %1241 = icmp eq i8 %1240, 0
  %or.cond = or i1 %1201, %1241
  br i1 %or.cond, label %1242, label %.loopexit

1242:                                             ; preds = %1238
  %1243 = load i8, ptr %1181, align 1, !tbaa !24
  %1244 = sext i8 %1243 to i64
  %1245 = getelementptr inbounds [32 x ptr], ptr %1180, i64 0, i64 %1244
  %1246 = load ptr, ptr %1245, align 8, !tbaa !31
  %1247 = call i64 @page_numkeys(ptr noundef %1246) #12
  %1248 = call i64 @cursor_dbi(ptr noundef nonnull %0) #12
  %1249 = load ptr, ptr %15, align 8, !tbaa !5
  %1250 = getelementptr inbounds i8, ptr %1249, i64 120
  %1251 = load ptr, ptr %1250, align 8, !tbaa !87
  %1252 = getelementptr inbounds ptr, ptr %1251, i64 %1248
  %.06801062 = load ptr, ptr %1252, align 8, !tbaa !31
  %.not8821063 = icmp eq ptr %.06801062, null
  br i1 %.not8821063, label %.loopexit, label %.lr.ph1066

.lr.ph1066:                                       ; preds = %1242
  %1253 = trunc nuw i8 %.5731 to i1
  %1254 = getelementptr inbounds i8, ptr %1200, i64 32
  %1255 = getelementptr inbounds i8, ptr %1200, i64 384
  %1256 = getelementptr inbounds i8, ptr %1200, i64 48
  br label %1257

1257:                                             ; preds = %.lr.ph1066, %1314
  %.06801064 = phi ptr [ %.06801062, %.lr.ph1066 ], [ %.0680, %1314 ]
  %1258 = call zeroext i1 @is_related(ptr noundef %0, ptr noundef nonnull %.06801064)
  br i1 %1258, label %1259, label %1314

1259:                                             ; preds = %1257
  %1260 = getelementptr inbounds i8, ptr %.06801064, i64 48
  %1261 = load i8, ptr %1181, align 1, !tbaa !24
  %1262 = sext i8 %1261 to i64
  %1263 = getelementptr inbounds [32 x ptr], ptr %1260, i64 0, i64 %1262
  %1264 = load ptr, ptr %1263, align 8, !tbaa !31
  %.not959 = icmp eq ptr %1264, %1246
  br i1 %.not959, label %1265, label %1314

1265:                                             ; preds = %1259
  %1266 = call zeroext i1 @is_filled(ptr noundef nonnull %.06801064) #12
  br i1 %1266, label %1267, label %1305

1267:                                             ; preds = %1265
  %1268 = getelementptr inbounds i8, ptr %.06801064, i64 304
  %1269 = getelementptr inbounds [32 x i16], ptr %1268, i64 0, i64 %1262
  %1270 = load i16, ptr %1269, align 2, !tbaa !32
  %1271 = getelementptr inbounds [32 x i16], ptr %1186, i64 0, i64 %1262
  %1272 = load i16, ptr %1271, align 2, !tbaa !32
  %1273 = icmp eq i16 %1270, %1272
  br i1 %1273, label %1274, label %1305

1274:                                             ; preds = %1267
  %1275 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1276 = and i8 %1275, 1
  %.not960 = icmp eq i8 %1276, 0
  %.phi.trans.insert1093 = getelementptr inbounds i8, ptr %.06801064, i64 40
  %.pre1094 = load ptr, ptr %.phi.trans.insert1093, align 8, !tbaa !30
  br i1 %.not960, label %._crit_edge1092, label %1277, !prof !20

1277:                                             ; preds = %1274
  %1278 = getelementptr inbounds i8, ptr %.pre1094, i64 32
  %1279 = load ptr, ptr %1278, align 8, !tbaa !63
  %1280 = load ptr, ptr %1254, align 8, !tbaa !63
  %.not961 = icmp eq ptr %1279, %1280
  br i1 %.not961, label %._crit_edge1092, label %1281, !prof !25

1281:                                             ; preds = %1277
  %1282 = getelementptr inbounds i8, ptr %.06801064, i64 16
  %1283 = load ptr, ptr %1282, align 8, !tbaa !5
  %1284 = getelementptr inbounds i8, ptr %1283, i64 80
  %1285 = load ptr, ptr %1284, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1285, ptr noundef nonnull @.str.86, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1378) #13
  unreachable

._crit_edge1092:                                  ; preds = %1274, %1277
  %1286 = getelementptr inbounds i8, ptr %.06801064, i64 40
  %1287 = getelementptr inbounds i8, ptr %.pre1094, i64 384
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(48) %1287, ptr noundef nonnull align 8 dereferenceable(48) %1255, i64 48, i1 false), !tbaa.struct !93
  %1288 = load ptr, ptr %1256, align 8, !tbaa !31
  %1289 = load ptr, ptr %1286, align 8, !tbaa !30
  %1290 = getelementptr inbounds i8, ptr %1289, i64 48
  store ptr %1288, ptr %1290, align 8, !tbaa !31
  %1291 = load ptr, ptr %11, align 8, !tbaa !21
  %.not962 = icmp eq ptr %1291, null
  br i1 %.not962, label %1297, label %1292

1292:                                             ; preds = %._crit_edge1092
  %1293 = load ptr, ptr %1286, align 8, !tbaa !30
  %1294 = getelementptr inbounds i8, ptr %1293, i64 4
  store i16 1, ptr %1294, align 4, !tbaa !24
  %1295 = load ptr, ptr %1286, align 8, !tbaa !30
  %1296 = getelementptr inbounds i8, ptr %1295, i64 304
  store i16 0, ptr %1296, align 8, !tbaa !32
  br label %1297

1297:                                             ; preds = %._crit_edge1092, %1292
  %1298 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %1299 = icmp ugt i8 %1298, 4
  br i1 %1299, label %1300, label %1314, !prof !20

1300:                                             ; preds = %1297
  %1301 = load ptr, ptr %1286, align 8, !tbaa !30
  %1302 = call i64 @cursor_dbi(ptr noundef %1301) #12
  %1303 = getelementptr inbounds i8, ptr %1301, i64 392
  %1304 = load i32, ptr %1303, align 8, !tbaa !91
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1385, ptr noundef nonnull @.str.87, i64 noundef %1302, i32 noundef %1304) #11
  br label %1314

1305:                                             ; preds = %1267, %1265
  br i1 %1253, label %1314, label %1306

1306:                                             ; preds = %1305
  %1307 = getelementptr inbounds i8, ptr %.06801064, i64 304
  %1308 = getelementptr inbounds [32 x i16], ptr %1307, i64 0, i64 %1262
  %1309 = load i16, ptr %1308, align 2, !tbaa !32
  %1310 = zext i16 %1309 to i64
  %1311 = icmp sgt i64 %1247, %1310
  br i1 %1311, label %1312, label %1314

1312:                                             ; preds = %1306
  %1313 = zext i16 %1309 to i32
  call void @cursor_inner_refresh(ptr noundef nonnull %.06801064, ptr noundef %1246, i32 noundef %1313)
  br label %1314

1314:                                             ; preds = %1300, %1297, %1312, %1306, %1305, %1257, %1259
  %1315 = getelementptr inbounds i8, ptr %.06801064, i64 368
  %.0680 = load ptr, ptr %1315, align 8, !tbaa !31
  %.not882 = icmp eq ptr %.0680, null
  br i1 %.not882, label %.loopexit, label %1257, !llvm.loop !94

.loopexit:                                        ; preds = %1314, %1242, %1238
  %1316 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1317 = and i8 %1316, 1
  %.not883 = icmp ne i8 %1317, 0
  %.pre1095 = load ptr, ptr %1199, align 8, !tbaa !30
  %.phi.trans.insert1096 = getelementptr inbounds i8, ptr %.pre1095, i64 416
  %.pre1097 = load i64, ptr %.phi.trans.insert1096, align 8, !tbaa !34
  %1318 = icmp ugt i64 %.pre1097, 9223372036854775806
  %or.cond1135 = select i1 %.not883, i1 %1318, i1 false
  br i1 %or.cond1135, label %1319, label %.loopexit._crit_edge, !prof !85

1319:                                             ; preds = %.loopexit
  %1320 = load ptr, ptr %15, align 8, !tbaa !5
  %1321 = getelementptr inbounds i8, ptr %1320, i64 80
  %1322 = load ptr, ptr %1321, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1322, ptr noundef nonnull @.str.88, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1390) #13
  unreachable

.loopexit._crit_edge:                             ; preds = %.loopexit
  %1323 = and i32 %1191, 131072
  %1324 = or i32 %.0716, %1323
  %1325 = call i32 @cursor_put(ptr noundef nonnull %.pre1095, ptr noundef %2, ptr noundef nonnull %14, i32 noundef %1324) #14
  %1326 = and i32 %.13677, 2
  %.not884 = icmp eq i32 %1326, 0
  br i1 %.not884, label %1335, label %1327

1327:                                             ; preds = %.loopexit._crit_edge
  %1328 = call ptr @node_data(ptr noundef %1190) #12
  %1329 = load ptr, ptr %15, align 8, !tbaa !5
  %1330 = getelementptr inbounds i8, ptr %1329, i64 64
  %1331 = load i64, ptr %1330, align 8, !tbaa !70
  %1332 = load ptr, ptr %1199, align 8, !tbaa !30
  %1333 = getelementptr inbounds i8, ptr %1332, i64 424
  store i64 %1331, ptr %1333, align 8, !tbaa !95
  %1334 = getelementptr inbounds i8, ptr %1332, i64 384
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(48) %1328, ptr noundef nonnull align 8 dereferenceable(48) %1334, i64 48, i1 false)
  br label %1335

1335:                                             ; preds = %1327, %.loopexit._crit_edge
  %1336 = load ptr, ptr %1199, align 8, !tbaa !30
  %1337 = getelementptr inbounds i8, ptr %1336, i64 416
  %1338 = load i64, ptr %1337, align 8, !tbaa !34
  %1339 = icmp ne i64 %.pre1097, %1338
  %1340 = zext i1 %1339 to i8
  br label %1341

1341:                                             ; preds = %1335, %.thread1046
  %.7747 = phi i16 [ %.6746, %1335 ], [ %.5745, %.thread1046 ]
  %.5739 = phi i8 [ %1340, %1335 ], [ %.4730, %.thread1046 ]
  %.6732 = phi i8 [ %.5731, %1335 ], [ %.4730, %.thread1046 ]
  %.11705 = phi i32 [ %1325, %1335 ], [ 0, %.thread1046 ]
  %.14678 = phi i32 [ %.13677, %1335 ], [ %.12676, %.thread1046 ]
  %1342 = trunc nuw i8 %.5739 to i1
  br i1 %1342, label %1343, label %1348

1343:                                             ; preds = %1341
  %1344 = load ptr, ptr %114, align 8, !tbaa !46
  %1345 = getelementptr inbounds i8, ptr %1344, i64 32
  %1346 = load i64, ptr %1345, align 4, !tbaa !48
  %1347 = add i64 %1346, 1
  store i64 %1347, ptr %1345, align 4, !tbaa !48
  br label %1348

1348:                                             ; preds = %1343, %1341
  %1349 = trunc nuw i8 %.6732 to i1
  %.not885 = icmp eq i32 %.11705, 0
  br i1 %1349, label %1350, label %1351

1350:                                             ; preds = %1348
  br i1 %.not885, label %.thread1051, label %1378, !prof !25

.thread1051:                                      ; preds = %1350
  call void @be_filled(ptr noundef %0)
  br label %1352

1351:                                             ; preds = %1348
  br i1 %.not885, label %1352, label %.thread1031, !prof !96

1352:                                             ; preds = %.thread1051, %1351
  %1353 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !33
  %1354 = and i8 %1353, 1
  %.not886 = icmp eq i8 %1354, 0
  br i1 %.not886, label %1361, label %1355, !prof !20

1355:                                             ; preds = %1352
  %1356 = call zeroext i1 @is_filled(ptr noundef %0) #12
  br i1 %1356, label %1361, label %1357, !prof !25

1357:                                             ; preds = %1355
  %1358 = load ptr, ptr %15, align 8, !tbaa !5
  %1359 = getelementptr inbounds i8, ptr %1358, i64 80
  %1360 = load ptr, ptr %1359, align 8, !tbaa !11
  call void @mdbx_assert_fail(ptr noundef %1360, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1414) #13
  unreachable

1361:                                             ; preds = %1355, %1352
  %.not887 = icmp eq ptr %.0718, null
  br i1 %.not887, label %1373, label %1362, !prof !25

1362:                                             ; preds = %653, %1361
  %1363 = phi i8 [ %1353, %1361 ], [ %654, %653 ]
  %.8748 = phi i16 [ %.7747, %1361 ], [ %.0740, %653 ]
  %.15679 = phi i32 [ %.14678, %1361 ], [ %.8672, %653 ]
  %1364 = load i64, ptr %.0718, align 8, !tbaa !51
  %1365 = add i64 %1364, 1
  store i64 %1365, ptr %.0718, align 8, !tbaa !51
  %1366 = icmp ult i64 %1365, %.0720
  br i1 %1366, label %1367, label %1373

1367:                                             ; preds = %1362
  %1368 = load ptr, ptr %2, align 8, !tbaa !21
  %1369 = ptrtoint ptr %1368 to i64
  %1370 = load i64, ptr %.0717.sroa.gep757, align 8, !tbaa !23
  %1371 = add nsw i64 %1370, %1369
  %1372 = inttoptr i64 %1371 to ptr
  store ptr %1372, ptr %2, align 8, !tbaa !21
  store ptr null, ptr %11, align 8, !tbaa !21
  br label %472

1373:                                             ; preds = %1362, %1361
  %1374 = phi i8 [ %1363, %1362 ], [ %1353, %1361 ]
  %1375 = and i8 %1374, 2
  %.not888 = icmp eq i8 %1375, 0
  br i1 %.not888, label %.thread1031, label %1376, !prof !25

1376:                                             ; preds = %1373
  %1377 = call i32 @cursor_validate(ptr noundef %0) #15
  br label %.thread1031

1378:                                             ; preds = %1350, %1233, %1196
  %.15709 = phi i32 [ %1197, %1196 ], [ %.10704, %1233 ], [ %.11705, %1350 ]
  %1379 = icmp eq i32 %.15709, -30799
  br i1 %1379, label %1380, label %.thread1049, !prof !20

1380:                                             ; preds = %1378
  %1381 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !17
  %.not963 = icmp eq i8 %1381, 0
  br i1 %.not963, label %.thread1049, label %1382, !prof !25

1382:                                             ; preds = %1380
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.cursor_put, i32 noundef 1434, ptr noundef nonnull @.str.89, i32 noundef -30799) #11
  br label %.thread1049

.thread1049:                                      ; preds = %1128, %1092, %1380, %1382, %1378, %1176
  %.16710 = phi i32 [ %.15709, %1378 ], [ %.9703, %1176 ], [ -30779, %1382 ], [ -30779, %1380 ], [ %.8702, %1128 ], [ %1096, %1092 ]
  %1383 = load ptr, ptr %15, align 8, !tbaa !5
  %1384 = getelementptr inbounds i8, ptr %1383, i64 4
  %1385 = load i32, ptr %1384, align 4, !tbaa !97
  %1386 = or i32 %1385, 2
  store i32 %1386, ptr %1384, align 4, !tbaa !97
  br label %.thread1031

.thread1031:                                      ; preds = %628, %653, %548, %550, %584, %581, %540, %542, %533, %583, %500, %291, %295, %.thread1009, %.thread997, %1351, %1376, %1373, %1071, %970, %816, %475, %469, %413, %283, %278, %39, %.critedge974, %463, %.thread1049, %1073, %471
  %.33 = phi i32 [ %.16710, %.thread1049 ], [ 0, %1073 ], [ 0, %471 ], [ %.0681, %463 ], [ -30418, %.critedge974 ], [ %.11, %.thread1009 ], [ 22, %39 ], [ 0, %278 ], [ %284, %283 ], [ -30781, %413 ], [ %470, %469 ], [ %476, %475 ], [ %.mux, %653 ], [ %825, %816 ], [ -30784, %970 ], [ %1072, %1071 ], [ %1377, %1376 ], [ 0, %1373 ], [ %.11705, %1351 ], [ %.3.ph, %.thread997 ], [ %294, %291 ], [ %296, %295 ], [ %552, %550 ], [ 12, %548 ], [ %585, %584 ], [ %582, %581 ], [ -30779, %540 ], [ -30779, %542 ], [ %536, %533 ], [ 0, %583 ], [ %507, %500 ], [ -30418, %628 ]
  call void @llvm.lifetime.end.p0(i64 510, ptr nonnull %5) #11
  ret i32 %.33
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @cursor_dbi_dbg(ptr noundef) local_unnamed_addr #9

declare ptr @mdbx_dump_val(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #7

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_ops(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

; Function Attrs: hot nounwind uwtable
declare dso_local i32 @cursor_del(ptr noundef, i32 noundef) local_unnamed_addr #4

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

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

; Function Attrs: hot nounwind uwtable
declare dso_local i64 @cursor_seek(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

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

declare { ptr, i32 } @page_new(ptr noundef, i32 noundef) local_unnamed_addr #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @cursor_push(ptr noundef, ptr noundef, i16 noundef zeroext) local_unnamed_addr #9

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

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

declare i32 @tree_propagate_key(ptr noundef, ptr noundef) local_unnamed_addr #7

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

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

declare { ptr, i32 } @page_get_large(ptr noundef, i32 noundef, i64 noundef) local_unnamed_addr #7

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

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

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

declare { ptr, i32 } @page_unspill(ptr noundef, ptr noundef) local_unnamed_addr #7

declare ptr @page_shadow_alloc(ptr noundef, i64 noundef) local_unnamed_addr #7

declare i32 @page_dirty(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #7

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @node_set_ds(ptr noalias noundef, i64 noundef) local_unnamed_addr #9

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

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

declare i64 @page_subleaf2_reserve(ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #7

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

; Function Attrs: inlinehint mustprogress nofree nosync nounwind willreturn memory(none) uwtable
declare hidden i64 @node_size_len(i64 noundef, i64 noundef) local_unnamed_addr #8

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

declare { ptr, i32 } @gc_alloc_single(ptr noundef) local_unnamed_addr #7

declare void @node_del(ptr noundef, i64 noundef) local_unnamed_addr #7

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @node_set_ks(ptr noalias noundef, i64 noundef) local_unnamed_addr #9

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

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

declare i32 @page_split(ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #7

declare i32 @node_add_dupfix(ptr noundef, i64 noundef, ptr noundef) local_unnamed_addr #7

declare i32 @node_add_leaf(ptr noundef, i64 noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #7

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @cursor_inner_refresh(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #9

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 16}
!6 = !{!"MDBX_cursor", !7, i64 0, !8, i64 4, !8, i64 6, !8, i64 7, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !8, i64 48, !8, i64 304, !10, i64 368, !10, i64 376}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!12, !10, i64 80}
!12 = !{!"MDBX_txn", !7, i64 0, !7, i64 4, !13, i64 8, !13, i64 16, !10, i64 24, !10, i64 32, !14, i64 40, !13, i64 64, !13, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !16, i64 128, !10, i64 160, !8, i64 168}
!13 = !{!"long", !8, i64 0}
!14 = !{!"geo", !15, i64 0, !15, i64 2, !7, i64 4, !7, i64 8, !8, i64 12, !8, i64 16}
!15 = !{!"short", !8, i64 0}
!16 = !{!"MDBX_canary", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}
!17 = !{!18, !8, i64 26}
!18 = !{!"libmdbx_globals", !8, i64 0, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !19, i64 27, !7, i64 28, !8, i64 32, !8, i64 40, !13, i64 80, !10, i64 88}
!19 = !{!"_Bool", !8, i64 0}
!20 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!21 = !{!22, !10, i64 0}
!22 = !{!"iovec", !10, i64 0, !13, i64 8}
!23 = !{!22, !13, i64 8}
!24 = !{!8, !8, i64 0}
!25 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!26 = !{!6, !10, i64 32}
!27 = !{!28, !10, i64 0}
!28 = !{!"clc2", !29, i64 0, !29, i64 24}
!29 = !{!"clc", !10, i64 0, !13, i64 8, !13, i64 16}
!30 = !{!6, !10, i64 40}
!31 = !{!10, !10, i64 0}
!32 = !{!15, !15, i64 0}
!33 = !{!18, !8, i64 25}
!34 = !{!35, !13, i64 416}
!35 = !{!"inner_cursor", !6, i64 0, !36, i64 384}
!36 = !{!"tree", !15, i64 0, !15, i64 2, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !13, i64 24, !13, i64 32, !13, i64 40}
!37 = !{!38, !15, i64 112}
!38 = !{!"MDBX_env", !8, i64 0, !7, i64 4, !7, i64 8, !39, i64 16, !7, i64 56, !7, i64 60, !39, i64 64, !10, i64 104, !15, i64 112, !15, i64 114, !15, i64 116, !15, i64 118, !15, i64 120, !15, i64 122, !8, i64 124, !8, i64 128, !8, i64 129, !15, i64 130, !7, i64 132, !7, i64 136, !7, i64 140, !7, i64 144, !40, i64 152, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !7, i64 224, !7, i64 228, !7, i64 232, !10, i64 240, !10, i64 248, !13, i64 256, !41, i64 264, !43, i64 320, !19, i64 360, !10, i64 368, !10, i64 376, !10, i64 384, !44, i64 392, !8, i64 400, !7, i64 440, !7, i64 444, !10, i64 448, !45, i64 456, !8, i64 496, !8, i64 536}
!39 = !{!"osal_mmap", !8, i64 0, !7, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!40 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!41 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !13, i64 16, !8, i64 24, !8, i64 25, !8, i64 26, !8, i64 27, !7, i64 28, !7, i64 32, !19, i64 36, !19, i64 37, !19, i64 38, !42, i64 40, !8, i64 48}
!42 = !{!"", !15, i64 0, !15, i64 2, !15, i64 4, !15, i64 6}
!43 = !{!"", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!44 = !{!"", !13, i64 0}
!45 = !{!"osal_ioring", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!46 = !{!6, !10, i64 24}
!47 = !{!36, !15, i64 2}
!48 = !{!36, !13, i64 32}
!49 = !{!"branch_weights", i32 2146410493, i32 1073155}
!50 = !{i64 0, i64 8, !31, i64 8, i64 8, !51}
!51 = !{!13, !13, i64 0}
!52 = !{!"branch_weights", i32 4002001, i32 2000}
!53 = !{!"branch_weights", i32 1, i32 2001, i32 2000}
!54 = !{!28, !10, i64 24}
!55 = !{!7, !7, i64 0}
!56 = !{!36, !7, i64 8}
!57 = !{!36, !15, i64 0}
!58 = !{!28, !13, i64 8}
!59 = !{!28, !13, i64 16}
!60 = !{!28, !13, i64 40}
!61 = !{!28, !13, i64 32}
!62 = !{!36, !7, i64 4}
!63 = !{!35, !10, i64 32}
!64 = !{!38, !10, i64 184}
!65 = !{!12, !13, i64 72}
!66 = distinct !{!66, !67}
!67 = !{!"llvm.loop.mustprogress"}
!68 = !{!12, !10, i64 88}
!69 = !{!12, !10, i64 24}
!70 = !{!12, !13, i64 64}
!71 = !{!38, !10, i64 104}
!72 = !{!38, !7, i64 8}
!73 = !{!"branch_weights", i32 2000, i32 2002}
!74 = !{!"branch_weights", i32 1073205, i32 2146410443}
!75 = !{!"branch_weights", i32 2001, i32 2000}
!76 = !{!"branch_weights", i32 4001, i32 1}
!77 = !{!38, !15, i64 116}
!78 = !{!38, !15, i64 118}
!79 = !{!36, !7, i64 12}
!80 = !{!36, !7, i64 16}
!81 = !{!36, !7, i64 20}
!82 = !{!"branch_weights", i32 2146410443, i32 1073205}
!83 = !{!36, !13, i64 24}
!84 = !{!36, !13, i64 40}
!85 = !{!"branch_weights", i32 2000, i32 4002001}
!86 = distinct !{!86, !67}
!87 = !{!12, !10, i64 120}
!88 = distinct !{!88, !67}
!89 = !{!"branch_weights", !"expected", i32 -2147483648, i32 0}
!90 = !{!35, !15, i64 386}
!91 = !{!35, !7, i64 392}
!92 = !{!35, !10, i64 24}
!93 = !{i64 0, i64 2, !32, i64 2, i64 2, !32, i64 4, i64 4, !55, i64 8, i64 4, !55, i64 12, i64 4, !55, i64 16, i64 4, !55, i64 20, i64 4, !55, i64 24, i64 8, !51, i64 32, i64 8, !51, i64 40, i64 8, !51}
!94 = distinct !{!94, !67}
!95 = !{!35, !13, i64 424}
!96 = !{!"branch_weights", !"expected", i32 2145337774, i32 2145874}
!97 = !{!12, !7, i64 4}


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