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

; 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.0 }
%struct.anon.0 = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.MDBX_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.page = type <{ i64, i16, i16, %union.anon.2, i32, [0 x i16] }>
%union.anon.2 = type { i32 }
%struct.MDBX_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.6 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.4, %union.anon.5 }
%union.anon.4 = type { i32 }
%union.anon.5 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.6 = type { %struct.anon.8 }
%struct.anon.8 = type { %struct.troika, ptr, %struct.anon.9, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.10 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.9 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.10 = type { %struct.anon.11 }
%struct.anon.11 = type { i64, ptr }
%struct.anon.3 = type { i16, i16 }

@globals = external global %struct.libmdbx_globals, align 8
@.str.7 = external hidden unnamed_addr constant [52 x i8], align 1
@__func__.node_del = external hidden unnamed_addr constant [9 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [31 x i8], align 1

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

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

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

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

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

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

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

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

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

; Function Attrs: hot nounwind uwtable
define dso_local void @node_del(ptr noundef %0, i64 noundef %1) #6 {
  %3 = alloca ptr, align 8
  %4 = alloca i64, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca i16, align 2
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store i64 %1, ptr %4, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #7
  %19 = load ptr, ptr %3, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.MDBX_cursor, ptr %19, i32 0, i32 9
  %21 = load ptr, ptr %3, align 8, !tbaa !5
  %22 = getelementptr inbounds %struct.MDBX_cursor, ptr %21, i32 0, i32 1
  %23 = getelementptr inbounds %struct.anon, ptr %22, i32 0, i32 1
  %24 = load i8, ptr %23, align 1, !tbaa !11
  %25 = sext i8 %24 to i64
  %26 = getelementptr inbounds [32 x ptr], ptr %20, i64 0, i64 %25
  %27 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %27, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #7
  %28 = load ptr, ptr %3, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.MDBX_cursor, ptr %28, i32 0, i32 10
  %30 = load ptr, ptr %3, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.MDBX_cursor, ptr %30, i32 0, i32 1
  %32 = getelementptr inbounds %struct.anon, ptr %31, i32 0, i32 1
  %33 = load i8, ptr %32, align 1, !tbaa !11
  %34 = sext i8 %33 to i64
  %35 = getelementptr inbounds [32 x i16], ptr %29, i64 0, i64 %34
  %36 = load i16, ptr %35, align 2, !tbaa !12
  %37 = zext i16 %36 to i64
  store i64 %37, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  %38 = load ptr, ptr %5, align 8, !tbaa !5
  %39 = call i64 @page_numkeys(ptr noundef %38) #8
  store i64 %39, ptr %7, align 8, !tbaa !9
  br label %40

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

50:                                               ; preds = %40
  %51 = load i64, ptr %6, align 8, !tbaa !9
  %52 = load ptr, ptr %5, align 8, !tbaa !5
  %53 = call zeroext i1 @is_leaf(ptr noundef %52) #8
  %54 = zext i1 %53 to i64
  %55 = select i1 %53, ptr @.str.24, ptr @.str.25
  %56 = load ptr, ptr %5, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.page, ptr %56, i32 0, i32 4
  %58 = load i32, ptr %57, align 1, !tbaa !18
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.node_del, i32 noundef 179, ptr noundef @.str.23, i64 noundef %51, ptr noundef %55, i32 noundef %58)
  br label %59

59:                                               ; preds = %50, %40
  br label %60

60:                                               ; preds = %59
  br label %61

61:                                               ; preds = %60
  br label %62

62:                                               ; preds = %61
  %63 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !19
  %64 = zext i8 %63 to i32
  %65 = and i32 %64, 1
  %66 = icmp ne i32 %65, 0
  %67 = xor i1 %66, true
  %68 = xor i1 %67, true
  %69 = zext i1 %68 to i32
  %70 = sext i32 %69 to i64
  %71 = call i64 @llvm.expect.i64(i64 %70, i64 1)
  %72 = icmp ne i64 %71, 0
  br i1 %72, label %73, label %94

73:                                               ; preds = %62
  br label %74

74:                                               ; preds = %73
  %75 = load i64, ptr %6, align 8, !tbaa !9
  %76 = load i64, ptr %7, align 8, !tbaa !9
  %77 = icmp ult i64 %75, %76
  %78 = xor i1 %77, true
  %79 = xor i1 %78, true
  %80 = xor i1 %79, true
  %81 = zext i1 %80 to i32
  %82 = sext i32 %81 to i64
  %83 = call i64 @llvm.expect.i64(i64 %82, i64 0)
  %84 = icmp ne i64 %83, 0
  br i1 %84, label %85, label %91

85:                                               ; preds = %74
  %86 = load ptr, ptr %3, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.MDBX_cursor, ptr %86, i32 0, i32 5
  %88 = load ptr, ptr %87, align 8, !tbaa !20
  %89 = getelementptr inbounds %struct.MDBX_txn, ptr %88, i32 0, i32 9
  %90 = load ptr, ptr %89, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %90, ptr noundef @.str.26, ptr noundef @__func__.node_del, i32 noundef 180) #9
  unreachable

91:                                               ; preds = %74
  br label %92

92:                                               ; preds = %91
  br label %93

93:                                               ; preds = %92
  br label %94

94:                                               ; preds = %93, %62
  br label %95

95:                                               ; preds = %94
  br label %96

96:                                               ; preds = %95
  %97 = load ptr, ptr %5, align 8, !tbaa !5
  %98 = call zeroext i1 @is_dupfix_leaf(ptr noundef %97) #8
  br i1 %98, label %99, label %296

99:                                               ; preds = %96
  br label %100

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

111:                                              ; preds = %100
  br label %112

112:                                              ; preds = %111
  %113 = load i64, ptr %4, align 8, !tbaa !9
  %114 = icmp uge i64 %113, 2
  %115 = xor i1 %114, true
  %116 = xor i1 %115, true
  %117 = xor i1 %116, true
  %118 = zext i1 %117 to i32
  %119 = sext i32 %118 to i64
  %120 = call i64 @llvm.expect.i64(i64 %119, i64 0)
  %121 = icmp ne i64 %120, 0
  br i1 %121, label %122, label %128

122:                                              ; preds = %112
  %123 = load ptr, ptr %3, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.MDBX_cursor, ptr %123, i32 0, i32 5
  %125 = load ptr, ptr %124, align 8, !tbaa !20
  %126 = getelementptr inbounds %struct.MDBX_txn, ptr %125, i32 0, i32 9
  %127 = load ptr, ptr %126, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %127, ptr noundef @.str.27, ptr noundef @__func__.node_del, i32 noundef 183) #9
  unreachable

128:                                              ; preds = %112
  br label %129

129:                                              ; preds = %128
  br label %130

130:                                              ; preds = %129
  br label %131

131:                                              ; preds = %130, %100
  br label %132

132:                                              ; preds = %131
  br label %133

133:                                              ; preds = %132
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  %134 = load i64, ptr %7, align 8, !tbaa !9
  %135 = sub i64 %134, 1
  %136 = load i64, ptr %6, align 8, !tbaa !9
  %137 = sub i64 %135, %136
  store i64 %137, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #7
  %138 = load ptr, ptr %5, align 8, !tbaa !5
  %139 = load i64, ptr %6, align 8, !tbaa !9
  %140 = load i64, ptr %4, align 8, !tbaa !9
  %141 = call ptr @page_dupfix_ptr(ptr noundef %138, i64 noundef %139, i64 noundef %140) #8
  store ptr %141, ptr %9, align 8, !tbaa !5
  %142 = load i64, ptr %8, align 8, !tbaa !9
  %143 = icmp ne i64 %142, 0
  br i1 %143, label %144, label %154

144:                                              ; preds = %133
  %145 = load ptr, ptr %9, align 8, !tbaa !5
  %146 = load ptr, ptr %9, align 8, !tbaa !5
  %147 = ptrtoint ptr %146 to i64
  %148 = load i64, ptr %4, align 8, !tbaa !9
  %149 = add nsw i64 %147, %148
  %150 = inttoptr i64 %149 to ptr
  %151 = load i64, ptr %8, align 8, !tbaa !9
  %152 = load i64, ptr %4, align 8, !tbaa !9
  %153 = mul i64 %151, %152
  call void @llvm.memmove.p0.p0.i64(ptr align 1 %145, ptr align 1 %150, i64 %153, i1 false)
  br label %154

154:                                              ; preds = %144, %133
  br label %155

155:                                              ; preds = %154
  %156 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !19
  %157 = zext i8 %156 to i32
  %158 = and i32 %157, 1
  %159 = icmp ne i32 %158, 0
  %160 = xor i1 %159, true
  %161 = xor i1 %160, true
  %162 = zext i1 %161 to i32
  %163 = sext i32 %162 to i64
  %164 = call i64 @llvm.expect.i64(i64 %163, i64 1)
  %165 = icmp ne i64 %164, 0
  br i1 %165, label %166, label %190

166:                                              ; preds = %155
  br label %167

167:                                              ; preds = %166
  %168 = load ptr, ptr %5, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct.page, ptr %168, i32 0, i32 3
  %170 = getelementptr inbounds %struct.anon.3, ptr %169, i32 0, i32 0
  %171 = load i16, ptr %170, align 1, !tbaa !11
  %172 = zext i16 %171 to i64
  %173 = icmp uge i64 %172, 2
  %174 = xor i1 %173, true
  %175 = xor i1 %174, true
  %176 = xor i1 %175, true
  %177 = zext i1 %176 to i32
  %178 = sext i32 %177 to i64
  %179 = call i64 @llvm.expect.i64(i64 %178, i64 0)
  %180 = icmp ne i64 %179, 0
  br i1 %180, label %181, label %187

181:                                              ; preds = %167
  %182 = load ptr, ptr %3, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.MDBX_cursor, ptr %182, i32 0, i32 5
  %184 = load ptr, ptr %183, align 8, !tbaa !20
  %185 = getelementptr inbounds %struct.MDBX_txn, ptr %184, i32 0, i32 9
  %186 = load ptr, ptr %185, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %186, ptr noundef @.str.28, ptr noundef @__func__.node_del, i32 noundef 188) #9
  unreachable

187:                                              ; preds = %167
  br label %188

188:                                              ; preds = %187
  br label %189

189:                                              ; preds = %188
  br label %190

190:                                              ; preds = %189, %155
  br label %191

191:                                              ; preds = %190
  br label %192

192:                                              ; preds = %191
  %193 = load ptr, ptr %5, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.page, ptr %193, i32 0, i32 3
  %195 = getelementptr inbounds %struct.anon.3, ptr %194, i32 0, i32 0
  %196 = load i16, ptr %195, align 1, !tbaa !11
  %197 = zext i16 %196 to i64
  %198 = sub i64 %197, 2
  %199 = trunc i64 %198 to i16
  store i16 %199, ptr %195, align 1, !tbaa !11
  br label %200

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

211:                                              ; preds = %200
  br label %212

212:                                              ; preds = %211
  %213 = load ptr, ptr %5, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.page, ptr %213, i32 0, i32 3
  %215 = getelementptr inbounds %struct.anon.3, ptr %214, i32 0, i32 1
  %216 = load i16, ptr %215, align 1, !tbaa !11
  %217 = zext i16 %216 to i64
  %218 = sub i64 65535, %217
  %219 = load i64, ptr %4, align 8, !tbaa !9
  %220 = sub i64 %219, 2
  %221 = icmp uge i64 %218, %220
  %222 = xor i1 %221, true
  %223 = xor i1 %222, true
  %224 = xor i1 %223, true
  %225 = zext i1 %224 to i32
  %226 = sext i32 %225 to i64
  %227 = call i64 @llvm.expect.i64(i64 %226, i64 0)
  %228 = icmp ne i64 %227, 0
  br i1 %228, label %229, label %235

229:                                              ; preds = %212
  %230 = load ptr, ptr %3, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.MDBX_cursor, ptr %230, i32 0, i32 5
  %232 = load ptr, ptr %231, align 8, !tbaa !20
  %233 = getelementptr inbounds %struct.MDBX_txn, ptr %232, i32 0, i32 9
  %234 = load ptr, ptr %233, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %234, ptr noundef @.str.29, ptr noundef @__func__.node_del, i32 noundef 190) #9
  unreachable

235:                                              ; preds = %212
  br label %236

236:                                              ; preds = %235
  br label %237

237:                                              ; preds = %236
  br label %238

238:                                              ; preds = %237, %200
  br label %239

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  %241 = load i64, ptr %4, align 8, !tbaa !9
  %242 = sub i64 %241, 2
  %243 = trunc i64 %242 to i16
  %244 = zext i16 %243 to i32
  %245 = load ptr, ptr %5, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.page, ptr %245, i32 0, i32 3
  %247 = getelementptr inbounds %struct.anon.3, ptr %246, i32 0, i32 1
  %248 = load i16, ptr %247, align 1, !tbaa !11
  %249 = zext i16 %248 to i32
  %250 = add nsw i32 %249, %244
  %251 = trunc i32 %250 to i16
  store i16 %251, ptr %247, align 1, !tbaa !11
  br label %252

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

263:                                              ; preds = %252
  br label %264

264:                                              ; preds = %263
  %265 = load i64, ptr %4, align 8, !tbaa !9
  %266 = load ptr, ptr %5, align 8, !tbaa !5
  %267 = call i64 @page_numkeys(ptr noundef %266) #8
  %268 = and i64 %265, %267
  %269 = load ptr, ptr %5, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.page, ptr %269, i32 0, i32 3
  %271 = getelementptr inbounds %struct.anon.3, ptr %270, i32 0, i32 1
  %272 = load i16, ptr %271, align 1, !tbaa !11
  %273 = zext i16 %272 to i64
  %274 = xor i64 %268, %273
  %275 = and i64 %274, 1
  %276 = icmp eq i64 %275, 0
  %277 = xor i1 %276, true
  %278 = xor i1 %277, true
  %279 = xor i1 %278, true
  %280 = zext i1 %279 to i32
  %281 = sext i32 %280 to i64
  %282 = call i64 @llvm.expect.i64(i64 %281, i64 0)
  %283 = icmp ne i64 %282, 0
  br i1 %283, label %284, label %290

284:                                              ; preds = %264
  %285 = load ptr, ptr %3, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.MDBX_cursor, ptr %285, i32 0, i32 5
  %287 = load ptr, ptr %286, align 8, !tbaa !20
  %288 = getelementptr inbounds %struct.MDBX_txn, ptr %287, i32 0, i32 9
  %289 = load ptr, ptr %288, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %289, ptr noundef @.str.7, ptr noundef @__func__.node_del, i32 noundef 192) #9
  unreachable

290:                                              ; preds = %264
  br label %291

291:                                              ; preds = %290
  br label %292

292:                                              ; preds = %291
  br label %293

293:                                              ; preds = %292, %252
  br label %294

294:                                              ; preds = %293
  br label %295

295:                                              ; preds = %294
  store i32 1, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  br label %602

296:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  %297 = load ptr, ptr %5, align 8, !tbaa !5
  %298 = load i64, ptr %6, align 8, !tbaa !9
  %299 = call ptr @page_node(ptr noundef %297, i64 noundef %298) #8
  store ptr %299, ptr %11, align 8, !tbaa !5
  br label %300

300:                                              ; preds = %296
  %301 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !19
  %302 = zext i8 %301 to i32
  %303 = and i32 %302, 1
  %304 = icmp ne i32 %303, 0
  %305 = xor i1 %304, true
  %306 = xor i1 %305, true
  %307 = zext i1 %306 to i32
  %308 = sext i32 %307 to i64
  %309 = call i64 @llvm.expect.i64(i64 %308, i64 1)
  %310 = icmp ne i64 %309, 0
  br i1 %310, label %311, label %340

311:                                              ; preds = %300
  br label %312

312:                                              ; preds = %311
  %313 = load ptr, ptr %5, align 8, !tbaa !5
  %314 = call zeroext i1 @is_branch(ptr noundef %313) #8
  br i1 %314, label %315, label %322

315:                                              ; preds = %312
  %316 = load i64, ptr %6, align 8, !tbaa !9
  %317 = icmp ne i64 %316, 0
  br i1 %317, label %322, label %318

318:                                              ; preds = %315
  %319 = load ptr, ptr %11, align 8, !tbaa !5
  %320 = call i64 @node_ks(ptr noundef %319) #8
  %321 = icmp eq i64 %320, 0
  br label %322

322:                                              ; preds = %318, %315, %312
  %323 = phi i1 [ true, %315 ], [ true, %312 ], [ %321, %318 ]
  %324 = xor i1 %323, true
  %325 = xor i1 %324, true
  %326 = xor i1 %325, true
  %327 = zext i1 %326 to i32
  %328 = sext i32 %327 to i64
  %329 = call i64 @llvm.expect.i64(i64 %328, i64 0)
  %330 = icmp ne i64 %329, 0
  br i1 %330, label %331, label %337

331:                                              ; preds = %322
  %332 = load ptr, ptr %3, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.MDBX_cursor, ptr %332, i32 0, i32 5
  %334 = load ptr, ptr %333, align 8, !tbaa !20
  %335 = getelementptr inbounds %struct.MDBX_txn, ptr %334, i32 0, i32 9
  %336 = load ptr, ptr %335, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %336, ptr noundef @.str.30, ptr noundef @__func__.node_del, i32 noundef 197) #9
  unreachable

337:                                              ; preds = %322
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  br label %340

340:                                              ; preds = %339, %300
  br label %341

341:                                              ; preds = %340
  br label %342

342:                                              ; preds = %341
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %343 = load ptr, ptr %11, align 8, !tbaa !5
  %344 = call i64 @node_ks(ptr noundef %343) #8
  %345 = add i64 8, %344
  store i64 %345, ptr %12, align 8, !tbaa !9
  %346 = load ptr, ptr %5, align 8, !tbaa !5
  %347 = call zeroext i1 @is_leaf(ptr noundef %346) #8
  br i1 %347, label %348, label %362

348:                                              ; preds = %342
  %349 = load ptr, ptr %11, align 8, !tbaa !5
  %350 = call zeroext i8 @node_flags(ptr noundef %349) #8
  %351 = zext i8 %350 to i32
  %352 = and i32 %351, 1
  %353 = icmp ne i32 %352, 0
  br i1 %353, label %354, label %355

354:                                              ; preds = %348
  br label %358

355:                                              ; preds = %348
  %356 = load ptr, ptr %11, align 8, !tbaa !5
  %357 = call i64 @node_ds(ptr noundef %356) #8
  br label %358

358:                                              ; preds = %355, %354
  %359 = phi i64 [ 4, %354 ], [ %357, %355 ]
  %360 = load i64, ptr %12, align 8, !tbaa !9
  %361 = add i64 %360, %359
  store i64 %361, ptr %12, align 8, !tbaa !9
  br label %362

362:                                              ; preds = %358, %342
  %363 = load i64, ptr %12, align 8, !tbaa !9
  %364 = add i64 %363, 1
  %365 = and i64 %364, -2
  store i64 %365, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 2, ptr %13) #7
  %366 = load ptr, ptr %5, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.page, ptr %366, i32 0, i32 5
  %368 = load i64, ptr %6, align 8, !tbaa !9
  %369 = getelementptr inbounds [0 x i16], ptr %367, i64 0, i64 %368
  %370 = load i16, ptr %369, align 1, !tbaa !12
  store i16 %370, ptr %13, align 2, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  store i64 0, ptr %15, align 8, !tbaa !9
  store i64 0, ptr %14, align 8, !tbaa !9
  br label %371

371:                                              ; preds = %416, %362
  %372 = load i64, ptr %14, align 8, !tbaa !9
  %373 = load i64, ptr %7, align 8, !tbaa !9
  %374 = icmp ult i64 %372, %373
  br i1 %374, label %375, label %419

375:                                              ; preds = %371
  %376 = load i64, ptr %14, align 8, !tbaa !9
  %377 = load i64, ptr %6, align 8, !tbaa !9
  %378 = icmp ne i64 %376, %377
  br i1 %378, label %379, label %415

379:                                              ; preds = %375
  %380 = load ptr, ptr %5, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.page, ptr %380, i32 0, i32 5
  %382 = load i64, ptr %14, align 8, !tbaa !9
  %383 = getelementptr inbounds [0 x i16], ptr %381, i64 0, i64 %382
  %384 = load i16, ptr %383, align 1, !tbaa !12
  %385 = zext i16 %384 to i32
  %386 = load i16, ptr %13, align 2, !tbaa !12
  %387 = zext i16 %386 to i32
  %388 = icmp slt i32 %385, %387
  br i1 %388, label %389, label %400

389:                                              ; preds = %379
  %390 = load ptr, ptr %5, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.page, ptr %390, i32 0, i32 5
  %392 = load i64, ptr %14, align 8, !tbaa !9
  %393 = getelementptr inbounds [0 x i16], ptr %391, i64 0, i64 %392
  %394 = load i16, ptr %393, align 1, !tbaa !12
  %395 = zext i16 %394 to i32
  %396 = load i64, ptr %12, align 8, !tbaa !9
  %397 = trunc i64 %396 to i16
  %398 = zext i16 %397 to i32
  %399 = add nsw i32 %395, %398
  br label %407

400:                                              ; preds = %379
  %401 = load ptr, ptr %5, align 8, !tbaa !5
  %402 = getelementptr inbounds %struct.page, ptr %401, i32 0, i32 5
  %403 = load i64, ptr %14, align 8, !tbaa !9
  %404 = getelementptr inbounds [0 x i16], ptr %402, i64 0, i64 %403
  %405 = load i16, ptr %404, align 1, !tbaa !12
  %406 = zext i16 %405 to i32
  br label %407

407:                                              ; preds = %400, %389
  %408 = phi i32 [ %399, %389 ], [ %406, %400 ]
  %409 = trunc i32 %408 to i16
  %410 = load ptr, ptr %5, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.page, ptr %410, i32 0, i32 5
  %412 = load i64, ptr %15, align 8, !tbaa !9
  %413 = add i64 %412, 1
  store i64 %413, ptr %15, align 8, !tbaa !9
  %414 = getelementptr inbounds [0 x i16], ptr %411, i64 0, i64 %412
  store i16 %409, ptr %414, align 1, !tbaa !12
  br label %415

415:                                              ; preds = %407, %375
  br label %416

416:                                              ; preds = %415
  %417 = load i64, ptr %14, align 8, !tbaa !9
  %418 = add i64 %417, 1
  store i64 %418, ptr %14, align 8, !tbaa !9
  br label %371, !llvm.loop !26

419:                                              ; preds = %371
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  %420 = load ptr, ptr %5, align 8, !tbaa !5
  %421 = ptrtoint ptr %420 to i64
  %422 = load ptr, ptr %5, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.page, ptr %422, i32 0, i32 3
  %424 = getelementptr inbounds %struct.anon.3, ptr %423, i32 0, i32 1
  %425 = load i16, ptr %424, align 1, !tbaa !11
  %426 = zext i16 %425 to i32
  %427 = add i32 %426, 20
  %428 = zext i32 %427 to i64
  %429 = add nsw i64 %421, %428
  %430 = inttoptr i64 %429 to ptr
  store ptr %430, ptr %16, align 8, !tbaa !5
  %431 = load ptr, ptr %16, align 8, !tbaa !5
  %432 = ptrtoint ptr %431 to i64
  %433 = load i64, ptr %12, align 8, !tbaa !9
  %434 = add nsw i64 %432, %433
  %435 = inttoptr i64 %434 to ptr
  %436 = load ptr, ptr %16, align 8, !tbaa !5
  %437 = load i16, ptr %13, align 2, !tbaa !12
  %438 = zext i16 %437 to i32
  %439 = load ptr, ptr %5, align 8, !tbaa !5
  %440 = getelementptr inbounds %struct.page, ptr %439, i32 0, i32 3
  %441 = getelementptr inbounds %struct.anon.3, ptr %440, i32 0, i32 1
  %442 = load i16, ptr %441, align 1, !tbaa !11
  %443 = zext i16 %442 to i32
  %444 = sub nsw i32 %438, %443
  %445 = sext i32 %444 to i64
  call void @llvm.memmove.p0.p0.i64(ptr align 1 %435, ptr align 1 %436, i64 %445, i1 false)
  br label %446

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

457:                                              ; preds = %446
  br label %458

458:                                              ; preds = %457
  %459 = load ptr, ptr %5, align 8, !tbaa !5
  %460 = getelementptr inbounds %struct.page, ptr %459, i32 0, i32 3
  %461 = getelementptr inbounds %struct.anon.3, ptr %460, i32 0, i32 0
  %462 = load i16, ptr %461, align 1, !tbaa !11
  %463 = zext i16 %462 to i64
  %464 = icmp uge i64 %463, 2
  %465 = xor i1 %464, true
  %466 = xor i1 %465, true
  %467 = xor i1 %466, true
  %468 = zext i1 %467 to i32
  %469 = sext i32 %468 to i64
  %470 = call i64 @llvm.expect.i64(i64 %469, i64 0)
  %471 = icmp ne i64 %470, 0
  br i1 %471, label %472, label %478

472:                                              ; preds = %458
  %473 = load ptr, ptr %3, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.MDBX_cursor, ptr %473, i32 0, i32 5
  %475 = load ptr, ptr %474, align 8, !tbaa !20
  %476 = getelementptr inbounds %struct.MDBX_txn, ptr %475, i32 0, i32 9
  %477 = load ptr, ptr %476, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %477, ptr noundef @.str.28, ptr noundef @__func__.node_del, i32 noundef 212) #9
  unreachable

478:                                              ; preds = %458
  br label %479

479:                                              ; preds = %478
  br label %480

480:                                              ; preds = %479
  br label %481

481:                                              ; preds = %480, %446
  br label %482

482:                                              ; preds = %481
  br label %483

483:                                              ; preds = %482
  %484 = load ptr, ptr %5, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.page, ptr %484, i32 0, i32 3
  %486 = getelementptr inbounds %struct.anon.3, ptr %485, i32 0, i32 0
  %487 = load i16, ptr %486, align 1, !tbaa !11
  %488 = zext i16 %487 to i64
  %489 = sub i64 %488, 2
  %490 = trunc i64 %489 to i16
  store i16 %490, ptr %486, align 1, !tbaa !11
  br label %491

491:                                              ; preds = %483
  %492 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !19
  %493 = zext i8 %492 to i32
  %494 = and i32 %493, 1
  %495 = icmp ne i32 %494, 0
  %496 = xor i1 %495, true
  %497 = xor i1 %496, true
  %498 = zext i1 %497 to i32
  %499 = sext i32 %498 to i64
  %500 = call i64 @llvm.expect.i64(i64 %499, i64 1)
  %501 = icmp ne i64 %500, 0
  br i1 %501, label %502, label %528

502:                                              ; preds = %491
  br label %503

503:                                              ; preds = %502
  %504 = load ptr, ptr %5, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.page, ptr %504, i32 0, i32 3
  %506 = getelementptr inbounds %struct.anon.3, ptr %505, i32 0, i32 1
  %507 = load i16, ptr %506, align 1, !tbaa !11
  %508 = zext i16 %507 to i64
  %509 = sub i64 65535, %508
  %510 = load i64, ptr %12, align 8, !tbaa !9
  %511 = icmp uge i64 %509, %510
  %512 = xor i1 %511, true
  %513 = xor i1 %512, true
  %514 = xor i1 %513, true
  %515 = zext i1 %514 to i32
  %516 = sext i32 %515 to i64
  %517 = call i64 @llvm.expect.i64(i64 %516, i64 0)
  %518 = icmp ne i64 %517, 0
  br i1 %518, label %519, label %525

519:                                              ; preds = %503
  %520 = load ptr, ptr %3, align 8, !tbaa !5
  %521 = getelementptr inbounds %struct.MDBX_cursor, ptr %520, i32 0, i32 5
  %522 = load ptr, ptr %521, align 8, !tbaa !20
  %523 = getelementptr inbounds %struct.MDBX_txn, ptr %522, i32 0, i32 9
  %524 = load ptr, ptr %523, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %524, ptr noundef @.str.31, ptr noundef @__func__.node_del, i32 noundef 214) #9
  unreachable

525:                                              ; preds = %503
  br label %526

526:                                              ; preds = %525
  br label %527

527:                                              ; preds = %526
  br label %528

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

529:                                              ; preds = %528
  br label %530

530:                                              ; preds = %529
  %531 = load i64, ptr %12, align 8, !tbaa !9
  %532 = trunc i64 %531 to i16
  %533 = zext i16 %532 to i32
  %534 = load ptr, ptr %5, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.page, ptr %534, i32 0, i32 3
  %536 = getelementptr inbounds %struct.anon.3, ptr %535, i32 0, i32 1
  %537 = load i16, ptr %536, align 1, !tbaa !11
  %538 = zext i16 %537 to i32
  %539 = add nsw i32 %538, %533
  %540 = trunc i32 %539 to i16
  store i16 %540, ptr %536, align 1, !tbaa !11
  %541 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !19
  %542 = zext i8 %541 to i32
  %543 = and i32 %542, 2
  %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 0)
  %550 = icmp ne i64 %549, 0
  br i1 %550, label %551, label %601

551:                                              ; preds = %530
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #7
  %552 = load ptr, ptr %3, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.MDBX_cursor, ptr %552, i32 0, i32 2
  %554 = load i8, ptr %553, align 2, !tbaa !28
  store i8 %554, ptr %17, align 1, !tbaa !11
  %555 = load ptr, ptr %3, align 8, !tbaa !5
  %556 = getelementptr inbounds %struct.MDBX_cursor, ptr %555, i32 0, i32 2
  %557 = load i8, ptr %556, align 2, !tbaa !28
  %558 = zext i8 %557 to i32
  %559 = or i32 %558, 8
  %560 = trunc i32 %559 to i8
  store i8 %560, ptr %556, align 2, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #7
  %561 = load ptr, ptr %3, align 8, !tbaa !5
  %562 = load ptr, ptr %5, align 8, !tbaa !5
  %563 = call i32 @page_check(ptr noundef %561, ptr noundef %562)
  store i32 %563, ptr %18, align 4, !tbaa !18
  %564 = load i8, ptr %17, align 1, !tbaa !11
  %565 = load ptr, ptr %3, align 8, !tbaa !5
  %566 = getelementptr inbounds %struct.MDBX_cursor, ptr %565, i32 0, i32 2
  store i8 %564, ptr %566, align 2, !tbaa !28
  br label %567

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

578:                                              ; preds = %567
  br label %579

579:                                              ; preds = %578
  %580 = load i32, ptr %18, align 4, !tbaa !18
  %581 = icmp eq i32 %580, 0
  %582 = xor i1 %581, true
  %583 = xor i1 %582, true
  %584 = xor i1 %583, true
  %585 = zext i1 %584 to i32
  %586 = sext i32 %585 to i64
  %587 = call i64 @llvm.expect.i64(i64 %586, i64 0)
  %588 = icmp ne i64 %587, 0
  br i1 %588, label %589, label %595

589:                                              ; preds = %579
  %590 = load ptr, ptr %3, align 8, !tbaa !5
  %591 = getelementptr inbounds %struct.MDBX_cursor, ptr %590, i32 0, i32 5
  %592 = load ptr, ptr %591, align 8, !tbaa !20
  %593 = getelementptr inbounds %struct.MDBX_txn, ptr %592, i32 0, i32 9
  %594 = load ptr, ptr %593, align 8, !tbaa !22
  call void @mdbx_assert_fail(ptr noundef %594, ptr noundef @.str.32, ptr noundef @__func__.node_del, i32 noundef 222) #9
  unreachable

595:                                              ; preds = %579
  br label %596

596:                                              ; preds = %595
  br label %597

597:                                              ; preds = %596
  br label %598

598:                                              ; preds = %597, %567
  br label %599

599:                                              ; preds = %598
  br label %600

600:                                              ; preds = %599
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #7
  br label %601

601:                                              ; preds = %600, %530
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 2, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  store i32 0, ptr %10, align 4
  br label %602

602:                                              ; preds = %601, %295
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #7
  %603 = load i32, ptr %10, align 4
  switch i32 %603, label %605 [
    i32 0, label %604
    i32 1, label %604
  ]

604:                                              ; preds = %602, %602
  ret void

605:                                              ; preds = %602
  unreachable
}

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

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

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

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

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

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

declare i32 @page_check(ptr noundef, ptr noundef) #3

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

!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 = !{!"long", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"short", !7, i64 0}
!14 = !{!15, !7, i64 26}
!15 = !{!"libmdbx_globals", !7, i64 0, !16, i64 16, !16, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !17, i64 27, !16, i64 28, !7, i64 32, !7, i64 40, !10, i64 80, !6, i64 88}
!16 = !{!"int", !7, i64 0}
!17 = !{!"_Bool", !7, i64 0}
!18 = !{!16, !16, i64 0}
!19 = !{!15, !7, i64 25}
!20 = !{!21, !6, i64 16}
!21 = !{!"MDBX_cursor", !16, 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}
!22 = !{!23, !6, i64 80}
!23 = !{!"MDBX_txn", !16, i64 0, !16, i64 4, !10, i64 8, !10, i64 16, !6, i64 24, !6, i64 32, !24, i64 40, !10, i64 64, !10, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !25, i64 128, !6, i64 160, !7, i64 168}
!24 = !{!"geo", !13, i64 0, !13, i64 2, !16, i64 4, !16, i64 8, !7, i64 12, !7, i64 16}
!25 = !{!"MDBX_canary", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!21, !7, i64 6}


; 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.0 }
%struct.anon.0 = 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 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.7 = external hidden unnamed_addr constant [52 x i8], align 1
@__func__.node_del = external hidden unnamed_addr constant [9 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [5 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [31 x i8], align 1

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

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

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

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

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

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

; Function Attrs: hot nounwind uwtable
define dso_local void @node_del(ptr noundef %0, i64 noundef %1) local_unnamed_addr #4 {
  %3 = getelementptr inbounds i8, ptr %0, i64 48
  %4 = getelementptr inbounds i8, ptr %0, i64 5
  %5 = load i8, ptr %4, align 1, !tbaa !5
  %6 = sext i8 %5 to i64
  %7 = getelementptr inbounds [32 x ptr], ptr %3, i64 0, i64 %6
  %8 = load ptr, ptr %7, align 8, !tbaa !8
  %9 = getelementptr inbounds i8, ptr %0, i64 304
  %10 = getelementptr inbounds [32 x i16], ptr %9, i64 0, i64 %6
  %11 = load i16, ptr %10, align 2, !tbaa !10
  %12 = zext i16 %11 to i64
  %13 = tail call i64 @page_numkeys(ptr noundef %8) #5
  %14 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !12
  %15 = icmp ugt i8 %14, 4
  br i1 %15, label %16, label %21, !prof !17

16:                                               ; preds = %2
  %17 = tail call zeroext i1 @is_leaf(ptr noundef %8) #5
  %18 = select i1 %17, ptr @.str.24, ptr @.str.25
  %19 = getelementptr inbounds i8, ptr %8, i64 16
  %20 = load i32, ptr %19, align 1, !tbaa !18
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.node_del, i32 noundef 179, ptr noundef nonnull @.str.23, i64 noundef %12, ptr noundef nonnull %18, i32 noundef %20) #6
  br label %21

21:                                               ; preds = %2, %16
  %22 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %23 = and i8 %22, 1
  %.not94 = icmp eq i8 %23, 0
  %.not95 = icmp ugt i64 %13, %12
  %or.cond = select i1 %.not94, i1 true, i1 %.not95
  br i1 %or.cond, label %29, label %24, !prof !20

24:                                               ; preds = %21
  %25 = getelementptr inbounds i8, ptr %0, i64 16
  %26 = load ptr, ptr %25, align 8, !tbaa !21
  %27 = getelementptr inbounds i8, ptr %26, i64 80
  %28 = load ptr, ptr %27, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %28, ptr noundef nonnull @.str.26, ptr noundef nonnull @__func__.node_del, i32 noundef 180) #7
  unreachable

29:                                               ; preds = %21
  %30 = tail call zeroext i1 @is_dupfix_leaf(ptr noundef %8) #5
  br i1 %30, label %31, label %86

31:                                               ; preds = %29
  %.not105 = icmp ne i8 %23, 0
  %32 = icmp ult i64 %1, 2
  %or.cond112 = and i1 %32, %.not105
  br i1 %or.cond112, label %33, label %38, !prof !27

33:                                               ; preds = %31
  %34 = getelementptr inbounds i8, ptr %0, i64 16
  %35 = load ptr, ptr %34, align 8, !tbaa !21
  %36 = getelementptr inbounds i8, ptr %35, i64 80
  %37 = load ptr, ptr %36, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %37, ptr noundef nonnull @.str.27, ptr noundef nonnull @__func__.node_del, i32 noundef 183) #7
  unreachable

38:                                               ; preds = %31
  %39 = xor i64 %12, -1
  %40 = add i64 %13, %39
  %.not106 = icmp eq i64 %40, 0
  br i1 %.not106, label %47, label %41

41:                                               ; preds = %38
  %42 = tail call ptr @page_dupfix_ptr(ptr noundef %8, i64 noundef %12, i64 noundef %1) #5
  %43 = ptrtoint ptr %42 to i64
  %44 = add nsw i64 %43, %1
  %45 = inttoptr i64 %44 to ptr
  %46 = mul i64 %40, %1
  tail call void @llvm.memmove.p0.p0.i64(ptr align 1 %42, ptr align 1 %45, i64 %46, i1 false)
  %.pre119 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  br label %47

47:                                               ; preds = %38, %41
  %48 = phi i8 [ %22, %38 ], [ %.pre119, %41 ]
  %49 = and i8 %48, 1
  %.not107 = icmp ne i8 %49, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %8, i64 12
  %.pre121 = load i16, ptr %.phi.trans.insert, align 1, !tbaa !5
  %50 = icmp ult i16 %.pre121, 2
  %or.cond125 = select i1 %.not107, i1 %50, i1 false
  br i1 %or.cond125, label %51, label %._crit_edge120, !prof !27

51:                                               ; preds = %47
  %52 = getelementptr inbounds i8, ptr %0, i64 16
  %53 = load ptr, ptr %52, align 8, !tbaa !21
  %54 = getelementptr inbounds i8, ptr %53, i64 80
  %55 = load ptr, ptr %54, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %55, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.node_del, i32 noundef 188) #7
  unreachable

._crit_edge120:                                   ; preds = %47
  %56 = getelementptr inbounds i8, ptr %8, i64 12
  %57 = add i16 %.pre121, -2
  store i16 %57, ptr %56, align 1, !tbaa !5
  %58 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %59 = and i8 %58, 1
  %.not108 = icmp eq i8 %59, 0
  %.phi.trans.insert123 = getelementptr inbounds i8, ptr %8, i64 14
  %.pre124 = load i16, ptr %.phi.trans.insert123, align 1, !tbaa !5
  br i1 %.not108, label %._crit_edge122, label %60, !prof !17

60:                                               ; preds = %._crit_edge120
  %61 = xor i16 %.pre124, -1
  %62 = zext i16 %61 to i64
  %63 = add i64 %1, -2
  %.not109 = icmp ugt i64 %63, %62
  br i1 %.not109, label %64, label %._crit_edge122, !prof !17

64:                                               ; preds = %60
  %65 = getelementptr inbounds i8, ptr %0, i64 16
  %66 = load ptr, ptr %65, align 8, !tbaa !21
  %67 = getelementptr inbounds i8, ptr %66, i64 80
  %68 = load ptr, ptr %67, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %68, ptr noundef nonnull @.str.29, ptr noundef nonnull @__func__.node_del, i32 noundef 190) #7
  unreachable

._crit_edge122:                                   ; preds = %._crit_edge120, %60
  %69 = trunc i64 %1 to i16
  %70 = add i16 %69, -2
  %71 = getelementptr inbounds i8, ptr %8, i64 14
  %72 = add i16 %70, %.pre124
  store i16 %72, ptr %71, align 1, !tbaa !5
  %73 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %74 = and i8 %73, 1
  %.not110 = icmp eq i8 %74, 0
  br i1 %.not110, label %198, label %75, !prof !17

75:                                               ; preds = %._crit_edge122
  %76 = tail call i64 @page_numkeys(ptr noundef nonnull %8) #5
  %77 = and i64 %76, %1
  %78 = zext i16 %72 to i64
  %79 = xor i64 %77, %78
  %80 = and i64 %79, 1
  %.not111 = icmp eq i64 %80, 0
  br i1 %.not111, label %198, label %81, !prof !28

81:                                               ; preds = %75
  %82 = getelementptr inbounds i8, ptr %0, i64 16
  %83 = load ptr, ptr %82, align 8, !tbaa !21
  %84 = getelementptr inbounds i8, ptr %83, i64 80
  %85 = load ptr, ptr %84, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %85, ptr noundef nonnull @.str.7, ptr noundef nonnull @__func__.node_del, i32 noundef 192) #7
  unreachable

86:                                               ; preds = %29
  %87 = tail call ptr @page_node(ptr noundef %8, i64 noundef %12) #5
  br i1 %.not94, label %.critedge, label %88, !prof !17

88:                                               ; preds = %86
  %89 = tail call zeroext i1 @is_branch(ptr noundef %8) #5
  %90 = icmp eq i16 %11, 0
  %or.cond.not = select i1 %89, i1 %90, i1 false
  br i1 %or.cond.not, label %91, label %.critedge

91:                                               ; preds = %88
  %92 = tail call i64 @node_ks(ptr noundef %87) #5
  %.not114 = icmp eq i64 %92, 0
  br i1 %.not114, label %.critedge, label %93, !prof !28

93:                                               ; preds = %91
  %94 = getelementptr inbounds i8, ptr %0, i64 16
  %95 = load ptr, ptr %94, align 8, !tbaa !21
  %96 = getelementptr inbounds i8, ptr %95, i64 80
  %97 = load ptr, ptr %96, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %97, ptr noundef nonnull @.str.30, ptr noundef nonnull @__func__.node_del, i32 noundef 197) #7
  unreachable

.critedge:                                        ; preds = %88, %91, %86
  %98 = tail call i64 @node_ks(ptr noundef %87) #5
  %99 = add i64 %98, 8
  %100 = tail call zeroext i1 @is_leaf(ptr noundef %8) #5
  br i1 %100, label %101, label %109

101:                                              ; preds = %.critedge
  %102 = tail call zeroext i8 @node_flags(ptr noundef %87) #5
  %103 = and i8 %102, 1
  %.not = icmp eq i8 %103, 0
  br i1 %.not, label %104, label %106

104:                                              ; preds = %101
  %105 = tail call i64 @node_ds(ptr noundef %87) #5
  br label %106

106:                                              ; preds = %101, %104
  %107 = phi i64 [ %105, %104 ], [ 4, %101 ]
  %108 = add i64 %107, %99
  br label %109

109:                                              ; preds = %106, %.critedge
  %.0 = phi i64 [ %108, %106 ], [ %99, %.critedge ]
  %110 = add i64 %.0, 1
  %111 = and i64 %110, -2
  %112 = getelementptr inbounds i8, ptr %8, i64 20
  %113 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %12
  %114 = load i16, ptr %113, align 1, !tbaa !10
  %.not117 = icmp eq i64 %13, 0
  br i1 %.not117, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %109
  %115 = trunc i64 %110 to i16
  %116 = and i16 %115, -2
  %xtraiter = and i64 %13, 1
  %117 = icmp eq i64 %13, 1
  br i1 %117, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %13, -2
  br label %118

118:                                              ; preds = %137, %.lr.ph.new
  %.089116 = phi i64 [ 0, %.lr.ph.new ], [ %138, %137 ]
  %.090115 = phi i64 [ 0, %.lr.ph.new ], [ %.1.1, %137 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.1, %137 ]
  %.not104 = icmp eq i64 %.089116, %12
  br i1 %.not104, label %127, label %119

119:                                              ; preds = %118
  %120 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %.089116
  %121 = load i16, ptr %120, align 1, !tbaa !10
  %122 = icmp ult i16 %121, %114
  %123 = select i1 %122, i16 %116, i16 0
  %124 = add i16 %123, %121
  %125 = add i64 %.090115, 1
  %126 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %.090115
  store i16 %124, ptr %126, align 1, !tbaa !10
  br label %127

127:                                              ; preds = %118, %119
  %.1 = phi i64 [ %125, %119 ], [ %.090115, %118 ]
  %128 = or disjoint i64 %.089116, 1
  %.not104.1 = icmp eq i64 %128, %12
  br i1 %.not104.1, label %137, label %129

129:                                              ; preds = %127
  %130 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %128
  %131 = load i16, ptr %130, align 1, !tbaa !10
  %132 = icmp ult i16 %131, %114
  %133 = select i1 %132, i16 %116, i16 0
  %134 = add i16 %133, %131
  %135 = add i64 %.1, 1
  %136 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %.1
  store i16 %134, ptr %136, align 1, !tbaa !10
  br label %137

137:                                              ; preds = %129, %127
  %.1.1 = phi i64 [ %135, %129 ], [ %.1, %127 ]
  %138 = add nuw i64 %.089116, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %118, !llvm.loop !29

._crit_edge.loopexit.unr-lcssa:                   ; preds = %137, %.lr.ph
  %.089116.unr = phi i64 [ 0, %.lr.ph ], [ %138, %137 ]
  %.090115.unr = phi i64 [ 0, %.lr.ph ], [ %.1.1, %137 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %.not104.epil = icmp eq i64 %.089116.unr, %12
  %or.cond127 = select i1 %lcmp.mod.not, i1 true, i1 %.not104.epil
  br i1 %or.cond127, label %._crit_edge, label %139

139:                                              ; preds = %._crit_edge.loopexit.unr-lcssa
  %140 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %.089116.unr
  %141 = load i16, ptr %140, align 1, !tbaa !10
  %142 = icmp ult i16 %141, %114
  %143 = select i1 %142, i16 %116, i16 0
  %144 = add i16 %143, %141
  %145 = getelementptr inbounds [0 x i16], ptr %112, i64 0, i64 %.090115.unr
  store i16 %144, ptr %145, align 1, !tbaa !10
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %139, %109
  %146 = ptrtoint ptr %8 to i64
  %147 = getelementptr inbounds i8, ptr %8, i64 12
  %148 = getelementptr inbounds i8, ptr %8, i64 14
  %149 = load i16, ptr %148, align 1, !tbaa !5
  %150 = zext i16 %149 to i32
  %151 = add nuw nsw i32 %150, 20
  %152 = zext nneg i32 %151 to i64
  %153 = add nsw i64 %152, %146
  %154 = inttoptr i64 %153 to ptr
  %155 = add nsw i64 %153, %111
  %156 = inttoptr i64 %155 to ptr
  %157 = zext i16 %114 to i32
  %158 = sub nsw i32 %157, %150
  %159 = sext i32 %158 to i64
  tail call void @llvm.memmove.p0.p0.i64(ptr align 1 %156, ptr align 1 %154, i64 %159, i1 false)
  %160 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %161 = and i8 %160, 1
  %.not98 = icmp ne i8 %161, 0
  %.pre = load i16, ptr %147, align 1, !tbaa !5
  %162 = icmp ult i16 %.pre, 2
  %or.cond126 = select i1 %.not98, i1 %162, i1 false
  br i1 %or.cond126, label %163, label %168, !prof !27

163:                                              ; preds = %._crit_edge
  %164 = getelementptr inbounds i8, ptr %0, i64 16
  %165 = load ptr, ptr %164, align 8, !tbaa !21
  %166 = getelementptr inbounds i8, ptr %165, i64 80
  %167 = load ptr, ptr %166, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %167, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.node_del, i32 noundef 212) #7
  unreachable

168:                                              ; preds = %._crit_edge
  %169 = add i16 %.pre, -2
  store i16 %169, ptr %147, align 1, !tbaa !5
  %170 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %171 = and i8 %170, 1
  %.not99 = icmp eq i8 %171, 0
  %.pre118 = load i16, ptr %148, align 1, !tbaa !5
  br i1 %.not99, label %180, label %172, !prof !17

172:                                              ; preds = %168
  %173 = xor i16 %.pre118, -1
  %174 = zext i16 %173 to i64
  %.not100 = icmp ugt i64 %111, %174
  br i1 %.not100, label %175, label %180, !prof !17

175:                                              ; preds = %172
  %176 = getelementptr inbounds i8, ptr %0, i64 16
  %177 = load ptr, ptr %176, align 8, !tbaa !21
  %178 = getelementptr inbounds i8, ptr %177, i64 80
  %179 = load ptr, ptr %178, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %179, ptr noundef nonnull @.str.31, ptr noundef nonnull @__func__.node_del, i32 noundef 214) #7
  unreachable

180:                                              ; preds = %172, %168
  %181 = trunc i64 %110 to i16
  %182 = and i16 %181, -2
  %183 = add i16 %.pre118, %182
  store i16 %183, ptr %148, align 1, !tbaa !5
  %184 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %185 = and i8 %184, 2
  %.not101 = icmp eq i8 %185, 0
  br i1 %.not101, label %198, label %186, !prof !28

186:                                              ; preds = %180
  %187 = getelementptr inbounds i8, ptr %0, i64 6
  %188 = load i8, ptr %187, align 2, !tbaa !31
  %189 = or i8 %188, 8
  store i8 %189, ptr %187, align 2, !tbaa !31
  %190 = tail call i32 @page_check(ptr noundef %0, ptr noundef nonnull %8) #6
  store i8 %188, ptr %187, align 2, !tbaa !31
  %191 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !19
  %192 = and i8 %191, 1
  %.not102 = icmp eq i8 %192, 0
  %.not103 = icmp eq i32 %190, 0
  %or.cond113 = select i1 %.not102, i1 true, i1 %.not103
  br i1 %or.cond113, label %198, label %193, !prof !20

193:                                              ; preds = %186
  %194 = getelementptr inbounds i8, ptr %0, i64 16
  %195 = load ptr, ptr %194, align 8, !tbaa !21
  %196 = getelementptr inbounds i8, ptr %195, i64 80
  %197 = load ptr, ptr %196, align 8, !tbaa !23
  tail call void @mdbx_assert_fail(ptr noundef %197, ptr noundef nonnull @.str.32, ptr noundef nonnull @__func__.node_del, i32 noundef 222) #7
  unreachable

198:                                              ; preds = %180, %186, %._crit_edge122, %75
  ret void
}

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

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

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

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"any pointer", !6, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"short", !6, i64 0}
!12 = !{!13, !6, i64 26}
!13 = !{!"libmdbx_globals", !6, i64 0, !14, i64 16, !14, i64 20, !6, i64 24, !6, i64 25, !6, i64 26, !15, i64 27, !14, i64 28, !6, i64 32, !6, i64 40, !16, i64 80, !9, i64 88}
!14 = !{!"int", !6, i64 0}
!15 = !{!"_Bool", !6, i64 0}
!16 = !{!"long", !6, i64 0}
!17 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!18 = !{!14, !14, i64 0}
!19 = !{!13, !6, i64 25}
!20 = !{!"branch_weights", i32 4002001, i32 2000}
!21 = !{!22, !9, i64 16}
!22 = !{!"MDBX_cursor", !14, i64 0, !6, i64 4, !6, i64 6, !6, i64 7, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40, !6, i64 48, !6, i64 304, !9, i64 368, !9, i64 376}
!23 = !{!24, !9, i64 80}
!24 = !{!"MDBX_txn", !14, i64 0, !14, i64 4, !16, i64 8, !16, i64 16, !9, i64 24, !9, i64 32, !25, i64 40, !16, i64 64, !16, i64 72, !9, i64 80, !9, i64 88, !9, i64 96, !9, i64 104, !9, i64 112, !9, i64 120, !26, i64 128, !9, i64 160, !6, i64 168}
!25 = !{!"geo", !11, i64 0, !11, i64 2, !14, i64 4, !14, i64 8, !6, i64 12, !6, i64 16}
!26 = !{!"MDBX_canary", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24}
!27 = !{!"branch_weights", i32 2000, i32 4002001}
!28 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!22, !6, i64 6}


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