; 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.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.anon = type { i8, i8 }
%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.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.clc2 = type { %struct.clc, %struct.clc }
%struct.clc = type { ptr, i64, i64 }

@globals = external global %struct.libmdbx_globals, align 8
@.str.5 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [19 x i8], align 1
@__func__.cursor_ops = external hidden unnamed_addr constant [11 x i8], align 1
@.str.117 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.118 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.119 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.120 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.121 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.122 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.123 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.124 = external hidden unnamed_addr constant [45 x i8], align 1

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: cold nounwind optsize uwtable
declare hidden i32 @unexpected_dupsort(ptr noundef) #5

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

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

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

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

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

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

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

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

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

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

; Function Attrs: hot nounwind uwtable
define dso_local i32 @cursor_ops(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) #7 {
  %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 i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca %struct.iovec, align 8
  %15 = alloca %struct.iovec, align 8
  %16 = alloca %struct.cursor_set_result, align 4
  %17 = alloca %struct.cursor_set_result, align 4
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca %struct.iovec, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca %struct.iovec, align 8
  %26 = alloca %struct.cursor_set_result, align 4
  %27 = alloca %struct.cursor_set_result, align 4
  %28 = alloca i32, align 4
  %29 = alloca %struct.cursor_set_result, align 4
  %30 = alloca %struct.iovec, align 8
  %31 = alloca %struct.cursor_set_result, align 4
  %32 = alloca ptr, align 8
  %33 = alloca %struct.cursor_set_result, align 4
  %34 = alloca i32, align 4
  %35 = alloca %struct.iovec, align 8
  %36 = alloca %struct.cursor_set_result, align 4
  %37 = alloca ptr, align 8
  %38 = alloca %struct.cursor_set_result, align 4
  %39 = alloca i32, align 4
  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
  %40 = load i32, ptr %9, align 4, !tbaa !9
  %41 = icmp ne i32 %40, 4
  br i1 %41, label %42, label %68

42:                                               ; preds = %4
  br label %43

43:                                               ; preds = %42
  %44 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !11
  %45 = zext i8 %44 to i32
  %46 = icmp sle i32 5, %45
  %47 = xor i1 %46, true
  %48 = xor i1 %47, true
  %49 = zext i1 %48 to i32
  %50 = sext i32 %49 to i64
  %51 = call i64 @llvm.expect.i64(i64 %50, i64 0)
  %52 = icmp ne i64 %51, 0
  br i1 %52, label %53, label %66

53:                                               ; preds = %43
  %54 = load ptr, ptr %6, align 8, !tbaa !5
  %55 = call ptr @__Wpedantic_format_voidptr(ptr noundef %54)
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.MDBX_cursor, ptr %56, i32 0, i32 1
  %58 = getelementptr inbounds %struct.anon, ptr %57, i32 0, i32 0
  %59 = load i8, ptr %58, align 4, !tbaa !15
  %60 = sext i8 %59 to i32
  %61 = load i32, ptr %9, align 4, !tbaa !9
  %62 = load ptr, ptr %7, align 8, !tbaa !5
  %63 = call ptr @__Wpedantic_format_voidptr(ptr noundef %62)
  %64 = load ptr, ptr %8, align 8, !tbaa !5
  %65 = call ptr @__Wpedantic_format_voidptr(ptr noundef %64)
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_ops, i32 noundef 2008, ptr noundef @.str.117, ptr noundef %55, i32 noundef %60, i32 noundef %61, ptr noundef %63, ptr noundef %65)
  br label %66

66:                                               ; preds = %53, %43
  br label %67

67:                                               ; preds = %66
  br label %68

68:                                               ; preds = %67, %4
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #9
  %69 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %69, label %1809 [
    i32 4, label %70
    i32 2, label %375
    i32 3, label %375
    i32 15, label %398
    i32 16, label %398
    i32 17, label %398
    i32 36, label %623
    i32 5, label %652
    i32 10, label %798
    i32 18, label %934
    i32 9, label %990
    i32 8, label %990
    i32 11, label %990
    i32 13, label %1013
    i32 12, label %1013
    i32 14, label %1013
    i32 0, label %1019
    i32 6, label %1024
    i32 7, label %1029
    i32 1, label %1029
    i32 20, label %1118
    i32 19, label %1118
    i32 21, label %1275
    i32 22, label %1275
    i32 23, label %1275
    i32 24, label %1275
    i32 25, label %1275
    i32 26, label %1374
    i32 27, label %1374
    i32 28, label %1374
    i32 29, label %1374
    i32 30, label %1374
    i32 31, label %1564
    i32 32, label %1564
    i32 33, label %1564
    i32 34, label %1564
    i32 35, label %1564
  ]

70:                                               ; preds = %68
  br label %71

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

82:                                               ; preds = %71
  br label %83

83:                                               ; preds = %82
  %84 = load ptr, ptr %6, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.MDBX_cursor, ptr %84, i32 0, i32 1
  %86 = getelementptr inbounds %struct.anon, ptr %85, i32 0, i32 0
  %87 = load i8, ptr %86, align 4, !tbaa !15
  %88 = sext i8 %87 to i32
  %89 = and i32 %88, 1
  %90 = icmp eq i32 %89, 0
  %91 = xor i1 %90, true
  %92 = xor i1 %91, true
  %93 = xor i1 %92, true
  %94 = zext i1 %93 to i32
  %95 = sext i32 %94 to i64
  %96 = call i64 @llvm.expect.i64(i64 %95, i64 0)
  %97 = icmp ne i64 %96, 0
  br i1 %97, label %98, label %104

98:                                               ; preds = %83
  %99 = load ptr, ptr %6, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.MDBX_cursor, ptr %99, i32 0, i32 5
  %101 = load ptr, ptr %100, align 8, !tbaa !17
  %102 = getelementptr inbounds %struct.MDBX_txn, ptr %101, i32 0, i32 9
  %103 = load ptr, ptr %102, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %103, ptr noundef @.str.90, ptr noundef @__func__.cursor_ops, i32 noundef 2013) #10
  unreachable

104:                                              ; preds = %83
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  br label %107

107:                                              ; preds = %106, %71
  br label %108

108:                                              ; preds = %107
  br label %109

109:                                              ; preds = %108
  %110 = load ptr, ptr %6, align 8, !tbaa !5
  %111 = call zeroext i1 @is_filled(ptr noundef %110) #11
  %112 = xor i1 %111, true
  %113 = xor i1 %112, true
  %114 = xor i1 %113, true
  %115 = zext i1 %114 to i32
  %116 = sext i32 %115 to i64
  %117 = call i64 @llvm.expect.i64(i64 %116, i64 0)
  %118 = icmp ne i64 %117, 0
  br i1 %118, label %119, label %147

119:                                              ; preds = %109
  %120 = load ptr, ptr %6, align 8, !tbaa !5
  %121 = call zeroext i1 @is_hollow(ptr noundef %120) #11
  br i1 %121, label %122, label %123

122:                                              ; preds = %119
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

123:                                              ; preds = %119
  %124 = load ptr, ptr %6, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.MDBX_cursor, ptr %124, i32 0, i32 10
  %126 = load ptr, ptr %6, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.MDBX_cursor, ptr %126, i32 0, i32 1
  %128 = getelementptr inbounds %struct.anon, ptr %127, i32 0, i32 1
  %129 = load i8, ptr %128, align 1, !tbaa !15
  %130 = sext i8 %129 to i64
  %131 = getelementptr inbounds [32 x i16], ptr %125, i64 0, i64 %130
  %132 = load i16, ptr %131, align 2, !tbaa !24
  %133 = zext i16 %132 to i64
  %134 = load ptr, ptr %6, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.MDBX_cursor, ptr %134, i32 0, i32 9
  %136 = load ptr, ptr %6, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.MDBX_cursor, ptr %136, i32 0, i32 1
  %138 = getelementptr inbounds %struct.anon, ptr %137, i32 0, i32 1
  %139 = load i8, ptr %138, align 1, !tbaa !15
  %140 = sext i8 %139 to i64
  %141 = getelementptr inbounds [32 x ptr], ptr %135, i64 0, i64 %140
  %142 = load ptr, ptr %141, align 8, !tbaa !5
  %143 = call i64 @page_numkeys(ptr noundef %142) #11
  %144 = icmp uge i64 %133, %143
  br i1 %144, label %145, label %146

145:                                              ; preds = %123
  store i32 -30798, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

146:                                              ; preds = %123
  br label %147

147:                                              ; preds = %146, %109
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.MDBX_cursor, ptr %148, i32 0, i32 1
  %150 = getelementptr inbounds %struct.anon, ptr %149, i32 0, i32 0
  %151 = load i8, ptr %150, align 4, !tbaa !15
  %152 = sext i8 %151 to i32
  %153 = and i32 %152, 8
  %154 = icmp ne i32 %153, 0
  br i1 %154, label %155, label %160

155:                                              ; preds = %147
  %156 = load ptr, ptr %6, align 8, !tbaa !5
  %157 = load ptr, ptr %7, align 8, !tbaa !5
  %158 = load ptr, ptr %8, align 8, !tbaa !5
  %159 = call i32 @outer_next(ptr noundef %156, ptr noundef %157, ptr noundef %158, i32 noundef 11) #12
  store i32 %159, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

160:                                              ; preds = %147
  %161 = load ptr, ptr %6, align 8, !tbaa !5
  %162 = call zeroext i1 @inner_pointed(ptr noundef %161) #11
  br i1 %162, label %163, label %179

163:                                              ; preds = %160
  %164 = load ptr, ptr %6, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.MDBX_cursor, ptr %164, i32 0, i32 8
  %166 = load ptr, ptr %165, align 8, !tbaa !25
  %167 = getelementptr inbounds %struct.inner_cursor, ptr %166, i32 0, i32 0
  %168 = getelementptr inbounds %struct.MDBX_cursor, ptr %167, i32 0, i32 1
  %169 = getelementptr inbounds %struct.anon, ptr %168, i32 0, i32 0
  %170 = load i8, ptr %169, align 4, !tbaa !15
  %171 = sext i8 %170 to i32
  %172 = and i32 %171, 8
  %173 = icmp ne i32 %172, 0
  br i1 %173, label %174, label %179

174:                                              ; preds = %163
  %175 = load ptr, ptr %6, align 8, !tbaa !5
  %176 = load ptr, ptr %7, align 8, !tbaa !5
  %177 = load ptr, ptr %8, align 8, !tbaa !5
  %178 = call i32 @outer_next(ptr noundef %175, ptr noundef %176, ptr noundef %177, i32 noundef 9) #12
  store i32 %178, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

179:                                              ; preds = %163, %160
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #9
  %180 = load ptr, ptr %6, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.MDBX_cursor, ptr %180, i32 0, i32 9
  %182 = load ptr, ptr %6, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.MDBX_cursor, ptr %182, i32 0, i32 1
  %184 = getelementptr inbounds %struct.anon, ptr %183, i32 0, i32 1
  %185 = load i8, ptr %184, align 1, !tbaa !15
  %186 = sext i8 %185 to i64
  %187 = getelementptr inbounds [32 x ptr], ptr %181, i64 0, i64 %186
  %188 = load ptr, ptr %187, align 8, !tbaa !5
  store ptr %188, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %189 = load ptr, ptr %12, align 8, !tbaa !5
  %190 = load ptr, ptr %6, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.MDBX_cursor, ptr %190, i32 0, i32 10
  %192 = load ptr, ptr %6, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.MDBX_cursor, ptr %192, i32 0, i32 1
  %194 = getelementptr inbounds %struct.anon, ptr %193, i32 0, i32 1
  %195 = load i8, ptr %194, align 1, !tbaa !15
  %196 = sext i8 %195 to i64
  %197 = getelementptr inbounds [32 x i16], ptr %191, i64 0, i64 %196
  %198 = load i16, ptr %197, align 2, !tbaa !24
  %199 = zext i16 %198 to i64
  %200 = call ptr @page_node(ptr noundef %189, i64 noundef %199) #11
  store ptr %200, ptr %13, align 8, !tbaa !5
  %201 = load ptr, ptr %13, align 8, !tbaa !5
  %202 = load ptr, ptr %7, align 8, !tbaa !5
  call void @get_key_optional(ptr noundef %201, ptr noundef %202)
  %203 = load ptr, ptr %8, align 8, !tbaa !5
  %204 = icmp ne ptr %203, null
  br i1 %204, label %206, label %205

205:                                              ; preds = %179
  store i32 0, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

206:                                              ; preds = %179
  %207 = load ptr, ptr %13, align 8, !tbaa !5
  %208 = call zeroext i8 @node_flags(ptr noundef %207) #11
  %209 = zext i8 %208 to i32
  %210 = and i32 %209, 4
  %211 = icmp ne i32 %210, 0
  br i1 %211, label %212, label %325

212:                                              ; preds = %206
  %213 = load ptr, ptr %6, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.MDBX_cursor, ptr %213, i32 0, i32 8
  %215 = load ptr, ptr %214, align 8, !tbaa !25
  %216 = icmp ne ptr %215, null
  %217 = xor i1 %216, true
  %218 = xor i1 %217, true
  %219 = xor i1 %218, true
  %220 = zext i1 %219 to i32
  %221 = sext i32 %220 to i64
  %222 = call i64 @llvm.expect.i64(i64 %221, i64 0)
  %223 = icmp ne i64 %222, 0
  br i1 %223, label %224, label %227

224:                                              ; preds = %212
  %225 = load ptr, ptr %6, align 8, !tbaa !5
  %226 = call i32 @unexpected_dupsort(ptr noundef %225) #13
  store i32 %226, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

227:                                              ; preds = %212
  %228 = load ptr, ptr %6, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.MDBX_cursor, ptr %228, i32 0, i32 8
  %230 = load ptr, ptr %229, align 8, !tbaa !25
  %231 = getelementptr inbounds %struct.inner_cursor, ptr %230, i32 0, i32 0
  store ptr %231, ptr %6, align 8, !tbaa !5
  %232 = load ptr, ptr %6, align 8, !tbaa !5
  %233 = call zeroext i1 @is_filled(ptr noundef %232) #11
  %234 = xor i1 %233, true
  %235 = xor i1 %234, true
  %236 = xor i1 %235, true
  %237 = zext i1 %236 to i32
  %238 = sext i32 %237 to i64
  %239 = call i64 @llvm.expect.i64(i64 %238, i64 0)
  %240 = icmp ne i64 %239, 0
  br i1 %240, label %241, label %269

241:                                              ; preds = %227
  %242 = load ptr, ptr %6, align 8, !tbaa !5
  %243 = call zeroext i1 @is_hollow(ptr noundef %242) #11
  br i1 %243, label %244, label %245

244:                                              ; preds = %241
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

245:                                              ; preds = %241
  %246 = load ptr, ptr %6, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.MDBX_cursor, ptr %246, i32 0, i32 10
  %248 = load ptr, ptr %6, align 8, !tbaa !5
  %249 = getelementptr inbounds %struct.MDBX_cursor, ptr %248, i32 0, i32 1
  %250 = getelementptr inbounds %struct.anon, ptr %249, i32 0, i32 1
  %251 = load i8, ptr %250, align 1, !tbaa !15
  %252 = sext i8 %251 to i64
  %253 = getelementptr inbounds [32 x i16], ptr %247, i64 0, i64 %252
  %254 = load i16, ptr %253, align 2, !tbaa !24
  %255 = zext i16 %254 to i64
  %256 = load ptr, ptr %6, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.MDBX_cursor, ptr %256, i32 0, i32 9
  %258 = load ptr, ptr %6, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct.MDBX_cursor, ptr %258, i32 0, i32 1
  %260 = getelementptr inbounds %struct.anon, ptr %259, i32 0, i32 1
  %261 = load i8, ptr %260, align 1, !tbaa !15
  %262 = sext i8 %261 to i64
  %263 = getelementptr inbounds [32 x ptr], ptr %257, i64 0, i64 %262
  %264 = load ptr, ptr %263, align 8, !tbaa !5
  %265 = call i64 @page_numkeys(ptr noundef %264) #11
  %266 = icmp uge i64 %255, %265
  br i1 %266, label %267, label %268

267:                                              ; preds = %245
  store i32 -30798, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

268:                                              ; preds = %245
  br label %269

269:                                              ; preds = %268, %227
  %270 = load ptr, ptr %6, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.MDBX_cursor, ptr %270, i32 0, i32 9
  %272 = load ptr, ptr %6, align 8, !tbaa !5
  %273 = getelementptr inbounds %struct.MDBX_cursor, ptr %272, i32 0, i32 1
  %274 = getelementptr inbounds %struct.anon, ptr %273, i32 0, i32 1
  %275 = load i8, ptr %274, align 1, !tbaa !15
  %276 = sext i8 %275 to i64
  %277 = getelementptr inbounds [32 x ptr], ptr %271, i64 0, i64 %276
  %278 = load ptr, ptr %277, align 8, !tbaa !5
  store ptr %278, ptr %12, align 8, !tbaa !5
  %279 = load ptr, ptr %12, align 8, !tbaa !5
  %280 = call zeroext i1 @is_dupfix_leaf(ptr noundef %279) #11
  br i1 %280, label %281, label %305

281:                                              ; preds = %269
  %282 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #9
  %283 = load ptr, ptr %12, align 8, !tbaa !5
  %284 = load ptr, ptr %6, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.MDBX_cursor, ptr %284, i32 0, i32 10
  %286 = load ptr, ptr %6, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.MDBX_cursor, ptr %286, i32 0, i32 1
  %288 = getelementptr inbounds %struct.anon, ptr %287, i32 0, i32 1
  %289 = load i8, ptr %288, align 1, !tbaa !15
  %290 = sext i8 %289 to i64
  %291 = getelementptr inbounds [32 x i16], ptr %285, i64 0, i64 %290
  %292 = load i16, ptr %291, align 2, !tbaa !24
  %293 = zext i16 %292 to i64
  %294 = load ptr, ptr %6, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.MDBX_cursor, ptr %294, i32 0, i32 6
  %296 = load ptr, ptr %295, align 8, !tbaa !26
  %297 = getelementptr inbounds %struct.tree, ptr %296, i32 0, i32 2
  %298 = load i32, ptr %297, align 4, !tbaa !27
  %299 = zext i32 %298 to i64
  %300 = call { ptr, i64 } @page_dupfix_key(ptr noundef %283, i64 noundef %293, i64 noundef %299) #11
  %301 = getelementptr inbounds { ptr, i64 }, ptr %14, i32 0, i32 0
  %302 = extractvalue { ptr, i64 } %300, 0
  store ptr %302, ptr %301, align 8
  %303 = getelementptr inbounds { ptr, i64 }, ptr %14, i32 0, i32 1
  %304 = extractvalue { ptr, i64 } %300, 1
  store i64 %304, ptr %303, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %282, ptr align 8 %14, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #9
  br label %324

305:                                              ; preds = %269
  %306 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %15) #9
  %307 = load ptr, ptr %12, align 8, !tbaa !5
  %308 = load ptr, ptr %6, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.MDBX_cursor, ptr %308, i32 0, i32 10
  %310 = load ptr, ptr %6, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.MDBX_cursor, ptr %310, i32 0, i32 1
  %312 = getelementptr inbounds %struct.anon, ptr %311, i32 0, i32 1
  %313 = load i8, ptr %312, align 1, !tbaa !15
  %314 = sext i8 %313 to i64
  %315 = getelementptr inbounds [32 x i16], ptr %309, i64 0, i64 %314
  %316 = load i16, ptr %315, align 2, !tbaa !24
  %317 = zext i16 %316 to i64
  %318 = call ptr @page_node(ptr noundef %307, i64 noundef %317) #11
  %319 = call { ptr, i64 } @get_key(ptr noundef %318) #11
  %320 = getelementptr inbounds { ptr, i64 }, ptr %15, i32 0, i32 0
  %321 = extractvalue { ptr, i64 } %319, 0
  store ptr %321, ptr %320, align 8
  %322 = getelementptr inbounds { ptr, i64 }, ptr %15, i32 0, i32 1
  %323 = extractvalue { ptr, i64 } %319, 1
  store i64 %323, ptr %322, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %306, ptr align 8 %15, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.end.p0(i64 16, ptr %15) #9
  br label %324

324:                                              ; preds = %305, %281
  store i32 0, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

325:                                              ; preds = %206
  br label %326

326:                                              ; preds = %325
  %327 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %328 = zext i8 %327 to i32
  %329 = and i32 %328, 1
  %330 = icmp ne i32 %329, 0
  %331 = xor i1 %330, true
  %332 = xor i1 %331, true
  %333 = zext i1 %332 to i32
  %334 = sext i32 %333 to i64
  %335 = call i64 @llvm.expect.i64(i64 %334, i64 1)
  %336 = icmp ne i64 %335, 0
  br i1 %336, label %337, label %358

337:                                              ; preds = %326
  br label %338

338:                                              ; preds = %337
  %339 = load ptr, ptr %6, align 8, !tbaa !5
  %340 = call zeroext i1 @inner_pointed(ptr noundef %339) #11
  %341 = xor i1 %340, true
  %342 = xor i1 %341, true
  %343 = xor i1 %342, true
  %344 = xor i1 %343, true
  %345 = zext i1 %344 to i32
  %346 = sext i32 %345 to i64
  %347 = call i64 @llvm.expect.i64(i64 %346, i64 0)
  %348 = icmp ne i64 %347, 0
  br i1 %348, label %349, label %355

349:                                              ; preds = %338
  %350 = load ptr, ptr %6, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.MDBX_cursor, ptr %350, i32 0, i32 5
  %352 = load ptr, ptr %351, align 8, !tbaa !17
  %353 = getelementptr inbounds %struct.MDBX_txn, ptr %352, i32 0, i32 9
  %354 = load ptr, ptr %353, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %354, ptr noundef @.str.99, ptr noundef @__func__.cursor_ops, i32 noundef 2047) #10
  unreachable

355:                                              ; preds = %338
  br label %356

356:                                              ; preds = %355
  br label %357

357:                                              ; preds = %356
  br label %358

358:                                              ; preds = %357, %326
  br label %359

359:                                              ; preds = %358
  br label %360

360:                                              ; preds = %359
  %361 = load ptr, ptr %6, align 8, !tbaa !5
  %362 = load ptr, ptr %13, align 8, !tbaa !5
  %363 = load ptr, ptr %8, align 8, !tbaa !5
  %364 = load ptr, ptr %6, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.MDBX_cursor, ptr %364, i32 0, i32 9
  %366 = load ptr, ptr %6, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.MDBX_cursor, ptr %366, i32 0, i32 1
  %368 = getelementptr inbounds %struct.anon, ptr %367, i32 0, i32 1
  %369 = load i8, ptr %368, align 1, !tbaa !15
  %370 = sext i8 %369 to i64
  %371 = getelementptr inbounds [32 x ptr], ptr %365, i64 0, i64 %370
  %372 = load ptr, ptr %371, align 8, !tbaa !5
  %373 = call i32 @node_read(ptr noundef %361, ptr noundef %362, ptr noundef %363, ptr noundef %372)
  store i32 %373, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %374

374:                                              ; preds = %360, %324, %267, %244, %224, %205
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #9
  br label %1825

375:                                              ; preds = %68, %68
  %376 = load ptr, ptr %8, align 8, !tbaa !5
  %377 = icmp eq ptr %376, null
  %378 = xor i1 %377, true
  %379 = xor i1 %378, true
  %380 = zext i1 %379 to i32
  %381 = sext i32 %380 to i64
  %382 = call i64 @llvm.expect.i64(i64 %381, i64 0)
  %383 = icmp ne i64 %382, 0
  br i1 %383, label %384, label %385

384:                                              ; preds = %375
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

385:                                              ; preds = %375
  %386 = load ptr, ptr %6, align 8, !tbaa !5
  %387 = getelementptr inbounds %struct.MDBX_cursor, ptr %386, i32 0, i32 8
  %388 = load ptr, ptr %387, align 8, !tbaa !25
  %389 = icmp eq ptr %388, null
  %390 = xor i1 %389, true
  %391 = xor i1 %390, true
  %392 = zext i1 %391 to i32
  %393 = sext i32 %392 to i64
  %394 = call i64 @llvm.expect.i64(i64 %393, i64 0)
  %395 = icmp ne i64 %394, 0
  br i1 %395, label %396, label %397

396:                                              ; preds = %385
  store i32 -30784, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

397:                                              ; preds = %385
  br label %398

398:                                              ; preds = %397, %68, %68, %68
  %399 = load ptr, ptr %7, align 8, !tbaa !5
  %400 = icmp eq ptr %399, null
  %401 = xor i1 %400, true
  %402 = xor i1 %401, true
  %403 = zext i1 %402 to i32
  %404 = sext i32 %403 to i64
  %405 = call i64 @llvm.expect.i64(i64 %404, i64 0)
  %406 = icmp ne i64 %405, 0
  br i1 %406, label %407, label %408

407:                                              ; preds = %398
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

408:                                              ; preds = %398
  %409 = load ptr, ptr %6, align 8, !tbaa !5
  %410 = load ptr, ptr %7, align 8, !tbaa !5
  %411 = load ptr, ptr %8, align 8, !tbaa !5
  %412 = load i32, ptr %9, align 4, !tbaa !9
  %413 = call i64 @cursor_seek(ptr noundef %409, ptr noundef %410, ptr noundef %411, i32 noundef %412) #12
  store i64 %413, ptr %16, align 4
  %414 = getelementptr inbounds %struct.cursor_set_result, ptr %16, i32 0, i32 0
  %415 = load i32, ptr %414, align 4, !tbaa !31
  store i32 %415, ptr %10, align 4, !tbaa !9
  %416 = load i32, ptr %10, align 4, !tbaa !9
  %417 = icmp eq i32 %416, 0
  br i1 %417, label %418, label %453

418:                                              ; preds = %408
  br label %419

419:                                              ; preds = %418
  %420 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %421 = zext i8 %420 to i32
  %422 = and i32 %421, 1
  %423 = icmp ne i32 %422, 0
  %424 = xor i1 %423, true
  %425 = xor i1 %424, true
  %426 = zext i1 %425 to i32
  %427 = sext i32 %426 to i64
  %428 = call i64 @llvm.expect.i64(i64 %427, i64 1)
  %429 = icmp ne i64 %428, 0
  br i1 %429, label %430, label %450

430:                                              ; preds = %419
  br label %431

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

441:                                              ; preds = %431
  %442 = load ptr, ptr %6, align 8, !tbaa !5
  %443 = getelementptr inbounds %struct.MDBX_cursor, ptr %442, i32 0, i32 5
  %444 = load ptr, ptr %443, align 8, !tbaa !17
  %445 = getelementptr inbounds %struct.MDBX_txn, ptr %444, i32 0, i32 9
  %446 = load ptr, ptr %445, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %446, ptr noundef @.str.5, ptr noundef @__func__.cursor_ops, i32 noundef 2067) #10
  unreachable

447:                                              ; preds = %431
  br label %448

448:                                              ; preds = %447
  br label %449

449:                                              ; preds = %448
  br label %450

450:                                              ; preds = %449, %419
  br label %451

451:                                              ; preds = %450
  br label %452

452:                                              ; preds = %451
  br label %621

453:                                              ; preds = %408
  %454 = load i32, ptr %10, align 4, !tbaa !9
  %455 = icmp eq i32 %454, -30798
  br i1 %455, label %456, label %579

456:                                              ; preds = %453
  %457 = load ptr, ptr %6, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.MDBX_cursor, ptr %457, i32 0, i32 6
  %459 = load ptr, ptr %458, align 8, !tbaa !26
  %460 = getelementptr inbounds %struct.tree, ptr %459, i32 0, i32 8
  %461 = load i64, ptr %460, align 4, !tbaa !33
  %462 = icmp ne i64 %461, 0
  br i1 %462, label %463, label %579

463:                                              ; preds = %456
  br label %464

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

475:                                              ; preds = %464
  br label %476

476:                                              ; preds = %475
  %477 = load ptr, ptr %6, align 8, !tbaa !5
  %478 = call zeroext i1 @is_pointed(ptr noundef %477) #11
  %479 = xor i1 %478, true
  %480 = xor i1 %479, true
  %481 = xor i1 %480, true
  %482 = zext i1 %481 to i32
  %483 = sext i32 %482 to i64
  %484 = call i64 @llvm.expect.i64(i64 %483, i64 0)
  %485 = icmp ne i64 %484, 0
  br i1 %485, label %486, label %492

486:                                              ; preds = %476
  %487 = load ptr, ptr %6, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.MDBX_cursor, ptr %487, i32 0, i32 5
  %489 = load ptr, ptr %488, align 8, !tbaa !17
  %490 = getelementptr inbounds %struct.MDBX_txn, ptr %489, i32 0, i32 9
  %491 = load ptr, ptr %490, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %491, ptr noundef @.str.28, ptr noundef @__func__.cursor_ops, i32 noundef 2069) #10
  unreachable

492:                                              ; preds = %476
  br label %493

493:                                              ; preds = %492
  br label %494

494:                                              ; preds = %493
  br label %495

495:                                              ; preds = %494, %464
  br label %496

496:                                              ; preds = %495
  br label %497

497:                                              ; preds = %496
  br label %498

498:                                              ; preds = %497
  %499 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %500 = zext i8 %499 to i32
  %501 = and i32 %500, 1
  %502 = icmp ne i32 %501, 0
  %503 = xor i1 %502, true
  %504 = xor i1 %503, true
  %505 = zext i1 %504 to i32
  %506 = sext i32 %505 to i64
  %507 = call i64 @llvm.expect.i64(i64 %506, i64 1)
  %508 = icmp ne i64 %507, 0
  br i1 %508, label %509, label %537

509:                                              ; preds = %498
  br label %510

510:                                              ; preds = %509
  %511 = load i32, ptr %9, align 4, !tbaa !9
  %512 = icmp eq i32 %511, 17
  br i1 %512, label %519, label %513

513:                                              ; preds = %510
  %514 = load i32, ptr %9, align 4, !tbaa !9
  %515 = icmp eq i32 %514, 3
  br i1 %515, label %519, label %516

516:                                              ; preds = %513
  %517 = load ptr, ptr %6, align 8, !tbaa !5
  %518 = call zeroext i1 @is_hollow(ptr noundef %517) #11
  br label %519

519:                                              ; preds = %516, %513, %510
  %520 = phi i1 [ true, %513 ], [ true, %510 ], [ %518, %516 ]
  %521 = xor i1 %520, true
  %522 = xor i1 %521, true
  %523 = xor i1 %522, true
  %524 = zext i1 %523 to i32
  %525 = sext i32 %524 to i64
  %526 = call i64 @llvm.expect.i64(i64 %525, i64 0)
  %527 = icmp ne i64 %526, 0
  br i1 %527, label %528, label %534

528:                                              ; preds = %519
  %529 = load ptr, ptr %6, align 8, !tbaa !5
  %530 = getelementptr inbounds %struct.MDBX_cursor, ptr %529, i32 0, i32 5
  %531 = load ptr, ptr %530, align 8, !tbaa !17
  %532 = getelementptr inbounds %struct.MDBX_txn, ptr %531, i32 0, i32 9
  %533 = load ptr, ptr %532, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %533, ptr noundef @.str.118, ptr noundef @__func__.cursor_ops, i32 noundef 2070) #10
  unreachable

534:                                              ; preds = %519
  br label %535

535:                                              ; preds = %534
  br label %536

536:                                              ; preds = %535
  br label %537

537:                                              ; preds = %536, %498
  br label %538

538:                                              ; preds = %537
  br label %539

539:                                              ; preds = %538
  br label %540

540:                                              ; preds = %539
  %541 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %542 = zext i8 %541 to i32
  %543 = and i32 %542, 1
  %544 = icmp ne i32 %543, 0
  %545 = xor i1 %544, true
  %546 = xor i1 %545, true
  %547 = zext i1 %546 to i32
  %548 = sext i32 %547 to i64
  %549 = call i64 @llvm.expect.i64(i64 %548, i64 1)
  %550 = icmp ne i64 %549, 0
  br i1 %550, label %551, label %576

551:                                              ; preds = %540
  br label %552

552:                                              ; preds = %551
  %553 = load i32, ptr %9, align 4, !tbaa !9
  %554 = icmp eq i32 %553, 3
  br i1 %554, label %558, label %555

555:                                              ; preds = %552
  %556 = load ptr, ptr %6, align 8, !tbaa !5
  %557 = call zeroext i1 @inner_hollow(ptr noundef %556) #11
  br label %558

558:                                              ; preds = %555, %552
  %559 = phi i1 [ true, %552 ], [ %557, %555 ]
  %560 = xor i1 %559, true
  %561 = xor i1 %560, true
  %562 = xor i1 %561, true
  %563 = zext i1 %562 to i32
  %564 = sext i32 %563 to i64
  %565 = call i64 @llvm.expect.i64(i64 %564, i64 0)
  %566 = icmp ne i64 %565, 0
  br i1 %566, label %567, label %573

567:                                              ; preds = %558
  %568 = load ptr, ptr %6, align 8, !tbaa !5
  %569 = getelementptr inbounds %struct.MDBX_cursor, ptr %568, i32 0, i32 5
  %570 = load ptr, ptr %569, align 8, !tbaa !17
  %571 = getelementptr inbounds %struct.MDBX_txn, ptr %570, i32 0, i32 9
  %572 = load ptr, ptr %571, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %572, ptr noundef @.str.119, ptr noundef @__func__.cursor_ops, i32 noundef 2071) #10
  unreachable

573:                                              ; preds = %558
  br label %574

574:                                              ; preds = %573
  br label %575

575:                                              ; preds = %574
  br label %576

576:                                              ; preds = %575, %540
  br label %577

577:                                              ; preds = %576
  br label %578

578:                                              ; preds = %577
  br label %620

579:                                              ; preds = %456, %453
  br label %580

580:                                              ; preds = %579
  %581 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %582 = zext i8 %581 to i32
  %583 = and i32 %582, 1
  %584 = icmp ne i32 %583, 0
  %585 = xor i1 %584, true
  %586 = xor i1 %585, true
  %587 = zext i1 %586 to i32
  %588 = sext i32 %587 to i64
  %589 = call i64 @llvm.expect.i64(i64 %588, i64 1)
  %590 = icmp ne i64 %589, 0
  br i1 %590, label %591, label %617

591:                                              ; preds = %580
  br label %592

592:                                              ; preds = %591
  %593 = load ptr, ptr %6, align 8, !tbaa !5
  %594 = call zeroext i1 @is_poor(ptr noundef %593) #11
  br i1 %594, label %595, label %599

595:                                              ; preds = %592
  %596 = load ptr, ptr %6, align 8, !tbaa !5
  %597 = call zeroext i1 @is_filled(ptr noundef %596) #11
  %598 = xor i1 %597, true
  br label %599

599:                                              ; preds = %595, %592
  %600 = phi i1 [ false, %592 ], [ %598, %595 ]
  %601 = xor i1 %600, true
  %602 = xor i1 %601, true
  %603 = xor i1 %602, true
  %604 = zext i1 %603 to i32
  %605 = sext i32 %604 to i64
  %606 = call i64 @llvm.expect.i64(i64 %605, i64 0)
  %607 = icmp ne i64 %606, 0
  br i1 %607, label %608, label %614

608:                                              ; preds = %599
  %609 = load ptr, ptr %6, align 8, !tbaa !5
  %610 = getelementptr inbounds %struct.MDBX_cursor, ptr %609, i32 0, i32 5
  %611 = load ptr, ptr %610, align 8, !tbaa !17
  %612 = getelementptr inbounds %struct.MDBX_txn, ptr %611, i32 0, i32 9
  %613 = load ptr, ptr %612, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %613, ptr noundef @.str.120, ptr noundef @__func__.cursor_ops, i32 noundef 2073) #10
  unreachable

614:                                              ; preds = %599
  br label %615

615:                                              ; preds = %614
  br label %616

616:                                              ; preds = %615
  br label %617

617:                                              ; preds = %616, %580
  br label %618

618:                                              ; preds = %617
  br label %619

619:                                              ; preds = %618
  br label %620

620:                                              ; preds = %619, %578
  br label %621

621:                                              ; preds = %620, %452
  %622 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %622, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

623:                                              ; preds = %68
  %624 = load ptr, ptr %7, align 8, !tbaa !5
  %625 = icmp ne ptr %624, null
  %626 = xor i1 %625, true
  %627 = xor i1 %626, true
  %628 = xor i1 %627, true
  %629 = zext i1 %628 to i32
  %630 = sext i32 %629 to i64
  %631 = call i64 @llvm.expect.i64(i64 %630, i64 0)
  %632 = icmp ne i64 %631, 0
  br i1 %632, label %633, label %634

633:                                              ; preds = %623
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

634:                                              ; preds = %623
  %635 = load ptr, ptr %6, align 8, !tbaa !5
  %636 = load ptr, ptr %7, align 8, !tbaa !5
  %637 = load ptr, ptr %8, align 8, !tbaa !5
  %638 = call i64 @cursor_seek(ptr noundef %635, ptr noundef %636, ptr noundef %637, i32 noundef 15) #12
  store i64 %638, ptr %17, align 4
  %639 = getelementptr inbounds %struct.cursor_set_result, ptr %17, i32 0, i32 0
  %640 = load i32, ptr %639, align 4, !tbaa !31
  store i32 %640, ptr %10, align 4, !tbaa !9
  %641 = load i32, ptr %10, align 4, !tbaa !9
  %642 = icmp ne i32 %641, 0
  %643 = xor i1 %642, true
  %644 = xor i1 %643, true
  %645 = zext i1 %644 to i32
  %646 = sext i32 %645 to i64
  %647 = call i64 @llvm.expect.i64(i64 %646, i64 0)
  %648 = icmp ne i64 %647, 0
  br i1 %648, label %649, label %651

649:                                              ; preds = %634
  %650 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %650, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

651:                                              ; preds = %634
  br label %652

652:                                              ; preds = %651, %68
  %653 = load ptr, ptr %8, align 8, !tbaa !5
  %654 = icmp ne ptr %653, null
  %655 = xor i1 %654, true
  %656 = xor i1 %655, true
  %657 = xor i1 %656, true
  %658 = zext i1 %657 to i32
  %659 = sext i32 %658 to i64
  %660 = call i64 @llvm.expect.i64(i64 %659, i64 0)
  %661 = icmp ne i64 %660, 0
  br i1 %661, label %662, label %663

662:                                              ; preds = %652
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

663:                                              ; preds = %652
  %664 = load ptr, ptr %6, align 8, !tbaa !5
  %665 = getelementptr inbounds %struct.MDBX_cursor, ptr %664, i32 0, i32 6
  %666 = load ptr, ptr %665, align 8, !tbaa !26
  %667 = getelementptr inbounds %struct.tree, ptr %666, i32 0, i32 0
  %668 = load i16, ptr %667, align 4, !tbaa !34
  %669 = zext i16 %668 to i32
  %670 = and i32 %669, 16
  %671 = icmp eq i32 %670, 0
  %672 = xor i1 %671, true
  %673 = xor i1 %672, true
  %674 = zext i1 %673 to i32
  %675 = sext i32 %674 to i64
  %676 = call i64 @llvm.expect.i64(i64 %675, i64 0)
  %677 = icmp ne i64 %676, 0
  br i1 %677, label %678, label %679

678:                                              ; preds = %663
  store i32 -30784, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

679:                                              ; preds = %663
  %680 = load ptr, ptr %6, align 8, !tbaa !5
  %681 = call zeroext i1 @is_filled(ptr noundef %680) #11
  %682 = xor i1 %681, true
  %683 = xor i1 %682, true
  %684 = xor i1 %683, true
  %685 = zext i1 %684 to i32
  %686 = sext i32 %685 to i64
  %687 = call i64 @llvm.expect.i64(i64 %686, i64 0)
  %688 = icmp ne i64 %687, 0
  br i1 %688, label %689, label %690

689:                                              ; preds = %679
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

690:                                              ; preds = %679
  %691 = load ptr, ptr %7, align 8, !tbaa !5
  %692 = icmp ne ptr %691, null
  br i1 %692, label %693, label %722

693:                                              ; preds = %690
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #9
  %694 = load ptr, ptr %6, align 8, !tbaa !5
  %695 = getelementptr inbounds %struct.MDBX_cursor, ptr %694, i32 0, i32 9
  %696 = load ptr, ptr %6, align 8, !tbaa !5
  %697 = getelementptr inbounds %struct.MDBX_cursor, ptr %696, i32 0, i32 1
  %698 = getelementptr inbounds %struct.anon, ptr %697, i32 0, i32 1
  %699 = load i8, ptr %698, align 1, !tbaa !15
  %700 = sext i8 %699 to i64
  %701 = getelementptr inbounds [32 x ptr], ptr %695, i64 0, i64 %700
  %702 = load ptr, ptr %701, align 8, !tbaa !5
  store ptr %702, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #9
  %703 = load ptr, ptr %18, align 8, !tbaa !5
  %704 = load ptr, ptr %6, align 8, !tbaa !5
  %705 = getelementptr inbounds %struct.MDBX_cursor, ptr %704, i32 0, i32 10
  %706 = load ptr, ptr %6, align 8, !tbaa !5
  %707 = getelementptr inbounds %struct.MDBX_cursor, ptr %706, i32 0, i32 1
  %708 = getelementptr inbounds %struct.anon, ptr %707, i32 0, i32 1
  %709 = load i8, ptr %708, align 1, !tbaa !15
  %710 = sext i8 %709 to i64
  %711 = getelementptr inbounds [32 x i16], ptr %705, i64 0, i64 %710
  %712 = load i16, ptr %711, align 2, !tbaa !24
  %713 = zext i16 %712 to i64
  %714 = call ptr @page_node(ptr noundef %703, i64 noundef %713) #11
  store ptr %714, ptr %19, align 8, !tbaa !5
  %715 = load ptr, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #9
  %716 = load ptr, ptr %19, align 8, !tbaa !5
  %717 = call { ptr, i64 } @get_key(ptr noundef %716) #11
  %718 = getelementptr inbounds { ptr, i64 }, ptr %20, i32 0, i32 0
  %719 = extractvalue { ptr, i64 } %717, 0
  store ptr %719, ptr %718, align 8
  %720 = getelementptr inbounds { ptr, i64 }, ptr %20, i32 0, i32 1
  %721 = extractvalue { ptr, i64 } %717, 1
  store i64 %721, ptr %720, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %715, ptr align 8 %20, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #9
  br label %722

722:                                              ; preds = %693, %690
  br label %723

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

734:                                              ; preds = %723
  br label %735

735:                                              ; preds = %734
  %736 = load ptr, ptr %6, align 8, !tbaa !5
  %737 = call zeroext i1 @is_filled(ptr noundef %736) #11
  %738 = xor i1 %737, true
  %739 = xor i1 %738, true
  %740 = xor i1 %739, true
  %741 = zext i1 %740 to i32
  %742 = sext i32 %741 to i64
  %743 = call i64 @llvm.expect.i64(i64 %742, i64 0)
  %744 = icmp ne i64 %743, 0
  br i1 %744, label %745, label %751

745:                                              ; preds = %735
  %746 = load ptr, ptr %6, align 8, !tbaa !5
  %747 = getelementptr inbounds %struct.MDBX_cursor, ptr %746, i32 0, i32 5
  %748 = load ptr, ptr %747, align 8, !tbaa !17
  %749 = getelementptr inbounds %struct.MDBX_txn, ptr %748, i32 0, i32 9
  %750 = load ptr, ptr %749, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %750, ptr noundef @.str.5, ptr noundef @__func__.cursor_ops, i32 noundef 2095) #10
  unreachable

751:                                              ; preds = %735
  br label %752

752:                                              ; preds = %751
  br label %753

753:                                              ; preds = %752
  br label %754

754:                                              ; preds = %753, %723
  br label %755

755:                                              ; preds = %754
  br label %756

756:                                              ; preds = %755
  %757 = load ptr, ptr %6, align 8, !tbaa !5
  %758 = call zeroext i1 @inner_filled(ptr noundef %757) #11
  %759 = xor i1 %758, true
  %760 = xor i1 %759, true
  %761 = xor i1 %760, true
  %762 = zext i1 %761 to i32
  %763 = sext i32 %762 to i64
  %764 = call i64 @llvm.expect.i64(i64 %763, i64 0)
  %765 = icmp ne i64 %764, 0
  br i1 %765, label %766, label %797

766:                                              ; preds = %756
  %767 = load ptr, ptr %6, align 8, !tbaa !5
  %768 = call zeroext i1 @inner_pointed(ptr noundef %767) #11
  br i1 %768, label %769, label %770

769:                                              ; preds = %766
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

770:                                              ; preds = %766
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #9
  %771 = load ptr, ptr %6, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.MDBX_cursor, ptr %771, i32 0, i32 9
  %773 = load ptr, ptr %6, align 8, !tbaa !5
  %774 = getelementptr inbounds %struct.MDBX_cursor, ptr %773, i32 0, i32 1
  %775 = getelementptr inbounds %struct.anon, ptr %774, i32 0, i32 1
  %776 = load i8, ptr %775, align 1, !tbaa !15
  %777 = sext i8 %776 to i64
  %778 = getelementptr inbounds [32 x ptr], ptr %772, i64 0, i64 %777
  %779 = load ptr, ptr %778, align 8, !tbaa !5
  store ptr %779, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #9
  %780 = load ptr, ptr %21, align 8, !tbaa !5
  %781 = load ptr, ptr %6, align 8, !tbaa !5
  %782 = getelementptr inbounds %struct.MDBX_cursor, ptr %781, i32 0, i32 10
  %783 = load ptr, ptr %6, align 8, !tbaa !5
  %784 = getelementptr inbounds %struct.MDBX_cursor, ptr %783, i32 0, i32 1
  %785 = getelementptr inbounds %struct.anon, ptr %784, i32 0, i32 1
  %786 = load i8, ptr %785, align 1, !tbaa !15
  %787 = sext i8 %786 to i64
  %788 = getelementptr inbounds [32 x i16], ptr %782, i64 0, i64 %787
  %789 = load i16, ptr %788, align 2, !tbaa !24
  %790 = zext i16 %789 to i64
  %791 = call ptr @page_node(ptr noundef %780, i64 noundef %790) #11
  store ptr %791, ptr %22, align 8, !tbaa !5
  %792 = load ptr, ptr %6, align 8, !tbaa !5
  %793 = load ptr, ptr %22, align 8, !tbaa !5
  %794 = load ptr, ptr %8, align 8, !tbaa !5
  %795 = load ptr, ptr %21, align 8, !tbaa !5
  %796 = call i32 @node_read(ptr noundef %792, ptr noundef %793, ptr noundef %794, ptr noundef %795)
  store i32 %796, ptr %5, align 4
  store i32 1, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #9
  br label %1825

797:                                              ; preds = %756
  br label %837

798:                                              ; preds = %68
  %799 = load ptr, ptr %8, align 8, !tbaa !5
  %800 = icmp ne ptr %799, null
  %801 = xor i1 %800, true
  %802 = xor i1 %801, true
  %803 = xor i1 %802, true
  %804 = zext i1 %803 to i32
  %805 = sext i32 %804 to i64
  %806 = call i64 @llvm.expect.i64(i64 %805, i64 0)
  %807 = icmp ne i64 %806, 0
  br i1 %807, label %808, label %809

808:                                              ; preds = %798
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

809:                                              ; preds = %798
  %810 = load ptr, ptr %6, align 8, !tbaa !5
  %811 = getelementptr inbounds %struct.MDBX_cursor, ptr %810, i32 0, i32 8
  %812 = load ptr, ptr %811, align 8, !tbaa !25
  %813 = icmp eq ptr %812, null
  %814 = xor i1 %813, true
  %815 = xor i1 %814, true
  %816 = zext i1 %815 to i32
  %817 = sext i32 %816 to i64
  %818 = call i64 @llvm.expect.i64(i64 %817, i64 0)
  %819 = icmp ne i64 %818, 0
  br i1 %819, label %820, label %821

820:                                              ; preds = %809
  store i32 -30784, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

821:                                              ; preds = %809
  %822 = load ptr, ptr %6, align 8, !tbaa !5
  %823 = load ptr, ptr %7, align 8, !tbaa !5
  %824 = load ptr, ptr %8, align 8, !tbaa !5
  %825 = call i32 @outer_next(ptr noundef %822, ptr noundef %823, ptr noundef %824, i32 noundef 9) #12
  store i32 %825, ptr %10, align 4, !tbaa !9
  %826 = load i32, ptr %10, align 4, !tbaa !9
  %827 = icmp ne i32 %826, 0
  %828 = xor i1 %827, true
  %829 = xor i1 %828, true
  %830 = zext i1 %829 to i32
  %831 = sext i32 %830 to i64
  %832 = call i64 @llvm.expect.i64(i64 %831, i64 0)
  %833 = icmp ne i64 %832, 0
  br i1 %833, label %834, label %836

834:                                              ; preds = %821
  %835 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %835, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

836:                                              ; preds = %821
  br label %837

837:                                              ; preds = %987, %836, %797
  br label %838

838:                                              ; preds = %837
  %839 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %840 = zext i8 %839 to i32
  %841 = and i32 %840, 1
  %842 = icmp ne i32 %841, 0
  %843 = xor i1 %842, true
  %844 = xor i1 %843, true
  %845 = zext i1 %844 to i32
  %846 = sext i32 %845 to i64
  %847 = call i64 @llvm.expect.i64(i64 %846, i64 1)
  %848 = icmp ne i64 %847, 0
  br i1 %848, label %849, label %874

849:                                              ; preds = %838
  br label %850

850:                                              ; preds = %849
  %851 = load ptr, ptr %6, align 8, !tbaa !5
  %852 = call zeroext i1 @is_filled(ptr noundef %851) #11
  br i1 %852, label %853, label %856

853:                                              ; preds = %850
  %854 = load ptr, ptr %6, align 8, !tbaa !5
  %855 = call zeroext i1 @inner_filled(ptr noundef %854) #11
  br label %856

856:                                              ; preds = %853, %850
  %857 = phi i1 [ false, %850 ], [ %855, %853 ]
  %858 = xor i1 %857, true
  %859 = xor i1 %858, true
  %860 = xor i1 %859, true
  %861 = zext i1 %860 to i32
  %862 = sext i32 %861 to i64
  %863 = call i64 @llvm.expect.i64(i64 %862, i64 0)
  %864 = icmp ne i64 %863, 0
  br i1 %864, label %865, label %871

865:                                              ; preds = %856
  %866 = load ptr, ptr %6, align 8, !tbaa !5
  %867 = getelementptr inbounds %struct.MDBX_cursor, ptr %866, i32 0, i32 5
  %868 = load ptr, ptr %867, align 8, !tbaa !17
  %869 = getelementptr inbounds %struct.MDBX_txn, ptr %868, i32 0, i32 9
  %870 = load ptr, ptr %869, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %870, ptr noundef @.str.121, ptr noundef @__func__.cursor_ops, i32 noundef 2115) #10
  unreachable

871:                                              ; preds = %856
  br label %872

872:                                              ; preds = %871
  br label %873

873:                                              ; preds = %872
  br label %874

874:                                              ; preds = %873, %838
  br label %875

875:                                              ; preds = %874
  br label %876

876:                                              ; preds = %875
  %877 = load ptr, ptr %6, align 8, !tbaa !5
  %878 = getelementptr inbounds %struct.MDBX_cursor, ptr %877, i32 0, i32 8
  %879 = load ptr, ptr %878, align 8, !tbaa !25
  %880 = getelementptr inbounds %struct.inner_cursor, ptr %879, i32 0, i32 0
  store ptr %880, ptr %23, align 8, !tbaa !5
  %881 = load ptr, ptr %23, align 8, !tbaa !5
  %882 = getelementptr inbounds %struct.MDBX_cursor, ptr %881, i32 0, i32 9
  %883 = load ptr, ptr %23, align 8, !tbaa !5
  %884 = getelementptr inbounds %struct.MDBX_cursor, ptr %883, i32 0, i32 1
  %885 = getelementptr inbounds %struct.anon, ptr %884, i32 0, i32 1
  %886 = load i8, ptr %885, align 1, !tbaa !15
  %887 = sext i8 %886 to i64
  %888 = getelementptr inbounds [32 x ptr], ptr %882, i64 0, i64 %887
  %889 = load ptr, ptr %888, align 8, !tbaa !5
  %890 = call i64 @page_numkeys(ptr noundef %889) #11
  %891 = load ptr, ptr %23, align 8, !tbaa !5
  %892 = getelementptr inbounds %struct.MDBX_cursor, ptr %891, i32 0, i32 6
  %893 = load ptr, ptr %892, align 8, !tbaa !26
  %894 = getelementptr inbounds %struct.tree, ptr %893, i32 0, i32 2
  %895 = load i32, ptr %894, align 4, !tbaa !27
  %896 = zext i32 %895 to i64
  %897 = mul i64 %890, %896
  %898 = load ptr, ptr %8, align 8, !tbaa !5
  %899 = getelementptr inbounds %struct.iovec, ptr %898, i32 0, i32 1
  store i64 %897, ptr %899, align 8, !tbaa !35
  %900 = load ptr, ptr %23, align 8, !tbaa !5
  %901 = getelementptr inbounds %struct.MDBX_cursor, ptr %900, i32 0, i32 9
  %902 = load ptr, ptr %23, align 8, !tbaa !5
  %903 = getelementptr inbounds %struct.MDBX_cursor, ptr %902, i32 0, i32 1
  %904 = getelementptr inbounds %struct.anon, ptr %903, i32 0, i32 1
  %905 = load i8, ptr %904, align 1, !tbaa !15
  %906 = sext i8 %905 to i64
  %907 = getelementptr inbounds [32 x ptr], ptr %901, i64 0, i64 %906
  %908 = load ptr, ptr %907, align 8, !tbaa !5
  %909 = call ptr @page_data(ptr noundef %908) #11
  %910 = load ptr, ptr %8, align 8, !tbaa !5
  %911 = getelementptr inbounds %struct.iovec, ptr %910, i32 0, i32 0
  store ptr %909, ptr %911, align 8, !tbaa !37
  %912 = load ptr, ptr %23, align 8, !tbaa !5
  %913 = getelementptr inbounds %struct.MDBX_cursor, ptr %912, i32 0, i32 9
  %914 = load ptr, ptr %23, align 8, !tbaa !5
  %915 = getelementptr inbounds %struct.MDBX_cursor, ptr %914, i32 0, i32 1
  %916 = getelementptr inbounds %struct.anon, ptr %915, i32 0, i32 1
  %917 = load i8, ptr %916, align 1, !tbaa !15
  %918 = sext i8 %917 to i64
  %919 = getelementptr inbounds [32 x ptr], ptr %913, i64 0, i64 %918
  %920 = load ptr, ptr %919, align 8, !tbaa !5
  %921 = call i64 @page_numkeys(ptr noundef %920) #11
  %922 = trunc i64 %921 to i16
  %923 = zext i16 %922 to i32
  %924 = sub nsw i32 %923, 1
  %925 = trunc i32 %924 to i16
  %926 = load ptr, ptr %23, align 8, !tbaa !5
  %927 = getelementptr inbounds %struct.MDBX_cursor, ptr %926, i32 0, i32 10
  %928 = load ptr, ptr %23, 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 1
  %931 = load i8, ptr %930, align 1, !tbaa !15
  %932 = sext i8 %931 to i64
  %933 = getelementptr inbounds [32 x i16], ptr %927, i64 0, i64 %932
  store i16 %925, ptr %933, align 2, !tbaa !24
  store i32 0, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

934:                                              ; preds = %68
  %935 = load ptr, ptr %8, align 8, !tbaa !5
  %936 = icmp ne ptr %935, null
  %937 = xor i1 %936, true
  %938 = xor i1 %937, true
  %939 = xor i1 %938, true
  %940 = zext i1 %939 to i32
  %941 = sext i32 %940 to i64
  %942 = call i64 @llvm.expect.i64(i64 %941, i64 0)
  %943 = icmp ne i64 %942, 0
  br i1 %943, label %944, label %945

944:                                              ; preds = %934
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

945:                                              ; preds = %934
  %946 = load ptr, ptr %6, align 8, !tbaa !5
  %947 = getelementptr inbounds %struct.MDBX_cursor, ptr %946, i32 0, i32 8
  %948 = load ptr, ptr %947, align 8, !tbaa !25
  %949 = icmp eq ptr %948, null
  %950 = xor i1 %949, true
  %951 = xor i1 %950, true
  %952 = zext i1 %951 to i32
  %953 = sext i32 %952 to i64
  %954 = call i64 @llvm.expect.i64(i64 %953, i64 0)
  %955 = icmp ne i64 %954, 0
  br i1 %955, label %956, label %957

956:                                              ; preds = %945
  store i32 -30784, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

957:                                              ; preds = %945
  %958 = load ptr, ptr %6, align 8, !tbaa !5
  %959 = call zeroext i1 @is_filled(ptr noundef %958) #11
  br i1 %959, label %960, label %964

960:                                              ; preds = %957
  %961 = load ptr, ptr %6, align 8, !tbaa !5
  %962 = call zeroext i1 @inner_filled(ptr noundef %961) #11
  %963 = xor i1 %962, true
  br label %964

964:                                              ; preds = %960, %957
  %965 = phi i1 [ true, %957 ], [ %963, %960 ]
  %966 = xor i1 %965, true
  %967 = xor i1 %966, true
  %968 = zext i1 %967 to i32
  %969 = sext i32 %968 to i64
  %970 = call i64 @llvm.expect.i64(i64 %969, i64 0)
  %971 = icmp ne i64 %970, 0
  br i1 %971, label %972, label %973

972:                                              ; preds = %964
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

973:                                              ; preds = %964
  %974 = load ptr, ptr %6, align 8, !tbaa !5
  %975 = getelementptr inbounds %struct.MDBX_cursor, ptr %974, i32 0, i32 8
  %976 = load ptr, ptr %975, align 8, !tbaa !25
  %977 = getelementptr inbounds %struct.inner_cursor, ptr %976, i32 0, i32 0
  %978 = call i32 @cursor_sibling_left(ptr noundef %977) #12
  store i32 %978, ptr %10, align 4, !tbaa !9
  %979 = load i32, ptr %10, align 4, !tbaa !9
  %980 = icmp eq i32 %979, 0
  %981 = xor i1 %980, true
  %982 = xor i1 %981, true
  %983 = zext i1 %982 to i32
  %984 = sext i32 %983 to i64
  %985 = call i64 @llvm.expect.i64(i64 %984, i64 1)
  %986 = icmp ne i64 %985, 0
  br i1 %986, label %987, label %988

987:                                              ; preds = %973
  br label %837

988:                                              ; preds = %973
  %989 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %989, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

990:                                              ; preds = %68, %68, %68
  %991 = load ptr, ptr %6, align 8, !tbaa !5
  %992 = load ptr, ptr %7, align 8, !tbaa !5
  %993 = load ptr, ptr %8, align 8, !tbaa !5
  %994 = load i32, ptr %9, align 4, !tbaa !9
  %995 = call i32 @outer_next(ptr noundef %991, ptr noundef %992, ptr noundef %993, i32 noundef %994) #12
  store i32 %995, ptr %10, align 4, !tbaa !9
  %996 = load ptr, ptr %6, align 8, !tbaa !5
  %997 = getelementptr inbounds %struct.MDBX_cursor, ptr %996, i32 0, i32 1
  %998 = getelementptr inbounds %struct.anon, ptr %997, i32 0, i32 0
  %999 = load i8, ptr %998, align 4, !tbaa !15
  %1000 = sext i8 %999 to i32
  %1001 = and i32 %1000, -65
  %1002 = trunc i32 %1001 to i8
  store i8 %1002, ptr %998, align 4, !tbaa !15
  %1003 = load ptr, ptr %6, align 8, !tbaa !5
  %1004 = getelementptr inbounds %struct.cursor_couple, ptr %1003, i32 0, i32 2
  %1005 = getelementptr inbounds %struct.inner_cursor, ptr %1004, i32 0, i32 0
  %1006 = getelementptr inbounds %struct.MDBX_cursor, ptr %1005, i32 0, i32 1
  %1007 = getelementptr inbounds %struct.anon, ptr %1006, i32 0, i32 0
  %1008 = load i8, ptr %1007, align 4, !tbaa !15
  %1009 = sext i8 %1008 to i32
  %1010 = and i32 %1009, -65
  %1011 = trunc i32 %1010 to i8
  store i8 %1011, ptr %1007, align 4, !tbaa !15
  %1012 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1012, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1013:                                             ; preds = %68, %68, %68
  %1014 = load ptr, ptr %6, align 8, !tbaa !5
  %1015 = load ptr, ptr %7, align 8, !tbaa !5
  %1016 = load ptr, ptr %8, align 8, !tbaa !5
  %1017 = load i32, ptr %9, align 4, !tbaa !9
  %1018 = call i32 @outer_prev(ptr noundef %1014, ptr noundef %1015, ptr noundef %1016, i32 noundef %1017) #12
  store i32 %1018, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1019:                                             ; preds = %68
  %1020 = load ptr, ptr %6, align 8, !tbaa !5
  %1021 = load ptr, ptr %7, align 8, !tbaa !5
  %1022 = load ptr, ptr %8, align 8, !tbaa !5
  %1023 = call i32 @outer_first(ptr noundef %1020, ptr noundef %1021, ptr noundef %1022) #12
  store i32 %1023, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1024:                                             ; preds = %68
  %1025 = load ptr, ptr %6, align 8, !tbaa !5
  %1026 = load ptr, ptr %7, align 8, !tbaa !5
  %1027 = load ptr, ptr %8, align 8, !tbaa !5
  %1028 = call i32 @outer_last(ptr noundef %1025, ptr noundef %1026, ptr noundef %1027) #12
  store i32 %1028, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1029:                                             ; preds = %68, %68
  %1030 = load ptr, ptr %8, align 8, !tbaa !5
  %1031 = icmp eq ptr %1030, null
  %1032 = xor i1 %1031, true
  %1033 = xor i1 %1032, true
  %1034 = zext i1 %1033 to i32
  %1035 = sext i32 %1034 to i64
  %1036 = call i64 @llvm.expect.i64(i64 %1035, i64 0)
  %1037 = icmp ne i64 %1036, 0
  br i1 %1037, label %1038, label %1039

1038:                                             ; preds = %1029
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1039:                                             ; preds = %1029
  %1040 = load ptr, ptr %6, align 8, !tbaa !5
  %1041 = call zeroext i1 @is_filled(ptr noundef %1040) #11
  %1042 = xor i1 %1041, true
  %1043 = xor i1 %1042, true
  %1044 = xor i1 %1043, true
  %1045 = zext i1 %1044 to i32
  %1046 = sext i32 %1045 to i64
  %1047 = call i64 @llvm.expect.i64(i64 %1046, i64 0)
  %1048 = icmp ne i64 %1047, 0
  br i1 %1048, label %1049, label %1050

1049:                                             ; preds = %1039
  store i32 61, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1050:                                             ; preds = %1039
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #9
  %1051 = load ptr, ptr %6, align 8, !tbaa !5
  %1052 = getelementptr inbounds %struct.MDBX_cursor, ptr %1051, i32 0, i32 9
  %1053 = load ptr, ptr %6, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.MDBX_cursor, ptr %1053, i32 0, i32 1
  %1055 = getelementptr inbounds %struct.anon, ptr %1054, i32 0, i32 1
  %1056 = load i8, ptr %1055, align 1, !tbaa !15
  %1057 = sext i8 %1056 to i64
  %1058 = getelementptr inbounds [32 x ptr], ptr %1052, i64 0, i64 %1057
  %1059 = load ptr, ptr %1058, align 8, !tbaa !5
  %1060 = load ptr, ptr %6, align 8, !tbaa !5
  %1061 = getelementptr inbounds %struct.MDBX_cursor, ptr %1060, i32 0, i32 10
  %1062 = load ptr, ptr %6, align 8, !tbaa !5
  %1063 = getelementptr inbounds %struct.MDBX_cursor, ptr %1062, i32 0, i32 1
  %1064 = getelementptr inbounds %struct.anon, ptr %1063, i32 0, i32 1
  %1065 = load i8, ptr %1064, align 1, !tbaa !15
  %1066 = sext i8 %1065 to i64
  %1067 = getelementptr inbounds [32 x i16], ptr %1061, i64 0, i64 %1066
  %1068 = load i16, ptr %1067, align 2, !tbaa !24
  %1069 = zext i16 %1068 to i64
  %1070 = call ptr @page_node(ptr noundef %1059, i64 noundef %1069) #11
  store ptr %1070, ptr %24, align 8, !tbaa !5
  %1071 = load ptr, ptr %24, align 8, !tbaa !5
  %1072 = load ptr, ptr %7, align 8, !tbaa !5
  call void @get_key_optional(ptr noundef %1071, ptr noundef %1072)
  %1073 = load ptr, ptr %24, align 8, !tbaa !5
  %1074 = call zeroext i8 @node_flags(ptr noundef %1073) #11
  %1075 = zext i8 %1074 to i32
  %1076 = and i32 %1075, 4
  %1077 = icmp eq i32 %1076, 0
  br i1 %1077, label %1078, label %1092

1078:                                             ; preds = %1050
  %1079 = load ptr, ptr %6, align 8, !tbaa !5
  %1080 = load ptr, ptr %24, align 8, !tbaa !5
  %1081 = load ptr, ptr %8, align 8, !tbaa !5
  %1082 = load ptr, ptr %6, align 8, !tbaa !5
  %1083 = getelementptr inbounds %struct.MDBX_cursor, ptr %1082, i32 0, i32 9
  %1084 = load ptr, ptr %6, align 8, !tbaa !5
  %1085 = getelementptr inbounds %struct.MDBX_cursor, ptr %1084, i32 0, i32 1
  %1086 = getelementptr inbounds %struct.anon, ptr %1085, i32 0, i32 1
  %1087 = load i8, ptr %1086, align 1, !tbaa !15
  %1088 = sext i8 %1087 to i64
  %1089 = getelementptr inbounds [32 x ptr], ptr %1083, i64 0, i64 %1088
  %1090 = load ptr, ptr %1089, align 8, !tbaa !5
  %1091 = call i32 @node_read(ptr noundef %1079, ptr noundef %1080, ptr noundef %1081, ptr noundef %1090)
  store i32 %1091, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1117

1092:                                             ; preds = %1050
  %1093 = load ptr, ptr %6, align 8, !tbaa !5
  %1094 = getelementptr inbounds %struct.MDBX_cursor, ptr %1093, i32 0, i32 8
  %1095 = load ptr, ptr %1094, align 8, !tbaa !25
  %1096 = icmp ne ptr %1095, null
  %1097 = xor i1 %1096, true
  %1098 = xor i1 %1097, true
  %1099 = zext i1 %1098 to i32
  %1100 = sext i32 %1099 to i64
  %1101 = call i64 @llvm.expect.i64(i64 %1100, i64 1)
  %1102 = icmp ne i64 %1101, 0
  br i1 %1102, label %1103, label %1114

1103:                                             ; preds = %1092
  %1104 = load i32, ptr %9, align 4, !tbaa !9
  %1105 = icmp eq i32 %1104, 1
  %1106 = zext i1 %1105 to i64
  %1107 = select i1 %1105, ptr @inner_first, ptr @inner_last
  %1108 = load ptr, ptr %6, align 8, !tbaa !5
  %1109 = getelementptr inbounds %struct.MDBX_cursor, ptr %1108, i32 0, i32 8
  %1110 = load ptr, ptr %1109, align 8, !tbaa !25
  %1111 = getelementptr inbounds %struct.inner_cursor, ptr %1110, i32 0, i32 0
  %1112 = load ptr, ptr %8, align 8, !tbaa !5
  %1113 = call i32 %1107(ptr noundef %1111, ptr noundef %1112)
  store i32 %1113, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1117

1114:                                             ; preds = %1092
  %1115 = load ptr, ptr %6, align 8, !tbaa !5
  %1116 = call i32 @unexpected_dupsort(ptr noundef %1115) #13
  store i32 %1116, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1117

1117:                                             ; preds = %1114, %1103, %1078
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #9
  br label %1825

1118:                                             ; preds = %68, %68
  %1119 = load ptr, ptr %7, align 8, !tbaa !5
  %1120 = icmp eq ptr %1119, null
  br i1 %1120, label %1124, label %1121

1121:                                             ; preds = %1118
  %1122 = load ptr, ptr %8, align 8, !tbaa !5
  %1123 = icmp eq ptr %1122, null
  br label %1124

1124:                                             ; preds = %1121, %1118
  %1125 = phi i1 [ true, %1118 ], [ %1123, %1121 ]
  %1126 = xor i1 %1125, true
  %1127 = xor i1 %1126, true
  %1128 = zext i1 %1127 to i32
  %1129 = sext i32 %1128 to i64
  %1130 = call i64 @llvm.expect.i64(i64 %1129, i64 0)
  %1131 = icmp ne i64 %1130, 0
  br i1 %1131, label %1132, label %1133

1132:                                             ; preds = %1124
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1133:                                             ; preds = %1124
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #9
  %1134 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %25, ptr align 8 %1134, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #9
  %1135 = load ptr, ptr %6, align 8, !tbaa !5
  %1136 = load ptr, ptr %7, align 8, !tbaa !5
  %1137 = load ptr, ptr %8, align 8, !tbaa !5
  %1138 = call i64 @cursor_seek(ptr noundef %1135, ptr noundef %1136, ptr noundef %1137, i32 noundef 17) #12
  store i64 %1138, ptr %26, align 4
  %1139 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 0
  %1140 = load i32, ptr %1139, align 4, !tbaa !31
  store i32 %1140, ptr %10, align 4, !tbaa !9
  %1141 = load i32, ptr %10, align 4, !tbaa !9
  %1142 = icmp eq i32 %1141, 0
  br i1 %1142, label %1143, label %1241

1143:                                             ; preds = %1133
  %1144 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 1
  %1145 = load i8, ptr %1144, align 4, !tbaa !38, !range !39, !noundef !40
  %1146 = trunc i8 %1145 to i1
  br i1 %1146, label %1147, label %1241

1147:                                             ; preds = %1143
  %1148 = load ptr, ptr %6, align 8, !tbaa !5
  %1149 = getelementptr inbounds %struct.MDBX_cursor, ptr %1148, i32 0, i32 8
  %1150 = load ptr, ptr %1149, align 8, !tbaa !25
  %1151 = icmp ne ptr %1150, null
  br i1 %1151, label %1152, label %1241

1152:                                             ; preds = %1147
  %1153 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 1
  store i8 0, ptr %1153, align 4, !tbaa !38
  %1154 = getelementptr inbounds %struct.iovec, ptr %25, i32 0, i32 0
  %1155 = load ptr, ptr %1154, align 8, !tbaa !37
  %1156 = icmp ne ptr %1155, null
  br i1 %1156, label %1158, label %1157

1157:                                             ; preds = %1152
  br label %1240

1158:                                             ; preds = %1152
  %1159 = load ptr, ptr %6, align 8, !tbaa !5
  %1160 = getelementptr inbounds %struct.MDBX_cursor, ptr %1159, i32 0, i32 8
  %1161 = load ptr, ptr %1160, align 8, !tbaa !25
  %1162 = getelementptr inbounds %struct.inner_cursor, ptr %1161, i32 0, i32 0
  %1163 = call zeroext i1 @is_pointed(ptr noundef %1162) #11
  br i1 %1163, label %1164, label %1218

1164:                                             ; preds = %1158
  %1165 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1165, ptr align 8 %25, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  %1166 = load ptr, ptr %6, align 8, !tbaa !5
  %1167 = getelementptr inbounds %struct.MDBX_cursor, ptr %1166, i32 0, i32 8
  %1168 = load ptr, ptr %1167, align 8, !tbaa !25
  %1169 = getelementptr inbounds %struct.inner_cursor, ptr %1168, i32 0, i32 0
  %1170 = load ptr, ptr %8, align 8, !tbaa !5
  %1171 = call i64 @cursor_seek(ptr noundef %1169, ptr noundef %1170, ptr noundef null, i32 noundef 17) #12
  store i64 %1171, ptr %27, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %26, ptr align 4 %27, i64 8, i1 false), !tbaa.struct !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  %1172 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 0
  %1173 = load i32, ptr %1172, align 4, !tbaa !31
  store i32 %1173, ptr %10, align 4, !tbaa !9
  %1174 = load i32, ptr %10, align 4, !tbaa !9
  %1175 = icmp eq i32 %1174, -30798
  br i1 %1175, label %1176, label %1217

1176:                                             ; preds = %1164
  br label %1177

1177:                                             ; preds = %1176
  %1178 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %1179 = zext i8 %1178 to i32
  %1180 = and i32 %1179, 1
  %1181 = icmp ne i32 %1180, 0
  %1182 = xor i1 %1181, true
  %1183 = xor i1 %1182, true
  %1184 = zext i1 %1183 to i32
  %1185 = sext i32 %1184 to i64
  %1186 = call i64 @llvm.expect.i64(i64 %1185, i64 1)
  %1187 = icmp ne i64 %1186, 0
  br i1 %1187, label %1188, label %1210

1188:                                             ; preds = %1177
  br label %1189

1189:                                             ; preds = %1188
  %1190 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 1
  %1191 = load i8, ptr %1190, align 4, !tbaa !38, !range !39, !noundef !40
  %1192 = trunc i8 %1191 to i1
  %1193 = xor i1 %1192, true
  %1194 = xor i1 %1193, true
  %1195 = xor i1 %1194, true
  %1196 = xor i1 %1195, true
  %1197 = zext i1 %1196 to i32
  %1198 = sext i32 %1197 to i64
  %1199 = call i64 @llvm.expect.i64(i64 %1198, i64 0)
  %1200 = icmp ne i64 %1199, 0
  br i1 %1200, label %1201, label %1207

1201:                                             ; preds = %1189
  %1202 = load ptr, ptr %6, align 8, !tbaa !5
  %1203 = getelementptr inbounds %struct.MDBX_cursor, ptr %1202, i32 0, i32 5
  %1204 = load ptr, ptr %1203, align 8, !tbaa !17
  %1205 = getelementptr inbounds %struct.MDBX_txn, ptr %1204, i32 0, i32 9
  %1206 = load ptr, ptr %1205, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1206, ptr noundef @.str.122, ptr noundef @__func__.cursor_ops, i32 noundef 2190) #10
  unreachable

1207:                                             ; preds = %1189
  br label %1208

1208:                                             ; preds = %1207
  br label %1209

1209:                                             ; preds = %1208
  br label %1210

1210:                                             ; preds = %1209, %1177
  br label %1211

1211:                                             ; preds = %1210
  br label %1212

1212:                                             ; preds = %1211
  %1213 = load ptr, ptr %6, align 8, !tbaa !5
  %1214 = load ptr, ptr %7, align 8, !tbaa !5
  %1215 = load ptr, ptr %8, align 8, !tbaa !5
  %1216 = call i32 @outer_next(ptr noundef %1213, ptr noundef %1214, ptr noundef %1215, i32 noundef 11) #12
  store i32 %1216, ptr %10, align 4, !tbaa !9
  br label %1217

1217:                                             ; preds = %1212, %1164
  br label %1239

1218:                                             ; preds = %1158
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #9
  %1219 = load ptr, ptr %6, align 8, !tbaa !5
  %1220 = getelementptr inbounds %struct.MDBX_cursor, ptr %1219, i32 0, i32 7
  %1221 = load ptr, ptr %1220, align 8, !tbaa !43
  %1222 = getelementptr inbounds %struct.clc2, ptr %1221, i32 0, i32 1
  %1223 = getelementptr inbounds %struct.clc, ptr %1222, i32 0, i32 0
  %1224 = load ptr, ptr %1223, align 8, !tbaa !44
  %1225 = load ptr, ptr %8, align 8, !tbaa !5
  %1226 = call i32 %1224(ptr noundef %25, ptr noundef %1225)
  store i32 %1226, ptr %28, align 4, !tbaa !9
  %1227 = load i32, ptr %28, align 4, !tbaa !9
  %1228 = icmp eq i32 %1227, 0
  %1229 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 1
  %1230 = zext i1 %1228 to i8
  store i8 %1230, ptr %1229, align 4, !tbaa !38
  %1231 = load i32, ptr %28, align 4, !tbaa !9
  %1232 = icmp sgt i32 %1231, 0
  br i1 %1232, label %1233, label %1238

1233:                                             ; preds = %1218
  %1234 = load ptr, ptr %6, align 8, !tbaa !5
  %1235 = load ptr, ptr %7, align 8, !tbaa !5
  %1236 = load ptr, ptr %8, align 8, !tbaa !5
  %1237 = call i32 @outer_next(ptr noundef %1234, ptr noundef %1235, ptr noundef %1236, i32 noundef 11) #12
  store i32 %1237, ptr %10, align 4, !tbaa !9
  br label %1238

1238:                                             ; preds = %1233, %1218
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #9
  br label %1239

1239:                                             ; preds = %1238, %1217
  br label %1240

1240:                                             ; preds = %1239, %1157
  br label %1241

1241:                                             ; preds = %1240, %1147, %1143, %1133
  %1242 = load i32, ptr %10, align 4, !tbaa !9
  %1243 = icmp eq i32 %1242, 0
  br i1 %1243, label %1244, label %1249

1244:                                             ; preds = %1241
  %1245 = getelementptr inbounds %struct.cursor_set_result, ptr %26, i32 0, i32 1
  %1246 = load i8, ptr %1245, align 4, !tbaa !38, !range !39, !noundef !40
  %1247 = trunc i8 %1246 to i1
  br i1 %1247, label %1249, label %1248

1248:                                             ; preds = %1244
  store i32 -1, ptr %10, align 4, !tbaa !9
  br label %1249

1249:                                             ; preds = %1248, %1244, %1241
  %1250 = load i32, ptr %9, align 4, !tbaa !9
  %1251 = icmp eq i32 %1250, 20
  %1252 = xor i1 %1251, true
  %1253 = xor i1 %1252, true
  %1254 = zext i1 %1253 to i32
  %1255 = sext i32 %1254 to i64
  %1256 = call i64 @llvm.expect.i64(i64 %1255, i64 0)
  %1257 = icmp ne i64 %1256, 0
  br i1 %1257, label %1258, label %1272

1258:                                             ; preds = %1249
  %1259 = load i32, ptr %10, align 4, !tbaa !9
  %1260 = icmp eq i32 %1259, -1
  br i1 %1260, label %1261, label %1262

1261:                                             ; preds = %1258
  store i32 0, ptr %10, align 4, !tbaa !9
  br label %1271

1262:                                             ; preds = %1258
  %1263 = load i32, ptr %10, align 4, !tbaa !9
  %1264 = icmp eq i32 %1263, 0
  br i1 %1264, label %1265, label %1270

1265:                                             ; preds = %1262
  %1266 = load ptr, ptr %6, align 8, !tbaa !5
  %1267 = load ptr, ptr %7, align 8, !tbaa !5
  %1268 = load ptr, ptr %8, align 8, !tbaa !5
  %1269 = call i32 @outer_next(ptr noundef %1266, ptr noundef %1267, ptr noundef %1268, i32 noundef 8) #12
  store i32 %1269, ptr %10, align 4, !tbaa !9
  br label %1270

1270:                                             ; preds = %1265, %1262
  br label %1271

1271:                                             ; preds = %1270, %1261
  br label %1272

1272:                                             ; preds = %1271, %1249
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #9
  br label %1273

1273:                                             ; preds = %1272
  %1274 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1274, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1275:                                             ; preds = %68, %68, %68, %68, %68
  %1276 = load ptr, ptr %7, align 8, !tbaa !5
  %1277 = icmp eq ptr %1276, null
  %1278 = xor i1 %1277, true
  %1279 = xor i1 %1278, true
  %1280 = zext i1 %1279 to i32
  %1281 = sext i32 %1280 to i64
  %1282 = call i64 @llvm.expect.i64(i64 %1281, i64 0)
  %1283 = icmp ne i64 %1282, 0
  br i1 %1283, label %1284, label %1285

1284:                                             ; preds = %1275
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1285:                                             ; preds = %1275
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #9
  %1286 = load ptr, ptr %6, align 8, !tbaa !5
  %1287 = load ptr, ptr %7, align 8, !tbaa !5
  %1288 = load ptr, ptr %8, align 8, !tbaa !5
  %1289 = call i64 @cursor_seek(ptr noundef %1286, ptr noundef %1287, ptr noundef %1288, i32 noundef 17) #12
  store i64 %1289, ptr %29, align 4
  %1290 = getelementptr inbounds %struct.cursor_set_result, ptr %29, i32 0, i32 0
  %1291 = load i32, ptr %1290, align 4, !tbaa !31
  store i32 %1291, ptr %10, align 4, !tbaa !9
  %1292 = getelementptr inbounds %struct.cursor_set_result, ptr %29, i32 0, i32 1
  %1293 = load i8, ptr %1292, align 4, !tbaa !38, !range !39, !noundef !40
  %1294 = trunc i8 %1293 to i1
  br i1 %1294, label %1295, label %1348

1295:                                             ; preds = %1285
  br label %1296

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

1307:                                             ; preds = %1296
  br label %1308

1308:                                             ; preds = %1307
  %1309 = getelementptr inbounds %struct.cursor_set_result, ptr %29, i32 0, i32 0
  %1310 = load i32, ptr %1309, align 4, !tbaa !31
  %1311 = icmp eq i32 %1310, 0
  %1312 = xor i1 %1311, true
  %1313 = xor i1 %1312, true
  %1314 = xor i1 %1313, true
  %1315 = zext i1 %1314 to i32
  %1316 = sext i32 %1315 to i64
  %1317 = call i64 @llvm.expect.i64(i64 %1316, i64 0)
  %1318 = icmp ne i64 %1317, 0
  br i1 %1318, label %1319, label %1325

1319:                                             ; preds = %1308
  %1320 = load ptr, ptr %6, align 8, !tbaa !5
  %1321 = getelementptr inbounds %struct.MDBX_cursor, ptr %1320, i32 0, i32 5
  %1322 = load ptr, ptr %1321, align 8, !tbaa !17
  %1323 = getelementptr inbounds %struct.MDBX_txn, ptr %1322, i32 0, i32 9
  %1324 = load ptr, ptr %1323, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1324, ptr noundef @.str.51, ptr noundef @__func__.cursor_ops, i32 noundef 2226) #10
  unreachable

1325:                                             ; preds = %1308
  br label %1326

1326:                                             ; preds = %1325
  br label %1327

1327:                                             ; preds = %1326
  br label %1328

1328:                                             ; preds = %1327, %1296
  br label %1329

1329:                                             ; preds = %1328
  br label %1330

1330:                                             ; preds = %1329
  %1331 = load i32, ptr %9, align 4, !tbaa !9
  %1332 = icmp eq i32 %1331, 21
  br i1 %1332, label %1333, label %1338

1333:                                             ; preds = %1330
  %1334 = load ptr, ptr %6, align 8, !tbaa !5
  %1335 = load ptr, ptr %7, align 8, !tbaa !5
  %1336 = load ptr, ptr %8, align 8, !tbaa !5
  %1337 = call i32 @outer_prev(ptr noundef %1334, ptr noundef %1335, ptr noundef %1336, i32 noundef 14) #12
  store i32 %1337, ptr %10, align 4, !tbaa !9
  br label %1347

1338:                                             ; preds = %1330
  %1339 = load i32, ptr %9, align 4, !tbaa !9
  %1340 = icmp eq i32 %1339, 25
  br i1 %1340, label %1341, label %1346

1341:                                             ; preds = %1338
  %1342 = load ptr, ptr %6, align 8, !tbaa !5
  %1343 = load ptr, ptr %7, align 8, !tbaa !5
  %1344 = load ptr, ptr %8, align 8, !tbaa !5
  %1345 = call i32 @outer_next(ptr noundef %1342, ptr noundef %1343, ptr noundef %1344, i32 noundef 11) #12
  store i32 %1345, ptr %10, align 4, !tbaa !9
  br label %1346

1346:                                             ; preds = %1341, %1338
  br label %1347

1347:                                             ; preds = %1346, %1333
  br label %1371

1348:                                             ; preds = %1285
  %1349 = load i32, ptr %9, align 4, !tbaa !9
  %1350 = icmp ult i32 %1349, 23
  br i1 %1350, label %1351, label %1362

1351:                                             ; preds = %1348
  %1352 = load i32, ptr %10, align 4, !tbaa !9
  %1353 = icmp eq i32 %1352, -30798
  br i1 %1353, label %1357, label %1354

1354:                                             ; preds = %1351
  %1355 = load i32, ptr %10, align 4, !tbaa !9
  %1356 = icmp eq i32 %1355, 0
  br i1 %1356, label %1357, label %1362

1357:                                             ; preds = %1354, %1351
  %1358 = load ptr, ptr %6, align 8, !tbaa !5
  %1359 = load ptr, ptr %7, align 8, !tbaa !5
  %1360 = load ptr, ptr %8, align 8, !tbaa !5
  %1361 = call i32 @outer_prev(ptr noundef %1358, ptr noundef %1359, ptr noundef %1360, i32 noundef 14) #12
  store i32 %1361, ptr %10, align 4, !tbaa !9
  br label %1370

1362:                                             ; preds = %1354, %1348
  %1363 = load i32, ptr %9, align 4, !tbaa !9
  %1364 = icmp eq i32 %1363, 23
  br i1 %1364, label %1365, label %1369

1365:                                             ; preds = %1362
  %1366 = load i32, ptr %10, align 4, !tbaa !9
  %1367 = icmp eq i32 %1366, 0
  br i1 %1367, label %1368, label %1369

1368:                                             ; preds = %1365
  store i32 -30798, ptr %10, align 4, !tbaa !9
  br label %1369

1369:                                             ; preds = %1368, %1365, %1362
  br label %1370

1370:                                             ; preds = %1369, %1357
  br label %1371

1371:                                             ; preds = %1370, %1347
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #9
  br label %1372

1372:                                             ; preds = %1371
  %1373 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1373, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1374:                                             ; preds = %68, %68, %68, %68, %68
  %1375 = load ptr, ptr %7, align 8, !tbaa !5
  %1376 = icmp eq ptr %1375, null
  br i1 %1376, label %1380, label %1377

1377:                                             ; preds = %1374
  %1378 = load ptr, ptr %8, align 8, !tbaa !5
  %1379 = icmp eq ptr %1378, null
  br label %1380

1380:                                             ; preds = %1377, %1374
  %1381 = phi i1 [ true, %1374 ], [ %1379, %1377 ]
  %1382 = xor i1 %1381, true
  %1383 = xor i1 %1382, true
  %1384 = zext i1 %1383 to i32
  %1385 = sext i32 %1384 to i64
  %1386 = call i64 @llvm.expect.i64(i64 %1385, i64 0)
  %1387 = icmp ne i64 %1386, 0
  br i1 %1387, label %1388, label %1389

1388:                                             ; preds = %1380
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1389:                                             ; preds = %1380
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #9
  %1390 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %30, ptr align 8 %1390, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #9
  %1391 = load ptr, ptr %6, align 8, !tbaa !5
  %1392 = load ptr, ptr %7, align 8, !tbaa !5
  %1393 = load ptr, ptr %8, align 8, !tbaa !5
  %1394 = call i64 @cursor_seek(ptr noundef %1391, ptr noundef %1392, ptr noundef %1393, i32 noundef 16) #12
  store i64 %1394, ptr %31, align 4
  %1395 = getelementptr inbounds %struct.cursor_set_result, ptr %31, i32 0, i32 0
  %1396 = load i32, ptr %1395, align 4, !tbaa !31
  store i32 %1396, ptr %10, align 4, !tbaa !9
  %1397 = load i32, ptr %10, align 4, !tbaa !9
  %1398 = icmp eq i32 %1397, 0
  br i1 %1398, label %1399, label %1561

1399:                                             ; preds = %1389
  br label %1400

1400:                                             ; preds = %1399
  %1401 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %1402 = zext i8 %1401 to i32
  %1403 = and i32 %1402, 1
  %1404 = icmp ne i32 %1403, 0
  %1405 = xor i1 %1404, true
  %1406 = xor i1 %1405, true
  %1407 = zext i1 %1406 to i32
  %1408 = sext i32 %1407 to i64
  %1409 = call i64 @llvm.expect.i64(i64 %1408, i64 1)
  %1410 = icmp ne i64 %1409, 0
  br i1 %1410, label %1411, label %1432

1411:                                             ; preds = %1400
  br label %1412

1412:                                             ; preds = %1411
  %1413 = getelementptr inbounds %struct.cursor_set_result, ptr %31, i32 0, i32 1
  %1414 = load i8, ptr %1413, align 4, !tbaa !38, !range !39, !noundef !40
  %1415 = trunc i8 %1414 to i1
  %1416 = xor i1 %1415, true
  %1417 = xor i1 %1416, true
  %1418 = xor i1 %1417, true
  %1419 = zext i1 %1418 to i32
  %1420 = sext i32 %1419 to i64
  %1421 = call i64 @llvm.expect.i64(i64 %1420, i64 0)
  %1422 = icmp ne i64 %1421, 0
  br i1 %1422, label %1423, label %1429

1423:                                             ; preds = %1412
  %1424 = load ptr, ptr %6, align 8, !tbaa !5
  %1425 = getelementptr inbounds %struct.MDBX_cursor, ptr %1424, i32 0, i32 5
  %1426 = load ptr, ptr %1425, align 8, !tbaa !17
  %1427 = getelementptr inbounds %struct.MDBX_txn, ptr %1426, i32 0, i32 9
  %1428 = load ptr, ptr %1427, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1428, ptr noundef @.str.123, ptr noundef @__func__.cursor_ops, i32 noundef 2252) #10
  unreachable

1429:                                             ; preds = %1412
  br label %1430

1430:                                             ; preds = %1429
  br label %1431

1431:                                             ; preds = %1430
  br label %1432

1432:                                             ; preds = %1431, %1400
  br label %1433

1433:                                             ; preds = %1432
  br label %1434

1434:                                             ; preds = %1433
  %1435 = load ptr, ptr %6, align 8, !tbaa !5
  %1436 = call zeroext i1 @inner_pointed(ptr noundef %1435) #11
  br i1 %1436, label %1437, label %1523

1437:                                             ; preds = %1434
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #9
  %1438 = load ptr, ptr %6, align 8, !tbaa !5
  %1439 = getelementptr inbounds %struct.MDBX_cursor, ptr %1438, i32 0, i32 8
  %1440 = load ptr, ptr %1439, align 8, !tbaa !25
  %1441 = getelementptr inbounds %struct.inner_cursor, ptr %1440, i32 0, i32 0
  store ptr %1441, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #9
  %1442 = load ptr, ptr %32, align 8, !tbaa !5
  %1443 = call i64 @cursor_seek(ptr noundef %1442, ptr noundef %30, ptr noundef null, i32 noundef 17) #12
  store i64 %1443, ptr %33, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %31, ptr align 4 %33, i64 8, i1 false), !tbaa.struct !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #9
  %1444 = getelementptr inbounds %struct.cursor_set_result, ptr %31, i32 0, i32 0
  %1445 = load i32, ptr %1444, align 4, !tbaa !31
  store i32 %1445, ptr %10, align 4, !tbaa !9
  %1446 = getelementptr inbounds %struct.cursor_set_result, ptr %31, i32 0, i32 1
  %1447 = load i8, ptr %1446, align 4, !tbaa !38, !range !39, !noundef !40
  %1448 = trunc i8 %1447 to i1
  br i1 %1448, label %1449, label %1500

1449:                                             ; preds = %1437
  br label %1450

1450:                                             ; preds = %1449
  %1451 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %1452 = zext i8 %1451 to i32
  %1453 = and i32 %1452, 1
  %1454 = icmp ne i32 %1453, 0
  %1455 = xor i1 %1454, true
  %1456 = xor i1 %1455, true
  %1457 = zext i1 %1456 to i32
  %1458 = sext i32 %1457 to i64
  %1459 = call i64 @llvm.expect.i64(i64 %1458, i64 1)
  %1460 = icmp ne i64 %1459, 0
  br i1 %1460, label %1461, label %1482

1461:                                             ; preds = %1450
  br label %1462

1462:                                             ; preds = %1461
  %1463 = getelementptr inbounds %struct.cursor_set_result, ptr %31, i32 0, i32 0
  %1464 = load i32, ptr %1463, align 4, !tbaa !31
  %1465 = icmp eq i32 %1464, 0
  %1466 = xor i1 %1465, true
  %1467 = xor i1 %1466, true
  %1468 = xor i1 %1467, true
  %1469 = zext i1 %1468 to i32
  %1470 = sext i32 %1469 to i64
  %1471 = call i64 @llvm.expect.i64(i64 %1470, i64 0)
  %1472 = icmp ne i64 %1471, 0
  br i1 %1472, label %1473, label %1479

1473:                                             ; preds = %1462
  %1474 = load ptr, ptr %6, align 8, !tbaa !5
  %1475 = getelementptr inbounds %struct.MDBX_cursor, ptr %1474, i32 0, i32 5
  %1476 = load ptr, ptr %1475, align 8, !tbaa !17
  %1477 = getelementptr inbounds %struct.MDBX_txn, ptr %1476, i32 0, i32 9
  %1478 = load ptr, ptr %1477, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1478, ptr noundef @.str.51, ptr noundef @__func__.cursor_ops, i32 noundef 2258) #10
  unreachable

1479:                                             ; preds = %1462
  br label %1480

1480:                                             ; preds = %1479
  br label %1481

1481:                                             ; preds = %1480
  br label %1482

1482:                                             ; preds = %1481, %1450
  br label %1483

1483:                                             ; preds = %1482
  br label %1484

1484:                                             ; preds = %1483
  %1485 = load i32, ptr %9, align 4, !tbaa !9
  %1486 = icmp eq i32 %1485, 26
  br i1 %1486, label %1487, label %1491

1487:                                             ; preds = %1484
  %1488 = load ptr, ptr %32, align 8, !tbaa !5
  %1489 = load ptr, ptr %8, align 8, !tbaa !5
  %1490 = call i32 @inner_prev(ptr noundef %1488, ptr noundef %1489) #12
  store i32 %1490, ptr %10, align 4, !tbaa !9
  br label %1499

1491:                                             ; preds = %1484
  %1492 = load i32, ptr %9, align 4, !tbaa !9
  %1493 = icmp eq i32 %1492, 30
  br i1 %1493, label %1494, label %1498

1494:                                             ; preds = %1491
  %1495 = load ptr, ptr %32, align 8, !tbaa !5
  %1496 = load ptr, ptr %8, align 8, !tbaa !5
  %1497 = call i32 @inner_next(ptr noundef %1495, ptr noundef %1496) #12
  store i32 %1497, ptr %10, align 4, !tbaa !9
  br label %1498

1498:                                             ; preds = %1494, %1491
  br label %1499

1499:                                             ; preds = %1498, %1487
  br label %1522

1500:                                             ; preds = %1437
  %1501 = load i32, ptr %9, align 4, !tbaa !9
  %1502 = icmp ult i32 %1501, 28
  br i1 %1502, label %1503, label %1513

1503:                                             ; preds = %1500
  %1504 = load i32, ptr %10, align 4, !tbaa !9
  %1505 = icmp eq i32 %1504, -30798
  br i1 %1505, label %1509, label %1506

1506:                                             ; preds = %1503
  %1507 = load i32, ptr %10, align 4, !tbaa !9
  %1508 = icmp eq i32 %1507, 0
  br i1 %1508, label %1509, label %1513

1509:                                             ; preds = %1506, %1503
  %1510 = load ptr, ptr %32, align 8, !tbaa !5
  %1511 = load ptr, ptr %8, align 8, !tbaa !5
  %1512 = call i32 @inner_prev(ptr noundef %1510, ptr noundef %1511) #12
  store i32 %1512, ptr %10, align 4, !tbaa !9
  br label %1521

1513:                                             ; preds = %1506, %1500
  %1514 = load i32, ptr %9, align 4, !tbaa !9
  %1515 = icmp eq i32 %1514, 28
  br i1 %1515, label %1516, label %1520

1516:                                             ; preds = %1513
  %1517 = load i32, ptr %10, align 4, !tbaa !9
  %1518 = icmp eq i32 %1517, 0
  br i1 %1518, label %1519, label %1520

1519:                                             ; preds = %1516
  store i32 -30798, ptr %10, align 4, !tbaa !9
  br label %1520

1520:                                             ; preds = %1519, %1516, %1513
  br label %1521

1521:                                             ; preds = %1520, %1509
  br label %1522

1522:                                             ; preds = %1521, %1499
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #9
  br label %1560

1523:                                             ; preds = %1434
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #9
  %1524 = load ptr, ptr %6, align 8, !tbaa !5
  %1525 = getelementptr inbounds %struct.MDBX_cursor, ptr %1524, i32 0, i32 7
  %1526 = load ptr, ptr %1525, align 8, !tbaa !43
  %1527 = getelementptr inbounds %struct.clc2, ptr %1526, i32 0, i32 1
  %1528 = getelementptr inbounds %struct.clc, ptr %1527, i32 0, i32 0
  %1529 = load ptr, ptr %1528, align 8, !tbaa !44
  %1530 = load ptr, ptr %8, align 8, !tbaa !5
  %1531 = call i32 %1529(ptr noundef %1530, ptr noundef %30)
  store i32 %1531, ptr %34, align 4, !tbaa !9
  %1532 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %1532, label %1533 [
    i32 26, label %1534
    i32 27, label %1539
    i32 28, label %1544
    i32 29, label %1549
    i32 30, label %1554
  ]

1533:                                             ; preds = %1523
  unreachable

1534:                                             ; preds = %1523
  %1535 = load i32, ptr %34, align 4, !tbaa !9
  %1536 = icmp slt i32 %1535, 0
  %1537 = zext i1 %1536 to i64
  %1538 = select i1 %1536, i32 0, i32 -30798
  store i32 %1538, ptr %10, align 4, !tbaa !9
  br label %1559

1539:                                             ; preds = %1523
  %1540 = load i32, ptr %34, align 4, !tbaa !9
  %1541 = icmp sle i32 %1540, 0
  %1542 = zext i1 %1541 to i64
  %1543 = select i1 %1541, i32 0, i32 -30798
  store i32 %1543, ptr %10, align 4, !tbaa !9
  br label %1559

1544:                                             ; preds = %1523
  %1545 = load i32, ptr %34, align 4, !tbaa !9
  %1546 = icmp eq i32 %1545, 0
  %1547 = zext i1 %1546 to i64
  %1548 = select i1 %1546, i32 0, i32 -30798
  store i32 %1548, ptr %10, align 4, !tbaa !9
  br label %1559

1549:                                             ; preds = %1523
  %1550 = load i32, ptr %34, align 4, !tbaa !9
  %1551 = icmp sge i32 %1550, 0
  %1552 = zext i1 %1551 to i64
  %1553 = select i1 %1551, i32 0, i32 -30798
  store i32 %1553, ptr %10, align 4, !tbaa !9
  br label %1559

1554:                                             ; preds = %1523
  %1555 = load i32, ptr %34, align 4, !tbaa !9
  %1556 = icmp sgt i32 %1555, 0
  %1557 = zext i1 %1556 to i64
  %1558 = select i1 %1556, i32 0, i32 -30798
  store i32 %1558, ptr %10, align 4, !tbaa !9
  br label %1559

1559:                                             ; preds = %1554, %1549, %1544, %1539, %1534
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #9
  br label %1560

1560:                                             ; preds = %1559, %1522
  br label %1561

1561:                                             ; preds = %1560, %1389
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #9
  br label %1562

1562:                                             ; preds = %1561
  %1563 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1563, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1564:                                             ; preds = %68, %68, %68, %68, %68
  %1565 = load ptr, ptr %7, align 8, !tbaa !5
  %1566 = icmp eq ptr %1565, null
  br i1 %1566, label %1570, label %1567

1567:                                             ; preds = %1564
  %1568 = load ptr, ptr %8, align 8, !tbaa !5
  %1569 = icmp eq ptr %1568, null
  br label %1570

1570:                                             ; preds = %1567, %1564
  %1571 = phi i1 [ true, %1564 ], [ %1569, %1567 ]
  %1572 = xor i1 %1571, true
  %1573 = xor i1 %1572, true
  %1574 = zext i1 %1573 to i32
  %1575 = sext i32 %1574 to i64
  %1576 = call i64 @llvm.expect.i64(i64 %1575, i64 0)
  %1577 = icmp ne i64 %1576, 0
  br i1 %1577, label %1578, label %1579

1578:                                             ; preds = %1570
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1579:                                             ; preds = %1570
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #9
  %1580 = load ptr, ptr %8, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %35, ptr align 8 %1580, i64 16, i1 false), !tbaa.struct !29
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #9
  %1581 = load ptr, ptr %6, align 8, !tbaa !5
  %1582 = load ptr, ptr %7, align 8, !tbaa !5
  %1583 = load ptr, ptr %8, align 8, !tbaa !5
  %1584 = call i64 @cursor_seek(ptr noundef %1581, ptr noundef %1582, ptr noundef %1583, i32 noundef 17) #12
  store i64 %1584, ptr %36, align 4
  %1585 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 0
  %1586 = load i32, ptr %1585, align 4, !tbaa !31
  store i32 %1586, ptr %10, align 4, !tbaa !9
  %1587 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 1
  %1588 = load i8, ptr %1587, align 4, !tbaa !38, !range !39, !noundef !40
  %1589 = trunc i8 %1588 to i1
  br i1 %1589, label %1590, label %1783

1590:                                             ; preds = %1579
  br label %1591

1591:                                             ; preds = %1590
  %1592 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %1593 = zext i8 %1592 to i32
  %1594 = and i32 %1593, 1
  %1595 = icmp ne i32 %1594, 0
  %1596 = xor i1 %1595, true
  %1597 = xor i1 %1596, true
  %1598 = zext i1 %1597 to i32
  %1599 = sext i32 %1598 to i64
  %1600 = call i64 @llvm.expect.i64(i64 %1599, i64 1)
  %1601 = icmp ne i64 %1600, 0
  br i1 %1601, label %1602, label %1623

1602:                                             ; preds = %1591
  br label %1603

1603:                                             ; preds = %1602
  %1604 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 0
  %1605 = load i32, ptr %1604, align 4, !tbaa !31
  %1606 = icmp eq i32 %1605, 0
  %1607 = xor i1 %1606, true
  %1608 = xor i1 %1607, true
  %1609 = xor i1 %1608, true
  %1610 = zext i1 %1609 to i32
  %1611 = sext i32 %1610 to i64
  %1612 = call i64 @llvm.expect.i64(i64 %1611, i64 0)
  %1613 = icmp ne i64 %1612, 0
  br i1 %1613, label %1614, label %1620

1614:                                             ; preds = %1603
  %1615 = load ptr, ptr %6, align 8, !tbaa !5
  %1616 = getelementptr inbounds %struct.MDBX_cursor, ptr %1615, i32 0, i32 5
  %1617 = load ptr, ptr %1616, align 8, !tbaa !17
  %1618 = getelementptr inbounds %struct.MDBX_txn, ptr %1617, i32 0, i32 9
  %1619 = load ptr, ptr %1618, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1619, ptr noundef @.str.51, ptr noundef @__func__.cursor_ops, i32 noundef 2305) #10
  unreachable

1620:                                             ; preds = %1603
  br label %1621

1621:                                             ; preds = %1620
  br label %1622

1622:                                             ; preds = %1621
  br label %1623

1623:                                             ; preds = %1622, %1591
  br label %1624

1624:                                             ; preds = %1623
  br label %1625

1625:                                             ; preds = %1624
  %1626 = load ptr, ptr %6, align 8, !tbaa !5
  %1627 = call zeroext i1 @inner_pointed(ptr noundef %1626) #11
  br i1 %1627, label %1628, label %1729

1628:                                             ; preds = %1625
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #9
  %1629 = load ptr, ptr %6, align 8, !tbaa !5
  %1630 = getelementptr inbounds %struct.MDBX_cursor, ptr %1629, i32 0, i32 8
  %1631 = load ptr, ptr %1630, align 8, !tbaa !25
  %1632 = getelementptr inbounds %struct.inner_cursor, ptr %1631, i32 0, i32 0
  store ptr %1632, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #9
  %1633 = load ptr, ptr %37, align 8, !tbaa !5
  %1634 = call i64 @cursor_seek(ptr noundef %1633, ptr noundef %35, ptr noundef null, i32 noundef 17) #12
  store i64 %1634, ptr %38, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %36, ptr align 4 %38, i64 8, i1 false), !tbaa.struct !41
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #9
  %1635 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 0
  %1636 = load i32, ptr %1635, align 4, !tbaa !31
  store i32 %1636, ptr %10, align 4, !tbaa !9
  %1637 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 1
  %1638 = load i8, ptr %1637, align 4, !tbaa !38, !range !39, !noundef !40
  %1639 = trunc i8 %1638 to i1
  br i1 %1639, label %1640, label %1693

1640:                                             ; preds = %1628
  br label %1641

1641:                                             ; preds = %1640
  %1642 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %1643 = zext i8 %1642 to i32
  %1644 = and i32 %1643, 1
  %1645 = icmp ne i32 %1644, 0
  %1646 = xor i1 %1645, true
  %1647 = xor i1 %1646, true
  %1648 = zext i1 %1647 to i32
  %1649 = sext i32 %1648 to i64
  %1650 = call i64 @llvm.expect.i64(i64 %1649, i64 1)
  %1651 = icmp ne i64 %1650, 0
  br i1 %1651, label %1652, label %1673

1652:                                             ; preds = %1641
  br label %1653

1653:                                             ; preds = %1652
  %1654 = getelementptr inbounds %struct.cursor_set_result, ptr %36, i32 0, i32 0
  %1655 = load i32, ptr %1654, align 4, !tbaa !31
  %1656 = icmp eq i32 %1655, 0
  %1657 = xor i1 %1656, true
  %1658 = xor i1 %1657, true
  %1659 = xor i1 %1658, true
  %1660 = zext i1 %1659 to i32
  %1661 = sext i32 %1660 to i64
  %1662 = call i64 @llvm.expect.i64(i64 %1661, i64 0)
  %1663 = icmp ne i64 %1662, 0
  br i1 %1663, label %1664, label %1670

1664:                                             ; preds = %1653
  %1665 = load ptr, ptr %6, align 8, !tbaa !5
  %1666 = getelementptr inbounds %struct.MDBX_cursor, ptr %1665, i32 0, i32 5
  %1667 = load ptr, ptr %1666, align 8, !tbaa !17
  %1668 = getelementptr inbounds %struct.MDBX_txn, ptr %1667, i32 0, i32 9
  %1669 = load ptr, ptr %1668, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %1669, ptr noundef @.str.51, ptr noundef @__func__.cursor_ops, i32 noundef 2311) #10
  unreachable

1670:                                             ; preds = %1653
  br label %1671

1671:                                             ; preds = %1670
  br label %1672

1672:                                             ; preds = %1671
  br label %1673

1673:                                             ; preds = %1672, %1641
  br label %1674

1674:                                             ; preds = %1673
  br label %1675

1675:                                             ; preds = %1674
  %1676 = load i32, ptr %9, align 4, !tbaa !9
  %1677 = icmp eq i32 %1676, 31
  br i1 %1677, label %1678, label %1683

1678:                                             ; preds = %1675
  %1679 = load ptr, ptr %6, align 8, !tbaa !5
  %1680 = load ptr, ptr %7, align 8, !tbaa !5
  %1681 = load ptr, ptr %8, align 8, !tbaa !5
  %1682 = call i32 @outer_prev(ptr noundef %1679, ptr noundef %1680, ptr noundef %1681, i32 noundef 12) #12
  store i32 %1682, ptr %10, align 4, !tbaa !9
  br label %1692

1683:                                             ; preds = %1675
  %1684 = load i32, ptr %9, align 4, !tbaa !9
  %1685 = icmp eq i32 %1684, 35
  br i1 %1685, label %1686, label %1691

1686:                                             ; preds = %1683
  %1687 = load ptr, ptr %6, align 8, !tbaa !5
  %1688 = load ptr, ptr %7, align 8, !tbaa !5
  %1689 = load ptr, ptr %8, align 8, !tbaa !5
  %1690 = call i32 @outer_next(ptr noundef %1687, ptr noundef %1688, ptr noundef %1689, i32 noundef 8) #12
  store i32 %1690, ptr %10, align 4, !tbaa !9
  br label %1691

1691:                                             ; preds = %1686, %1683
  br label %1692

1692:                                             ; preds = %1691, %1678
  br label %1728

1693:                                             ; preds = %1628
  %1694 = load i32, ptr %9, align 4, !tbaa !9
  %1695 = icmp ult i32 %1694, 33
  br i1 %1695, label %1696, label %1707

1696:                                             ; preds = %1693
  %1697 = load i32, ptr %10, align 4, !tbaa !9
  %1698 = icmp eq i32 %1697, -30798
  br i1 %1698, label %1702, label %1699

1699:                                             ; preds = %1696
  %1700 = load i32, ptr %10, align 4, !tbaa !9
  %1701 = icmp eq i32 %1700, 0
  br i1 %1701, label %1702, label %1707

1702:                                             ; preds = %1699, %1696
  %1703 = load ptr, ptr %6, align 8, !tbaa !5
  %1704 = load ptr, ptr %7, align 8, !tbaa !5
  %1705 = load ptr, ptr %8, align 8, !tbaa !5
  %1706 = call i32 @outer_prev(ptr noundef %1703, ptr noundef %1704, ptr noundef %1705, i32 noundef 12) #12
  store i32 %1706, ptr %10, align 4, !tbaa !9
  br label %1727

1707:                                             ; preds = %1699, %1693
  %1708 = load i32, ptr %9, align 4, !tbaa !9
  %1709 = icmp eq i32 %1708, 33
  br i1 %1709, label %1710, label %1714

1710:                                             ; preds = %1707
  %1711 = load i32, ptr %10, align 4, !tbaa !9
  %1712 = icmp eq i32 %1711, 0
  br i1 %1712, label %1713, label %1714

1713:                                             ; preds = %1710
  store i32 -30798, ptr %10, align 4, !tbaa !9
  br label %1726

1714:                                             ; preds = %1710, %1707
  %1715 = load i32, ptr %9, align 4, !tbaa !9
  %1716 = icmp ugt i32 %1715, 33
  br i1 %1716, label %1717, label %1725

1717:                                             ; preds = %1714
  %1718 = load i32, ptr %10, align 4, !tbaa !9
  %1719 = icmp eq i32 %1718, -30798
  br i1 %1719, label %1720, label %1725

1720:                                             ; preds = %1717
  %1721 = load ptr, ptr %6, align 8, !tbaa !5
  %1722 = load ptr, ptr %7, align 8, !tbaa !5
  %1723 = load ptr, ptr %8, align 8, !tbaa !5
  %1724 = call i32 @outer_next(ptr noundef %1721, ptr noundef %1722, ptr noundef %1723, i32 noundef 8) #12
  store i32 %1724, ptr %10, align 4, !tbaa !9
  br label %1725

1725:                                             ; preds = %1720, %1717, %1714
  br label %1726

1726:                                             ; preds = %1725, %1713
  br label %1727

1727:                                             ; preds = %1726, %1702
  br label %1728

1728:                                             ; preds = %1727, %1692
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #9
  br label %1782

1729:                                             ; preds = %1625
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #9
  %1730 = load ptr, ptr %6, align 8, !tbaa !5
  %1731 = getelementptr inbounds %struct.MDBX_cursor, ptr %1730, i32 0, i32 7
  %1732 = load ptr, ptr %1731, align 8, !tbaa !43
  %1733 = getelementptr inbounds %struct.clc2, ptr %1732, i32 0, i32 1
  %1734 = getelementptr inbounds %struct.clc, ptr %1733, i32 0, i32 0
  %1735 = load ptr, ptr %1734, align 8, !tbaa !44
  %1736 = load ptr, ptr %8, align 8, !tbaa !5
  %1737 = call i32 %1735(ptr noundef %1736, ptr noundef %35)
  store i32 %1737, ptr %39, align 4, !tbaa !9
  %1738 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %1738, label %1739 [
    i32 31, label %1740
    i32 32, label %1749
    i32 33, label %1758
    i32 34, label %1763
    i32 35, label %1772
  ]

1739:                                             ; preds = %1729
  unreachable

1740:                                             ; preds = %1729
  %1741 = load i32, ptr %39, align 4, !tbaa !9
  %1742 = icmp sge i32 %1741, 0
  br i1 %1742, label %1743, label %1748

1743:                                             ; preds = %1740
  %1744 = load ptr, ptr %6, align 8, !tbaa !5
  %1745 = load ptr, ptr %7, align 8, !tbaa !5
  %1746 = load ptr, ptr %8, align 8, !tbaa !5
  %1747 = call i32 @outer_prev(ptr noundef %1744, ptr noundef %1745, ptr noundef %1746, i32 noundef 12) #12
  store i32 %1747, ptr %10, align 4, !tbaa !9
  br label %1748

1748:                                             ; preds = %1743, %1740
  br label %1781

1749:                                             ; preds = %1729
  %1750 = load i32, ptr %39, align 4, !tbaa !9
  %1751 = icmp sgt i32 %1750, 0
  br i1 %1751, label %1752, label %1757

1752:                                             ; preds = %1749
  %1753 = load ptr, ptr %6, align 8, !tbaa !5
  %1754 = load ptr, ptr %7, align 8, !tbaa !5
  %1755 = load ptr, ptr %8, align 8, !tbaa !5
  %1756 = call i32 @outer_prev(ptr noundef %1753, ptr noundef %1754, ptr noundef %1755, i32 noundef 12) #12
  store i32 %1756, ptr %10, align 4, !tbaa !9
  br label %1757

1757:                                             ; preds = %1752, %1749
  br label %1781

1758:                                             ; preds = %1729
  %1759 = load i32, ptr %39, align 4, !tbaa !9
  %1760 = icmp eq i32 %1759, 0
  %1761 = zext i1 %1760 to i64
  %1762 = select i1 %1760, i32 0, i32 -30798
  store i32 %1762, ptr %10, align 4, !tbaa !9
  br label %1781

1763:                                             ; preds = %1729
  %1764 = load i32, ptr %39, align 4, !tbaa !9
  %1765 = icmp slt i32 %1764, 0
  br i1 %1765, label %1766, label %1771

1766:                                             ; preds = %1763
  %1767 = load ptr, ptr %6, align 8, !tbaa !5
  %1768 = load ptr, ptr %7, align 8, !tbaa !5
  %1769 = load ptr, ptr %8, align 8, !tbaa !5
  %1770 = call i32 @outer_next(ptr noundef %1767, ptr noundef %1768, ptr noundef %1769, i32 noundef 8) #12
  store i32 %1770, ptr %10, align 4, !tbaa !9
  br label %1771

1771:                                             ; preds = %1766, %1763
  br label %1781

1772:                                             ; preds = %1729
  %1773 = load i32, ptr %39, align 4, !tbaa !9
  %1774 = icmp sle i32 %1773, 0
  br i1 %1774, label %1775, label %1780

1775:                                             ; preds = %1772
  %1776 = load ptr, ptr %6, align 8, !tbaa !5
  %1777 = load ptr, ptr %7, align 8, !tbaa !5
  %1778 = load ptr, ptr %8, align 8, !tbaa !5
  %1779 = call i32 @outer_next(ptr noundef %1776, ptr noundef %1777, ptr noundef %1778, i32 noundef 8) #12
  store i32 %1779, ptr %10, align 4, !tbaa !9
  br label %1780

1780:                                             ; preds = %1775, %1772
  br label %1781

1781:                                             ; preds = %1780, %1771, %1758, %1757, %1748
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #9
  br label %1782

1782:                                             ; preds = %1781, %1728
  br label %1806

1783:                                             ; preds = %1579
  %1784 = load i32, ptr %9, align 4, !tbaa !9
  %1785 = icmp ult i32 %1784, 33
  br i1 %1785, label %1786, label %1797

1786:                                             ; preds = %1783
  %1787 = load i32, ptr %10, align 4, !tbaa !9
  %1788 = icmp eq i32 %1787, -30798
  br i1 %1788, label %1792, label %1789

1789:                                             ; preds = %1786
  %1790 = load i32, ptr %10, align 4, !tbaa !9
  %1791 = icmp eq i32 %1790, 0
  br i1 %1791, label %1792, label %1797

1792:                                             ; preds = %1789, %1786
  %1793 = load ptr, ptr %6, align 8, !tbaa !5
  %1794 = load ptr, ptr %7, align 8, !tbaa !5
  %1795 = load ptr, ptr %8, align 8, !tbaa !5
  %1796 = call i32 @outer_prev(ptr noundef %1793, ptr noundef %1794, ptr noundef %1795, i32 noundef 14) #12
  store i32 %1796, ptr %10, align 4, !tbaa !9
  br label %1805

1797:                                             ; preds = %1789, %1783
  %1798 = load i32, ptr %9, align 4, !tbaa !9
  %1799 = icmp eq i32 %1798, 33
  br i1 %1799, label %1800, label %1804

1800:                                             ; preds = %1797
  %1801 = load i32, ptr %10, align 4, !tbaa !9
  %1802 = icmp eq i32 %1801, 0
  br i1 %1802, label %1803, label %1804

1803:                                             ; preds = %1800
  store i32 -30798, ptr %10, align 4, !tbaa !9
  br label %1804

1804:                                             ; preds = %1803, %1800, %1797
  br label %1805

1805:                                             ; preds = %1804, %1792
  br label %1806

1806:                                             ; preds = %1805, %1782
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #9
  br label %1807

1807:                                             ; preds = %1806
  %1808 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %1808, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1809:                                             ; preds = %68
  br label %1810

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

1820:                                             ; preds = %1810
  %1821 = load i32, ptr %9, align 4, !tbaa !9
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.cursor_ops, i32 noundef 2356, ptr noundef @.str.124, i32 noundef %1821)
  br label %1822

1822:                                             ; preds = %1820, %1810
  br label %1823

1823:                                             ; preds = %1822
  br label %1824

1824:                                             ; preds = %1823
  store i32 22, ptr %5, align 4
  store i32 1, ptr %11, align 4
  br label %1825

1825:                                             ; preds = %1824, %1807, %1578, %1562, %1388, %1372, %1284, %1273, %1132, %1117, %1049, %1038, %1024, %1019, %1013, %990, %988, %972, %956, %944, %876, %834, %820, %808, %770, %769, %689, %678, %662, %649, %633, %621, %407, %396, %384, %374, %174, %155, %145, %122
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #9
  %1826 = load i32, ptr %5, align 4
  ret i32 %1826
}

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

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

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

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

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden { ptr, i64 } @page_dupfix_key(ptr noundef, i64 noundef, i64 noundef) #2

; Function Attrs: inlinehint nounwind willreturn memory(read) uwtable
declare hidden { ptr, i64 } @get_key(ptr noundef) #2

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @get_key_optional(ptr noundef, ptr noundef) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @__Wpedantic_format_voidptr(ptr noundef) #8

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !7, i64 26}
!12 = !{!"libmdbx_globals", !7, i64 0, !10, i64 16, !10, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !13, i64 27, !10, i64 28, !7, i64 32, !7, i64 40, !14, i64 80, !6, i64 88}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = !{!7, !7, i64 0}
!16 = !{!12, !7, i64 25}
!17 = !{!18, !6, i64 16}
!18 = !{!"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}
!19 = !{!20, !6, i64 80}
!20 = !{!"MDBX_txn", !10, i64 0, !10, i64 4, !14, i64 8, !14, i64 16, !6, i64 24, !6, i64 32, !21, i64 40, !14, i64 64, !14, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !23, i64 128, !6, i64 160, !7, i64 168}
!21 = !{!"geo", !22, i64 0, !22, i64 2, !10, i64 4, !10, i64 8, !7, i64 12, !7, i64 16}
!22 = !{!"short", !7, i64 0}
!23 = !{!"MDBX_canary", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!24 = !{!22, !22, i64 0}
!25 = !{!18, !6, i64 40}
!26 = !{!18, !6, i64 24}
!27 = !{!28, !10, i64 4}
!28 = !{!"tree", !22, i64 0, !22, i64 2, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !14, i64 24, !14, i64 32, !14, i64 40}
!29 = !{i64 0, i64 8, !5, i64 8, i64 8, !30}
!30 = !{!14, !14, i64 0}
!31 = !{!32, !10, i64 0}
!32 = !{!"cursor_set_result", !10, i64 0, !13, i64 4}
!33 = !{!28, !14, i64 32}
!34 = !{!28, !22, i64 0}
!35 = !{!36, !14, i64 8}
!36 = !{!"iovec", !6, i64 0, !14, i64 8}
!37 = !{!36, !6, i64 0}
!38 = !{!32, !13, i64 4}
!39 = !{i8 0, i8 2}
!40 = !{}
!41 = !{i64 0, i64 4, !9, i64 4, i64 1, !42}
!42 = !{!13, !13, i64 0}
!43 = !{!18, !6, i64 32}
!44 = !{!45, !6, i64 24}
!45 = !{!"clc2", !46, i64 0, !46, i64 24}
!46 = !{!"clc", !6, i64 0, !14, i64 8, !14, i64 16}


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

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.5 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [19 x i8], align 1
@__func__.cursor_ops = external hidden unnamed_addr constant [11 x i8], align 1
@.str.117 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.118 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.119 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.120 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.121 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.122 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.123 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.124 = external hidden unnamed_addr constant [45 x i8], align 1

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

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

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

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

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

; 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 #1

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

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

; Function Attrs: cold nounwind optsize uwtable
declare hidden i32 @unexpected_dupsort(ptr noundef) local_unnamed_addr #4

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

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

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

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

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

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

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

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

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

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

; Function Attrs: hot nounwind uwtable
define dso_local i32 @cursor_ops(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) local_unnamed_addr #6 {
  %5 = alloca %struct.iovec, align 8
  %6 = alloca %struct.iovec, align 8
  %7 = alloca %struct.iovec, align 8
  %.not = icmp ne i32 %3, 4
  %8 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2
  %9 = icmp ugt i8 %8, 4
  %or.cond461 = select i1 %.not, i1 %9, i1 false
  br i1 %or.cond461, label %10, label %17, !prof !5

10:                                               ; preds = %4
  %11 = tail call ptr @__Wpedantic_format_voidptr(ptr noundef %0)
  %12 = getelementptr inbounds i8, ptr %0, i64 4
  %13 = load i8, ptr %12, align 4, !tbaa !6
  %14 = sext i8 %13 to i32
  %15 = tail call ptr @__Wpedantic_format_voidptr(ptr noundef %1)
  %16 = tail call ptr @__Wpedantic_format_voidptr(ptr noundef %2)
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2008, ptr noundef nonnull @.str.117, ptr noundef %11, i32 noundef %14, i32 noundef %3, ptr noundef %15, ptr noundef %16) #8
  br label %17

17:                                               ; preds = %10, %4
  switch i32 %3, label %593 [
    i32 4, label %18
    i32 2, label %137
    i32 3, label %137
    i32 15, label %143
    i32 16, label %143
    i32 17, label %143
    i32 36, label %199
    i32 5, label %202
    i32 10, label %254
    i32 18, label %303
    i32 9, label %315
    i32 8, label %315
    i32 11, label %315
    i32 13, label %323
    i32 12, label %323
    i32 14, label %323
    i32 0, label %325
    i32 6, label %327
    i32 7, label %329
    i32 1, label %329
    i32 20, label %363
    i32 19, label %363
    i32 21, label %420
    i32 22, label %420
    i32 23, label %420
    i32 24, label %420
    i32 25, label %420
    i32 26, label %446
    i32 27, label %446
    i32 28, label %446
    i32 29, label %446
    i32 30, label %446
    i32 31, label %511
    i32 32, label %511
    i32 33, label %511
    i32 34, label %511
    i32 35, label %511
  ]

18:                                               ; preds = %17
  %19 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %20 = and i8 %19, 1
  %.not450 = icmp eq i8 %20, 0
  br i1 %.not450, label %30, label %21, !prof !15

21:                                               ; preds = %18
  %22 = getelementptr inbounds i8, ptr %0, i64 4
  %23 = load i8, ptr %22, align 4, !tbaa !6
  %24 = and i8 %23, 1
  %.not451 = icmp eq i8 %24, 0
  br i1 %.not451, label %30, label %25, !prof !16

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %0, i64 16
  %27 = load ptr, ptr %26, align 8, !tbaa !17
  %28 = getelementptr inbounds i8, ptr %27, i64 80
  %29 = load ptr, ptr %28, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %29, ptr noundef nonnull @.str.90, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2013) #9
  unreachable

30:                                               ; preds = %21, %18
  %31 = tail call zeroext i1 @is_filled(ptr noundef %0) #10
  br i1 %31, label %46, label %32, !prof !16

32:                                               ; preds = %30
  %33 = tail call zeroext i1 @is_hollow(ptr noundef %0) #10
  br i1 %33, label %.critedge463, label %34

34:                                               ; preds = %32
  %35 = getelementptr inbounds i8, ptr %0, i64 304
  %36 = getelementptr inbounds i8, ptr %0, i64 5
  %37 = load i8, ptr %36, align 1, !tbaa !6
  %38 = sext i8 %37 to i64
  %39 = getelementptr inbounds [32 x i16], ptr %35, i64 0, i64 %38
  %40 = load i16, ptr %39, align 2, !tbaa !24
  %41 = zext i16 %40 to i64
  %42 = getelementptr inbounds i8, ptr %0, i64 48
  %43 = getelementptr inbounds [32 x ptr], ptr %42, i64 0, i64 %38
  %44 = load ptr, ptr %43, align 8, !tbaa !25
  %45 = tail call i64 @page_numkeys(ptr noundef %44) #10
  %.not452 = icmp ugt i64 %45, %41
  br i1 %.not452, label %46, label %.critedge463

46:                                               ; preds = %34, %30
  %47 = getelementptr inbounds i8, ptr %0, i64 4
  %48 = load i8, ptr %47, align 4, !tbaa !6
  %49 = and i8 %48, 8
  %.not453 = icmp eq i8 %49, 0
  br i1 %.not453, label %52, label %50

50:                                               ; preds = %46
  %51 = tail call i32 @outer_next(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, i32 noundef 11) #11
  br label %.critedge463

52:                                               ; preds = %46
  %53 = tail call zeroext i1 @inner_pointed(ptr noundef nonnull %0) #10
  br i1 %53, label %54, label %62

54:                                               ; preds = %52
  %55 = getelementptr inbounds i8, ptr %0, i64 40
  %56 = load ptr, ptr %55, align 8, !tbaa !26
  %57 = getelementptr inbounds i8, ptr %56, i64 4
  %58 = load i8, ptr %57, align 4, !tbaa !6
  %59 = and i8 %58, 8
  %.not454 = icmp eq i8 %59, 0
  br i1 %.not454, label %62, label %60

60:                                               ; preds = %54
  %61 = tail call i32 @outer_next(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, i32 noundef 9) #11
  br label %.critedge463

62:                                               ; preds = %54, %52
  %63 = getelementptr inbounds i8, ptr %0, i64 48
  %64 = getelementptr inbounds i8, ptr %0, i64 5
  %65 = load i8, ptr %64, align 1, !tbaa !6
  %66 = sext i8 %65 to i64
  %67 = getelementptr inbounds [32 x ptr], ptr %63, i64 0, i64 %66
  %68 = load ptr, ptr %67, align 8, !tbaa !25
  %69 = getelementptr inbounds i8, ptr %0, i64 304
  %70 = getelementptr inbounds [32 x i16], ptr %69, i64 0, i64 %66
  %71 = load i16, ptr %70, align 2, !tbaa !24
  %72 = zext i16 %71 to i64
  %73 = tail call ptr @page_node(ptr noundef %68, i64 noundef %72) #10
  tail call void @get_key_optional(ptr noundef %73, ptr noundef %1)
  %.not455 = icmp eq ptr %2, null
  br i1 %.not455, label %.critedge463, label %74

74:                                               ; preds = %62
  %75 = tail call zeroext i8 @node_flags(ptr noundef %73) #10
  %76 = and i8 %75, 4
  %.not456 = icmp eq i8 %76, 0
  br i1 %.not456, label %121, label %77

77:                                               ; preds = %74
  %78 = getelementptr inbounds i8, ptr %0, i64 40
  %79 = load ptr, ptr %78, align 8, !tbaa !26
  %.not458 = icmp eq ptr %79, null
  br i1 %.not458, label %80, label %82, !prof !15

80:                                               ; preds = %77
  %81 = tail call i32 @unexpected_dupsort(ptr noundef nonnull %0) #12
  br label %.critedge463

82:                                               ; preds = %77
  %83 = tail call zeroext i1 @is_filled(ptr noundef nonnull %79) #10
  br i1 %83, label %._crit_edge, label %84, !prof !16

._crit_edge:                                      ; preds = %82
  %.phi.trans.insert = getelementptr inbounds i8, ptr %79, i64 5
  %.pre = load i8, ptr %.phi.trans.insert, align 1, !tbaa !6
  %.pre492 = sext i8 %.pre to i64
  br label %98

84:                                               ; preds = %82
  %85 = tail call zeroext i1 @is_hollow(ptr noundef nonnull %79) #10
  br i1 %85, label %.critedge463, label %86

86:                                               ; preds = %84
  %87 = getelementptr inbounds i8, ptr %79, i64 304
  %88 = getelementptr inbounds i8, ptr %79, i64 5
  %89 = load i8, ptr %88, align 1, !tbaa !6
  %90 = sext i8 %89 to i64
  %91 = getelementptr inbounds [32 x i16], ptr %87, i64 0, i64 %90
  %92 = load i16, ptr %91, align 2, !tbaa !24
  %93 = zext i16 %92 to i64
  %94 = getelementptr inbounds i8, ptr %79, i64 48
  %95 = getelementptr inbounds [32 x ptr], ptr %94, i64 0, i64 %90
  %96 = load ptr, ptr %95, align 8, !tbaa !25
  %97 = tail call i64 @page_numkeys(ptr noundef %96) #10
  %.not459 = icmp ugt i64 %97, %93
  br i1 %.not459, label %98, label %.critedge463

98:                                               ; preds = %._crit_edge, %86
  %.pre-phi = phi i64 [ %.pre492, %._crit_edge ], [ %90, %86 ]
  %99 = getelementptr inbounds i8, ptr %79, i64 48
  %100 = getelementptr inbounds [32 x ptr], ptr %99, i64 0, i64 %.pre-phi
  %101 = load ptr, ptr %100, align 8, !tbaa !25
  %102 = tail call zeroext i1 @is_dupfix_leaf(ptr noundef %101) #10
  %103 = getelementptr inbounds i8, ptr %79, i64 304
  %104 = getelementptr inbounds [32 x i16], ptr %103, i64 0, i64 %.pre-phi
  %105 = load i16, ptr %104, align 2, !tbaa !24
  %106 = zext i16 %105 to i64
  br i1 %102, label %107, label %116

107:                                              ; preds = %98
  %108 = getelementptr inbounds i8, ptr %79, i64 24
  %109 = load ptr, ptr %108, align 8, !tbaa !27
  %110 = getelementptr inbounds i8, ptr %109, i64 4
  %111 = load i32, ptr %110, align 4, !tbaa !28
  %112 = zext i32 %111 to i64
  %113 = tail call { ptr, i64 } @page_dupfix_key(ptr noundef %101, i64 noundef %106, i64 noundef %112) #10
  %114 = extractvalue { ptr, i64 } %113, 0
  %115 = extractvalue { ptr, i64 } %113, 1
  store ptr %114, ptr %2, align 8, !tbaa !25
  %.sroa.495.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 8
  store i64 %115, ptr %.sroa.495.0..sroa_idx, align 8, !tbaa !30
  br label %.critedge463

116:                                              ; preds = %98
  %117 = tail call ptr @page_node(ptr noundef %101, i64 noundef %106) #10
  %118 = tail call { ptr, i64 } @get_key(ptr noundef %117) #10
  %119 = extractvalue { ptr, i64 } %118, 0
  %120 = extractvalue { ptr, i64 } %118, 1
  store ptr %119, ptr %2, align 8, !tbaa !25
  %.sroa.493.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 8
  store i64 %120, ptr %.sroa.493.0..sroa_idx, align 8, !tbaa !30
  br label %.critedge463

121:                                              ; preds = %74
  %122 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %123 = and i8 %122, 1
  %.not457 = icmp eq i8 %123, 0
  br i1 %.not457, label %131, label %124, !prof !15

124:                                              ; preds = %121
  %125 = tail call zeroext i1 @inner_pointed(ptr noundef nonnull %0) #10
  br i1 %125, label %126, label %131, !prof !15

126:                                              ; preds = %124
  %127 = getelementptr inbounds i8, ptr %0, i64 16
  %128 = load ptr, ptr %127, align 8, !tbaa !17
  %129 = getelementptr inbounds i8, ptr %128, i64 80
  %130 = load ptr, ptr %129, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %130, ptr noundef nonnull @.str.99, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2047) #9
  unreachable

131:                                              ; preds = %124, %121
  %132 = load i8, ptr %64, align 1, !tbaa !6
  %133 = sext i8 %132 to i64
  %134 = getelementptr inbounds [32 x ptr], ptr %63, i64 0, i64 %133
  %135 = load ptr, ptr %134, align 8, !tbaa !25
  %136 = tail call i32 @node_read(ptr noundef nonnull %0, ptr noundef %73, ptr noundef nonnull %2, ptr noundef %135)
  br label %.critedge463

137:                                              ; preds = %17, %17
  %138 = icmp eq ptr %2, null
  br i1 %138, label %.critedge463, label %139, !prof !15

139:                                              ; preds = %137
  %140 = getelementptr inbounds i8, ptr %0, i64 40
  %141 = load ptr, ptr %140, align 8, !tbaa !26
  %142 = icmp eq ptr %141, null
  br i1 %142, label %.critedge463, label %143, !prof !15

143:                                              ; preds = %139, %17, %17, %17
  %144 = icmp eq ptr %1, null
  br i1 %144, label %.critedge463, label %145, !prof !15

145:                                              ; preds = %143
  %146 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef %3) #11
  %.sroa.090.0.extract.trunc = trunc i64 %146 to i32
  switch i32 %.sroa.090.0.extract.trunc, label %188 [
    i32 0, label %147
    i32 -30798, label %157
  ]

147:                                              ; preds = %145
  %148 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %149 = and i8 %148, 1
  %.not449 = icmp eq i8 %149, 0
  br i1 %.not449, label %.critedge463, label %150, !prof !15

150:                                              ; preds = %147
  %151 = tail call zeroext i1 @is_filled(ptr noundef %0) #10
  br i1 %151, label %.critedge463, label %152, !prof !16

152:                                              ; preds = %150
  %153 = getelementptr inbounds i8, ptr %0, i64 16
  %154 = load ptr, ptr %153, align 8, !tbaa !17
  %155 = getelementptr inbounds i8, ptr %154, i64 80
  %156 = load ptr, ptr %155, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %156, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2067) #9
  unreachable

157:                                              ; preds = %145
  %158 = getelementptr inbounds i8, ptr %0, i64 24
  %159 = load ptr, ptr %158, align 8, !tbaa !27
  %160 = getelementptr inbounds i8, ptr %159, i64 32
  %161 = load i64, ptr %160, align 4, !tbaa !31
  %.not444 = icmp eq i64 %161, 0
  br i1 %.not444, label %188, label %162

162:                                              ; preds = %157
  %163 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %164 = and i8 %163, 1
  %.not446 = icmp eq i8 %164, 0
  br i1 %.not446, label %.critedge463, label %165, !prof !15

165:                                              ; preds = %162
  %166 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %0) #10
  br i1 %166, label %172, label %167, !prof !16

167:                                              ; preds = %165
  %168 = getelementptr inbounds i8, ptr %0, i64 16
  %169 = load ptr, ptr %168, align 8, !tbaa !17
  %170 = getelementptr inbounds i8, ptr %169, i64 80
  %171 = load ptr, ptr %170, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %171, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2069) #9
  unreachable

172:                                              ; preds = %165
  switch i32 %3, label %173 [
    i32 3, label %.critedge463
    i32 17, label %181
  ], !prof !32

173:                                              ; preds = %172
  %174 = tail call zeroext i1 @is_hollow(ptr noundef nonnull %0) #10
  br i1 %174, label %.critedge, label %175, !prof !16

175:                                              ; preds = %173
  %176 = getelementptr inbounds i8, ptr %0, i64 16
  %177 = load ptr, ptr %176, align 8, !tbaa !17
  %178 = getelementptr inbounds i8, ptr %177, i64 80
  %179 = load ptr, ptr %178, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %179, ptr noundef nonnull @.str.118, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2070) #9
  unreachable

.critedge:                                        ; preds = %173
  %180 = icmp eq i32 %3, 3
  br i1 %180, label %.critedge463, label %181, !prof !33

181:                                              ; preds = %172, %.critedge
  %182 = tail call zeroext i1 @inner_hollow(ptr noundef nonnull %0) #10
  br i1 %182, label %.critedge463, label %183, !prof !16

183:                                              ; preds = %181
  %184 = getelementptr inbounds i8, ptr %0, i64 16
  %185 = load ptr, ptr %184, align 8, !tbaa !17
  %186 = getelementptr inbounds i8, ptr %185, i64 80
  %187 = load ptr, ptr %186, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %187, ptr noundef nonnull @.str.119, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2071) #9
  unreachable

188:                                              ; preds = %145, %157
  %189 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %190 = and i8 %189, 1
  %.not445 = icmp eq i8 %190, 0
  br i1 %.not445, label %.critedge463, label %191, !prof !15

191:                                              ; preds = %188
  %192 = tail call zeroext i1 @is_poor(ptr noundef %0) #10
  br i1 %192, label %193, label %.critedge465, !prof !16

193:                                              ; preds = %191
  %194 = tail call zeroext i1 @is_filled(ptr noundef %0) #10
  br i1 %194, label %.critedge465, label %.critedge463, !prof !15

.critedge465:                                     ; preds = %191, %193
  %195 = getelementptr inbounds i8, ptr %0, i64 16
  %196 = load ptr, ptr %195, align 8, !tbaa !17
  %197 = getelementptr inbounds i8, ptr %196, i64 80
  %198 = load ptr, ptr %197, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %198, ptr noundef nonnull @.str.120, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2073) #9
  unreachable

199:                                              ; preds = %17
  %.not438 = icmp eq ptr %1, null
  br i1 %.not438, label %.critedge463, label %200, !prof !15

200:                                              ; preds = %199
  %201 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef 15) #11
  %.sroa.089.0.extract.trunc = trunc i64 %201 to i32
  %.not439 = icmp eq i32 %.sroa.089.0.extract.trunc, 0
  br i1 %.not439, label %202, label %.critedge463, !prof !16

202:                                              ; preds = %200, %17
  %.not440 = icmp eq ptr %2, null
  br i1 %.not440, label %.critedge463, label %203, !prof !15

203:                                              ; preds = %202
  %204 = getelementptr inbounds i8, ptr %0, i64 24
  %205 = load ptr, ptr %204, align 8, !tbaa !27
  %206 = load i16, ptr %205, align 4, !tbaa !34
  %207 = and i16 %206, 16
  %208 = icmp eq i16 %207, 0
  br i1 %208, label %.critedge463, label %209, !prof !15

209:                                              ; preds = %203
  %210 = tail call zeroext i1 @is_filled(ptr noundef nonnull %0) #10
  br i1 %210, label %211, label %.critedge463, !prof !16

211:                                              ; preds = %209
  %.not441 = icmp eq ptr %1, null
  br i1 %.not441, label %227, label %212

212:                                              ; preds = %211
  %213 = getelementptr inbounds i8, ptr %0, i64 48
  %214 = getelementptr inbounds i8, ptr %0, i64 5
  %215 = load i8, ptr %214, align 1, !tbaa !6
  %216 = sext i8 %215 to i64
  %217 = getelementptr inbounds [32 x ptr], ptr %213, i64 0, i64 %216
  %218 = load ptr, ptr %217, align 8, !tbaa !25
  %219 = getelementptr inbounds i8, ptr %0, i64 304
  %220 = getelementptr inbounds [32 x i16], ptr %219, i64 0, i64 %216
  %221 = load i16, ptr %220, align 2, !tbaa !24
  %222 = zext i16 %221 to i64
  %223 = tail call ptr @page_node(ptr noundef %218, i64 noundef %222) #10
  %224 = tail call { ptr, i64 } @get_key(ptr noundef %223) #10
  %225 = extractvalue { ptr, i64 } %224, 0
  %226 = extractvalue { ptr, i64 } %224, 1
  store ptr %225, ptr %1, align 8, !tbaa !25
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %1, i64 8
  store i64 %226, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !30
  br label %227

227:                                              ; preds = %211, %212
  %228 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %229 = and i8 %228, 1
  %.not442 = icmp eq i8 %229, 0
  br i1 %.not442, label %237, label %230, !prof !15

230:                                              ; preds = %227
  %231 = tail call zeroext i1 @is_filled(ptr noundef nonnull %0) #10
  br i1 %231, label %237, label %232, !prof !16

232:                                              ; preds = %230
  %233 = getelementptr inbounds i8, ptr %0, i64 16
  %234 = load ptr, ptr %233, align 8, !tbaa !17
  %235 = getelementptr inbounds i8, ptr %234, i64 80
  %236 = load ptr, ptr %235, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %236, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2095) #9
  unreachable

237:                                              ; preds = %230, %227
  %238 = tail call zeroext i1 @inner_filled(ptr noundef nonnull %0) #10
  br i1 %238, label %261, label %239, !prof !16

239:                                              ; preds = %237
  %240 = tail call zeroext i1 @inner_pointed(ptr noundef nonnull %0) #10
  br i1 %240, label %.critedge463, label %241

241:                                              ; preds = %239
  %242 = getelementptr inbounds i8, ptr %0, i64 48
  %243 = getelementptr inbounds i8, ptr %0, i64 5
  %244 = load i8, ptr %243, align 1, !tbaa !6
  %245 = sext i8 %244 to i64
  %246 = getelementptr inbounds [32 x ptr], ptr %242, i64 0, i64 %245
  %247 = load ptr, ptr %246, align 8, !tbaa !25
  %248 = getelementptr inbounds i8, ptr %0, i64 304
  %249 = getelementptr inbounds [32 x i16], ptr %248, i64 0, i64 %245
  %250 = load i16, ptr %249, align 2, !tbaa !24
  %251 = zext i16 %250 to i64
  %252 = tail call ptr @page_node(ptr noundef %247, i64 noundef %251) #10
  %253 = tail call i32 @node_read(ptr noundef nonnull %0, ptr noundef %252, ptr noundef nonnull %2, ptr noundef %247)
  br label %.critedge463

254:                                              ; preds = %17
  %.not436 = icmp eq ptr %2, null
  br i1 %.not436, label %.critedge463, label %255, !prof !15

255:                                              ; preds = %254
  %256 = getelementptr inbounds i8, ptr %0, i64 40
  %257 = load ptr, ptr %256, align 8, !tbaa !26
  %258 = icmp eq ptr %257, null
  br i1 %258, label %.critedge463, label %259, !prof !15

259:                                              ; preds = %255
  %260 = tail call i32 @outer_next(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, i32 noundef 9) #11
  %.not437 = icmp eq i32 %260, 0
  br i1 %.not437, label %261, label %.critedge463, !prof !16

261:                                              ; preds = %312, %237, %259
  %262 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %263 = and i8 %262, 1
  %.not443 = icmp eq i8 %263, 0
  br i1 %.not443, label %272, label %264, !prof !15

264:                                              ; preds = %261
  %265 = tail call zeroext i1 @is_filled(ptr noundef nonnull %0) #10
  br i1 %265, label %266, label %.critedge467, !prof !16

266:                                              ; preds = %264
  %267 = tail call zeroext i1 @inner_filled(ptr noundef nonnull %0) #10
  br i1 %267, label %272, label %.critedge467, !prof !16

.critedge467:                                     ; preds = %264, %266
  %268 = getelementptr inbounds i8, ptr %0, i64 16
  %269 = load ptr, ptr %268, align 8, !tbaa !17
  %270 = getelementptr inbounds i8, ptr %269, i64 80
  %271 = load ptr, ptr %270, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %271, ptr noundef nonnull @.str.121, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2115) #9
  unreachable

272:                                              ; preds = %266, %261
  %273 = getelementptr inbounds i8, ptr %0, i64 40
  %274 = load ptr, ptr %273, align 8, !tbaa !26
  %275 = getelementptr inbounds i8, ptr %274, i64 48
  %276 = getelementptr inbounds i8, ptr %274, i64 5
  %277 = load i8, ptr %276, align 1, !tbaa !6
  %278 = sext i8 %277 to i64
  %279 = getelementptr inbounds [32 x ptr], ptr %275, i64 0, i64 %278
  %280 = load ptr, ptr %279, align 8, !tbaa !25
  %281 = tail call i64 @page_numkeys(ptr noundef %280) #10
  %282 = getelementptr inbounds i8, ptr %274, i64 24
  %283 = load ptr, ptr %282, align 8, !tbaa !27
  %284 = getelementptr inbounds i8, ptr %283, i64 4
  %285 = load i32, ptr %284, align 4, !tbaa !28
  %286 = zext i32 %285 to i64
  %287 = mul i64 %281, %286
  %288 = getelementptr inbounds i8, ptr %2, i64 8
  store i64 %287, ptr %288, align 8, !tbaa !35
  %289 = load i8, ptr %276, align 1, !tbaa !6
  %290 = sext i8 %289 to i64
  %291 = getelementptr inbounds [32 x ptr], ptr %275, i64 0, i64 %290
  %292 = load ptr, ptr %291, align 8, !tbaa !25
  %293 = tail call ptr @page_data(ptr noundef %292) #10
  store ptr %293, ptr %2, align 8, !tbaa !37
  %294 = load i8, ptr %276, align 1, !tbaa !6
  %295 = sext i8 %294 to i64
  %296 = getelementptr inbounds [32 x ptr], ptr %275, i64 0, i64 %295
  %297 = load ptr, ptr %296, align 8, !tbaa !25
  %298 = tail call i64 @page_numkeys(ptr noundef %297) #10
  %299 = trunc i64 %298 to i16
  %300 = add i16 %299, -1
  %301 = getelementptr inbounds i8, ptr %274, i64 304
  %302 = getelementptr inbounds [32 x i16], ptr %301, i64 0, i64 %295
  store i16 %300, ptr %302, align 2, !tbaa !24
  br label %.critedge463

303:                                              ; preds = %17
  %.not435 = icmp eq ptr %2, null
  br i1 %.not435, label %.critedge463, label %304, !prof !15

304:                                              ; preds = %303
  %305 = getelementptr inbounds i8, ptr %0, i64 40
  %306 = load ptr, ptr %305, align 8, !tbaa !26
  %307 = icmp eq ptr %306, null
  br i1 %307, label %.critedge463, label %308, !prof !15

308:                                              ; preds = %304
  %309 = tail call zeroext i1 @is_filled(ptr noundef nonnull %0) #10
  br i1 %309, label %310, label %.critedge463, !prof !16

310:                                              ; preds = %308
  %311 = tail call zeroext i1 @inner_filled(ptr noundef nonnull %0) #10
  br i1 %311, label %312, label %.critedge463, !prof !16

312:                                              ; preds = %310
  %313 = tail call i32 @cursor_sibling_left(ptr noundef nonnull %306) #11
  %314 = icmp eq i32 %313, 0
  br i1 %314, label %261, label %.critedge463, !prof !16

315:                                              ; preds = %17, %17, %17
  %316 = tail call i32 @outer_next(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) #11
  %317 = getelementptr inbounds i8, ptr %0, i64 4
  %318 = load i8, ptr %317, align 4, !tbaa !6
  %319 = and i8 %318, -65
  store i8 %319, ptr %317, align 4, !tbaa !6
  %320 = getelementptr inbounds i8, ptr %0, i64 396
  %321 = load i8, ptr %320, align 4, !tbaa !6
  %322 = and i8 %321, -65
  store i8 %322, ptr %320, align 4, !tbaa !6
  br label %.critedge463

323:                                              ; preds = %17, %17, %17
  %324 = tail call i32 @outer_prev(ptr noundef %0, ptr noundef %1, ptr noundef %2, i32 noundef %3) #11
  br label %.critedge463

325:                                              ; preds = %17
  %326 = tail call i32 @outer_first(ptr noundef %0, ptr noundef %1, ptr noundef %2) #11
  br label %.critedge463

327:                                              ; preds = %17
  %328 = tail call i32 @outer_last(ptr noundef %0, ptr noundef %1, ptr noundef %2) #11
  br label %.critedge463

329:                                              ; preds = %17, %17
  %330 = icmp eq ptr %2, null
  br i1 %330, label %.critedge463, label %331, !prof !15

331:                                              ; preds = %329
  %332 = tail call zeroext i1 @is_filled(ptr noundef %0) #10
  br i1 %332, label %333, label %.critedge463, !prof !16

333:                                              ; preds = %331
  %334 = getelementptr inbounds i8, ptr %0, i64 48
  %335 = getelementptr inbounds i8, ptr %0, i64 5
  %336 = load i8, ptr %335, align 1, !tbaa !6
  %337 = sext i8 %336 to i64
  %338 = getelementptr inbounds [32 x ptr], ptr %334, i64 0, i64 %337
  %339 = load ptr, ptr %338, align 8, !tbaa !25
  %340 = getelementptr inbounds i8, ptr %0, i64 304
  %341 = getelementptr inbounds [32 x i16], ptr %340, i64 0, i64 %337
  %342 = load i16, ptr %341, align 2, !tbaa !24
  %343 = zext i16 %342 to i64
  %344 = tail call ptr @page_node(ptr noundef %339, i64 noundef %343) #10
  tail call void @get_key_optional(ptr noundef %344, ptr noundef %1)
  %345 = tail call zeroext i8 @node_flags(ptr noundef %344) #10
  %346 = and i8 %345, 4
  %347 = icmp eq i8 %346, 0
  br i1 %347, label %348, label %354

348:                                              ; preds = %333
  %349 = load i8, ptr %335, align 1, !tbaa !6
  %350 = sext i8 %349 to i64
  %351 = getelementptr inbounds [32 x ptr], ptr %334, i64 0, i64 %350
  %352 = load ptr, ptr %351, align 8, !tbaa !25
  %353 = tail call i32 @node_read(ptr noundef nonnull %0, ptr noundef %344, ptr noundef nonnull %2, ptr noundef %352)
  br label %.critedge463

354:                                              ; preds = %333
  %355 = getelementptr inbounds i8, ptr %0, i64 40
  %356 = load ptr, ptr %355, align 8, !tbaa !26
  %.not434 = icmp eq ptr %356, null
  br i1 %.not434, label %361, label %357, !prof !15

357:                                              ; preds = %354
  %358 = icmp eq i32 %3, 1
  %359 = select i1 %358, ptr @inner_first, ptr @inner_last
  %360 = tail call i32 %359(ptr noundef nonnull %356, ptr noundef nonnull %2) #8, !callees !38
  br label %.critedge463

361:                                              ; preds = %354
  %362 = tail call i32 @unexpected_dupsort(ptr noundef nonnull %0) #12
  br label %.critedge463

363:                                              ; preds = %17, %17
  %364 = icmp eq ptr %1, null
  %365 = icmp eq ptr %2, null
  %366 = or i1 %364, %365
  br i1 %366, label %.critedge463, label %367, !prof !15

367:                                              ; preds = %363
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #8
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %5, ptr noundef nonnull align 8 dereferenceable(16) %2, i64 16, i1 false), !tbaa.struct !39
  %368 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 17) #11
  %.sroa.060.0.extract.trunc = trunc i64 %368 to i32
  %.sroa.6.0.extract.shift63 = lshr i64 %368, 32
  %.sroa.6.0.extract.trunc64 = trunc i64 %.sroa.6.0.extract.shift63 to i8
  %369 = icmp eq i32 %.sroa.060.0.extract.trunc, 0
  br i1 %369, label %370, label %.thread482

370:                                              ; preds = %367
  %371 = trunc i64 %.sroa.6.0.extract.shift63 to i1
  br i1 %371, label %372, label %.thread476

372:                                              ; preds = %370
  %373 = getelementptr inbounds i8, ptr %0, i64 40
  %374 = load ptr, ptr %373, align 8, !tbaa !26
  %.not431 = icmp eq ptr %374, null
  br i1 %.not431, label %.thread476, label %375

375:                                              ; preds = %372
  %376 = load ptr, ptr %5, align 8, !tbaa !37
  %.not432 = icmp eq ptr %376, null
  br i1 %.not432, label %.thread476, label %377

377:                                              ; preds = %375
  %378 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %374) #10
  br i1 %378, label %379, label %395

379:                                              ; preds = %377
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %2, ptr noundef nonnull align 8 dereferenceable(16) %5, i64 16, i1 false), !tbaa.struct !39
  %380 = load ptr, ptr %373, align 8, !tbaa !26
  %381 = tail call i64 @cursor_seek(ptr noundef %380, ptr noundef nonnull %2, ptr noundef null, i32 noundef 17) #11
  %.sroa.060.0.extract.trunc62 = trunc i64 %381 to i32
  %.sroa.6.0.extract.shift65 = lshr i64 %381, 32
  %.sroa.6.0.extract.trunc66 = trunc i64 %.sroa.6.0.extract.shift65 to i8
  %382 = icmp eq i32 %.sroa.060.0.extract.trunc62, -30798
  br i1 %382, label %383, label %409

383:                                              ; preds = %379
  %384 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %385 = and i8 %384, 1
  %.not433 = icmp eq i8 %385, 0
  br i1 %.not433, label %393, label %386, !prof !15

386:                                              ; preds = %383
  %387 = trunc i64 %.sroa.6.0.extract.shift65 to i1
  br i1 %387, label %388, label %393, !prof !15

388:                                              ; preds = %386
  %389 = getelementptr inbounds i8, ptr %0, i64 16
  %390 = load ptr, ptr %389, align 8, !tbaa !17
  %391 = getelementptr inbounds i8, ptr %390, i64 80
  %392 = load ptr, ptr %391, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %392, ptr noundef nonnull @.str.122, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2190) #9
  unreachable

393:                                              ; preds = %386, %383
  %394 = tail call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 11) #11
  br label %409

395:                                              ; preds = %377
  %396 = getelementptr inbounds i8, ptr %0, i64 32
  %397 = load ptr, ptr %396, align 8, !tbaa !40
  %398 = getelementptr inbounds i8, ptr %397, i64 24
  %399 = load ptr, ptr %398, align 8, !tbaa !41
  %400 = call i32 %399(ptr noundef nonnull %5, ptr noundef nonnull %2) #8
  %401 = icmp eq i32 %400, 0
  %402 = zext i1 %401 to i8
  %403 = icmp sgt i32 %400, 0
  br i1 %403, label %404, label %.thread476

404:                                              ; preds = %395
  %405 = call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 11) #11
  br label %409

.thread476:                                       ; preds = %375, %372, %370, %395
  %.sroa.6.0.ph = phi i8 [ %402, %395 ], [ %.sroa.6.0.extract.trunc64, %370 ], [ %.sroa.6.0.extract.trunc64, %372 ], [ 0, %375 ]
  %406 = and i8 %.sroa.6.0.ph, 1
  %407 = xor i8 %406, 1
  %408 = zext nneg i8 %407 to i32
  %spec.select479 = sub nsw i32 0, %408
  br label %.thread482

409:                                              ; preds = %404, %379, %393
  %.sroa.6.0 = phi i8 [ %.sroa.6.0.extract.trunc66, %393 ], [ %.sroa.6.0.extract.trunc66, %379 ], [ %402, %404 ]
  %.1395 = phi i32 [ %394, %393 ], [ %.sroa.060.0.extract.trunc62, %379 ], [ %405, %404 ]
  %.1395.fr = freeze i32 %.1395
  %410 = icmp eq i32 %.1395.fr, 0
  %411 = and i8 %.sroa.6.0, 1
  %412 = xor i8 %411, 1
  %413 = zext nneg i8 %412 to i32
  %spec.select = sub nsw i32 0, %413
  %spec.select491 = select i1 %410, i32 %spec.select, i32 %.1395.fr
  br label %.thread482

.thread482:                                       ; preds = %409, %367, %.thread476
  %414 = phi i32 [ %spec.select479, %.thread476 ], [ %.sroa.060.0.extract.trunc, %367 ], [ %spec.select491, %409 ]
  %415 = icmp eq i32 %3, 20
  br i1 %415, label %416, label %419, !prof !15

416:                                              ; preds = %.thread482
  switch i32 %414, label %.fold.split [
    i32 -1, label %419
    i32 0, label %417
  ]

417:                                              ; preds = %416
  %418 = call i32 @outer_next(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 8) #11
  br label %419

.fold.split:                                      ; preds = %416
  br label %419

419:                                              ; preds = %416, %.fold.split, %417, %.thread482
  %.3 = phi i32 [ %418, %417 ], [ %414, %.thread482 ], [ 0, %416 ], [ %414, %.fold.split ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #8
  br label %.critedge463

420:                                              ; preds = %17, %17, %17, %17, %17
  %421 = icmp eq ptr %1, null
  br i1 %421, label %.critedge463, label %422, !prof !15

422:                                              ; preds = %420
  %423 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef 17) #11
  %.sroa.055.0.extract.trunc = trunc i64 %423 to i32
  %424 = and i64 %423, 4294967296
  %.not428 = icmp eq i64 %424, 0
  br i1 %.not428, label %438, label %425

425:                                              ; preds = %422
  %426 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %427 = and i8 %426, 1
  %.not429 = icmp eq i8 %427, 0
  %.not430 = icmp eq i32 %.sroa.055.0.extract.trunc, 0
  %or.cond = or i1 %.not430, %.not429
  br i1 %or.cond, label %433, label %428, !prof !44

428:                                              ; preds = %425
  %429 = getelementptr inbounds i8, ptr %0, i64 16
  %430 = load ptr, ptr %429, align 8, !tbaa !17
  %431 = getelementptr inbounds i8, ptr %430, i64 80
  %432 = load ptr, ptr %431, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %432, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2226) #9
  unreachable

433:                                              ; preds = %425
  switch i32 %3, label %.critedge463 [
    i32 21, label %434
    i32 25, label %436
  ]

434:                                              ; preds = %433
  %435 = tail call i32 @outer_prev(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef 14) #11
  br label %.critedge463

436:                                              ; preds = %433
  %437 = tail call i32 @outer_next(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef 11) #11
  br label %.critedge463

438:                                              ; preds = %422
  %439 = icmp ult i32 %3, 23
  br i1 %439, label %440, label %443

440:                                              ; preds = %438
  switch i32 %.sroa.055.0.extract.trunc, label %443 [
    i32 -30798, label %441
    i32 0, label %441
  ]

441:                                              ; preds = %440, %440
  %442 = tail call i32 @outer_prev(ptr noundef %0, ptr noundef nonnull %1, ptr noundef %2, i32 noundef 14) #11
  br label %.critedge463

443:                                              ; preds = %440, %438
  %444 = icmp eq i32 %3, 23
  %445 = icmp eq i32 %.sroa.055.0.extract.trunc, 0
  %or.cond5 = and i1 %444, %445
  %spec.store.select = select i1 %or.cond5, i32 -30798, i32 %.sroa.055.0.extract.trunc
  br label %.critedge463

446:                                              ; preds = %17, %17, %17, %17, %17
  %447 = icmp eq ptr %1, null
  %448 = icmp eq ptr %2, null
  %449 = or i1 %447, %448
  br i1 %449, label %.critedge463, label %450, !prof !15

450:                                              ; preds = %446
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #8
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %6, ptr noundef nonnull align 8 dereferenceable(16) %2, i64 16, i1 false), !tbaa.struct !39
  %451 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 16) #11
  %.sroa.046.0.extract.trunc = trunc i64 %451 to i32
  %452 = icmp eq i32 %.sroa.046.0.extract.trunc, 0
  br i1 %452, label %453, label %510

453:                                              ; preds = %450
  %454 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %455 = and i8 %454, 1
  %.not422 = icmp ne i8 %455, 0
  %456 = and i64 %451, 4294967296
  %.not423 = icmp eq i64 %456, 0
  %or.cond470 = and i1 %.not423, %.not422
  br i1 %or.cond470, label %457, label %462, !prof !45

457:                                              ; preds = %453
  %458 = getelementptr inbounds i8, ptr %0, i64 16
  %459 = load ptr, ptr %458, align 8, !tbaa !17
  %460 = getelementptr inbounds i8, ptr %459, i64 80
  %461 = load ptr, ptr %460, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %461, ptr noundef nonnull @.str.123, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2252) #9
  unreachable

462:                                              ; preds = %453
  %463 = tail call zeroext i1 @inner_pointed(ptr noundef %0) #10
  br i1 %463, label %464, label %490

464:                                              ; preds = %462
  %465 = getelementptr inbounds i8, ptr %0, i64 40
  %466 = load ptr, ptr %465, align 8, !tbaa !26
  %467 = call i64 @cursor_seek(ptr noundef %466, ptr noundef nonnull %6, ptr noundef null, i32 noundef 17) #11
  %.sroa.046.0.extract.trunc49 = trunc i64 %467 to i32
  %468 = and i64 %467, 4294967296
  %.not425 = icmp eq i64 %468, 0
  br i1 %.not425, label %482, label %469

469:                                              ; preds = %464
  %470 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %471 = and i8 %470, 1
  %.not426 = icmp eq i8 %471, 0
  %.not427 = icmp eq i32 %.sroa.046.0.extract.trunc49, 0
  %or.cond471 = or i1 %.not427, %.not426
  br i1 %or.cond471, label %477, label %472, !prof !44

472:                                              ; preds = %469
  %473 = getelementptr inbounds i8, ptr %0, i64 16
  %474 = load ptr, ptr %473, align 8, !tbaa !17
  %475 = getelementptr inbounds i8, ptr %474, i64 80
  %476 = load ptr, ptr %475, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %476, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2258) #9
  unreachable

477:                                              ; preds = %469
  switch i32 %3, label %510 [
    i32 26, label %478
    i32 30, label %480
  ]

478:                                              ; preds = %477
  %479 = call i32 @inner_prev(ptr noundef %466, ptr noundef nonnull %2) #11
  br label %510

480:                                              ; preds = %477
  %481 = call i32 @inner_next(ptr noundef %466, ptr noundef nonnull %2) #11
  br label %510

482:                                              ; preds = %464
  %483 = icmp ult i32 %3, 28
  br i1 %483, label %484, label %487

484:                                              ; preds = %482
  switch i32 %.sroa.046.0.extract.trunc49, label %487 [
    i32 -30798, label %485
    i32 0, label %485
  ]

485:                                              ; preds = %484, %484
  %486 = call i32 @inner_prev(ptr noundef %466, ptr noundef nonnull %2) #11
  br label %510

487:                                              ; preds = %484, %482
  %488 = icmp eq i32 %3, 28
  %489 = icmp eq i32 %.sroa.046.0.extract.trunc49, 0
  %or.cond9 = and i1 %488, %489
  %spec.store.select20 = select i1 %or.cond9, i32 -30798, i32 %.sroa.046.0.extract.trunc49
  br label %510

490:                                              ; preds = %462
  %491 = getelementptr inbounds i8, ptr %0, i64 32
  %492 = load ptr, ptr %491, align 8, !tbaa !40
  %493 = getelementptr inbounds i8, ptr %492, i64 24
  %494 = load ptr, ptr %493, align 8, !tbaa !41
  %495 = call i32 %494(ptr noundef nonnull %2, ptr noundef nonnull %6) #8
  switch i32 %3, label %496 [
    i32 26, label %497
    i32 27, label %500
    i32 28, label %502
    i32 29, label %505
    i32 30, label %507
  ]

496:                                              ; preds = %490
  unreachable

497:                                              ; preds = %490
  %498 = icmp slt i32 %495, 0
  %499 = select i1 %498, i32 0, i32 -30798
  br label %510

500:                                              ; preds = %490
  %.inv424 = icmp sgt i32 %495, 0
  %501 = select i1 %.inv424, i32 -30798, i32 0
  br label %510

502:                                              ; preds = %490
  %503 = icmp eq i32 %495, 0
  %504 = select i1 %503, i32 0, i32 -30798
  br label %510

505:                                              ; preds = %490
  %.inv = icmp slt i32 %495, 0
  %506 = select i1 %.inv, i32 -30798, i32 0
  br label %510

507:                                              ; preds = %490
  %508 = icmp sgt i32 %495, 0
  %509 = select i1 %508, i32 0, i32 -30798
  br label %510

510:                                              ; preds = %497, %500, %502, %505, %507, %480, %478, %485, %487, %477, %450
  %.7 = phi i32 [ %.sroa.046.0.extract.trunc, %450 ], [ %479, %478 ], [ %481, %480 ], [ %486, %485 ], [ %spec.store.select20, %487 ], [ %.sroa.046.0.extract.trunc49, %477 ], [ %509, %507 ], [ %506, %505 ], [ %504, %502 ], [ %501, %500 ], [ %499, %497 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #8
  br label %.critedge463

511:                                              ; preds = %17, %17, %17, %17, %17
  %512 = icmp eq ptr %1, null
  %513 = icmp eq ptr %2, null
  %514 = or i1 %512, %513
  br i1 %514, label %.critedge463, label %515, !prof !15

515:                                              ; preds = %511
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #8
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %7, ptr noundef nonnull align 8 dereferenceable(16) %2, i64 16, i1 false), !tbaa.struct !39
  %516 = tail call i64 @cursor_seek(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 17) #11
  %.sroa.026.0.extract.trunc = trunc i64 %516 to i32
  %517 = and i64 %516, 4294967296
  %.not416 = icmp eq i64 %517, 0
  br i1 %.not416, label %585, label %518

518:                                              ; preds = %515
  %519 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %520 = and i8 %519, 1
  %.not417 = icmp eq i8 %520, 0
  %.not418 = icmp eq i32 %.sroa.026.0.extract.trunc, 0
  %or.cond472 = or i1 %.not418, %.not417
  br i1 %or.cond472, label %526, label %521, !prof !44

521:                                              ; preds = %518
  %522 = getelementptr inbounds i8, ptr %0, i64 16
  %523 = load ptr, ptr %522, align 8, !tbaa !17
  %524 = getelementptr inbounds i8, ptr %523, i64 80
  %525 = load ptr, ptr %524, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %525, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2305) #9
  unreachable

526:                                              ; preds = %518
  %527 = tail call zeroext i1 @inner_pointed(ptr noundef %0) #10
  br i1 %527, label %528, label %559

528:                                              ; preds = %526
  %529 = getelementptr inbounds i8, ptr %0, i64 40
  %530 = load ptr, ptr %529, align 8, !tbaa !26
  %531 = call i64 @cursor_seek(ptr noundef %530, ptr noundef nonnull %7, ptr noundef null, i32 noundef 17) #11
  %.sroa.026.0.extract.trunc30 = trunc i64 %531 to i32
  %532 = and i64 %531, 4294967296
  %.not419 = icmp eq i64 %532, 0
  br i1 %.not419, label %546, label %533

533:                                              ; preds = %528
  %534 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !9
  %535 = and i8 %534, 1
  %.not420 = icmp eq i8 %535, 0
  %.not421 = icmp eq i32 %.sroa.026.0.extract.trunc30, 0
  %or.cond473 = or i1 %.not421, %.not420
  br i1 %or.cond473, label %541, label %536, !prof !44

536:                                              ; preds = %533
  %537 = getelementptr inbounds i8, ptr %0, i64 16
  %538 = load ptr, ptr %537, align 8, !tbaa !17
  %539 = getelementptr inbounds i8, ptr %538, i64 80
  %540 = load ptr, ptr %539, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %540, ptr noundef nonnull @.str.51, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2311) #9
  unreachable

541:                                              ; preds = %533
  switch i32 %3, label %.thread489 [
    i32 31, label %542
    i32 35, label %544
  ]

542:                                              ; preds = %541
  %543 = call i32 @outer_prev(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 12) #11
  br label %.thread489

544:                                              ; preds = %541
  %545 = call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 8) #11
  br label %.thread489

546:                                              ; preds = %528
  %547 = icmp ult i32 %3, 33
  br i1 %547, label %548, label %551

548:                                              ; preds = %546
  switch i32 %.sroa.026.0.extract.trunc30, label %.thread489 [
    i32 -30798, label %549
    i32 0, label %549
  ]

549:                                              ; preds = %548, %548
  %550 = call i32 @outer_prev(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 12) #11
  br label %.thread489

551:                                              ; preds = %546
  %552 = icmp eq i32 %3, 33
  %553 = icmp eq i32 %.sroa.026.0.extract.trunc30, 0
  %or.cond13 = and i1 %552, %553
  br i1 %or.cond13, label %.thread489, label %554

554:                                              ; preds = %551
  %555 = icmp ne i32 %3, 33
  %556 = icmp eq i32 %.sroa.026.0.extract.trunc30, -30798
  %or.cond15 = and i1 %555, %556
  br i1 %or.cond15, label %557, label %.thread489

557:                                              ; preds = %554
  %558 = call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 8) #11
  br label %.thread489

559:                                              ; preds = %526
  %560 = getelementptr inbounds i8, ptr %0, i64 32
  %561 = load ptr, ptr %560, align 8, !tbaa !40
  %562 = getelementptr inbounds i8, ptr %561, i64 24
  %563 = load ptr, ptr %562, align 8, !tbaa !41
  %564 = call i32 %563(ptr noundef nonnull %2, ptr noundef nonnull %7) #8
  switch i32 %3, label %565 [
    i32 31, label %566
    i32 32, label %570
    i32 33, label %574
    i32 34, label %577
    i32 35, label %581
  ]

565:                                              ; preds = %559
  unreachable

566:                                              ; preds = %559
  %567 = icmp sgt i32 %564, -1
  br i1 %567, label %568, label %.thread489

568:                                              ; preds = %566
  %569 = call i32 @outer_prev(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 12) #11
  br label %.thread489

570:                                              ; preds = %559
  %571 = icmp sgt i32 %564, 0
  br i1 %571, label %572, label %.thread489

572:                                              ; preds = %570
  %573 = call i32 @outer_prev(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 12) #11
  br label %.thread489

574:                                              ; preds = %559
  %575 = icmp eq i32 %564, 0
  %576 = select i1 %575, i32 0, i32 -30798
  br label %.thread489

577:                                              ; preds = %559
  %578 = icmp slt i32 %564, 0
  br i1 %578, label %579, label %.thread489

579:                                              ; preds = %577
  %580 = call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 8) #11
  br label %.thread489

581:                                              ; preds = %559
  %582 = icmp slt i32 %564, 1
  br i1 %582, label %583, label %.thread489

583:                                              ; preds = %581
  %584 = call i32 @outer_next(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 8) #11
  br label %.thread489

585:                                              ; preds = %515
  %586 = icmp ult i32 %3, 33
  br i1 %586, label %587, label %590

587:                                              ; preds = %585
  switch i32 %.sroa.026.0.extract.trunc, label %590 [
    i32 -30798, label %588
    i32 0, label %588
  ]

588:                                              ; preds = %587, %587
  %589 = tail call i32 @outer_prev(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, i32 noundef 14) #11
  br label %.thread489

590:                                              ; preds = %587, %585
  %591 = icmp eq i32 %3, 33
  %592 = icmp eq i32 %.sroa.026.0.extract.trunc, 0
  %or.cond19 = and i1 %591, %592
  %spec.store.select21 = select i1 %or.cond19, i32 -30798, i32 %.sroa.026.0.extract.trunc
  br label %.thread489

.thread489:                                       ; preds = %548, %574, %568, %566, %572, %570, %579, %577, %583, %581, %544, %542, %557, %554, %549, %541, %551, %590, %588
  %.10 = phi i32 [ %589, %588 ], [ %spec.store.select21, %590 ], [ %543, %542 ], [ %545, %544 ], [ %550, %549 ], [ %558, %557 ], [ %.sroa.026.0.extract.trunc30, %554 ], [ %.sroa.026.0.extract.trunc30, %541 ], [ -30798, %551 ], [ %584, %583 ], [ %.sroa.026.0.extract.trunc, %581 ], [ %580, %579 ], [ %.sroa.026.0.extract.trunc, %577 ], [ %576, %574 ], [ %573, %572 ], [ %.sroa.026.0.extract.trunc, %570 ], [ %569, %568 ], [ %.sroa.026.0.extract.trunc, %566 ], [ %.sroa.026.0.extract.trunc30, %548 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #8
  br label %.critedge463

593:                                              ; preds = %17
  %594 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !46
  %595 = icmp ugt i8 %594, 4
  br i1 %595, label %596, label %.critedge463, !prof !15

596:                                              ; preds = %593
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.cursor_ops, i32 noundef 2356, ptr noundef nonnull @.str.124, i32 noundef %3) #8
  br label %.critedge463

.critedge463:                                     ; preds = %172, %162, %308, %593, %596, %511, %446, %436, %434, %441, %443, %433, %420, %363, %348, %357, %361, %331, %329, %312, %310, %304, %303, %259, %255, %254, %239, %209, %203, %202, %200, %199, %150, %147, %188, %193, %.critedge, %181, %143, %139, %137, %80, %131, %62, %84, %86, %116, %107, %34, %32, %.thread489, %510, %419, %327, %325, %323, %315, %272, %241, %60, %50
  %.2 = phi i32 [ %.10, %.thread489 ], [ %.7, %510 ], [ %.3, %419 ], [ %328, %327 ], [ %326, %325 ], [ %324, %323 ], [ %316, %315 ], [ 0, %272 ], [ %253, %241 ], [ %51, %50 ], [ %61, %60 ], [ 61, %32 ], [ -30798, %34 ], [ %81, %80 ], [ %136, %131 ], [ 0, %62 ], [ 61, %84 ], [ -30798, %86 ], [ 0, %116 ], [ 0, %107 ], [ 22, %137 ], [ -30784, %139 ], [ 22, %143 ], [ -30798, %181 ], [ -30798, %.critedge ], [ %.sroa.090.0.extract.trunc, %193 ], [ %.sroa.090.0.extract.trunc, %188 ], [ 0, %147 ], [ 0, %150 ], [ 22, %199 ], [ %.sroa.089.0.extract.trunc, %200 ], [ 22, %202 ], [ -30784, %203 ], [ 61, %209 ], [ 61, %239 ], [ 22, %254 ], [ -30784, %255 ], [ %260, %259 ], [ 22, %303 ], [ -30784, %304 ], [ 61, %310 ], [ %313, %312 ], [ 22, %329 ], [ 61, %331 ], [ %353, %348 ], [ %360, %357 ], [ %362, %361 ], [ 22, %363 ], [ 22, %420 ], [ %435, %434 ], [ %437, %436 ], [ %442, %441 ], [ %spec.store.select, %443 ], [ %.sroa.055.0.extract.trunc, %433 ], [ 22, %446 ], [ 22, %511 ], [ 22, %596 ], [ 22, %593 ], [ 61, %308 ], [ -30798, %162 ], [ -30798, %172 ]
  ret i32 %.2
}

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

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

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

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @get_key_optional(ptr noundef, ptr noundef) local_unnamed_addr #7

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!"branch_weights", i32 1, i32 4001}
!6 = !{!7, !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !7, i64 25}
!10 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !13, i64 80, !14, i64 88}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!"any pointer", !7, i64 0}
!15 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!16 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!17 = !{!18, !14, i64 16}
!18 = !{!"MDBX_cursor", !11, i64 0, !7, i64 4, !7, i64 6, !7, i64 7, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32, !14, i64 40, !7, i64 48, !7, i64 304, !14, i64 368, !14, i64 376}
!19 = !{!20, !14, i64 80}
!20 = !{!"MDBX_txn", !11, i64 0, !11, i64 4, !13, i64 8, !13, i64 16, !14, i64 24, !14, i64 32, !21, i64 40, !13, i64 64, !13, i64 72, !14, i64 80, !14, i64 88, !14, i64 96, !14, i64 104, !14, i64 112, !14, i64 120, !23, i64 128, !14, i64 160, !7, i64 168}
!21 = !{!"geo", !22, i64 0, !22, i64 2, !11, i64 4, !11, i64 8, !7, i64 12, !7, i64 16}
!22 = !{!"short", !7, i64 0}
!23 = !{!"MDBX_canary", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}
!24 = !{!22, !22, i64 0}
!25 = !{!14, !14, i64 0}
!26 = !{!18, !14, i64 40}
!27 = !{!18, !14, i64 24}
!28 = !{!29, !11, i64 4}
!29 = !{!"tree", !22, i64 0, !22, i64 2, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !13, i64 24, !13, i64 32, !13, i64 40}
!30 = !{!13, !13, i64 0}
!31 = !{!29, !13, i64 32}
!32 = !{!"branch_weights", i32 1, i32 1, i32 1}
!33 = !{!"branch_weights", i32 1073741467, i32 1073742181}
!34 = !{!29, !22, i64 0}
!35 = !{!36, !13, i64 8}
!36 = !{!"iovec", !14, i64 0, !13, i64 8}
!37 = !{!36, !14, i64 0}
!38 = !{ptr @inner_first, ptr @inner_last}
!39 = !{i64 0, i64 8, !25, i64 8, i64 8, !30}
!40 = !{!18, !14, i64 32}
!41 = !{!42, !14, i64 24}
!42 = !{!"clc2", !43, i64 0, !43, i64 24}
!43 = !{!"clc", !14, i64 0, !13, i64 8, !13, i64 16}
!44 = !{!"branch_weights", i32 4002001, i32 2000}
!45 = !{!"branch_weights", i32 2000, i32 4002001}
!46 = !{!10, !7, i64 26}


; Effective O3 passes: BDCEPass,CalledValuePropagationPass,ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LowerExpectIntrinsicPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass