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

; 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 }
%struct.anon = 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_rkl_hole = type { i64, i64 }
%struct.MDBX_rkl_iter = type { ptr, i32, i32 }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }

@globals = external global %struct.libmdbx_globals, align 8
@.str.10 = external hidden unnamed_addr constant [41 x i8], align 1
@__func__.rkl_hole = external hidden unnamed_addr constant [9 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [8 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(argmem: readwrite)
declare void @llvm.lifetime.end.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

; Function Attrs: nounwind willreturn memory(read) uwtable
declare dso_local i64 @rkl_len(ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local { i64, i64 } @rkl_hole(ptr noundef %0, i1 noundef zeroext %1) #4 {
  %3 = alloca %struct.MDBX_rkl_hole, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i8, align 1
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i32, align 4
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  %13 = zext i1 %1 to i8
  store i8 %13, ptr %5, align 1, !tbaa !9
  br label %14

14:                                               ; preds = %2
  %15 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %16 = zext i8 %15 to i32
  %17 = and i32 %16, 1
  %18 = icmp ne i32 %17, 0
  %19 = xor i1 %18, true
  %20 = xor i1 %19, true
  %21 = zext i1 %20 to i32
  %22 = sext i32 %21 to i64
  %23 = call i64 @llvm.expect.i64(i64 %22, i64 1)
  %24 = icmp ne i64 %23, 0
  br i1 %24, label %25, label %46

25:                                               ; preds = %14
  br label %26

26:                                               ; preds = %25
  %27 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %28 = trunc i8 %27 to i1
  %29 = zext i1 %28 to i32
  %30 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %31 = trunc i8 %30 to i1
  %32 = xor i1 %31, true
  %33 = xor i1 %32, true
  %34 = zext i1 %33 to i32
  %35 = icmp eq i32 %29, %34
  %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 = %26
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.10, ptr noundef @__func__.rkl_hole, i32 noundef 473) #5
  unreachable

44:                                               ; preds = %26
  br label %45

45:                                               ; preds = %44
  br label %46

46:                                               ; preds = %45, %14
  br label %47

47:                                               ; preds = %46
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #6
  %48 = load ptr, ptr %4, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %48, i32 0, i32 0
  %50 = load ptr, ptr %49, align 8, !tbaa !17
  %51 = call i64 @rkl_len(ptr noundef %50) #7
  store i64 %51, ptr %6, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #6
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %52, i32 0, i32 1
  %54 = load i32, ptr %53, align 8, !tbaa !20
  %55 = zext i32 %54 to i64
  store i64 %55, ptr %7, align 8, !tbaa !19
  %56 = load i64, ptr %7, align 8, !tbaa !19
  %57 = load i64, ptr %6, align 8, !tbaa !19
  %58 = icmp uge i64 %56, %57
  %59 = xor i1 %58, true
  %60 = xor i1 %59, true
  %61 = zext i1 %60 to i32
  %62 = sext i32 %61 to i64
  %63 = call i64 @llvm.expect.i64(i64 %62, i64 0)
  %64 = icmp ne i64 %63, 0
  br i1 %64, label %65, label %107

65:                                               ; preds = %47
  %66 = load i64, ptr %6, align 8, !tbaa !19
  %67 = icmp eq i64 %66, 0
  br i1 %67, label %68, label %76

68:                                               ; preds = %65
  %69 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 1, ptr %69, align 8, !tbaa !21
  %70 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 -4294967297, ptr %70, align 8, !tbaa !23
  %71 = load ptr, ptr %4, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %71, i32 0, i32 1
  store i32 0, ptr %72, align 8, !tbaa !20
  br label %73

73:                                               ; preds = %68
  br label %74

74:                                               ; preds = %73
  br label %75

75:                                               ; preds = %74
  store i32 1, ptr %8, align 4
  br label %550

76:                                               ; preds = %65
  %77 = load i64, ptr %7, align 8, !tbaa !19
  %78 = load i64, ptr %6, align 8, !tbaa !19
  %79 = icmp eq i64 %77, %78
  br i1 %79, label %80, label %84

80:                                               ; preds = %76
  %81 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %82 = trunc i8 %81 to i1
  br i1 %82, label %83, label %84

83:                                               ; preds = %80
  br label %105

84:                                               ; preds = %80, %76
  %85 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %86 = trunc i8 %85 to i1
  br i1 %86, label %87, label %95

87:                                               ; preds = %84
  %88 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 1, ptr %88, align 8, !tbaa !21
  %89 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 1, ptr %89, align 8, !tbaa !23
  %90 = load ptr, ptr %4, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %90, i32 0, i32 1
  store i32 0, ptr %91, align 8, !tbaa !20
  br label %92

92:                                               ; preds = %87
  br label %93

93:                                               ; preds = %92
  br label %94

94:                                               ; preds = %93
  store i32 1, ptr %8, align 4
  br label %550

95:                                               ; preds = %84
  %96 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 -4294967297, ptr %96, align 8, !tbaa !21
  %97 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 -4294967297, ptr %97, align 8, !tbaa !23
  %98 = load i64, ptr %6, align 8, !tbaa !19
  %99 = trunc i64 %98 to i32
  %100 = load ptr, ptr %4, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %100, i32 0, i32 1
  store i32 %99, ptr %101, align 8, !tbaa !20
  br label %102

102:                                              ; preds = %95
  br label %103

103:                                              ; preds = %102
  br label %104

104:                                              ; preds = %103
  store i32 1, ptr %8, align 4
  br label %550

105:                                              ; preds = %83
  br label %106

106:                                              ; preds = %105
  br label %107

107:                                              ; preds = %106, %47
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  %108 = load ptr, ptr %4, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %108, i32 0, i32 0
  %110 = load ptr, ptr %109, align 8, !tbaa !17
  %111 = getelementptr inbounds %struct.MDBX_rkl, ptr %110, i32 0, i32 1
  %112 = load i64, ptr %111, align 8, !tbaa !24
  %113 = load ptr, ptr %4, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %113, i32 0, i32 0
  %115 = load ptr, ptr %114, align 8, !tbaa !17
  %116 = getelementptr inbounds %struct.MDBX_rkl, ptr %115, i32 0, i32 0
  %117 = load i64, ptr %116, align 8, !tbaa !26
  %118 = sub i64 %112, %117
  store i64 %118, ptr %9, align 8, !tbaa !19
  %119 = load ptr, ptr %4, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %119, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !17
  %122 = getelementptr inbounds %struct.MDBX_rkl, ptr %121, i32 0, i32 2
  %123 = load i32, ptr %122, align 8, !tbaa !27
  %124 = icmp ne i32 %123, 0
  br i1 %124, label %125, label %509

125:                                              ; preds = %107
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  br label %126

126:                                              ; preds = %479, %125
  %127 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %128 = trunc i8 %127 to i1
  br i1 %128, label %129, label %132

129:                                              ; preds = %126
  %130 = load i64, ptr %7, align 8, !tbaa !19
  %131 = sub i64 %130, 1
  br label %135

132:                                              ; preds = %126
  %133 = load i64, ptr %7, align 8, !tbaa !19
  %134 = add i64 %133, 1
  br label %135

135:                                              ; preds = %132, %129
  %136 = phi i64 [ %131, %129 ], [ %134, %132 ]
  store i64 %136, ptr %12, align 8, !tbaa !19
  %137 = load i64, ptr %7, align 8, !tbaa !19
  %138 = load ptr, ptr %4, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %138, i32 0, i32 2
  %140 = load i32, ptr %139, align 4, !tbaa !28
  %141 = zext i32 %140 to i64
  %142 = icmp ult i64 %137, %141
  br i1 %142, label %143, label %255

143:                                              ; preds = %135
  %144 = load ptr, ptr %4, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %144, i32 0, i32 0
  %146 = load ptr, ptr %145, align 8, !tbaa !17
  %147 = getelementptr inbounds %struct.MDBX_rkl, ptr %146, i32 0, i32 4
  %148 = load ptr, ptr %147, align 8, !tbaa !29
  %149 = load i64, ptr %7, align 8, !tbaa !19
  %150 = getelementptr inbounds i64, ptr %148, i64 %149
  %151 = load i64, ptr %150, align 8, !tbaa !19
  store i64 %151, ptr %10, align 8, !tbaa !19
  %152 = load i64, ptr %12, align 8, !tbaa !19
  %153 = load ptr, ptr %4, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %153, i32 0, i32 2
  %155 = load i32, ptr %154, align 4, !tbaa !28
  %156 = zext i32 %155 to i64
  %157 = icmp eq i64 %152, %156
  br i1 %157, label %158, label %241

158:                                              ; preds = %143
  br label %159

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

170:                                              ; preds = %159
  br label %171

171:                                              ; preds = %170
  %172 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %173 = trunc i8 %172 to i1
  %174 = xor i1 %173, true
  %175 = xor i1 %174, true
  %176 = xor i1 %175, true
  %177 = xor i1 %176, true
  %178 = zext i1 %177 to i32
  %179 = sext i32 %178 to i64
  %180 = call i64 @llvm.expect.i64(i64 %179, i64 0)
  %181 = icmp ne i64 %180, 0
  br i1 %181, label %182, label %183

182:                                              ; preds = %171
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.13, ptr noundef @__func__.rkl_hole, i32 noundef 512) #5
  unreachable

183:                                              ; preds = %171
  br label %184

184:                                              ; preds = %183
  br label %185

185:                                              ; preds = %184
  br label %186

186:                                              ; preds = %185, %159
  br label %187

187:                                              ; preds = %186
  br label %188

188:                                              ; preds = %187
  %189 = load i64, ptr %10, align 8, !tbaa !19
  %190 = add i64 %189, 1
  %191 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 %190, ptr %191, align 8, !tbaa !21
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %192, i32 0, i32 0
  %194 = load ptr, ptr %193, align 8, !tbaa !17
  %195 = getelementptr inbounds %struct.MDBX_rkl, ptr %194, i32 0, i32 0
  %196 = load i64, ptr %195, align 8, !tbaa !26
  %197 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 %196, ptr %197, align 8, !tbaa !23
  %198 = load i64, ptr %9, align 8, !tbaa !19
  %199 = load i64, ptr %12, align 8, !tbaa !19
  %200 = add i64 %199, %198
  store i64 %200, ptr %12, align 8, !tbaa !19
  br label %201

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

212:                                              ; preds = %201
  br label %213

213:                                              ; preds = %212
  %214 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  %215 = load i64, ptr %214, align 8, !tbaa !21
  %216 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  %217 = load i64, ptr %216, align 8, !tbaa !23
  %218 = icmp ult i64 %215, %217
  %219 = xor i1 %218, true
  %220 = xor i1 %219, true
  %221 = xor i1 %220, true
  %222 = zext i1 %221 to i32
  %223 = sext i32 %222 to i64
  %224 = call i64 @llvm.expect.i64(i64 %223, i64 0)
  %225 = icmp ne i64 %224, 0
  br i1 %225, label %226, label %227

226:                                              ; preds = %213
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.14, ptr noundef @__func__.rkl_hole, i32 noundef 516) #5
  unreachable

227:                                              ; preds = %213
  br label %228

228:                                              ; preds = %227
  br label %229

229:                                              ; preds = %228
  br label %230

230:                                              ; preds = %229, %201
  br label %231

231:                                              ; preds = %230
  br label %232

232:                                              ; preds = %231
  %233 = load i64, ptr %12, align 8, !tbaa !19
  %234 = sub i64 %233, 1
  %235 = trunc i64 %234 to i32
  %236 = load ptr, ptr %4, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %236, i32 0, i32 1
  store i32 %235, ptr %237, align 8, !tbaa !20
  br label %238

238:                                              ; preds = %232
  br label %239

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  store i32 1, ptr %8, align 4
  br label %481

241:                                              ; preds = %143
  %242 = load i64, ptr %12, align 8, !tbaa !19
  %243 = load i64, ptr %6, align 8, !tbaa !19
  %244 = icmp uge i64 %242, %243
  br i1 %244, label %245, label %246

245:                                              ; preds = %241
  store i32 12, ptr %8, align 4
  br label %481

246:                                              ; preds = %241
  %247 = load ptr, ptr %4, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %247, i32 0, i32 0
  %249 = load ptr, ptr %248, align 8, !tbaa !17
  %250 = getelementptr inbounds %struct.MDBX_rkl, ptr %249, i32 0, i32 4
  %251 = load ptr, ptr %250, align 8, !tbaa !29
  %252 = load i64, ptr %12, align 8, !tbaa !19
  %253 = getelementptr inbounds i64, ptr %251, i64 %252
  %254 = load i64, ptr %253, align 8, !tbaa !19
  store i64 %254, ptr %11, align 8, !tbaa !19
  br label %445

255:                                              ; preds = %135
  %256 = load i64, ptr %7, align 8, !tbaa !19
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %257, i32 0, i32 2
  %259 = load i32, ptr %258, align 4, !tbaa !28
  %260 = zext i32 %259 to i64
  %261 = load i64, ptr %9, align 8, !tbaa !19
  %262 = add i64 %260, %261
  %263 = icmp uge i64 %256, %262
  br i1 %263, label %264, label %388

264:                                              ; preds = %255
  %265 = load i64, ptr %7, align 8, !tbaa !19
  %266 = load i64, ptr %6, align 8, !tbaa !19
  %267 = icmp ult i64 %265, %266
  br i1 %267, label %268, label %279

268:                                              ; preds = %264
  %269 = load ptr, ptr %4, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %269, i32 0, i32 0
  %271 = load ptr, ptr %270, align 8, !tbaa !17
  %272 = getelementptr inbounds %struct.MDBX_rkl, ptr %271, i32 0, i32 4
  %273 = load ptr, ptr %272, align 8, !tbaa !29
  %274 = load i64, ptr %7, align 8, !tbaa !19
  %275 = load i64, ptr %9, align 8, !tbaa !19
  %276 = sub i64 %274, %275
  %277 = getelementptr inbounds i64, ptr %273, i64 %276
  %278 = load i64, ptr %277, align 8, !tbaa !19
  br label %280

279:                                              ; preds = %264
  br label %280

280:                                              ; preds = %279, %268
  %281 = phi i64 [ %278, %268 ], [ -4294967297, %279 ]
  store i64 %281, ptr %10, align 8, !tbaa !19
  %282 = load i64, ptr %12, align 8, !tbaa !19
  %283 = load i64, ptr %6, align 8, !tbaa !19
  %284 = icmp uge i64 %282, %283
  br i1 %284, label %285, label %286

285:                                              ; preds = %280
  store i32 12, ptr %8, align 4
  br label %481

286:                                              ; preds = %280
  %287 = load i64, ptr %12, align 8, !tbaa !19
  %288 = load ptr, ptr %4, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %288, i32 0, i32 2
  %290 = load i32, ptr %289, align 4, !tbaa !28
  %291 = zext i32 %290 to i64
  %292 = load i64, ptr %9, align 8, !tbaa !19
  %293 = add i64 %291, %292
  %294 = sub i64 %293, 1
  %295 = icmp eq i64 %287, %294
  br i1 %295, label %296, label %377

296:                                              ; preds = %286
  br label %297

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

308:                                              ; preds = %297
  br label %309

309:                                              ; preds = %308
  %310 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %311 = trunc i8 %310 to i1
  %312 = xor i1 %311, true
  %313 = xor i1 %312, true
  %314 = xor i1 %313, true
  %315 = zext i1 %314 to i32
  %316 = sext i32 %315 to i64
  %317 = call i64 @llvm.expect.i64(i64 %316, i64 0)
  %318 = icmp ne i64 %317, 0
  br i1 %318, label %319, label %320

319:                                              ; preds = %309
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.15, ptr noundef @__func__.rkl_hole, i32 noundef 535) #5
  unreachable

320:                                              ; preds = %309
  br label %321

321:                                              ; preds = %320
  br label %322

322:                                              ; preds = %321
  br label %323

323:                                              ; preds = %322, %297
  br label %324

324:                                              ; preds = %323
  br label %325

325:                                              ; preds = %324
  %326 = load ptr, ptr %4, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %326, i32 0, i32 0
  %328 = load ptr, ptr %327, align 8, !tbaa !17
  %329 = getelementptr inbounds %struct.MDBX_rkl, ptr %328, i32 0, i32 1
  %330 = load i64, ptr %329, align 8, !tbaa !24
  %331 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 %330, ptr %331, align 8, !tbaa !21
  %332 = load i64, ptr %10, align 8, !tbaa !19
  %333 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 %332, ptr %333, align 8, !tbaa !23
  %334 = load ptr, ptr %4, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %334, i32 0, i32 2
  %336 = load i32, ptr %335, align 4, !tbaa !28
  %337 = zext i32 %336 to i64
  store i64 %337, ptr %7, align 8, !tbaa !19
  br label %338

338:                                              ; preds = %325
  %339 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %340 = zext i8 %339 to i32
  %341 = and i32 %340, 1
  %342 = icmp ne i32 %341, 0
  %343 = xor i1 %342, true
  %344 = xor i1 %343, true
  %345 = zext i1 %344 to i32
  %346 = sext i32 %345 to i64
  %347 = call i64 @llvm.expect.i64(i64 %346, i64 1)
  %348 = icmp ne i64 %347, 0
  br i1 %348, label %349, label %367

349:                                              ; preds = %338
  br label %350

350:                                              ; preds = %349
  %351 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  %352 = load i64, ptr %351, align 8, !tbaa !21
  %353 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  %354 = load i64, ptr %353, align 8, !tbaa !23
  %355 = icmp ult i64 %352, %354
  %356 = xor i1 %355, true
  %357 = xor i1 %356, true
  %358 = xor i1 %357, true
  %359 = zext i1 %358 to i32
  %360 = sext i32 %359 to i64
  %361 = call i64 @llvm.expect.i64(i64 %360, i64 0)
  %362 = icmp ne i64 %361, 0
  br i1 %362, label %363, label %364

363:                                              ; preds = %350
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.14, ptr noundef @__func__.rkl_hole, i32 noundef 539) #5
  unreachable

364:                                              ; preds = %350
  br label %365

365:                                              ; preds = %364
  br label %366

366:                                              ; preds = %365
  br label %367

367:                                              ; preds = %366, %338
  br label %368

368:                                              ; preds = %367
  br label %369

369:                                              ; preds = %368
  %370 = load i64, ptr %7, align 8, !tbaa !19
  %371 = trunc i64 %370 to i32
  %372 = load ptr, ptr %4, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %372, i32 0, i32 1
  store i32 %371, ptr %373, align 8, !tbaa !20
  br label %374

374:                                              ; preds = %369
  br label %375

375:                                              ; preds = %374
  br label %376

376:                                              ; preds = %375
  store i32 1, ptr %8, align 4
  br label %481

377:                                              ; preds = %286
  %378 = load ptr, ptr %4, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %378, i32 0, i32 0
  %380 = load ptr, ptr %379, align 8, !tbaa !17
  %381 = getelementptr inbounds %struct.MDBX_rkl, ptr %380, i32 0, i32 4
  %382 = load ptr, ptr %381, align 8, !tbaa !29
  %383 = load i64, ptr %12, align 8, !tbaa !19
  %384 = load i64, ptr %9, align 8, !tbaa !19
  %385 = sub i64 %383, %384
  %386 = getelementptr inbounds i64, ptr %382, i64 %385
  %387 = load i64, ptr %386, align 8, !tbaa !19
  store i64 %387, ptr %11, align 8, !tbaa !19
  br label %444

388:                                              ; preds = %255
  %389 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %390 = trunc i8 %389 to i1
  br i1 %390, label %391, label %415

391:                                              ; preds = %388
  %392 = load ptr, ptr %4, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %392, i32 0, i32 2
  %394 = load i32, ptr %393, align 4, !tbaa !28
  %395 = sub i32 %394, 1
  %396 = zext i32 %395 to i64
  store i64 %396, ptr %12, align 8, !tbaa !19
  %397 = load ptr, ptr %4, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %397, i32 0, i32 0
  %399 = load ptr, ptr %398, align 8, !tbaa !17
  %400 = getelementptr inbounds %struct.MDBX_rkl, ptr %399, i32 0, i32 0
  %401 = load i64, ptr %400, align 8, !tbaa !26
  store i64 %401, ptr %10, align 8, !tbaa !19
  %402 = load i64, ptr %12, align 8, !tbaa !19
  %403 = load i64, ptr %6, align 8, !tbaa !19
  %404 = icmp uge i64 %402, %403
  br i1 %404, label %405, label %406

405:                                              ; preds = %391
  store i32 12, ptr %8, align 4
  br label %481

406:                                              ; preds = %391
  %407 = load ptr, ptr %4, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %407, i32 0, i32 0
  %409 = load ptr, ptr %408, align 8, !tbaa !17
  %410 = getelementptr inbounds %struct.MDBX_rkl, ptr %409, i32 0, i32 4
  %411 = load ptr, ptr %410, align 8, !tbaa !29
  %412 = load i64, ptr %12, align 8, !tbaa !19
  %413 = getelementptr inbounds i64, ptr %411, i64 %412
  %414 = load i64, ptr %413, align 8, !tbaa !19
  store i64 %414, ptr %11, align 8, !tbaa !19
  br label %443

415:                                              ; preds = %388
  %416 = load ptr, ptr %4, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %416, i32 0, i32 2
  %418 = load i32, ptr %417, align 4, !tbaa !28
  %419 = zext i32 %418 to i64
  %420 = load i64, ptr %9, align 8, !tbaa !19
  %421 = add i64 %419, %420
  store i64 %421, ptr %12, align 8, !tbaa !19
  %422 = load ptr, ptr %4, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %422, i32 0, i32 0
  %424 = load ptr, ptr %423, align 8, !tbaa !17
  %425 = getelementptr inbounds %struct.MDBX_rkl, ptr %424, i32 0, i32 1
  %426 = load i64, ptr %425, align 8, !tbaa !24
  %427 = sub i64 %426, 1
  store i64 %427, ptr %10, align 8, !tbaa !19
  %428 = load i64, ptr %12, align 8, !tbaa !19
  %429 = load i64, ptr %6, align 8, !tbaa !19
  %430 = icmp uge i64 %428, %429
  br i1 %430, label %431, label %432

431:                                              ; preds = %415
  store i32 12, ptr %8, align 4
  br label %481

432:                                              ; preds = %415
  %433 = load ptr, ptr %4, align 8, !tbaa !5
  %434 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %433, i32 0, i32 0
  %435 = load ptr, ptr %434, align 8, !tbaa !17
  %436 = getelementptr inbounds %struct.MDBX_rkl, ptr %435, i32 0, i32 4
  %437 = load ptr, ptr %436, align 8, !tbaa !29
  %438 = load i64, ptr %12, align 8, !tbaa !19
  %439 = load i64, ptr %9, align 8, !tbaa !19
  %440 = sub i64 %438, %439
  %441 = getelementptr inbounds i64, ptr %437, i64 %440
  %442 = load i64, ptr %441, align 8, !tbaa !19
  store i64 %442, ptr %11, align 8, !tbaa !19
  br label %443

443:                                              ; preds = %432, %406
  br label %444

444:                                              ; preds = %443, %377
  br label %445

445:                                              ; preds = %444, %246
  %446 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %447 = trunc i8 %446 to i1
  br i1 %447, label %448, label %450

448:                                              ; preds = %445
  %449 = load i64, ptr %11, align 8, !tbaa !19
  br label %452

450:                                              ; preds = %445
  %451 = load i64, ptr %10, align 8, !tbaa !19
  br label %452

452:                                              ; preds = %450, %448
  %453 = phi i64 [ %449, %448 ], [ %451, %450 ]
  %454 = add i64 %453, 1
  %455 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 %454, ptr %455, align 8, !tbaa !21
  %456 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %457 = trunc i8 %456 to i1
  br i1 %457, label %458, label %460

458:                                              ; preds = %452
  %459 = load i64, ptr %10, align 8, !tbaa !19
  br label %462

460:                                              ; preds = %452
  %461 = load i64, ptr %11, align 8, !tbaa !19
  br label %462

462:                                              ; preds = %460, %458
  %463 = phi i64 [ %459, %458 ], [ %461, %460 ]
  %464 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 %463, ptr %464, align 8, !tbaa !23
  %465 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  %466 = load i64, ptr %465, align 8, !tbaa !21
  %467 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  %468 = load i64, ptr %467, align 8, !tbaa !23
  %469 = icmp ult i64 %466, %468
  br i1 %469, label %470, label %478

470:                                              ; preds = %462
  %471 = load i64, ptr %12, align 8, !tbaa !19
  %472 = trunc i64 %471 to i32
  %473 = load ptr, ptr %4, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %473, i32 0, i32 1
  store i32 %472, ptr %474, align 8, !tbaa !20
  br label %475

475:                                              ; preds = %470
  br label %476

476:                                              ; preds = %475
  br label %477

477:                                              ; preds = %476
  store i32 1, ptr %8, align 4
  br label %481

478:                                              ; preds = %462
  br label %479

479:                                              ; preds = %478
  %480 = load i64, ptr %12, align 8, !tbaa !19
  store i64 %480, ptr %7, align 8, !tbaa !19
  br label %126

481:                                              ; preds = %477, %431, %405, %376, %285, %245, %240
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  %482 = load i32, ptr %8, align 4
  switch i32 %482, label %508 [
    i32 12, label %483
  ]

483:                                              ; preds = %481
  %484 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %485 = trunc i8 %484 to i1
  br i1 %485, label %486, label %495

486:                                              ; preds = %483
  %487 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 1, ptr %487, align 8, !tbaa !21
  %488 = load i64, ptr %10, align 8, !tbaa !19
  %489 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 %488, ptr %489, align 8, !tbaa !23
  %490 = load ptr, ptr %4, align 8, !tbaa !5
  %491 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %490, i32 0, i32 1
  store i32 0, ptr %491, align 8, !tbaa !20
  br label %492

492:                                              ; preds = %486
  br label %493

493:                                              ; preds = %492
  br label %494

494:                                              ; preds = %493
  br label %507

495:                                              ; preds = %483
  %496 = load i64, ptr %10, align 8, !tbaa !19
  %497 = add i64 %496, 1
  %498 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 %497, ptr %498, align 8, !tbaa !21
  %499 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 -4294967297, ptr %499, align 8, !tbaa !23
  %500 = load i64, ptr %6, align 8, !tbaa !19
  %501 = trunc i64 %500 to i32
  %502 = load ptr, ptr %4, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %502, i32 0, i32 1
  store i32 %501, ptr %503, align 8, !tbaa !20
  br label %504

504:                                              ; preds = %495
  br label %505

505:                                              ; preds = %504
  br label %506

506:                                              ; preds = %505
  br label %507

507:                                              ; preds = %506, %494
  store i32 1, ptr %8, align 4
  br label %508

508:                                              ; preds = %507, %481
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  br label %549

509:                                              ; preds = %107
  %510 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %511 = trunc i8 %510 to i1
  br i1 %511, label %512, label %513

512:                                              ; preds = %509
  br label %515

513:                                              ; preds = %509
  %514 = load i64, ptr %6, align 8, !tbaa !19
  br label %515

515:                                              ; preds = %513, %512
  %516 = phi i64 [ 0, %512 ], [ %514, %513 ]
  %517 = trunc i64 %516 to i32
  %518 = load ptr, ptr %4, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %518, i32 0, i32 1
  store i32 %517, ptr %519, align 8, !tbaa !20
  %520 = load i8, ptr %5, align 1, !tbaa !9, !range !15, !noundef !16
  %521 = trunc i8 %520 to i1
  br i1 %521, label %522, label %537

522:                                              ; preds = %515
  %523 = load i64, ptr %7, align 8, !tbaa !19
  %524 = load i64, ptr %6, align 8, !tbaa !19
  %525 = icmp ult i64 %523, %524
  br i1 %525, label %526, label %537

526:                                              ; preds = %522
  %527 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 1, ptr %527, align 8, !tbaa !21
  %528 = load ptr, ptr %4, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %528, i32 0, i32 0
  %530 = load ptr, ptr %529, align 8, !tbaa !17
  %531 = getelementptr inbounds %struct.MDBX_rkl, ptr %530, i32 0, i32 0
  %532 = load i64, ptr %531, align 8, !tbaa !26
  %533 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 %532, ptr %533, align 8, !tbaa !23
  br label %534

534:                                              ; preds = %526
  br label %535

535:                                              ; preds = %534
  br label %536

536:                                              ; preds = %535
  br label %548

537:                                              ; preds = %522, %515
  %538 = load ptr, ptr %4, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.MDBX_rkl_iter, ptr %538, i32 0, i32 0
  %540 = load ptr, ptr %539, align 8, !tbaa !17
  %541 = getelementptr inbounds %struct.MDBX_rkl, ptr %540, i32 0, i32 1
  %542 = load i64, ptr %541, align 8, !tbaa !24
  %543 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 0
  store i64 %542, ptr %543, align 8, !tbaa !21
  %544 = getelementptr inbounds %struct.MDBX_rkl_hole, ptr %3, i32 0, i32 1
  store i64 -4294967297, ptr %544, align 8, !tbaa !23
  br label %545

545:                                              ; preds = %537
  br label %546

546:                                              ; preds = %545
  br label %547

547:                                              ; preds = %546
  br label %548

548:                                              ; preds = %547, %536
  store i32 1, ptr %8, align 4
  br label %549

549:                                              ; preds = %548, %508
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  br label %550

550:                                              ; preds = %549, %104, %94, %75
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #6
  %551 = load { i64, i64 }, ptr %3, align 8
  ret { i64, i64 } %551
}

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !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, !7, i64 25}
!12 = !{!"libmdbx_globals", !7, i64 0, !13, i64 16, !13, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !13, i64 28, !7, i64 32, !7, i64 40, !14, i64 80, !6, i64 88}
!13 = !{!"int", !7, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = !{i8 0, i8 2}
!16 = !{}
!17 = !{!18, !6, i64 0}
!18 = !{!"MDBX_rkl_iter", !6, i64 0, !13, i64 8, !13, i64 12}
!19 = !{!14, !14, i64 0}
!20 = !{!18, !13, i64 8}
!21 = !{!22, !14, i64 0}
!22 = !{!"MDBX_rkl_hole", !14, i64 0, !14, i64 8}
!23 = !{!22, !14, i64 8}
!24 = !{!25, !14, i64 8}
!25 = !{!"MDBX_rkl", !14, i64 0, !14, i64 8, !13, i64 16, !13, i64 20, !6, i64 24, !7, i64 32}
!26 = !{!25, !14, i64 0}
!27 = !{!25, !13, i64 16}
!28 = !{!18, !13, i64 12}
!29 = !{!25, !6, i64 24}


; 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 }
%struct.anon = 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
@__func__.rkl_hole = external hidden unnamed_addr constant [9 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [8 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
define dso_local { i64, i64 } @rkl_hole(ptr nocapture noundef %0, i1 noundef zeroext %1) local_unnamed_addr #2 {
  %3 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %4 = and i8 %3, 1
  %5 = load ptr, ptr %0, align 8, !tbaa !13
  %6 = tail call i64 @rkl_len(ptr noundef %5) #3
  %7 = getelementptr inbounds i8, ptr %0, i64 8
  %8 = load i32, ptr %7, align 8, !tbaa !15
  %9 = zext i32 %8 to i64
  %.not120 = icmp ugt i64 %6, %9
  br i1 %.not120, label %19, label %10, !prof !16

10:                                               ; preds = %2
  %11 = icmp eq i64 %6, 0
  br i1 %11, label %12, label %13

12:                                               ; preds = %10
  store i32 0, ptr %7, align 8, !tbaa !15
  br label %174

13:                                               ; preds = %10
  %14 = icmp eq i64 %6, %9
  %brmerge.not = and i1 %14, %1
  br i1 %brmerge.not, label %19, label %15

15:                                               ; preds = %13
  br i1 %1, label %16, label %17

16:                                               ; preds = %15
  store i32 0, ptr %7, align 8, !tbaa !15
  br label %174

17:                                               ; preds = %15
  %18 = trunc nuw i64 %6 to i32
  store i32 %18, ptr %7, align 8, !tbaa !15
  br label %174

19:                                               ; preds = %13, %2
  %20 = getelementptr inbounds i8, ptr %5, i64 8
  %21 = load i64, ptr %20, align 8, !tbaa !17
  %22 = load i64, ptr %5, align 8, !tbaa !19
  %23 = sub i64 %21, %22
  %24 = getelementptr inbounds i8, ptr %5, i64 16
  %25 = load i32, ptr %24, align 8, !tbaa !20
  %.not121 = icmp eq i32 %25, 0
  br i1 %.not121, label %171, label %.preheader

.preheader:                                       ; preds = %19
  %.v = select i1 %1, i64 -1, i64 1
  %26 = getelementptr inbounds i8, ptr %0, i64 12
  %27 = load i32, ptr %26, align 4, !tbaa !21
  %28 = zext i32 %27 to i64
  %29 = add i64 %23, %28
  %30 = getelementptr inbounds i8, ptr %5, i64 24
  %31 = add i64 %29, -1
  %32 = add i64 %21, -1
  %33 = add i32 %27, -1
  %34 = zext i32 %33 to i64
  br i1 %1, label %.preheader.split.us, label %.preheader.split

.preheader.split.us:                              ; preds = %.preheader
  %.not124 = icmp ugt i64 %6, %34
  %.not124.fr = freeze i1 %.not124
  br i1 %.not124.fr, label %.preheader.split.us.split.us, label %.preheader.split.us.split

.preheader.split.us.split.us:                     ; preds = %.preheader.split.us, %64
  %.0107.us.us = phi i64 [ %.0.us.us, %64 ], [ %9, %.preheader.split.us ]
  %35 = add i64 %.0107.us.us, %.v
  %36 = icmp ult i64 %.0107.us.us, %28
  br i1 %36, label %56, label %37

37:                                               ; preds = %.preheader.split.us.split.us
  %.not122.us.us = icmp ult i64 %.0107.us.us, %29
  br i1 %.not122.us.us, label %53, label %38

38:                                               ; preds = %37
  %39 = icmp ult i64 %.0107.us.us, %6
  br i1 %39, label %40, label %45

40:                                               ; preds = %38
  %41 = load ptr, ptr %30, align 8, !tbaa !22
  %42 = sub i64 %.0107.us.us, %23
  %43 = getelementptr inbounds i64, ptr %41, i64 %42
  %44 = load i64, ptr %43, align 8, !tbaa !23
  br label %45

45:                                               ; preds = %40, %38
  %46 = phi i64 [ %44, %40 ], [ -4294967297, %38 ]
  %.not125.us.us = icmp ult i64 %35, %6
  br i1 %.not125.us.us, label %47, label %.split.us

47:                                               ; preds = %45
  %48 = icmp eq i64 %35, %31
  br i1 %48, label %.split158.us, label %49

49:                                               ; preds = %47
  %50 = load ptr, ptr %30, align 8, !tbaa !22
  %51 = sub i64 %35, %23
  %52 = getelementptr inbounds i64, ptr %50, i64 %51
  br label %64

53:                                               ; preds = %37
  %54 = load ptr, ptr %30, align 8, !tbaa !22
  %55 = getelementptr inbounds i64, ptr %54, i64 %34
  br label %64

56:                                               ; preds = %.preheader.split.us.split.us
  %57 = load ptr, ptr %30, align 8, !tbaa !22
  %58 = getelementptr inbounds i64, ptr %57, i64 %.0107.us.us
  %59 = load i64, ptr %58, align 8, !tbaa !23
  %60 = icmp eq i64 %35, %28
  br i1 %60, label %.split162.us, label %61

61:                                               ; preds = %56
  %.not129.us.us = icmp ult i64 %35, %6
  br i1 %.not129.us.us, label %62, label %.split.us

62:                                               ; preds = %61
  %63 = getelementptr inbounds i64, ptr %57, i64 %35
  br label %64

64:                                               ; preds = %62, %53, %49
  %.0105.us.us = phi i64 [ %59, %62 ], [ %46, %49 ], [ %22, %53 ]
  %.0104.in.us.us = phi ptr [ %63, %62 ], [ %52, %49 ], [ %55, %53 ]
  %.0.us.us = phi i64 [ %35, %62 ], [ %35, %49 ], [ %34, %53 ]
  %.0104.us.us = load i64, ptr %.0104.in.us.us, align 8, !tbaa !23
  %65 = add i64 %.0104.us.us, 1
  %66 = icmp ult i64 %65, %.0105.us.us
  br i1 %66, label %.split166.us, label %.preheader.split.us.split.us

.preheader.split.us.split:                        ; preds = %.preheader.split.us, %93
  %.0107.us = phi i64 [ %67, %93 ], [ %9, %.preheader.split.us ]
  %67 = add i64 %.0107.us, %.v
  %68 = icmp ult i64 %.0107.us, %28
  br i1 %68, label %85, label %69

69:                                               ; preds = %.preheader.split.us.split
  %.not122.us = icmp ult i64 %.0107.us, %29
  br i1 %.not122.us, label %.split.us, label %70

70:                                               ; preds = %69
  %71 = icmp ult i64 %.0107.us, %6
  br i1 %71, label %72, label %77

72:                                               ; preds = %70
  %73 = load ptr, ptr %30, align 8, !tbaa !22
  %74 = sub i64 %.0107.us, %23
  %75 = getelementptr inbounds i64, ptr %73, i64 %74
  %76 = load i64, ptr %75, align 8, !tbaa !23
  br label %77

77:                                               ; preds = %72, %70
  %78 = phi i64 [ %76, %72 ], [ -4294967297, %70 ]
  %.not125.us = icmp ult i64 %67, %6
  br i1 %.not125.us, label %79, label %.split.us

79:                                               ; preds = %77
  %80 = icmp eq i64 %67, %31
  br i1 %80, label %.split158.us, label %81

81:                                               ; preds = %79
  %82 = load ptr, ptr %30, align 8, !tbaa !22
  %83 = sub i64 %67, %23
  %84 = getelementptr inbounds i64, ptr %82, i64 %83
  br label %93

85:                                               ; preds = %.preheader.split.us.split
  %86 = load ptr, ptr %30, align 8, !tbaa !22
  %87 = getelementptr inbounds i64, ptr %86, i64 %.0107.us
  %88 = load i64, ptr %87, align 8, !tbaa !23
  %89 = icmp eq i64 %67, %28
  br i1 %89, label %.split162.us, label %90

90:                                               ; preds = %85
  %.not129.us = icmp ult i64 %67, %6
  br i1 %.not129.us, label %91, label %.split.us

91:                                               ; preds = %90
  %92 = getelementptr inbounds i64, ptr %86, i64 %67
  br label %93

93:                                               ; preds = %91, %81
  %.0105.us = phi i64 [ %88, %91 ], [ %78, %81 ]
  %.0104.in.us = phi ptr [ %92, %91 ], [ %84, %81 ]
  %.0104.us = load i64, ptr %.0104.in.us, align 8, !tbaa !23
  %94 = add i64 %.0104.us, 1
  %95 = icmp ult i64 %94, %.0105.us
  br i1 %95, label %.split166.us, label %.preheader.split.us.split

.preheader.split:                                 ; preds = %.preheader
  %.not123 = icmp ult i64 %29, %6
  %.not123.fr = freeze i1 %.not123
  br i1 %.not123.fr, label %.preheader.split.split.us, label %.preheader.split.split

.preheader.split.split.us:                        ; preds = %.preheader.split, %125
  %.0107.us170 = phi i64 [ %.0.us176, %125 ], [ %9, %.preheader.split ]
  %96 = add i64 %.0107.us170, %.v
  %97 = icmp ult i64 %.0107.us170, %28
  br i1 %97, label %117, label %98

98:                                               ; preds = %.preheader.split.split.us
  %.not122.us171 = icmp ult i64 %.0107.us170, %29
  br i1 %.not122.us171, label %114, label %99

99:                                               ; preds = %98
  %100 = icmp ult i64 %.0107.us170, %6
  br i1 %100, label %101, label %106

101:                                              ; preds = %99
  %102 = load ptr, ptr %30, align 8, !tbaa !22
  %103 = sub i64 %.0107.us170, %23
  %104 = getelementptr inbounds i64, ptr %102, i64 %103
  %105 = load i64, ptr %104, align 8, !tbaa !23
  br label %106

106:                                              ; preds = %101, %99
  %107 = phi i64 [ %105, %101 ], [ -4294967297, %99 ]
  %.not125.us172 = icmp ult i64 %96, %6
  br i1 %.not125.us172, label %108, label %.split.us

108:                                              ; preds = %106
  %109 = icmp eq i64 %96, %31
  br i1 %109, label %.split158.us, label %110

110:                                              ; preds = %108
  %111 = load ptr, ptr %30, align 8, !tbaa !22
  %112 = sub i64 %96, %23
  %113 = getelementptr inbounds i64, ptr %111, i64 %112
  br label %125

114:                                              ; preds = %98
  %115 = load ptr, ptr %30, align 8, !tbaa !22
  %116 = getelementptr inbounds i64, ptr %115, i64 %28
  br label %125

117:                                              ; preds = %.preheader.split.split.us
  %118 = load ptr, ptr %30, align 8, !tbaa !22
  %119 = getelementptr inbounds i64, ptr %118, i64 %.0107.us170
  %120 = load i64, ptr %119, align 8, !tbaa !23
  %121 = icmp eq i64 %96, %28
  br i1 %121, label %.split162.us, label %122

122:                                              ; preds = %117
  %.not129.us173 = icmp ult i64 %96, %6
  br i1 %.not129.us173, label %123, label %.split.us

123:                                              ; preds = %122
  %124 = getelementptr inbounds i64, ptr %118, i64 %96
  br label %125

125:                                              ; preds = %123, %114, %110
  %.0105.us174 = phi i64 [ %120, %123 ], [ %107, %110 ], [ %32, %114 ]
  %.0104.in.us175 = phi ptr [ %124, %123 ], [ %113, %110 ], [ %116, %114 ]
  %.0.us176 = phi i64 [ %96, %123 ], [ %96, %110 ], [ %29, %114 ]
  %.0104.us177 = load i64, ptr %.0104.in.us175, align 8, !tbaa !23
  %126 = add i64 %.0105.us174, 1
  %127 = icmp ult i64 %126, %.0104.us177
  br i1 %127, label %.split166.us, label %.preheader.split.split.us

.preheader.split.split:                           ; preds = %.preheader.split, %165
  %.0107 = phi i64 [ %128, %165 ], [ %9, %.preheader.split ]
  %128 = add i64 %.0107, %.v
  %129 = icmp ult i64 %.0107, %28
  br i1 %129, label %130, label %145

130:                                              ; preds = %.preheader.split.split
  %131 = load ptr, ptr %30, align 8, !tbaa !22
  %132 = getelementptr inbounds i64, ptr %131, i64 %.0107
  %133 = load i64, ptr %132, align 8, !tbaa !23
  %134 = icmp eq i64 %128, %28
  br i1 %134, label %.split162.us, label %142

.split162.us:                                     ; preds = %130, %117, %85, %56
  %.us-phi164 = phi i64 [ %59, %56 ], [ %88, %85 ], [ %120, %117 ], [ %133, %130 ]
  %.not130 = icmp eq i8 %4, 0
  %.not135 = xor i1 %1, true
  %brmerge136 = or i1 %.not130, %.not135
  br i1 %brmerge136, label %136, label %135, !prof !24

135:                                              ; preds = %.split162.us
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.13, ptr noundef nonnull @__func__.rkl_hole, i32 noundef 512) #4
  unreachable

136:                                              ; preds = %.split162.us
  %137 = add i64 %.us-phi164, 1
  %.not132 = icmp ult i64 %137, %22
  %or.cond = select i1 %.not130, i1 true, i1 %.not132
  br i1 %or.cond, label %139, label %138, !prof !24

138:                                              ; preds = %136
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.14, ptr noundef nonnull @__func__.rkl_hole, i32 noundef 516) #4
  unreachable

139:                                              ; preds = %136
  %140 = trunc i64 %29 to i32
  %141 = add i32 %140, -1
  store i32 %141, ptr %7, align 8, !tbaa !15
  br label %174

142:                                              ; preds = %130
  %.not129 = icmp ult i64 %128, %6
  br i1 %.not129, label %143, label %.split.us

143:                                              ; preds = %142
  %144 = getelementptr inbounds i64, ptr %131, i64 %128
  br label %165

145:                                              ; preds = %.preheader.split.split
  %.not122 = icmp ult i64 %.0107, %29
  br i1 %.not122, label %.split.us, label %146

146:                                              ; preds = %145
  %147 = icmp ult i64 %.0107, %6
  br i1 %147, label %148, label %153

148:                                              ; preds = %146
  %149 = load ptr, ptr %30, align 8, !tbaa !22
  %150 = sub i64 %.0107, %23
  %151 = getelementptr inbounds i64, ptr %149, i64 %150
  %152 = load i64, ptr %151, align 8, !tbaa !23
  br label %153

153:                                              ; preds = %146, %148
  %154 = phi i64 [ %152, %148 ], [ -4294967297, %146 ]
  %.not125 = icmp ult i64 %128, %6
  br i1 %.not125, label %155, label %.split.us

155:                                              ; preds = %153
  %156 = icmp eq i64 %128, %31
  br i1 %156, label %.split158.us, label %161

.split158.us:                                     ; preds = %155, %108, %79, %47
  %.us-phi160 = phi i64 [ %46, %47 ], [ %78, %79 ], [ %107, %108 ], [ %154, %155 ]
  %.not126 = icmp eq i8 %4, 0
  %brmerge137 = or i1 %.not126, %1
  br i1 %brmerge137, label %158, label %157, !prof !24

157:                                              ; preds = %.split158.us
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.15, ptr noundef nonnull @__func__.rkl_hole, i32 noundef 535) #4
  unreachable

158:                                              ; preds = %.split158.us
  %.not128 = icmp ult i64 %21, %.us-phi160
  %or.cond138 = select i1 %.not126, i1 true, i1 %.not128
  br i1 %or.cond138, label %160, label %159, !prof !24

159:                                              ; preds = %158
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.14, ptr noundef nonnull @__func__.rkl_hole, i32 noundef 539) #4
  unreachable

160:                                              ; preds = %158
  store i32 %27, ptr %7, align 8, !tbaa !15
  br label %174

161:                                              ; preds = %155
  %162 = load ptr, ptr %30, align 8, !tbaa !22
  %163 = sub i64 %128, %23
  %164 = getelementptr inbounds i64, ptr %162, i64 %163
  br label %165

165:                                              ; preds = %161, %143
  %.0105 = phi i64 [ %133, %143 ], [ %154, %161 ]
  %.0104.in = phi ptr [ %144, %143 ], [ %164, %161 ]
  %.0104 = load i64, ptr %.0104.in, align 8, !tbaa !23
  %166 = add i64 %.0105, 1
  %167 = icmp ult i64 %166, %.0104
  br i1 %167, label %.split166.us, label %.preheader.split.split

.split166.us:                                     ; preds = %165, %125, %93, %64
  %.us-phi167 = phi i64 [ %.0.us.us, %64 ], [ %67, %93 ], [ %.0.us176, %125 ], [ %128, %165 ]
  %.us-phi168 = phi i64 [ %65, %64 ], [ %94, %93 ], [ %126, %125 ], [ %166, %165 ]
  %.us-phi169 = phi i64 [ %.0105.us.us, %64 ], [ %.0105.us, %93 ], [ %.0104.us177, %125 ], [ %.0104, %165 ]
  %168 = trunc i64 %.us-phi167 to i32
  store i32 %168, ptr %7, align 8, !tbaa !15
  br label %174

.split.us:                                        ; preds = %142, %153, %145, %122, %106, %90, %77, %69, %61, %45
  %.sroa.14.2 = phi i64 [ %46, %45 ], [ %59, %61 ], [ %22, %69 ], [ %88, %90 ], [ %78, %77 ], [ -4294967297, %106 ], [ -4294967297, %122 ], [ -4294967297, %145 ], [ -4294967297, %153 ], [ -4294967297, %142 ]
  %.us-phi = phi i64 [ %46, %45 ], [ %59, %61 ], [ %22, %69 ], [ %88, %90 ], [ %78, %77 ], [ %120, %122 ], [ %107, %106 ], [ %133, %142 ], [ %154, %153 ], [ %32, %145 ]
  %169 = add i64 %.us-phi, 1
  %170 = trunc i64 %6 to i32
  %storemerge = select i1 %1, i32 0, i32 %170
  %.sroa.0.2 = select i1 %1, i64 1, i64 %169
  store i32 %storemerge, ptr %7, align 8, !tbaa !15
  br label %174

171:                                              ; preds = %19
  %172 = trunc i64 %6 to i32
  %173 = select i1 %1, i32 0, i32 %172
  store i32 %173, ptr %7, align 8, !tbaa !15
  %or.cond139 = and i1 %.not120, %1
  %spec.select = select i1 %or.cond139, i64 1, i64 %21
  %spec.select145 = select i1 %or.cond139, i64 %22, i64 -4294967297
  br label %174

174:                                              ; preds = %171, %139, %160, %.split166.us, %.split.us, %17, %16, %12
  %.sroa.0.6 = phi i64 [ 1, %12 ], [ 1, %16 ], [ -4294967297, %17 ], [ %.sroa.0.2, %.split.us ], [ %137, %139 ], [ %.us-phi168, %.split166.us ], [ %21, %160 ], [ %spec.select, %171 ]
  %.sroa.14.6 = phi i64 [ -4294967297, %12 ], [ 1, %16 ], [ -4294967297, %17 ], [ %.sroa.14.2, %.split.us ], [ %22, %139 ], [ %.us-phi169, %.split166.us ], [ %.us-phi160, %160 ], [ %spec.select145, %171 ]
  %.fca.0.insert = insertvalue { i64, i64 } poison, i64 %.sroa.0.6, 0
  %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %.sroa.14.6, 1
  ret { i64, i64 } %.fca.1.insert
}

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 = { mustprogress nofree nounwind willreturn memory(read) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 = { nounwind willreturn memory(read) }
attributes #4 = { 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, !7, i64 25}
!6 = !{!"libmdbx_globals", !7, i64 0, !9, i64 16, !9, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !10, i64 27, !9, i64 28, !7, i64 32, !7, i64 40, !11, i64 80, !12, i64 88}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"int", !7, i64 0}
!10 = !{!"_Bool", !7, i64 0}
!11 = !{!"long", !7, i64 0}
!12 = !{!"any pointer", !7, i64 0}
!13 = !{!14, !12, i64 0}
!14 = !{!"MDBX_rkl_iter", !12, i64 0, !9, i64 8, !9, i64 12}
!15 = !{!14, !9, i64 8}
!16 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!17 = !{!18, !11, i64 8}
!18 = !{!"MDBX_rkl", !11, i64 0, !11, i64 8, !9, i64 16, !9, i64 20, !12, i64 24, !7, i64 32}
!19 = !{!18, !11, i64 0}
!20 = !{!18, !9, i64 16}
!21 = !{!14, !9, i64 12}
!22 = !{!18, !12, i64 24}
!23 = !{!11, !11, i64 0}
!24 = !{!"branch_weights", i32 4002001, i32 2000}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LowerExpectIntrinsicPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass