; LLVM IR from erthink/libmdbx :: src (api-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.16 }
%struct.anon.16 = 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.MDBX_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.2 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.0, %union.anon.1 }
%union.anon.0 = type { i32 }
%union.anon.1 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.2 = type { %struct.anon.4 }
%struct.anon.4 = type { %struct.troika, ptr, %struct.anon.5, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.6 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.5 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.6 = type { %struct.anon.7 }
%struct.anon.7 = type { i64, ptr }
%struct.anon = type { i8, i8 }
%struct.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }

@globals = external global %struct.libmdbx_globals, align 8
@.str.12 = external hidden unnamed_addr constant [31 x i8], align 1
@__func__.mdbx_cursor_compare = external hidden unnamed_addr constant [20 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [25 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: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @mdbx_cursor_compare(ptr noundef %0, ptr noundef %1, i1 noundef zeroext %2) #4 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i8, align 1
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i64, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  %18 = zext i1 %2 to i8
  store i8 %18, ptr %7, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #6
  store i32 32768, ptr %8, align 4, !tbaa !11
  %19 = load ptr, ptr %5, align 8, !tbaa !5
  %20 = icmp ne ptr %19, null
  %21 = xor i1 %20, true
  %22 = xor i1 %21, true
  %23 = xor i1 %22, true
  %24 = zext i1 %23 to i32
  %25 = sext i32 %24 to i64
  %26 = call i64 @llvm.expect.i64(i64 %25, i64 0)
  %27 = icmp ne i64 %26, 0
  br i1 %27, label %28, label %33

28:                                               ; preds = %3
  %29 = load ptr, ptr %6, align 8, !tbaa !5
  %30 = icmp ne ptr %29, null
  %31 = zext i1 %30 to i64
  %32 = select i1 %30, i32 -294912, i32 0
  store i32 %32, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

33:                                               ; preds = %3
  %34 = load ptr, ptr %6, align 8, !tbaa !5
  %35 = icmp ne ptr %34, null
  %36 = xor i1 %35, true
  %37 = xor i1 %36, true
  %38 = xor i1 %37, true
  %39 = zext i1 %38 to i32
  %40 = sext i32 %39 to i64
  %41 = call i64 @llvm.expect.i64(i64 %40, i64 0)
  %42 = icmp ne i64 %41, 0
  br i1 %42, label %43, label %44

43:                                               ; preds = %33
  store i32 294912, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

44:                                               ; preds = %33
  br label %45

45:                                               ; preds = %44
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = call i32 @cursor_check_pure(ptr noundef %46)
  %48 = icmp ne i32 %47, 0
  %49 = xor i1 %48, true
  %50 = xor i1 %49, true
  %51 = zext i1 %50 to i32
  %52 = sext i32 %51 to i64
  %53 = call i64 @llvm.expect.i64(i64 %52, i64 0)
  %54 = icmp ne i64 %53, 0
  br i1 %54, label %55, label %61

55:                                               ; preds = %45
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = call i32 @cursor_check_pure(ptr noundef %56)
  %58 = icmp eq i32 %57, 0
  %59 = zext i1 %58 to i64
  %60 = select i1 %58, i32 -262144, i32 0
  store i32 %60, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

61:                                               ; preds = %45
  %62 = load ptr, ptr %6, align 8, !tbaa !5
  %63 = call i32 @cursor_check_pure(ptr noundef %62)
  %64 = icmp ne i32 %63, 0
  %65 = xor i1 %64, true
  %66 = xor i1 %65, true
  %67 = zext i1 %66 to i32
  %68 = sext i32 %67 to i64
  %69 = call i64 @llvm.expect.i64(i64 %68, i64 0)
  %70 = icmp ne i64 %69, 0
  br i1 %70, label %71, label %77

71:                                               ; preds = %61
  %72 = load ptr, ptr %5, align 8, !tbaa !5
  %73 = call i32 @cursor_check_pure(ptr noundef %72)
  %74 = icmp eq i32 %73, 0
  %75 = zext i1 %74 to i64
  %76 = select i1 %74, i32 262144, i32 0
  store i32 %76, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

77:                                               ; preds = %61
  %78 = load ptr, ptr %5, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.MDBX_cursor, ptr %78, i32 0, i32 7
  %80 = load ptr, ptr %79, align 8, !tbaa !13
  %81 = load ptr, ptr %6, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.MDBX_cursor, ptr %81, i32 0, i32 7
  %83 = load ptr, ptr %82, align 8, !tbaa !13
  %84 = icmp ne ptr %80, %83
  %85 = xor i1 %84, true
  %86 = xor i1 %85, true
  %87 = zext i1 %86 to i32
  %88 = sext i32 %87 to i64
  %89 = call i64 @llvm.expect.i64(i64 %88, i64 0)
  %90 = icmp ne i64 %89, 0
  br i1 %90, label %91, label %153

91:                                               ; preds = %77
  %92 = load ptr, ptr %5, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.MDBX_cursor, ptr %92, i32 0, i32 5
  %94 = load ptr, ptr %93, align 8, !tbaa !15
  %95 = getelementptr inbounds %struct.MDBX_txn, ptr %94, i32 0, i32 9
  %96 = load ptr, ptr %95, align 8, !tbaa !16
  %97 = load ptr, ptr %6, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.MDBX_cursor, ptr %97, i32 0, i32 5
  %99 = load ptr, ptr %98, align 8, !tbaa !15
  %100 = getelementptr inbounds %struct.MDBX_txn, ptr %99, i32 0, i32 9
  %101 = load ptr, ptr %100, align 8, !tbaa !16
  %102 = icmp ne ptr %96, %101
  br i1 %102, label %103, label %117

103:                                              ; preds = %91
  %104 = load ptr, ptr %5, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.MDBX_cursor, ptr %104, i32 0, i32 5
  %106 = load ptr, ptr %105, align 8, !tbaa !15
  %107 = getelementptr inbounds %struct.MDBX_txn, ptr %106, i32 0, i32 9
  %108 = load ptr, ptr %107, align 8, !tbaa !16
  %109 = load ptr, ptr %6, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.MDBX_cursor, ptr %109, i32 0, i32 5
  %111 = load ptr, ptr %110, align 8, !tbaa !15
  %112 = getelementptr inbounds %struct.MDBX_txn, ptr %111, i32 0, i32 9
  %113 = load ptr, ptr %112, align 8, !tbaa !16
  %114 = icmp ugt ptr %108, %113
  %115 = zext i1 %114 to i64
  %116 = select i1 %114, i32 229376, i32 -229376
  store i32 %116, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

117:                                              ; preds = %91
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.MDBX_cursor, ptr %118, i32 0, i32 5
  %120 = load ptr, ptr %119, align 8, !tbaa !15
  %121 = getelementptr inbounds %struct.MDBX_txn, ptr %120, i32 0, i32 7
  %122 = load i64, ptr %121, align 8, !tbaa !22
  %123 = load ptr, ptr %6, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.MDBX_cursor, ptr %123, i32 0, i32 5
  %125 = load ptr, ptr %124, align 8, !tbaa !15
  %126 = getelementptr inbounds %struct.MDBX_txn, ptr %125, i32 0, i32 7
  %127 = load i64, ptr %126, align 8, !tbaa !22
  %128 = icmp ne i64 %122, %127
  br i1 %128, label %129, label %143

129:                                              ; preds = %117
  %130 = load ptr, ptr %5, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.MDBX_cursor, ptr %130, i32 0, i32 5
  %132 = load ptr, ptr %131, align 8, !tbaa !15
  %133 = getelementptr inbounds %struct.MDBX_txn, ptr %132, i32 0, i32 7
  %134 = load i64, ptr %133, align 8, !tbaa !22
  %135 = load ptr, ptr %6, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.MDBX_cursor, ptr %135, i32 0, i32 5
  %137 = load ptr, ptr %136, align 8, !tbaa !15
  %138 = getelementptr inbounds %struct.MDBX_txn, ptr %137, i32 0, i32 7
  %139 = load i64, ptr %138, align 8, !tbaa !22
  %140 = icmp ugt i64 %134, %139
  %141 = zext i1 %140 to i64
  %142 = select i1 %140, i32 196608, i32 -196608
  store i32 %142, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

143:                                              ; preds = %117
  %144 = load ptr, ptr %5, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.MDBX_cursor, ptr %144, i32 0, i32 7
  %146 = load ptr, ptr %145, align 8, !tbaa !13
  %147 = load ptr, ptr %6, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.MDBX_cursor, ptr %147, i32 0, i32 7
  %149 = load ptr, ptr %148, align 8, !tbaa !13
  %150 = icmp ugt ptr %146, %149
  %151 = zext i1 %150 to i64
  %152 = select i1 %150, i32 163840, i32 -163840
  store i32 %152, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %641

153:                                              ; preds = %77
  br label %154

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

165:                                              ; preds = %154
  br label %166

166:                                              ; preds = %165
  %167 = load ptr, ptr %5, align 8, !tbaa !5
  %168 = call i64 @cursor_dbi(ptr noundef %167) #7
  %169 = load ptr, ptr %6, align 8, !tbaa !5
  %170 = call i64 @cursor_dbi(ptr noundef %169) #7
  %171 = icmp eq i64 %168, %170
  %172 = xor i1 %171, true
  %173 = xor i1 %172, true
  %174 = xor i1 %173, true
  %175 = zext i1 %174 to i32
  %176 = sext i32 %175 to i64
  %177 = call i64 @llvm.expect.i64(i64 %176, i64 0)
  %178 = icmp ne i64 %177, 0
  br i1 %178, label %179, label %180

179:                                              ; preds = %166
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.12, ptr noundef @__func__.mdbx_cursor_compare, i32 noundef 299) #8
  unreachable

180:                                              ; preds = %166
  br label %181

181:                                              ; preds = %180
  br label %182

182:                                              ; preds = %181
  br label %183

183:                                              ; preds = %182, %154
  br label %184

184:                                              ; preds = %183
  br label %185

185:                                              ; preds = %184
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = call zeroext i1 @is_pointed(ptr noundef %186) #7
  %188 = zext i1 %187 to i32
  %189 = load ptr, ptr %6, align 8, !tbaa !5
  %190 = call zeroext i1 @is_pointed(ptr noundef %189) #7
  %191 = zext i1 %190 to i32
  %192 = sub nsw i32 %188, %191
  store i32 %192, ptr %10, align 4, !tbaa !11
  %193 = load i32, ptr %10, align 4, !tbaa !11
  %194 = icmp ne i32 %193, 0
  %195 = xor i1 %194, true
  %196 = xor i1 %195, true
  %197 = zext i1 %196 to i32
  %198 = sext i32 %197 to i64
  %199 = call i64 @llvm.expect.i64(i64 %198, i64 0)
  %200 = icmp ne i64 %199, 0
  br i1 %200, label %201, label %206

201:                                              ; preds = %185
  %202 = load i32, ptr %10, align 4, !tbaa !11
  %203 = icmp sgt i32 %202, 0
  %204 = zext i1 %203 to i64
  %205 = select i1 %203, i32 131072, i32 -131072
  store i32 %205, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %640

206:                                              ; preds = %185
  %207 = load ptr, ptr %5, align 8, !tbaa !5
  %208 = call zeroext i1 @is_pointed(ptr noundef %207) #7
  %209 = xor i1 %208, true
  %210 = xor i1 %209, true
  %211 = xor i1 %210, true
  %212 = zext i1 %211 to i32
  %213 = sext i32 %212 to i64
  %214 = call i64 @llvm.expect.i64(i64 %213, i64 0)
  %215 = icmp ne i64 %214, 0
  br i1 %215, label %216, label %217

216:                                              ; preds = %206
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %640

217:                                              ; preds = %206
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  %218 = load ptr, ptr %5, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.MDBX_cursor, ptr %218, i32 0, i32 1
  %220 = getelementptr inbounds %struct.anon, ptr %219, i32 0, i32 1
  %221 = load i8, ptr %220, align 1, !tbaa !25
  %222 = sext i8 %221 to i32
  %223 = load ptr, ptr %6, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.MDBX_cursor, ptr %223, i32 0, i32 1
  %225 = getelementptr inbounds %struct.anon, ptr %224, i32 0, i32 1
  %226 = load i8, ptr %225, align 1, !tbaa !25
  %227 = sext i8 %226 to i32
  %228 = icmp sle i32 %222, %227
  br i1 %228, label %229, label %235

229:                                              ; preds = %217
  %230 = load ptr, ptr %5, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.MDBX_cursor, ptr %230, i32 0, i32 1
  %232 = getelementptr inbounds %struct.anon, ptr %231, i32 0, i32 1
  %233 = load i8, ptr %232, align 1, !tbaa !25
  %234 = sext i8 %233 to i32
  br label %241

235:                                              ; preds = %217
  %236 = load ptr, ptr %6, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.MDBX_cursor, ptr %236, i32 0, i32 1
  %238 = getelementptr inbounds %struct.anon, ptr %237, i32 0, i32 1
  %239 = load i8, ptr %238, align 1, !tbaa !25
  %240 = sext i8 %239 to i32
  br label %241

241:                                              ; preds = %235, %229
  %242 = phi i32 [ %234, %229 ], [ %240, %235 ]
  %243 = sext i32 %242 to i64
  store i64 %243, ptr %11, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  store i64 0, ptr %12, align 8, !tbaa !26
  br label %244

244:                                              ; preds = %268, %241
  %245 = load i64, ptr %12, align 8, !tbaa !26
  %246 = load i64, ptr %11, align 8, !tbaa !26
  %247 = icmp sle i64 %245, %246
  br i1 %247, label %249, label %248

248:                                              ; preds = %244
  store i32 6, ptr %9, align 4
  br label %271

249:                                              ; preds = %244
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.MDBX_cursor, ptr %250, i32 0, i32 10
  %252 = load i64, ptr %12, align 8, !tbaa !26
  %253 = getelementptr inbounds [32 x i16], ptr %251, i64 0, i64 %252
  %254 = load i16, ptr %253, align 2, !tbaa !27
  %255 = zext i16 %254 to i32
  %256 = load ptr, ptr %6, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.MDBX_cursor, ptr %256, i32 0, i32 10
  %258 = load i64, ptr %12, align 8, !tbaa !26
  %259 = getelementptr inbounds [32 x i16], ptr %257, i64 0, i64 %258
  %260 = load i16, ptr %259, align 2, !tbaa !27
  %261 = zext i16 %260 to i32
  %262 = sub nsw i32 %255, %261
  store i32 %262, ptr %10, align 4, !tbaa !11
  %263 = load i32, ptr %10, align 4, !tbaa !11
  %264 = icmp ne i32 %263, 0
  br i1 %264, label %265, label %267

265:                                              ; preds = %249
  %266 = load i32, ptr %10, align 4, !tbaa !11
  store i32 %266, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %271

267:                                              ; preds = %249
  br label %268

268:                                              ; preds = %267
  %269 = load i64, ptr %12, align 8, !tbaa !26
  %270 = add nsw i64 %269, 1
  store i64 %270, ptr %12, align 8, !tbaa !26
  br label %244, !llvm.loop !28

271:                                              ; preds = %265, %248
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  %272 = load i32, ptr %9, align 4
  switch i32 %272, label %639 [
    i32 6, label %273
  ]

273:                                              ; preds = %271
  %274 = load ptr, ptr %5, align 8, !tbaa !5
  %275 = getelementptr inbounds %struct.MDBX_cursor, ptr %274, i32 0, i32 1
  %276 = getelementptr inbounds %struct.anon, ptr %275, i32 0, i32 1
  %277 = load i8, ptr %276, align 1, !tbaa !25
  %278 = sext i8 %277 to i32
  %279 = load ptr, ptr %6, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.MDBX_cursor, ptr %279, i32 0, i32 1
  %281 = getelementptr inbounds %struct.anon, ptr %280, i32 0, i32 1
  %282 = load i8, ptr %281, align 1, !tbaa !25
  %283 = sext i8 %282 to i32
  %284 = icmp ne i32 %278, %283
  %285 = xor i1 %284, true
  %286 = xor i1 %285, true
  %287 = zext i1 %286 to i32
  %288 = sext i32 %287 to i64
  %289 = call i64 @llvm.expect.i64(i64 %288, i64 0)
  %290 = icmp ne i64 %289, 0
  br i1 %290, label %291, label %305

291:                                              ; preds = %273
  %292 = load ptr, ptr %5, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.MDBX_cursor, ptr %292, i32 0, i32 1
  %294 = getelementptr inbounds %struct.anon, ptr %293, i32 0, i32 1
  %295 = load i8, ptr %294, align 1, !tbaa !25
  %296 = sext i8 %295 to i32
  %297 = load ptr, ptr %6, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.MDBX_cursor, ptr %297, i32 0, i32 1
  %299 = getelementptr inbounds %struct.anon, ptr %298, i32 0, i32 1
  %300 = load i8, ptr %299, align 1, !tbaa !25
  %301 = sext i8 %300 to i32
  %302 = icmp sgt i32 %296, %301
  %303 = zext i1 %302 to i64
  %304 = select i1 %302, i32 98304, i32 -98304
  store i32 %304, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

305:                                              ; preds = %273
  br label %306

306:                                              ; preds = %305
  %307 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !23
  %308 = zext i8 %307 to i32
  %309 = and i32 %308, 1
  %310 = icmp ne i32 %309, 0
  %311 = xor i1 %310, true
  %312 = xor i1 %311, true
  %313 = zext i1 %312 to i32
  %314 = sext i32 %313 to i64
  %315 = call i64 @llvm.expect.i64(i64 %314, i64 1)
  %316 = icmp ne i64 %315, 0
  br i1 %316, label %317, label %341

317:                                              ; preds = %306
  br label %318

318:                                              ; preds = %317
  %319 = load ptr, ptr %5, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.MDBX_cursor, ptr %319, i32 0, i32 8
  %321 = load ptr, ptr %320, align 8, !tbaa !30
  %322 = icmp ne ptr %321, null
  %323 = zext i1 %322 to i32
  %324 = load ptr, ptr %6, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.MDBX_cursor, ptr %324, i32 0, i32 8
  %326 = load ptr, ptr %325, align 8, !tbaa !30
  %327 = icmp ne ptr %326, null
  %328 = zext i1 %327 to i32
  %329 = icmp eq i32 %323, %328
  %330 = xor i1 %329, true
  %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 0)
  %336 = icmp ne i64 %335, 0
  br i1 %336, label %337, label %338

337:                                              ; preds = %318
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.13, ptr noundef @__func__.mdbx_cursor_compare, i32 noundef 316) #8
  unreachable

338:                                              ; preds = %318
  br label %339

339:                                              ; preds = %338
  br label %340

340:                                              ; preds = %339
  br label %341

341:                                              ; preds = %340, %306
  br label %342

342:                                              ; preds = %341
  br label %343

343:                                              ; preds = %342
  %344 = load ptr, ptr %5, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.MDBX_cursor, ptr %344, i32 0, i32 8
  %346 = load ptr, ptr %345, align 8, !tbaa !30
  %347 = icmp ne ptr %346, null
  %348 = zext i1 %347 to i32
  %349 = load ptr, ptr %6, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.MDBX_cursor, ptr %349, i32 0, i32 8
  %351 = load ptr, ptr %350, align 8, !tbaa !30
  %352 = icmp ne ptr %351, null
  %353 = zext i1 %352 to i32
  %354 = icmp ne i32 %348, %353
  %355 = xor i1 %354, true
  %356 = xor i1 %355, true
  %357 = zext i1 %356 to i32
  %358 = sext i32 %357 to i64
  %359 = call i64 @llvm.expect.i64(i64 %358, i64 0)
  %360 = icmp ne i64 %359, 0
  br i1 %360, label %361, label %368

361:                                              ; preds = %343
  %362 = load ptr, ptr %5, align 8, !tbaa !5
  %363 = getelementptr inbounds %struct.MDBX_cursor, ptr %362, i32 0, i32 8
  %364 = load ptr, ptr %363, align 8, !tbaa !30
  %365 = icmp ne ptr %364, null
  %366 = zext i1 %365 to i64
  %367 = select i1 %365, i32 65536, i32 -65536
  store i32 %367, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

368:                                              ; preds = %343
  %369 = load i8, ptr %7, align 1, !tbaa !9, !range !31, !noundef !32
  %370 = trunc i8 %369 to i1
  br i1 %370, label %376, label %371

371:                                              ; preds = %368
  %372 = load ptr, ptr %5, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.MDBX_cursor, ptr %372, i32 0, i32 8
  %374 = load ptr, ptr %373, align 8, !tbaa !30
  %375 = icmp ne ptr %374, null
  br i1 %375, label %377, label %376

376:                                              ; preds = %371, %368
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

377:                                              ; preds = %371
  %378 = load ptr, ptr %5, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.MDBX_cursor, ptr %378, i32 0, i32 8
  %380 = load ptr, ptr %379, align 8, !tbaa !30
  %381 = getelementptr inbounds %struct.inner_cursor, ptr %380, i32 0, i32 0
  %382 = call zeroext i1 @is_pointed(ptr noundef %381) #7
  br i1 %382, label %383, label %437

383:                                              ; preds = %377
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %384 = load ptr, ptr %5, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.MDBX_cursor, ptr %384, i32 0, i32 9
  %386 = load ptr, ptr %5, align 8, !tbaa !5
  %387 = getelementptr inbounds %struct.MDBX_cursor, ptr %386, i32 0, i32 1
  %388 = getelementptr inbounds %struct.anon, ptr %387, i32 0, i32 1
  %389 = load i8, ptr %388, align 1, !tbaa !25
  %390 = sext i8 %389 to i64
  %391 = getelementptr inbounds [32 x ptr], ptr %385, i64 0, i64 %390
  %392 = load ptr, ptr %391, align 8, !tbaa !5
  store ptr %392, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  %393 = load ptr, ptr %13, align 8, !tbaa !5
  %394 = load ptr, ptr %5, align 8, !tbaa !5
  %395 = getelementptr inbounds %struct.MDBX_cursor, ptr %394, i32 0, i32 10
  %396 = load ptr, ptr %5, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.MDBX_cursor, ptr %396, i32 0, i32 1
  %398 = getelementptr inbounds %struct.anon, ptr %397, i32 0, i32 1
  %399 = load i8, ptr %398, align 1, !tbaa !25
  %400 = sext i8 %399 to i64
  %401 = getelementptr inbounds [32 x i16], ptr %395, i64 0, i64 %400
  %402 = load i16, ptr %401, align 2, !tbaa !27
  %403 = zext i16 %402 to i64
  %404 = call ptr @page_node(ptr noundef %393, i64 noundef %403) #7
  store ptr %404, ptr %14, align 8, !tbaa !5
  br label %405

405:                                              ; preds = %383
  %406 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !23
  %407 = zext i8 %406 to i32
  %408 = and i32 %407, 1
  %409 = icmp ne i32 %408, 0
  %410 = xor i1 %409, true
  %411 = xor i1 %410, true
  %412 = zext i1 %411 to i32
  %413 = sext i32 %412 to i64
  %414 = call i64 @llvm.expect.i64(i64 %413, i64 1)
  %415 = icmp ne i64 %414, 0
  br i1 %415, label %416, label %434

416:                                              ; preds = %405
  br label %417

417:                                              ; preds = %416
  %418 = load ptr, ptr %14, align 8, !tbaa !5
  %419 = call zeroext i8 @node_flags(ptr noundef %418) #7
  %420 = zext i8 %419 to i32
  %421 = and i32 %420, 4
  %422 = icmp ne i32 %421, 0
  %423 = xor i1 %422, true
  %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 0)
  %429 = icmp ne i64 %428, 0
  br i1 %429, label %430, label %431

430:                                              ; preds = %417
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.14, ptr noundef @__func__.mdbx_cursor_compare, i32 noundef 326) #8
  unreachable

431:                                              ; preds = %417
  br label %432

432:                                              ; preds = %431
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433, %405
  br label %435

435:                                              ; preds = %434
  br label %436

436:                                              ; preds = %435
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  br label %437

437:                                              ; preds = %436, %377
  %438 = load ptr, ptr %6, align 8, !tbaa !5
  %439 = getelementptr inbounds %struct.MDBX_cursor, ptr %438, i32 0, i32 8
  %440 = load ptr, ptr %439, align 8, !tbaa !30
  %441 = getelementptr inbounds %struct.inner_cursor, ptr %440, i32 0, i32 0
  %442 = call zeroext i1 @is_pointed(ptr noundef %441) #7
  br i1 %442, label %443, label %497

443:                                              ; preds = %437
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  %444 = load ptr, ptr %6, align 8, !tbaa !5
  %445 = getelementptr inbounds %struct.MDBX_cursor, ptr %444, i32 0, i32 9
  %446 = load ptr, ptr %6, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.MDBX_cursor, ptr %446, i32 0, i32 1
  %448 = getelementptr inbounds %struct.anon, ptr %447, i32 0, i32 1
  %449 = load i8, ptr %448, align 1, !tbaa !25
  %450 = sext i8 %449 to i64
  %451 = getelementptr inbounds [32 x ptr], ptr %445, i64 0, i64 %450
  %452 = load ptr, ptr %451, align 8, !tbaa !5
  store ptr %452, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %453 = load ptr, ptr %15, align 8, !tbaa !5
  %454 = load ptr, ptr %6, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.MDBX_cursor, ptr %454, i32 0, i32 10
  %456 = load ptr, ptr %6, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.MDBX_cursor, ptr %456, i32 0, i32 1
  %458 = getelementptr inbounds %struct.anon, ptr %457, i32 0, i32 1
  %459 = load i8, ptr %458, align 1, !tbaa !25
  %460 = sext i8 %459 to i64
  %461 = getelementptr inbounds [32 x i16], ptr %455, i64 0, i64 %460
  %462 = load i16, ptr %461, align 2, !tbaa !27
  %463 = zext i16 %462 to i64
  %464 = call ptr @page_node(ptr noundef %453, i64 noundef %463) #7
  store ptr %464, ptr %16, align 8, !tbaa !5
  br label %465

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

476:                                              ; preds = %465
  br label %477

477:                                              ; preds = %476
  %478 = load ptr, ptr %16, align 8, !tbaa !5
  %479 = call zeroext i8 @node_flags(ptr noundef %478) #7
  %480 = zext i8 %479 to i32
  %481 = and i32 %480, 4
  %482 = icmp ne i32 %481, 0
  %483 = xor i1 %482, true
  %484 = xor i1 %483, true
  %485 = xor i1 %484, true
  %486 = zext i1 %485 to i32
  %487 = sext i32 %486 to i64
  %488 = call i64 @llvm.expect.i64(i64 %487, i64 0)
  %489 = icmp ne i64 %488, 0
  br i1 %489, label %490, label %491

490:                                              ; preds = %477
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.14, ptr noundef @__func__.mdbx_cursor_compare, i32 noundef 331) #8
  unreachable

491:                                              ; preds = %477
  br label %492

492:                                              ; preds = %491
  br label %493

493:                                              ; preds = %492
  br label %494

494:                                              ; preds = %493, %465
  br label %495

495:                                              ; preds = %494
  br label %496

496:                                              ; preds = %495
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  br label %497

497:                                              ; preds = %496, %437
  %498 = load ptr, ptr %5, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.MDBX_cursor, ptr %498, i32 0, i32 8
  %500 = load ptr, ptr %499, align 8, !tbaa !30
  %501 = getelementptr inbounds %struct.inner_cursor, ptr %500, i32 0, i32 0
  store ptr %501, ptr %5, align 8, !tbaa !5
  %502 = load ptr, ptr %6, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.MDBX_cursor, ptr %502, i32 0, i32 8
  %504 = load ptr, ptr %503, align 8, !tbaa !30
  %505 = getelementptr inbounds %struct.inner_cursor, ptr %504, i32 0, i32 0
  store ptr %505, ptr %6, align 8, !tbaa !5
  %506 = load ptr, ptr %5, align 8, !tbaa !5
  %507 = call zeroext i1 @is_pointed(ptr noundef %506) #7
  %508 = zext i1 %507 to i32
  %509 = load ptr, ptr %6, align 8, !tbaa !5
  %510 = call zeroext i1 @is_pointed(ptr noundef %509) #7
  %511 = zext i1 %510 to i32
  %512 = sub nsw i32 %508, %511
  store i32 %512, ptr %10, align 4, !tbaa !11
  %513 = load i32, ptr %10, align 4, !tbaa !11
  %514 = icmp ne i32 %513, 0
  %515 = xor i1 %514, true
  %516 = xor i1 %515, true
  %517 = zext i1 %516 to i32
  %518 = sext i32 %517 to i64
  %519 = call i64 @llvm.expect.i64(i64 %518, i64 0)
  %520 = icmp ne i64 %519, 0
  br i1 %520, label %521, label %526

521:                                              ; preds = %497
  %522 = load i32, ptr %10, align 4, !tbaa !11
  %523 = icmp sgt i32 %522, 0
  %524 = zext i1 %523 to i64
  %525 = select i1 %523, i32 65536, i32 -65536
  store i32 %525, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

526:                                              ; preds = %497
  %527 = load ptr, ptr %5, align 8, !tbaa !5
  %528 = call zeroext i1 @is_pointed(ptr noundef %527) #7
  %529 = xor i1 %528, true
  %530 = xor i1 %529, true
  %531 = xor i1 %530, true
  %532 = zext i1 %531 to i32
  %533 = sext i32 %532 to i64
  %534 = call i64 @llvm.expect.i64(i64 %533, i64 0)
  %535 = icmp ne i64 %534, 0
  br i1 %535, label %536, label %537

536:                                              ; preds = %526
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

537:                                              ; preds = %526
  %538 = load ptr, ptr %5, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.MDBX_cursor, ptr %538, i32 0, i32 1
  %540 = getelementptr inbounds %struct.anon, ptr %539, i32 0, i32 1
  %541 = load i8, ptr %540, align 1, !tbaa !25
  %542 = sext i8 %541 to i32
  %543 = load ptr, ptr %6, align 8, !tbaa !5
  %544 = getelementptr inbounds %struct.MDBX_cursor, ptr %543, i32 0, i32 1
  %545 = getelementptr inbounds %struct.anon, ptr %544, i32 0, i32 1
  %546 = load i8, ptr %545, align 1, !tbaa !25
  %547 = sext i8 %546 to i32
  %548 = icmp sle i32 %542, %547
  br i1 %548, label %549, label %555

549:                                              ; preds = %537
  %550 = load ptr, ptr %5, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.MDBX_cursor, ptr %550, i32 0, i32 1
  %552 = getelementptr inbounds %struct.anon, ptr %551, i32 0, i32 1
  %553 = load i8, ptr %552, align 1, !tbaa !25
  %554 = sext i8 %553 to i32
  br label %561

555:                                              ; preds = %537
  %556 = load ptr, ptr %6, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.MDBX_cursor, ptr %556, i32 0, i32 1
  %558 = getelementptr inbounds %struct.anon, ptr %557, i32 0, i32 1
  %559 = load i8, ptr %558, align 1, !tbaa !25
  %560 = sext i8 %559 to i32
  br label %561

561:                                              ; preds = %555, %549
  %562 = phi i32 [ %554, %549 ], [ %560, %555 ]
  %563 = sext i32 %562 to i64
  store i64 %563, ptr %11, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  store i64 0, ptr %17, align 8, !tbaa !26
  br label %564

564:                                              ; preds = %588, %561
  %565 = load i64, ptr %17, align 8, !tbaa !26
  %566 = load i64, ptr %11, align 8, !tbaa !26
  %567 = icmp sle i64 %565, %566
  br i1 %567, label %569, label %568

568:                                              ; preds = %564
  store i32 21, ptr %9, align 4
  br label %591

569:                                              ; preds = %564
  %570 = load ptr, ptr %5, align 8, !tbaa !5
  %571 = getelementptr inbounds %struct.MDBX_cursor, ptr %570, i32 0, i32 10
  %572 = load i64, ptr %17, align 8, !tbaa !26
  %573 = getelementptr inbounds [32 x i16], ptr %571, i64 0, i64 %572
  %574 = load i16, ptr %573, align 2, !tbaa !27
  %575 = zext i16 %574 to i32
  %576 = load ptr, ptr %6, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct.MDBX_cursor, ptr %576, i32 0, i32 10
  %578 = load i64, ptr %17, align 8, !tbaa !26
  %579 = getelementptr inbounds [32 x i16], ptr %577, i64 0, i64 %578
  %580 = load i16, ptr %579, align 2, !tbaa !27
  %581 = zext i16 %580 to i32
  %582 = sub nsw i32 %575, %581
  store i32 %582, ptr %10, align 4, !tbaa !11
  %583 = load i32, ptr %10, align 4, !tbaa !11
  %584 = icmp ne i32 %583, 0
  br i1 %584, label %585, label %587

585:                                              ; preds = %569
  %586 = load i32, ptr %10, align 4, !tbaa !11
  store i32 %586, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %591

587:                                              ; preds = %569
  br label %588

588:                                              ; preds = %587
  %589 = load i64, ptr %17, align 8, !tbaa !26
  %590 = add nsw i64 %589, 1
  store i64 %590, ptr %17, align 8, !tbaa !26
  br label %564, !llvm.loop !33

591:                                              ; preds = %585, %568
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  %592 = load i32, ptr %9, align 4
  switch i32 %592, label %639 [
    i32 21, label %593
  ]

593:                                              ; preds = %591
  %594 = load ptr, ptr %5, align 8, !tbaa !5
  %595 = getelementptr inbounds %struct.MDBX_cursor, ptr %594, i32 0, i32 1
  %596 = getelementptr inbounds %struct.anon, ptr %595, i32 0, i32 1
  %597 = load i8, ptr %596, align 1, !tbaa !25
  %598 = sext i8 %597 to i32
  %599 = load ptr, ptr %6, align 8, !tbaa !5
  %600 = getelementptr inbounds %struct.MDBX_cursor, ptr %599, i32 0, i32 1
  %601 = getelementptr inbounds %struct.anon, ptr %600, i32 0, i32 1
  %602 = load i8, ptr %601, align 1, !tbaa !25
  %603 = sext i8 %602 to i32
  %604 = icmp ne i32 %598, %603
  %605 = xor i1 %604, true
  %606 = xor i1 %605, true
  %607 = zext i1 %606 to i32
  %608 = sext i32 %607 to i64
  %609 = call i64 @llvm.expect.i64(i64 %608, i64 0)
  %610 = icmp ne i64 %609, 0
  br i1 %610, label %611, label %625

611:                                              ; preds = %593
  %612 = load ptr, ptr %5, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.MDBX_cursor, ptr %612, i32 0, i32 1
  %614 = getelementptr inbounds %struct.anon, ptr %613, i32 0, i32 1
  %615 = load i8, ptr %614, align 1, !tbaa !25
  %616 = sext i8 %615 to i32
  %617 = load ptr, ptr %6, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.MDBX_cursor, ptr %617, i32 0, i32 1
  %619 = getelementptr inbounds %struct.anon, ptr %618, i32 0, i32 1
  %620 = load i8, ptr %619, align 1, !tbaa !25
  %621 = sext i8 %620 to i32
  %622 = icmp sgt i32 %616, %621
  %623 = zext i1 %622 to i64
  %624 = select i1 %622, i32 32768, i32 -32768
  store i32 %624, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

625:                                              ; preds = %593
  %626 = load ptr, ptr %5, align 8, !tbaa !5
  %627 = getelementptr inbounds %struct.MDBX_cursor, ptr %626, i32 0, i32 1
  %628 = getelementptr inbounds %struct.anon, ptr %627, i32 0, i32 0
  %629 = load i8, ptr %628, align 4, !tbaa !25
  %630 = sext i8 %629 to i32
  %631 = and i32 %630, 64
  %632 = load ptr, ptr %6, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.MDBX_cursor, ptr %632, i32 0, i32 1
  %634 = getelementptr inbounds %struct.anon, ptr %633, i32 0, i32 0
  %635 = load i8, ptr %634, align 4, !tbaa !25
  %636 = sext i8 %635 to i32
  %637 = and i32 %636, 64
  %638 = sub nsw i32 %631, %637
  store i32 %638, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %639

639:                                              ; preds = %625, %611, %591, %536, %521, %376, %361, %291, %271
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  br label %640

640:                                              ; preds = %639, %216, %201
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  br label %641

641:                                              ; preds = %640, %143, %129, %103, %71, %55, %43, %28
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #6
  %642 = load i32, ptr %4, align 4
  ret i32 %642
}

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

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

; 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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(none) }
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 = { noreturn "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 = { 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 #6 = { nounwind }
attributes #7 = { nounwind willreturn memory(read) }
attributes #8 = { 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 = !{!"_Bool", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !6, i64 32}
!14 = !{!"MDBX_cursor", !12, 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}
!15 = !{!14, !6, i64 16}
!16 = !{!17, !6, i64 80}
!17 = !{!"MDBX_txn", !12, i64 0, !12, i64 4, !18, i64 8, !18, i64 16, !6, i64 24, !6, i64 32, !19, i64 40, !18, i64 64, !18, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !21, i64 128, !6, i64 160, !7, i64 168}
!18 = !{!"long", !7, i64 0}
!19 = !{!"geo", !20, i64 0, !20, i64 2, !12, i64 4, !12, i64 8, !7, i64 12, !7, i64 16}
!20 = !{!"short", !7, i64 0}
!21 = !{!"MDBX_canary", !18, i64 0, !18, i64 8, !18, i64 16, !18, i64 24}
!22 = !{!17, !18, i64 64}
!23 = !{!24, !7, i64 25}
!24 = !{!"libmdbx_globals", !7, i64 0, !12, i64 16, !12, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !12, i64 28, !7, i64 32, !7, i64 40, !18, i64 80, !6, i64 88}
!25 = !{!7, !7, i64 0}
!26 = !{!18, !18, i64 0}
!27 = !{!20, !20, i64 0}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = !{!14, !6, i64 40}
!31 = !{i8 0, i8 2}
!32 = !{}
!33 = distinct !{!33, !29}


; 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.16 }
%struct.anon.16 = 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.12 = external hidden unnamed_addr constant [31 x i8], align 1
@__func__.mdbx_cursor_compare = external hidden unnamed_addr constant [20 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [25 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @mdbx_cursor_compare(ptr noundef %0, ptr noundef %1, i1 noundef zeroext %2) local_unnamed_addr #2 {
  %.not = icmp eq ptr %0, null
  %.not142 = icmp eq ptr %1, null
  br i1 %.not, label %4, label %6, !prof !5

4:                                                ; preds = %3
  %5 = select i1 %.not142, i32 0, i32 -294912
  br label %.loopexit

6:                                                ; preds = %3
  br i1 %.not142, label %.loopexit, label %7, !prof !5

7:                                                ; preds = %6
  %8 = tail call i32 @cursor_check_pure(ptr noundef nonnull %0)
  %.not117 = icmp eq i32 %8, 0
  %9 = tail call i32 @cursor_check_pure(ptr noundef nonnull %1)
  %.not118 = icmp eq i32 %9, 0
  br i1 %.not117, label %12, label %10, !prof !6

10:                                               ; preds = %7
  %11 = select i1 %.not118, i32 -262144, i32 0
  br label %.loopexit

12:                                               ; preds = %7
  br i1 %.not118, label %17, label %13, !prof !6

13:                                               ; preds = %12
  %14 = tail call i32 @cursor_check_pure(ptr noundef nonnull %0)
  %15 = icmp eq i32 %14, 0
  %16 = select i1 %15, i32 262144, i32 0
  br label %.loopexit

17:                                               ; preds = %12
  %18 = getelementptr inbounds i8, ptr %0, i64 32
  %19 = load ptr, ptr %18, align 8, !tbaa !7
  %20 = getelementptr inbounds i8, ptr %1, i64 32
  %21 = load ptr, ptr %20, align 8, !tbaa !7
  %.not119 = icmp eq ptr %19, %21
  br i1 %.not119, label %45, label %22, !prof !6

22:                                               ; preds = %17
  %23 = getelementptr inbounds i8, ptr %0, i64 16
  %24 = load ptr, ptr %23, align 8, !tbaa !13
  %25 = getelementptr inbounds i8, ptr %24, i64 80
  %26 = load ptr, ptr %25, align 8, !tbaa !14
  %27 = getelementptr inbounds i8, ptr %1, i64 16
  %28 = load ptr, ptr %27, align 8, !tbaa !13
  %29 = getelementptr inbounds i8, ptr %28, i64 80
  %30 = load ptr, ptr %29, align 8, !tbaa !14
  %.not140 = icmp eq ptr %26, %30
  br i1 %.not140, label %34, label %31

31:                                               ; preds = %22
  %32 = icmp ugt ptr %26, %30
  %33 = select i1 %32, i32 229376, i32 -229376
  br label %.loopexit

34:                                               ; preds = %22
  %35 = getelementptr inbounds i8, ptr %24, i64 64
  %36 = load i64, ptr %35, align 8, !tbaa !20
  %37 = getelementptr inbounds i8, ptr %28, i64 64
  %38 = load i64, ptr %37, align 8, !tbaa !20
  %.not141 = icmp eq i64 %36, %38
  br i1 %.not141, label %42, label %39

39:                                               ; preds = %34
  %40 = icmp ugt i64 %36, %38
  %41 = select i1 %40, i32 196608, i32 -196608
  br label %.loopexit

42:                                               ; preds = %34
  %43 = icmp ugt ptr %19, %21
  %44 = select i1 %43, i32 163840, i32 -163840
  br label %.loopexit

45:                                               ; preds = %17
  %46 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !21
  %47 = and i8 %46, 1
  %.not120 = icmp ne i8 %47, 0
  br i1 %.not120, label %48, label %52, !prof !6

48:                                               ; preds = %45
  %49 = tail call i64 @cursor_dbi(ptr noundef nonnull %0) #5
  %50 = tail call i64 @cursor_dbi(ptr noundef nonnull %1) #5
  %.not121 = icmp eq i64 %49, %50
  br i1 %.not121, label %52, label %51, !prof !6

51:                                               ; preds = %48
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.12, ptr noundef nonnull @__func__.mdbx_cursor_compare, i32 noundef 299) #6
  unreachable

52:                                               ; preds = %48, %45
  %53 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %0) #5
  %54 = zext i1 %53 to i32
  %55 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %1) #5
  %.neg = sext i1 %55 to i32
  %56 = add nsw i32 %.neg, %54
  %.not122 = icmp eq i32 %56, 0
  br i1 %.not122, label %60, label %57, !prof !6

57:                                               ; preds = %52
  %58 = icmp sgt i32 %56, 0
  %59 = select i1 %58, i32 131072, i32 -131072
  br label %.loopexit

60:                                               ; preds = %52
  br i1 %53, label %61, label %.loopexit, !prof !6

61:                                               ; preds = %60
  %62 = getelementptr inbounds i8, ptr %0, i64 5
  %63 = load i8, ptr %62, align 1, !tbaa !24
  %64 = getelementptr inbounds i8, ptr %1, i64 5
  %65 = load i8, ptr %64, align 1, !tbaa !24
  %.not123 = icmp sgt i8 %63, %65
  %. = tail call i8 @llvm.smin.i8(i8 %63, i8 %65)
  %.not124156 = icmp slt i8 %., 0
  br i1 %.not124156, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %61
  %66 = zext nneg i8 %. to i64
  %67 = getelementptr inbounds i8, ptr %0, i64 304
  %68 = getelementptr inbounds i8, ptr %1, i64 304
  br label %71

69:                                               ; preds = %71
  %70 = add nuw nsw i64 %.096157, 1
  %exitcond.not = icmp eq i64 %.096157, %66
  br i1 %exitcond.not, label %._crit_edge, label %71, !llvm.loop !25

71:                                               ; preds = %.lr.ph, %69
  %.096157 = phi i64 [ 0, %.lr.ph ], [ %70, %69 ]
  %72 = getelementptr inbounds [32 x i16], ptr %67, i64 0, i64 %.096157
  %73 = load i16, ptr %72, align 2, !tbaa !27
  %74 = zext i16 %73 to i32
  %75 = getelementptr inbounds [32 x i16], ptr %68, i64 0, i64 %.096157
  %76 = load i16, ptr %75, align 2, !tbaa !27
  %77 = zext i16 %76 to i32
  %78 = sub nsw i32 %74, %77
  %.not125 = icmp eq i32 %78, 0
  br i1 %.not125, label %69, label %.loopexit

._crit_edge:                                      ; preds = %69, %61
  %.not126 = icmp eq i8 %63, %65
  br i1 %.not126, label %81, label %79, !prof !6

79:                                               ; preds = %._crit_edge
  %80 = select i1 %.not123, i32 98304, i32 -98304
  br label %.loopexit

81:                                               ; preds = %._crit_edge
  %82 = getelementptr inbounds i8, ptr %0, i64 40
  %83 = load ptr, ptr %82, align 8, !tbaa !28
  br i1 %.not120, label %84, label %._crit_edge168, !prof !6

._crit_edge168:                                   ; preds = %81
  %.phi.trans.insert169 = getelementptr inbounds i8, ptr %1, i64 40
  %.pre170 = load ptr, ptr %.phi.trans.insert169, align 8, !tbaa !28
  br label %91

84:                                               ; preds = %81
  %85 = icmp ne ptr %83, null
  %86 = getelementptr inbounds i8, ptr %1, i64 40
  %87 = load ptr, ptr %86, align 8, !tbaa !28
  %88 = icmp ne ptr %87, null
  %89 = xor i1 %85, %88
  br i1 %89, label %90, label %91, !prof !5

90:                                               ; preds = %84
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.13, ptr noundef nonnull @__func__.mdbx_cursor_compare, i32 noundef 316) #6
  unreachable

91:                                               ; preds = %._crit_edge168, %84
  %92 = phi ptr [ %.pre170, %._crit_edge168 ], [ %87, %84 ]
  %93 = icmp ne ptr %83, null
  %94 = icmp eq ptr %92, null
  %.not128 = xor i1 %93, %94
  br i1 %.not128, label %97, label %95, !prof !6

95:                                               ; preds = %91
  %96 = select i1 %93, i32 65536, i32 -65536
  br label %.loopexit

97:                                               ; preds = %91
  %.not143 = xor i1 %93, true
  %brmerge = or i1 %.not143, %2
  br i1 %brmerge, label %.loopexit, label %98

98:                                               ; preds = %97
  %99 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %83) #5
  br i1 %99, label %100, label %114

100:                                              ; preds = %98
  br i1 %.not120, label %101, label %.thread148, !prof !6

101:                                              ; preds = %100
  %102 = getelementptr inbounds i8, ptr %0, i64 48
  %103 = sext i8 %63 to i64
  %104 = getelementptr inbounds [32 x ptr], ptr %102, i64 0, i64 %103
  %105 = load ptr, ptr %104, align 8, !tbaa !29
  %106 = getelementptr inbounds i8, ptr %0, i64 304
  %107 = getelementptr inbounds [32 x i16], ptr %106, i64 0, i64 %103
  %108 = load i16, ptr %107, align 2, !tbaa !27
  %109 = zext i16 %108 to i64
  %110 = tail call ptr @page_node(ptr noundef %105, i64 noundef %109) #5
  %111 = tail call zeroext i8 @node_flags(ptr noundef %110) #5
  %112 = and i8 %111, 4
  %.not130 = icmp eq i8 %112, 0
  br i1 %.not130, label %113, label %.thread, !prof !5

113:                                              ; preds = %101
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.14, ptr noundef nonnull @__func__.mdbx_cursor_compare, i32 noundef 326) #6
  unreachable

114:                                              ; preds = %98
  %115 = tail call zeroext i1 @is_pointed(ptr noundef %92) #5
  %brmerge153.not = and i1 %.not120, %115
  br i1 %brmerge153.not, label %..thread147_crit_edge, label %.thread149, !prof !30

..thread147_crit_edge:                            ; preds = %114
  %.pre171 = sext i8 %63 to i64
  br label %.thread147

.thread148:                                       ; preds = %100
  %116 = tail call zeroext i1 @is_pointed(ptr noundef %92) #5
  br label %.thread149

.thread:                                          ; preds = %101
  %117 = tail call zeroext i1 @is_pointed(ptr noundef %92) #5
  br i1 %117, label %.thread147, label %.thread149

.thread147:                                       ; preds = %..thread147_crit_edge, %.thread
  %.pre-phi = phi i64 [ %.pre171, %..thread147_crit_edge ], [ %103, %.thread ]
  %118 = getelementptr inbounds i8, ptr %1, i64 48
  %119 = getelementptr inbounds [32 x ptr], ptr %118, i64 0, i64 %.pre-phi
  %120 = load ptr, ptr %119, align 8, !tbaa !29
  %121 = getelementptr inbounds i8, ptr %1, i64 304
  %122 = getelementptr inbounds [32 x i16], ptr %121, i64 0, i64 %.pre-phi
  %123 = load i16, ptr %122, align 2, !tbaa !27
  %124 = zext i16 %123 to i64
  %125 = tail call ptr @page_node(ptr noundef %120, i64 noundef %124) #5
  %126 = tail call zeroext i8 @node_flags(ptr noundef %125) #5
  %127 = and i8 %126, 4
  %.not132 = icmp eq i8 %127, 0
  br i1 %.not132, label %128, label %.thread149, !prof !5

128:                                              ; preds = %.thread147
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.14, ptr noundef nonnull @__func__.mdbx_cursor_compare, i32 noundef 331) #6
  unreachable

.thread149:                                       ; preds = %114, %.thread148, %.thread, %.thread147
  %129 = phi i1 [ false, %.thread ], [ true, %.thread147 ], [ %115, %114 ], [ %116, %.thread148 ]
  %130 = tail call zeroext i1 @is_pointed(ptr noundef nonnull %83) #5
  %131 = zext i1 %130 to i32
  %.neg133 = sext i1 %129 to i32
  %132 = add nsw i32 %131, %.neg133
  %.not134 = icmp eq i32 %132, 0
  br i1 %.not134, label %136, label %133, !prof !6

133:                                              ; preds = %.thread149
  %134 = icmp sgt i32 %132, 0
  %135 = select i1 %134, i32 65536, i32 -65536
  br label %.loopexit

136:                                              ; preds = %.thread149
  br i1 %130, label %137, label %.loopexit, !prof !6

137:                                              ; preds = %136
  %138 = getelementptr inbounds i8, ptr %83, i64 4
  %139 = getelementptr inbounds i8, ptr %83, i64 5
  %140 = load i8, ptr %139, align 1, !tbaa !24
  %141 = getelementptr inbounds i8, ptr %92, i64 4
  %142 = getelementptr inbounds i8, ptr %92, i64 5
  %143 = load i8, ptr %142, align 1, !tbaa !24
  %.not135 = icmp sgt i8 %140, %143
  %.144 = tail call i8 @llvm.smin.i8(i8 %140, i8 %143)
  %.not137158 = icmp slt i8 %.144, 0
  br i1 %.not137158, label %._crit_edge162, label %.lr.ph161

.lr.ph161:                                        ; preds = %137
  %144 = zext nneg i8 %.144 to i64
  %145 = getelementptr inbounds i8, ptr %83, i64 304
  %146 = getelementptr inbounds i8, ptr %92, i64 304
  br label %149

147:                                              ; preds = %149
  %148 = add nuw nsw i64 %.0159, 1
  %exitcond167.not = icmp eq i64 %.0159, %144
  br i1 %exitcond167.not, label %._crit_edge162, label %149, !llvm.loop !31

149:                                              ; preds = %.lr.ph161, %147
  %.0159 = phi i64 [ 0, %.lr.ph161 ], [ %148, %147 ]
  %150 = getelementptr inbounds [32 x i16], ptr %145, i64 0, i64 %.0159
  %151 = load i16, ptr %150, align 2, !tbaa !27
  %152 = zext i16 %151 to i32
  %153 = getelementptr inbounds [32 x i16], ptr %146, i64 0, i64 %.0159
  %154 = load i16, ptr %153, align 2, !tbaa !27
  %155 = zext i16 %154 to i32
  %156 = sub nsw i32 %152, %155
  %.not138 = icmp eq i32 %156, 0
  br i1 %.not138, label %147, label %.loopexit

._crit_edge162:                                   ; preds = %147, %137
  %.not139 = icmp eq i8 %140, %143
  br i1 %.not139, label %159, label %157, !prof !6

157:                                              ; preds = %._crit_edge162
  %158 = select i1 %.not135, i32 32768, i32 -32768
  br label %.loopexit

159:                                              ; preds = %._crit_edge162
  %160 = load i8, ptr %138, align 4, !tbaa !24
  %161 = and i8 %160, 64
  %162 = zext nneg i8 %161 to i32
  %163 = load i8, ptr %141, align 4, !tbaa !24
  %164 = and i8 %163, 64
  %165 = zext nneg i8 %164 to i32
  %166 = sub nsw i32 %162, %165
  br label %.loopexit

.loopexit:                                        ; preds = %71, %149, %57, %60, %136, %97, %159, %157, %133, %95, %79, %6, %42, %39, %31, %13, %10, %4
  %.4 = phi i32 [ %5, %4 ], [ %11, %10 ], [ %16, %13 ], [ %33, %31 ], [ %41, %39 ], [ %44, %42 ], [ 294912, %6 ], [ %59, %57 ], [ 0, %60 ], [ %80, %79 ], [ %96, %95 ], [ %135, %133 ], [ %158, %157 ], [ %166, %159 ], [ 0, %97 ], [ 0, %136 ], [ %156, %149 ], [ %78, %71 ]
  ret i32 %.4
}

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

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

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i8 @llvm.smin.i8(i8, i8) #4

attributes #0 = { 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 #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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind willreturn memory(read) }
attributes #6 = { 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 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!6 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!7 = !{!8, !12, i64 32}
!8 = !{!"MDBX_cursor", !9, i64 0, !10, i64 4, !10, i64 6, !10, i64 7, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !10, i64 48, !10, i64 304, !12, i64 368, !12, i64 376}
!9 = !{!"int", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C/C++ TBAA"}
!12 = !{!"any pointer", !10, i64 0}
!13 = !{!8, !12, i64 16}
!14 = !{!15, !12, i64 80}
!15 = !{!"MDBX_txn", !9, i64 0, !9, i64 4, !16, i64 8, !16, i64 16, !12, i64 24, !12, i64 32, !17, i64 40, !16, i64 64, !16, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !19, i64 128, !12, i64 160, !10, i64 168}
!16 = !{!"long", !10, i64 0}
!17 = !{!"geo", !18, i64 0, !18, i64 2, !9, i64 4, !9, i64 8, !10, i64 12, !10, i64 16}
!18 = !{!"short", !10, i64 0}
!19 = !{!"MDBX_canary", !16, i64 0, !16, i64 8, !16, i64 16, !16, i64 24}
!20 = !{!15, !16, i64 64}
!21 = !{!22, !10, i64 25}
!22 = !{!"libmdbx_globals", !10, i64 0, !9, i64 16, !9, i64 20, !10, i64 24, !10, i64 25, !10, i64 26, !23, i64 27, !9, i64 28, !10, i64 32, !10, i64 40, !16, i64 80, !12, i64 88}
!23 = !{!"_Bool", !10, i64 0}
!24 = !{!10, !10, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!18, !18, i64 0}
!28 = !{!8, !12, i64 40}
!29 = !{!12, !12, i64 0}
!30 = !{!"branch_weights", i32 2146410979, i32 -2146410979}
!31 = distinct !{!31, !26}


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