; 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 = type { i64, i64, i32, i32, ptr, [12 x i64] }

@globals = external global %struct.libmdbx_globals, align 8
@.str.1 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [43 x i8], align 1
@__func__.rkl_push = external hidden unnamed_addr constant [9 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [35 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: nounwind willreturn memory(read) uwtable
declare dso_local zeroext i1 @rkl_check(ptr noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden i32 @rkl_resize(ptr noundef, i64 noundef) #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden ptr @rkl_bsearch(ptr noundef, i64 noundef, i64 noundef) #5

; Function Attrs: nounwind uwtable
define dso_local i32 @rkl_push(ptr noundef %0, i64 noundef %1, i1 noundef zeroext %2) #4 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i8, align 1
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store i64 %1, ptr %6, align 8, !tbaa !9
  %23 = zext i1 %2 to i8
  store i8 %23, ptr %7, align 1, !tbaa !11
  br label %24

24:                                               ; preds = %3
  %25 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %26 = zext i8 %25 to i32
  %27 = and i32 %26, 1
  %28 = icmp ne i32 %27, 0
  %29 = xor i1 %28, true
  %30 = xor i1 %29, true
  %31 = zext i1 %30 to i32
  %32 = sext i32 %31 to i64
  %33 = call i64 @llvm.expect.i64(i64 %32, i64 1)
  %34 = icmp ne i64 %33, 0
  br i1 %34, label %35, label %54

35:                                               ; preds = %24
  br label %36

36:                                               ; preds = %35
  %37 = load i64, ptr %6, align 8, !tbaa !9
  %38 = icmp uge i64 %37, 1
  br i1 %38, label %39, label %42

39:                                               ; preds = %36
  %40 = load i64, ptr %6, align 8, !tbaa !9
  %41 = icmp ult i64 %40, -1
  br label %42

42:                                               ; preds = %39, %36
  %43 = phi i1 [ false, %36 ], [ %41, %39 ]
  %44 = xor i1 %43, true
  %45 = xor i1 %44, true
  %46 = xor i1 %45, true
  %47 = zext i1 %46 to i32
  %48 = sext i32 %47 to i64
  %49 = call i64 @llvm.expect.i64(i64 %48, i64 0)
  %50 = icmp ne i64 %49, 0
  br i1 %50, label %51, label %52

51:                                               ; preds = %42
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.5, ptr noundef @__func__.rkl_push, i32 noundef 222) #6
  unreachable

52:                                               ; preds = %42
  br label %53

53:                                               ; preds = %52
  br label %54

54:                                               ; preds = %53, %24
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55
  %57 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %58 = zext i8 %57 to i32
  %59 = and i32 %58, 1
  %60 = icmp ne i32 %59, 0
  %61 = xor i1 %60, true
  %62 = xor i1 %61, true
  %63 = zext i1 %62 to i32
  %64 = sext i32 %63 to i64
  %65 = call i64 @llvm.expect.i64(i64 %64, i64 1)
  %66 = icmp ne i64 %65, 0
  br i1 %66, label %67, label %81

67:                                               ; preds = %56
  br label %68

68:                                               ; preds = %67
  %69 = load ptr, ptr %5, align 8, !tbaa !5
  %70 = call zeroext i1 @rkl_check(ptr noundef %69) #7
  %71 = xor i1 %70, true
  %72 = xor i1 %71, true
  %73 = xor i1 %72, true
  %74 = zext i1 %73 to i32
  %75 = sext i32 %74 to i64
  %76 = call i64 @llvm.expect.i64(i64 %75, i64 0)
  %77 = icmp ne i64 %76, 0
  br i1 %77, label %78, label %79

78:                                               ; preds = %68
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.rkl_push, i32 noundef 223) #6
  unreachable

79:                                               ; preds = %68
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80, %56
  br label %82

82:                                               ; preds = %81
  %83 = load ptr, ptr %5, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.MDBX_rkl, ptr %83, i32 0, i32 0
  %85 = load i64, ptr %84, align 8, !tbaa !16
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.MDBX_rkl, ptr %86, i32 0, i32 1
  %88 = load i64, ptr %87, align 8, !tbaa !18
  %89 = icmp uge i64 %85, %88
  br i1 %89, label %90, label %97

90:                                               ; preds = %82
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = load i64, ptr %6, align 8, !tbaa !9
  %93 = load i64, ptr %6, align 8, !tbaa !9
  %94 = add i64 %93, 1
  %95 = load i64, ptr %6, align 8, !tbaa !9
  %96 = call i32 @extend_solid(ptr noundef %91, i64 noundef %92, i64 noundef %94, i64 noundef %95)
  store i32 %96, ptr %4, align 4
  br label %768

97:                                               ; preds = %82
  %98 = load i64, ptr %6, align 8, !tbaa !9
  %99 = load ptr, ptr %5, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.MDBX_rkl, ptr %99, i32 0, i32 0
  %101 = load i64, ptr %100, align 8, !tbaa !16
  %102 = icmp ult i64 %98, %101
  br i1 %102, label %103, label %122

103:                                              ; preds = %97
  %104 = load i8, ptr %7, align 1, !tbaa !11, !range !19, !noundef !20
  %105 = trunc i8 %104 to i1
  br i1 %105, label %113, label %106

106:                                              ; preds = %103
  %107 = load i64, ptr %6, align 8, !tbaa !9
  %108 = add i64 %107, 1
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.MDBX_rkl, ptr %109, i32 0, i32 0
  %111 = load i64, ptr %110, align 8, !tbaa !16
  %112 = icmp eq i64 %108, %111
  br i1 %112, label %113, label %121

113:                                              ; preds = %106, %103
  %114 = load ptr, ptr %5, align 8, !tbaa !5
  %115 = load i64, ptr %6, align 8, !tbaa !9
  %116 = load ptr, ptr %5, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.MDBX_rkl, ptr %116, i32 0, i32 1
  %118 = load i64, ptr %117, align 8, !tbaa !18
  %119 = load i64, ptr %6, align 8, !tbaa !9
  %120 = call i32 @extend_solid(ptr noundef %114, i64 noundef %115, i64 noundef %118, i64 noundef %119)
  store i32 %120, ptr %4, align 4
  br label %768

121:                                              ; preds = %106
  br label %149

122:                                              ; preds = %97
  %123 = load i64, ptr %6, align 8, !tbaa !9
  %124 = load ptr, ptr %5, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.MDBX_rkl, ptr %124, i32 0, i32 1
  %126 = load i64, ptr %125, align 8, !tbaa !18
  %127 = icmp uge i64 %123, %126
  br i1 %127, label %128, label %147

128:                                              ; preds = %122
  %129 = load i8, ptr %7, align 1, !tbaa !11, !range !19, !noundef !20
  %130 = trunc i8 %129 to i1
  br i1 %130, label %137, label %131

131:                                              ; preds = %128
  %132 = load i64, ptr %6, align 8, !tbaa !9
  %133 = load ptr, ptr %5, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.MDBX_rkl, ptr %133, i32 0, i32 1
  %135 = load i64, ptr %134, align 8, !tbaa !18
  %136 = icmp eq i64 %132, %135
  br i1 %136, label %137, label %146

137:                                              ; preds = %131, %128
  %138 = load ptr, ptr %5, align 8, !tbaa !5
  %139 = load ptr, ptr %5, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.MDBX_rkl, ptr %139, i32 0, i32 0
  %141 = load i64, ptr %140, align 8, !tbaa !16
  %142 = load i64, ptr %6, align 8, !tbaa !9
  %143 = add i64 %142, 1
  %144 = load i64, ptr %6, align 8, !tbaa !9
  %145 = call i32 @extend_solid(ptr noundef %138, i64 noundef %141, i64 noundef %143, i64 noundef %144)
  store i32 %145, ptr %4, align 4
  br label %768

146:                                              ; preds = %131
  br label %148

147:                                              ; preds = %122
  store i32 -1, ptr %4, align 4
  br label %768

148:                                              ; preds = %146
  br label %149

149:                                              ; preds = %148, %121
  br label %150

150:                                              ; preds = %149
  %151 = load ptr, ptr %5, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.MDBX_rkl, ptr %151, i32 0, i32 2
  %153 = load i32, ptr %152, align 8, !tbaa !21
  %154 = icmp eq i32 %153, 1
  br i1 %154, label %155, label %241

155:                                              ; preds = %150
  %156 = load ptr, ptr %5, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.MDBX_rkl, ptr %156, i32 0, i32 1
  %158 = load i64, ptr %157, align 8, !tbaa !18
  %159 = load ptr, ptr %5, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.MDBX_rkl, ptr %159, i32 0, i32 0
  %161 = load i64, ptr %160, align 8, !tbaa !16
  %162 = add i64 %161, 1
  %163 = icmp eq i64 %158, %162
  br i1 %163, label %164, label %241

164:                                              ; preds = %155
  %165 = load ptr, ptr %5, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.MDBX_rkl, ptr %165, i32 0, i32 4
  %167 = load ptr, ptr %166, align 8, !tbaa !22
  %168 = getelementptr inbounds i64, ptr %167, i64 0
  %169 = load i64, ptr %168, align 8, !tbaa !9
  %170 = load i64, ptr %6, align 8, !tbaa !9
  %171 = add i64 %170, 1
  %172 = icmp eq i64 %169, %171
  br i1 %172, label %182, label %173

173:                                              ; preds = %164
  %174 = load ptr, ptr %5, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.MDBX_rkl, ptr %174, i32 0, i32 4
  %176 = load ptr, ptr %175, align 8, !tbaa !22
  %177 = getelementptr inbounds i64, ptr %176, i64 0
  %178 = load i64, ptr %177, align 8, !tbaa !9
  %179 = load i64, ptr %6, align 8, !tbaa !9
  %180 = sub i64 %179, 1
  %181 = icmp eq i64 %178, %180
  br i1 %181, label %182, label %241

182:                                              ; preds = %173, %164
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #8
  %183 = load ptr, ptr %5, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.MDBX_rkl, ptr %183, i32 0, i32 4
  %185 = load ptr, ptr %184, align 8, !tbaa !22
  %186 = getelementptr inbounds i64, ptr %185, i64 0
  %187 = load i64, ptr %186, align 8, !tbaa !9
  %188 = load i64, ptr %6, align 8, !tbaa !9
  %189 = sub i64 %188, 1
  %190 = icmp eq i64 %187, %189
  br i1 %190, label %191, label %194

191:                                              ; preds = %182
  %192 = load i64, ptr %6, align 8, !tbaa !9
  %193 = sub i64 %192, 1
  br label %196

194:                                              ; preds = %182
  %195 = load i64, ptr %6, align 8, !tbaa !9
  br label %196

196:                                              ; preds = %194, %191
  %197 = phi i64 [ %193, %191 ], [ %195, %194 ]
  store i64 %197, ptr %8, align 8, !tbaa !9
  %198 = load ptr, ptr %5, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.MDBX_rkl, ptr %198, i32 0, i32 0
  %200 = load i64, ptr %199, align 8, !tbaa !16
  %201 = load ptr, ptr %5, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.MDBX_rkl, ptr %201, i32 0, i32 4
  %203 = load ptr, ptr %202, align 8, !tbaa !22
  %204 = getelementptr inbounds i64, ptr %203, i64 0
  store i64 %200, ptr %204, align 8, !tbaa !9
  %205 = load i64, ptr %8, align 8, !tbaa !9
  %206 = load ptr, ptr %5, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.MDBX_rkl, ptr %206, i32 0, i32 0
  store i64 %205, ptr %207, align 8, !tbaa !16
  %208 = load i64, ptr %8, align 8, !tbaa !9
  %209 = add i64 %208, 2
  %210 = load ptr, ptr %5, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.MDBX_rkl, ptr %210, i32 0, i32 1
  store i64 %209, ptr %211, align 8, !tbaa !18
  br label %212

212:                                              ; preds = %196
  %213 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %214 = zext i8 %213 to i32
  %215 = and i32 %214, 1
  %216 = icmp ne i32 %215, 0
  %217 = xor i1 %216, true
  %218 = xor i1 %217, true
  %219 = zext i1 %218 to i32
  %220 = sext i32 %219 to i64
  %221 = call i64 @llvm.expect.i64(i64 %220, i64 1)
  %222 = icmp ne i64 %221, 0
  br i1 %222, label %223, label %238

223:                                              ; preds = %212
  br label %224

224:                                              ; preds = %223
  %225 = load ptr, ptr %5, align 8, !tbaa !5
  %226 = call zeroext i1 @rkl_check(ptr noundef %225) #7
  %227 = xor i1 %226, true
  %228 = xor i1 %227, true
  %229 = xor i1 %228, true
  %230 = zext i1 %229 to i32
  %231 = sext i32 %230 to i64
  %232 = call i64 @llvm.expect.i64(i64 %231, i64 0)
  %233 = icmp ne i64 %232, 0
  br i1 %233, label %234, label %235

234:                                              ; preds = %224
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.rkl_push, i32 noundef 249) #6
  unreachable

235:                                              ; preds = %224
  br label %236

236:                                              ; preds = %235
  br label %237

237:                                              ; preds = %236
  br label %238

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

239:                                              ; preds = %238
  br label %240

240:                                              ; preds = %239
  store i32 0, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #8
  br label %768

241:                                              ; preds = %173, %155, %150
  %242 = load ptr, ptr %5, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.MDBX_rkl, ptr %242, i32 0, i32 2
  %244 = load i32, ptr %243, align 8, !tbaa !21
  %245 = load ptr, ptr %5, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.MDBX_rkl, ptr %245, i32 0, i32 3
  %247 = load i32, ptr %246, align 4, !tbaa !23
  %248 = icmp eq i32 %244, %247
  %249 = xor i1 %248, true
  %250 = xor i1 %249, true
  %251 = zext i1 %250 to i32
  %252 = sext i32 %251 to i64
  %253 = call i64 @llvm.expect.i64(i64 %252, i64 0)
  %254 = icmp ne i64 %253, 0
  br i1 %254, label %255, label %343

255:                                              ; preds = %241
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #8
  %256 = load ptr, ptr %5, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.MDBX_rkl, ptr %256, i32 0, i32 3
  %258 = load i32, ptr %257, align 4, !tbaa !23
  %259 = add i32 %258, 1
  %260 = shl i32 %259, 1
  %261 = zext i32 %260 to i64
  store i64 %261, ptr %9, align 8, !tbaa !9
  %262 = load i64, ptr %9, align 8, !tbaa !9
  %263 = icmp ugt i64 %262, 62
  br i1 %263, label %264, label %266

264:                                              ; preds = %255
  %265 = load i64, ptr %9, align 8, !tbaa !9
  br label %267

266:                                              ; preds = %255
  br label %267

267:                                              ; preds = %266, %264
  %268 = phi i64 [ %265, %264 ], [ 62, %266 ]
  store i64 %268, ptr %9, align 8, !tbaa !9
  %269 = load i64, ptr %9, align 8, !tbaa !9
  %270 = icmp ult i64 %269, 67108860
  br i1 %270, label %271, label %273

271:                                              ; preds = %267
  %272 = load i64, ptr %9, align 8, !tbaa !9
  br label %274

273:                                              ; preds = %267
  br label %274

274:                                              ; preds = %273, %271
  %275 = phi i64 [ %272, %271 ], [ 67108860, %273 ]
  store i64 %275, ptr %9, align 8, !tbaa !9
  %276 = load i64, ptr %9, align 8, !tbaa !9
  %277 = load ptr, ptr %5, align 8, !tbaa !5
  %278 = getelementptr inbounds %struct.MDBX_rkl, ptr %277, i32 0, i32 2
  %279 = load i32, ptr %278, align 8, !tbaa !21
  %280 = zext i32 %279 to i64
  %281 = icmp ugt i64 %276, %280
  br i1 %281, label %282, label %284

282:                                              ; preds = %274
  %283 = load i64, ptr %9, align 8, !tbaa !9
  br label %290

284:                                              ; preds = %274
  %285 = load ptr, ptr %5, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.MDBX_rkl, ptr %285, i32 0, i32 2
  %287 = load i32, ptr %286, align 8, !tbaa !21
  %288 = add i32 %287, 42
  %289 = zext i32 %288 to i64
  br label %290

290:                                              ; preds = %284, %282
  %291 = phi i64 [ %283, %282 ], [ %289, %284 ]
  store i64 %291, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #8
  %292 = load ptr, ptr %5, align 8, !tbaa !5
  %293 = load i64, ptr %9, align 8, !tbaa !9
  %294 = call i32 @rkl_resize(ptr noundef %292, i64 noundef %293)
  store i32 %294, ptr %10, align 4, !tbaa !24
  %295 = load i32, ptr %10, align 4, !tbaa !24
  %296 = icmp ne i32 %295, 0
  %297 = xor i1 %296, true
  %298 = xor i1 %297, true
  %299 = zext i1 %298 to i32
  %300 = sext i32 %299 to i64
  %301 = call i64 @llvm.expect.i64(i64 %300, i64 0)
  %302 = icmp ne i64 %301, 0
  br i1 %302, label %303, label %305

303:                                              ; preds = %290
  %304 = load i32, ptr %10, align 4, !tbaa !24
  store i32 %304, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %340

305:                                              ; preds = %290
  br label %306

306:                                              ; preds = %305
  %307 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %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 %337

317:                                              ; preds = %306
  br label %318

318:                                              ; preds = %317
  %319 = load ptr, ptr %5, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.MDBX_rkl, ptr %319, i32 0, i32 3
  %321 = load i32, ptr %320, align 4, !tbaa !23
  %322 = load ptr, ptr %5, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.MDBX_rkl, ptr %322, i32 0, i32 2
  %324 = load i32, ptr %323, align 8, !tbaa !21
  %325 = icmp ugt i32 %321, %324
  %326 = xor i1 %325, true
  %327 = xor i1 %326, true
  %328 = xor i1 %327, true
  %329 = zext i1 %328 to i32
  %330 = sext i32 %329 to i64
  %331 = call i64 @llvm.expect.i64(i64 %330, i64 0)
  %332 = icmp ne i64 %331, 0
  br i1 %332, label %333, label %334

333:                                              ; preds = %318
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.6, ptr noundef @__func__.rkl_push, i32 noundef 262) #6
  unreachable

334:                                              ; preds = %318
  br label %335

335:                                              ; preds = %334
  br label %336

336:                                              ; preds = %335
  br label %337

337:                                              ; preds = %336, %306
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338
  store i32 0, ptr %11, align 4
  br label %340

340:                                              ; preds = %339, %303
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #8
  %341 = load i32, ptr %11, align 4
  switch i32 %341, label %770 [
    i32 0, label %342
    i32 1, label %768
  ]

342:                                              ; preds = %340
  br label %343

343:                                              ; preds = %342, %241
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #8
  %344 = load ptr, ptr %5, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.MDBX_rkl, ptr %344, i32 0, i32 2
  %346 = load i32, ptr %345, align 8, !tbaa !21
  %347 = zext i32 %346 to i64
  store i64 %347, ptr %12, align 8, !tbaa !9
  br label %348

348:                                              ; preds = %361, %343
  %349 = load i64, ptr %12, align 8, !tbaa !9
  %350 = icmp ugt i64 %349, 0
  br i1 %350, label %351, label %416

351:                                              ; preds = %348
  %352 = load i64, ptr %6, align 8, !tbaa !9
  %353 = load ptr, ptr %5, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.MDBX_rkl, ptr %353, i32 0, i32 4
  %355 = load ptr, ptr %354, align 8, !tbaa !22
  %356 = load i64, ptr %12, align 8, !tbaa !9
  %357 = sub i64 %356, 1
  %358 = getelementptr inbounds i64, ptr %355, i64 %357
  %359 = load i64, ptr %358, align 8, !tbaa !9
  %360 = icmp ult i64 %352, %359
  br i1 %360, label %361, label %376

361:                                              ; preds = %351
  %362 = load ptr, ptr %5, align 8, !tbaa !5
  %363 = getelementptr inbounds %struct.MDBX_rkl, ptr %362, i32 0, i32 4
  %364 = load ptr, ptr %363, align 8, !tbaa !22
  %365 = load i64, ptr %12, align 8, !tbaa !9
  %366 = sub i64 %365, 1
  %367 = getelementptr inbounds i64, ptr %364, i64 %366
  %368 = load i64, ptr %367, align 8, !tbaa !9
  %369 = load ptr, ptr %5, align 8, !tbaa !5
  %370 = getelementptr inbounds %struct.MDBX_rkl, ptr %369, i32 0, i32 4
  %371 = load ptr, ptr %370, align 8, !tbaa !22
  %372 = load i64, ptr %12, align 8, !tbaa !9
  %373 = getelementptr inbounds i64, ptr %371, i64 %372
  store i64 %368, ptr %373, align 8, !tbaa !9
  %374 = load i64, ptr %12, align 8, !tbaa !9
  %375 = sub i64 %374, 1
  store i64 %375, ptr %12, align 8, !tbaa !9
  br label %348, !llvm.loop !25

376:                                              ; preds = %351
  %377 = load i64, ptr %6, align 8, !tbaa !9
  %378 = load ptr, ptr %5, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.MDBX_rkl, ptr %378, i32 0, i32 4
  %380 = load ptr, ptr %379, align 8, !tbaa !22
  %381 = load i64, ptr %12, align 8, !tbaa !9
  %382 = sub i64 %381, 1
  %383 = getelementptr inbounds i64, ptr %380, i64 %382
  %384 = load i64, ptr %383, align 8, !tbaa !9
  %385 = icmp eq i64 %377, %384
  %386 = xor i1 %385, true
  %387 = xor i1 %386, true
  %388 = zext i1 %387 to i32
  %389 = sext i32 %388 to i64
  %390 = call i64 @llvm.expect.i64(i64 %389, i64 0)
  %391 = icmp ne i64 %390, 0
  br i1 %391, label %392, label %415

392:                                              ; preds = %376
  br label %393

393:                                              ; preds = %401, %392
  %394 = load i64, ptr %12, align 8, !tbaa !9
  %395 = add i64 %394, 1
  store i64 %395, ptr %12, align 8, !tbaa !9
  %396 = load ptr, ptr %5, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.MDBX_rkl, ptr %396, i32 0, i32 2
  %398 = load i32, ptr %397, align 8, !tbaa !21
  %399 = zext i32 %398 to i64
  %400 = icmp ult i64 %395, %399
  br i1 %400, label %401, label %414

401:                                              ; preds = %393
  %402 = load ptr, ptr %5, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.MDBX_rkl, ptr %402, i32 0, i32 4
  %404 = load ptr, ptr %403, align 8, !tbaa !22
  %405 = load i64, ptr %12, align 8, !tbaa !9
  %406 = getelementptr inbounds i64, ptr %404, i64 %405
  %407 = load i64, ptr %406, align 8, !tbaa !9
  %408 = load ptr, ptr %5, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.MDBX_rkl, ptr %408, i32 0, i32 4
  %410 = load ptr, ptr %409, align 8, !tbaa !22
  %411 = load i64, ptr %12, align 8, !tbaa !9
  %412 = sub i64 %411, 1
  %413 = getelementptr inbounds i64, ptr %410, i64 %412
  store i64 %407, ptr %413, align 8, !tbaa !9
  br label %393, !llvm.loop !27

414:                                              ; preds = %393
  store i32 -1, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %767

415:                                              ; preds = %376
  br label %416

416:                                              ; preds = %415, %348
  %417 = load i64, ptr %6, align 8, !tbaa !9
  %418 = load ptr, ptr %5, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.MDBX_rkl, ptr %418, i32 0, i32 4
  %420 = load ptr, ptr %419, align 8, !tbaa !22
  %421 = load i64, ptr %12, align 8, !tbaa !9
  %422 = getelementptr inbounds i64, ptr %420, i64 %421
  store i64 %417, ptr %422, align 8, !tbaa !9
  %423 = load ptr, ptr %5, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.MDBX_rkl, ptr %423, i32 0, i32 2
  %425 = load i32, ptr %424, align 8, !tbaa !21
  %426 = add i32 %425, 1
  store i32 %426, ptr %424, align 8, !tbaa !21
  br label %427

427:                                              ; preds = %416
  %428 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %429 = zext i8 %428 to i32
  %430 = and i32 %429, 1
  %431 = icmp ne i32 %430, 0
  %432 = xor i1 %431, true
  %433 = xor i1 %432, true
  %434 = zext i1 %433 to i32
  %435 = sext i32 %434 to i64
  %436 = call i64 @llvm.expect.i64(i64 %435, i64 1)
  %437 = icmp ne i64 %436, 0
  br i1 %437, label %438, label %453

438:                                              ; preds = %427
  br label %439

439:                                              ; preds = %438
  %440 = load ptr, ptr %5, align 8, !tbaa !5
  %441 = call zeroext i1 @rkl_check(ptr noundef %440) #7
  %442 = xor i1 %441, true
  %443 = xor i1 %442, true
  %444 = xor i1 %443, true
  %445 = zext i1 %444 to i32
  %446 = sext i32 %445 to i64
  %447 = call i64 @llvm.expect.i64(i64 %446, i64 0)
  %448 = icmp ne i64 %447, 0
  br i1 %448, label %449, label %450

449:                                              ; preds = %439
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.rkl_push, i32 noundef 283) #6
  unreachable

450:                                              ; preds = %439
  br label %451

451:                                              ; preds = %450
  br label %452

452:                                              ; preds = %451
  br label %453

453:                                              ; preds = %452, %427
  br label %454

454:                                              ; preds = %453
  br label %455

455:                                              ; preds = %454
  %456 = load ptr, ptr %5, align 8, !tbaa !5
  %457 = getelementptr inbounds %struct.MDBX_rkl, ptr %456, i32 0, i32 2
  %458 = load i32, ptr %457, align 8, !tbaa !21
  %459 = icmp ugt i32 %458, 2
  br i1 %459, label %460, label %766

460:                                              ; preds = %455
  %461 = load i64, ptr %12, align 8, !tbaa !9
  %462 = icmp ugt i64 %461, 0
  br i1 %462, label %463, label %474

463:                                              ; preds = %460
  %464 = load ptr, ptr %5, align 8, !tbaa !5
  %465 = getelementptr inbounds %struct.MDBX_rkl, ptr %464, i32 0, i32 4
  %466 = load ptr, ptr %465, align 8, !tbaa !22
  %467 = load i64, ptr %12, align 8, !tbaa !9
  %468 = sub i64 %467, 1
  %469 = getelementptr inbounds i64, ptr %466, i64 %468
  %470 = load i64, ptr %469, align 8, !tbaa !9
  %471 = load i64, ptr %6, align 8, !tbaa !9
  %472 = sub i64 %471, 1
  %473 = icmp eq i64 %470, %472
  br i1 %473, label %493, label %474

474:                                              ; preds = %463, %460
  %475 = load i64, ptr %12, align 8, !tbaa !9
  %476 = add i64 %475, 1
  %477 = load ptr, ptr %5, align 8, !tbaa !5
  %478 = getelementptr inbounds %struct.MDBX_rkl, ptr %477, i32 0, i32 2
  %479 = load i32, ptr %478, align 8, !tbaa !21
  %480 = zext i32 %479 to i64
  %481 = icmp ult i64 %476, %480
  br i1 %481, label %482, label %766

482:                                              ; preds = %474
  %483 = load ptr, ptr %5, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.MDBX_rkl, ptr %483, i32 0, i32 4
  %485 = load ptr, ptr %484, align 8, !tbaa !22
  %486 = load i64, ptr %12, align 8, !tbaa !9
  %487 = add i64 %486, 1
  %488 = getelementptr inbounds i64, ptr %485, i64 %487
  %489 = load i64, ptr %488, align 8, !tbaa !9
  %490 = load i64, ptr %6, align 8, !tbaa !9
  %491 = add i64 %490, 1
  %492 = icmp eq i64 %489, %491
  br i1 %492, label %493, label %766

493:                                              ; preds = %482, %463
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #8
  %494 = load i64, ptr %6, align 8, !tbaa !9
  store i64 %494, ptr %13, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #8
  %495 = load i64, ptr %12, align 8, !tbaa !9
  store i64 %495, ptr %14, align 8, !tbaa !9
  br label %496

496:                                              ; preds = %512, %493
  %497 = load i64, ptr %14, align 8, !tbaa !9
  %498 = icmp ugt i64 %497, 0
  br i1 %498, label %499, label %510

499:                                              ; preds = %496
  %500 = load ptr, ptr %5, align 8, !tbaa !5
  %501 = getelementptr inbounds %struct.MDBX_rkl, ptr %500, i32 0, i32 4
  %502 = load ptr, ptr %501, align 8, !tbaa !22
  %503 = load i64, ptr %14, align 8, !tbaa !9
  %504 = sub i64 %503, 1
  %505 = getelementptr inbounds i64, ptr %502, i64 %504
  %506 = load i64, ptr %505, align 8, !tbaa !9
  %507 = load i64, ptr %13, align 8, !tbaa !9
  %508 = sub i64 %507, 1
  %509 = icmp eq i64 %506, %508
  br label %510

510:                                              ; preds = %499, %496
  %511 = phi i1 [ false, %496 ], [ %509, %499 ]
  br i1 %511, label %512, label %517

512:                                              ; preds = %510
  %513 = load i64, ptr %14, align 8, !tbaa !9
  %514 = sub i64 %513, 1
  store i64 %514, ptr %14, align 8, !tbaa !9
  %515 = load i64, ptr %13, align 8, !tbaa !9
  %516 = sub i64 %515, 1
  store i64 %516, ptr %13, align 8, !tbaa !9
  br label %496, !llvm.loop !28

517:                                              ; preds = %510
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #8
  %518 = load i64, ptr %6, align 8, !tbaa !9
  %519 = add i64 %518, 1
  store i64 %519, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  %520 = load i64, ptr %12, align 8, !tbaa !9
  %521 = add i64 %520, 1
  store i64 %521, ptr %16, align 8, !tbaa !9
  br label %522

522:                                              ; preds = %540, %517
  %523 = load i64, ptr %16, align 8, !tbaa !9
  %524 = load ptr, ptr %5, align 8, !tbaa !5
  %525 = getelementptr inbounds %struct.MDBX_rkl, ptr %524, i32 0, i32 2
  %526 = load i32, ptr %525, align 8, !tbaa !21
  %527 = zext i32 %526 to i64
  %528 = icmp ult i64 %523, %527
  br i1 %528, label %529, label %538

529:                                              ; preds = %522
  %530 = load ptr, ptr %5, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.MDBX_rkl, ptr %530, i32 0, i32 4
  %532 = load ptr, ptr %531, align 8, !tbaa !22
  %533 = load i64, ptr %16, align 8, !tbaa !9
  %534 = getelementptr inbounds i64, ptr %532, i64 %533
  %535 = load i64, ptr %534, align 8, !tbaa !9
  %536 = load i64, ptr %15, align 8, !tbaa !9
  %537 = icmp eq i64 %535, %536
  br label %538

538:                                              ; preds = %529, %522
  %539 = phi i1 [ false, %522 ], [ %537, %529 ]
  br i1 %539, label %540, label %545

540:                                              ; preds = %538
  %541 = load i64, ptr %16, align 8, !tbaa !9
  %542 = add i64 %541, 1
  store i64 %542, ptr %16, align 8, !tbaa !9
  %543 = load i64, ptr %15, align 8, !tbaa !9
  %544 = add i64 %543, 1
  store i64 %544, ptr %15, align 8, !tbaa !9
  br label %522, !llvm.loop !29

545:                                              ; preds = %538
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  %546 = load i64, ptr %16, align 8, !tbaa !9
  %547 = load i64, ptr %14, align 8, !tbaa !9
  %548 = sub i64 %546, %547
  store i64 %548, ptr %17, align 8, !tbaa !9
  %549 = load i64, ptr %17, align 8, !tbaa !9
  %550 = icmp ugt i64 %549, 3
  br i1 %550, label %551, label %765

551:                                              ; preds = %545
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #8
  %552 = load ptr, ptr %5, align 8, !tbaa !5
  %553 = getelementptr inbounds %struct.MDBX_rkl, ptr %552, i32 0, i32 1
  %554 = load i64, ptr %553, align 8, !tbaa !18
  %555 = load ptr, ptr %5, align 8, !tbaa !5
  %556 = getelementptr inbounds %struct.MDBX_rkl, ptr %555, i32 0, i32 0
  %557 = load i64, ptr %556, align 8, !tbaa !16
  %558 = sub i64 %554, %557
  store i64 %558, ptr %18, align 8, !tbaa !9
  %559 = load i64, ptr %17, align 8, !tbaa !9
  %560 = load i64, ptr %18, align 8, !tbaa !9
  %561 = icmp ugt i64 %559, %560
  br i1 %561, label %562, label %764

562:                                              ; preds = %551
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  %563 = load ptr, ptr %5, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.MDBX_rkl, ptr %563, i32 0, i32 4
  %565 = load ptr, ptr %564, align 8, !tbaa !22
  %566 = load ptr, ptr %5, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct.MDBX_rkl, ptr %566, i32 0, i32 2
  %568 = load i32, ptr %567, align 8, !tbaa !21
  %569 = zext i32 %568 to i64
  %570 = load ptr, ptr %5, align 8, !tbaa !5
  %571 = getelementptr inbounds %struct.MDBX_rkl, ptr %570, i32 0, i32 0
  %572 = load i64, ptr %571, align 8, !tbaa !16
  %573 = call ptr @rkl_bsearch(ptr noundef %565, i64 noundef %569, i64 noundef %572)
  %574 = load ptr, ptr %5, align 8, !tbaa !5
  %575 = getelementptr inbounds %struct.MDBX_rkl, ptr %574, i32 0, i32 4
  %576 = load ptr, ptr %575, align 8, !tbaa !22
  %577 = ptrtoint ptr %573 to i64
  %578 = ptrtoint ptr %576 to i64
  %579 = sub i64 %577, %578
  %580 = sdiv exact i64 %579, 8
  store i64 %580, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  %581 = load ptr, ptr %5, align 8, !tbaa !5
  %582 = getelementptr inbounds %struct.MDBX_rkl, ptr %581, i32 0, i32 2
  %583 = load i32, ptr %582, align 8, !tbaa !21
  %584 = zext i32 %583 to i64
  %585 = load i64, ptr %16, align 8, !tbaa !9
  %586 = sub i64 %584, %585
  %587 = load i64, ptr %14, align 8, !tbaa !9
  %588 = load i64, ptr %19, align 8, !tbaa !9
  %589 = icmp ugt i64 %587, %588
  br i1 %589, label %590, label %594

590:                                              ; preds = %562
  %591 = load i64, ptr %14, align 8, !tbaa !9
  %592 = load i64, ptr %19, align 8, !tbaa !9
  %593 = sub i64 %591, %592
  br label %595

594:                                              ; preds = %562
  br label %595

595:                                              ; preds = %594, %590
  %596 = phi i64 [ %593, %590 ], [ 0, %594 ]
  %597 = add i64 %586, %596
  %598 = load i64, ptr %18, align 8, !tbaa !9
  %599 = add i64 %597, %598
  store i64 %599, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  %600 = load ptr, ptr %5, align 8, !tbaa !5
  %601 = getelementptr inbounds %struct.MDBX_rkl, ptr %600, i32 0, i32 2
  %602 = load i32, ptr %601, align 8, !tbaa !21
  %603 = zext i32 %602 to i64
  %604 = load i64, ptr %12, align 8, !tbaa !9
  %605 = sub i64 %603, %604
  store i64 %605, ptr %21, align 8, !tbaa !9
  %606 = load i64, ptr %20, align 8, !tbaa !9
  %607 = load i64, ptr %21, align 8, !tbaa !9
  %608 = icmp ult i64 %606, %607
  %609 = xor i1 %608, true
  %610 = xor i1 %609, true
  %611 = zext i1 %610 to i32
  %612 = sext i32 %611 to i64
  %613 = call i64 @llvm.expect.i64(i64 %612, i64 0)
  %614 = icmp ne i64 %613, 0
  br i1 %614, label %616, label %615

615:                                              ; preds = %595
  br i1 true, label %616, label %763

616:                                              ; preds = %615, %595
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  store i64 0, ptr %22, align 8, !tbaa !9
  %617 = load i64, ptr %14, align 8, !tbaa !9
  %618 = load i64, ptr %19, align 8, !tbaa !9
  %619 = icmp ugt i64 %617, %618
  br i1 %619, label %620, label %645

620:                                              ; preds = %616
  %621 = load i64, ptr %14, align 8, !tbaa !9
  %622 = load i64, ptr %19, align 8, !tbaa !9
  %623 = sub i64 %621, %622
  store i64 %623, ptr %22, align 8, !tbaa !9
  br label %624

624:                                              ; preds = %640, %620
  %625 = load i64, ptr %14, align 8, !tbaa !9
  %626 = sub i64 %625, 1
  store i64 %626, ptr %14, align 8, !tbaa !9
  %627 = load ptr, ptr %5, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.MDBX_rkl, ptr %627, i32 0, i32 4
  %629 = load ptr, ptr %628, align 8, !tbaa !22
  %630 = load i64, ptr %14, align 8, !tbaa !9
  %631 = getelementptr inbounds i64, ptr %629, i64 %630
  %632 = load i64, ptr %631, align 8, !tbaa !9
  %633 = load ptr, ptr %5, align 8, !tbaa !5
  %634 = getelementptr inbounds %struct.MDBX_rkl, ptr %633, i32 0, i32 4
  %635 = load ptr, ptr %634, align 8, !tbaa !22
  %636 = load i64, ptr %14, align 8, !tbaa !9
  %637 = load i64, ptr %18, align 8, !tbaa !9
  %638 = add i64 %636, %637
  %639 = getelementptr inbounds i64, ptr %635, i64 %638
  store i64 %632, ptr %639, align 8, !tbaa !9
  br label %640

640:                                              ; preds = %624
  %641 = load i64, ptr %14, align 8, !tbaa !9
  %642 = load i64, ptr %19, align 8, !tbaa !9
  %643 = icmp ugt i64 %641, %642
  br i1 %643, label %624, label %644, !llvm.loop !30

644:                                              ; preds = %640
  br label %674

645:                                              ; preds = %616
  %646 = load i64, ptr %14, align 8, !tbaa !9
  %647 = load i64, ptr %17, align 8, !tbaa !9
  %648 = add i64 %646, %647
  %649 = load i64, ptr %19, align 8, !tbaa !9
  %650 = icmp ult i64 %648, %649
  br i1 %650, label %651, label %673

651:                                              ; preds = %645
  br label %652

652:                                              ; preds = %666, %651
  %653 = load ptr, ptr %5, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.MDBX_rkl, ptr %653, i32 0, i32 4
  %655 = load ptr, ptr %654, align 8, !tbaa !22
  %656 = load i64, ptr %16, align 8, !tbaa !9
  %657 = add i64 %656, 1
  store i64 %657, ptr %16, align 8, !tbaa !9
  %658 = getelementptr inbounds i64, ptr %655, i64 %656
  %659 = load i64, ptr %658, align 8, !tbaa !9
  %660 = load ptr, ptr %5, align 8, !tbaa !5
  %661 = getelementptr inbounds %struct.MDBX_rkl, ptr %660, i32 0, i32 4
  %662 = load ptr, ptr %661, align 8, !tbaa !22
  %663 = load i64, ptr %14, align 8, !tbaa !9
  %664 = add i64 %663, 1
  store i64 %664, ptr %14, align 8, !tbaa !9
  %665 = getelementptr inbounds i64, ptr %662, i64 %663
  store i64 %659, ptr %665, align 8, !tbaa !9
  br label %666

666:                                              ; preds = %652
  %667 = load i64, ptr %14, align 8, !tbaa !9
  %668 = load i64, ptr %19, align 8, !tbaa !9
  %669 = load i64, ptr %17, align 8, !tbaa !9
  %670 = sub i64 %668, %669
  %671 = icmp ult i64 %667, %670
  br i1 %671, label %652, label %672, !llvm.loop !31

672:                                              ; preds = %666
  br label %673

673:                                              ; preds = %672, %645
  br label %674

674:                                              ; preds = %673, %644
  store i64 0, ptr %12, align 8, !tbaa !9
  br label %675

675:                                              ; preds = %688, %674
  %676 = load ptr, ptr %5, align 8, !tbaa !5
  %677 = getelementptr inbounds %struct.MDBX_rkl, ptr %676, i32 0, i32 0
  %678 = load i64, ptr %677, align 8, !tbaa !16
  %679 = load i64, ptr %12, align 8, !tbaa !9
  %680 = add i64 %679, 1
  store i64 %680, ptr %12, align 8, !tbaa !9
  %681 = add i64 %678, %679
  %682 = load ptr, ptr %5, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.MDBX_rkl, ptr %682, i32 0, i32 4
  %684 = load ptr, ptr %683, align 8, !tbaa !22
  %685 = load i64, ptr %14, align 8, !tbaa !9
  %686 = add i64 %685, 1
  store i64 %686, ptr %14, align 8, !tbaa !9
  %687 = getelementptr inbounds i64, ptr %684, i64 %685
  store i64 %681, ptr %687, align 8, !tbaa !9
  br label %688

688:                                              ; preds = %675
  %689 = load i64, ptr %12, align 8, !tbaa !9
  %690 = load i64, ptr %18, align 8, !tbaa !9
  %691 = icmp ne i64 %689, %690
  br i1 %691, label %675, label %692, !llvm.loop !32

692:                                              ; preds = %688
  br label %693

693:                                              ; preds = %700, %692
  %694 = load i64, ptr %16, align 8, !tbaa !9
  %695 = load ptr, ptr %5, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.MDBX_rkl, ptr %695, i32 0, i32 2
  %697 = load i32, ptr %696, align 8, !tbaa !21
  %698 = zext i32 %697 to i64
  %699 = icmp ult i64 %694, %698
  br i1 %699, label %700, label %716

700:                                              ; preds = %693
  %701 = load ptr, ptr %5, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.MDBX_rkl, ptr %701, i32 0, i32 4
  %703 = load ptr, ptr %702, align 8, !tbaa !22
  %704 = load i64, ptr %16, align 8, !tbaa !9
  %705 = add i64 %704, 1
  store i64 %705, ptr %16, align 8, !tbaa !9
  %706 = getelementptr inbounds i64, ptr %703, i64 %704
  %707 = load i64, ptr %706, align 8, !tbaa !9
  %708 = load ptr, ptr %5, align 8, !tbaa !5
  %709 = getelementptr inbounds %struct.MDBX_rkl, ptr %708, i32 0, i32 4
  %710 = load ptr, ptr %709, align 8, !tbaa !22
  %711 = load i64, ptr %22, align 8, !tbaa !9
  %712 = load i64, ptr %14, align 8, !tbaa !9
  %713 = add i64 %712, 1
  store i64 %713, ptr %14, align 8, !tbaa !9
  %714 = add i64 %711, %712
  %715 = getelementptr inbounds i64, ptr %710, i64 %714
  store i64 %707, ptr %715, align 8, !tbaa !9
  br label %693, !llvm.loop !33

716:                                              ; preds = %693
  %717 = load ptr, ptr %5, align 8, !tbaa !5
  %718 = getelementptr inbounds %struct.MDBX_rkl, ptr %717, i32 0, i32 2
  %719 = load i32, ptr %718, align 8, !tbaa !21
  %720 = zext i32 %719 to i64
  %721 = load i64, ptr %17, align 8, !tbaa !9
  %722 = sub i64 %720, %721
  %723 = load i64, ptr %18, align 8, !tbaa !9
  %724 = add i64 %722, %723
  %725 = trunc i64 %724 to i32
  %726 = load ptr, ptr %5, align 8, !tbaa !5
  %727 = getelementptr inbounds %struct.MDBX_rkl, ptr %726, i32 0, i32 2
  store i32 %725, ptr %727, align 8, !tbaa !21
  %728 = load i64, ptr %13, align 8, !tbaa !9
  %729 = load ptr, ptr %5, align 8, !tbaa !5
  %730 = getelementptr inbounds %struct.MDBX_rkl, ptr %729, i32 0, i32 0
  store i64 %728, ptr %730, align 8, !tbaa !16
  %731 = load i64, ptr %15, align 8, !tbaa !9
  %732 = load ptr, ptr %5, align 8, !tbaa !5
  %733 = getelementptr inbounds %struct.MDBX_rkl, ptr %732, i32 0, i32 1
  store i64 %731, ptr %733, align 8, !tbaa !18
  br label %734

734:                                              ; preds = %716
  %735 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !13
  %736 = zext i8 %735 to i32
  %737 = and i32 %736, 1
  %738 = icmp ne i32 %737, 0
  %739 = xor i1 %738, true
  %740 = xor i1 %739, true
  %741 = zext i1 %740 to i32
  %742 = sext i32 %741 to i64
  %743 = call i64 @llvm.expect.i64(i64 %742, i64 1)
  %744 = icmp ne i64 %743, 0
  br i1 %744, label %745, label %760

745:                                              ; preds = %734
  br label %746

746:                                              ; preds = %745
  %747 = load ptr, ptr %5, align 8, !tbaa !5
  %748 = call zeroext i1 @rkl_check(ptr noundef %747) #7
  %749 = xor i1 %748, true
  %750 = xor i1 %749, true
  %751 = xor i1 %750, true
  %752 = zext i1 %751 to i32
  %753 = sext i32 %752 to i64
  %754 = call i64 @llvm.expect.i64(i64 %753, i64 0)
  %755 = icmp ne i64 %754, 0
  br i1 %755, label %756, label %757

756:                                              ; preds = %746
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.rkl_push, i32 noundef 356) #6
  unreachable

757:                                              ; preds = %746
  br label %758

758:                                              ; preds = %757
  br label %759

759:                                              ; preds = %758
  br label %760

760:                                              ; preds = %759, %734
  br label %761

761:                                              ; preds = %760
  br label %762

762:                                              ; preds = %761
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  br label %763

763:                                              ; preds = %762, %615
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  br label %764

764:                                              ; preds = %763, %551
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  br label %765

765:                                              ; preds = %764, %545
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #8
  br label %766

766:                                              ; preds = %765, %482, %474, %455
  store i32 0, ptr %4, align 4
  store i32 1, ptr %11, align 4
  br label %767

767:                                              ; preds = %766, %414
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #8
  br label %768

768:                                              ; preds = %767, %340, %240, %147, %137, %113, %90
  %769 = load i32, ptr %4, align 4
  ret i32 %769

770:                                              ; preds = %340
  unreachable
}

; Function Attrs: nounwind uwtable
declare hidden i32 @extend_solid(ptr noundef, i64 noundef, i64 noundef, i64 noundef) #4

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #2 = { 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 = { alwaysinline 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 = { noreturn }
attributes #7 = { nounwind willreturn memory(read) }
attributes #8 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!14, !7, i64 25}
!14 = !{!"libmdbx_globals", !7, i64 0, !15, i64 16, !15, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !15, i64 28, !7, i64 32, !7, i64 40, !10, i64 80, !6, i64 88}
!15 = !{!"int", !7, i64 0}
!16 = !{!17, !10, i64 0}
!17 = !{!"MDBX_rkl", !10, i64 0, !10, i64 8, !15, i64 16, !15, i64 20, !6, i64 24, !7, i64 32}
!18 = !{!17, !10, i64 8}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!17, !15, i64 16}
!22 = !{!17, !6, i64 24}
!23 = !{!17, !15, i64 20}
!24 = !{!15, !15, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = distinct !{!27, !26}
!28 = distinct !{!28, !26}
!29 = distinct !{!29, !26}
!30 = distinct !{!30, !26}
!31 = distinct !{!31, !26}
!32 = distinct !{!32, !26}
!33 = distinct !{!33, !26}


; 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
@.str.1 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [43 x i8], align 1
@__func__.rkl_push = external hidden unnamed_addr constant [9 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [35 x i8], align 1

; Function Attrs: mustprogress nofree nounwind willreturn memory(read) uwtable
declare dso_local zeroext i1 @rkl_check(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
declare hidden i32 @rkl_resize(ptr noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden ptr @rkl_bsearch(ptr noundef, i64 noundef, i64 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local i32 @rkl_push(ptr noundef %0, i64 noundef %1, i1 noundef zeroext %2) local_unnamed_addr #2 {
  %4 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %5 = and i8 %4, 1
  %.not = icmp ne i8 %5, 0
  %6 = add i64 %1, 1
  %7 = icmp ult i64 %6, 2
  %or.cond = and i1 %7, %.not
  br i1 %or.cond, label %8, label %9, !prof !13

8:                                                ; preds = %3
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.rkl_push, i32 noundef 222) #5
  unreachable

9:                                                ; preds = %3
  %.not217 = icmp eq i8 %5, 0
  br i1 %.not217, label %13, label %10, !prof !14

10:                                               ; preds = %9
  %11 = tail call zeroext i1 @rkl_check(ptr noundef %0) #6
  br i1 %11, label %13, label %12, !prof !15

12:                                               ; preds = %10
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.rkl_push, i32 noundef 223) #5
  unreachable

13:                                               ; preds = %9, %10
  %14 = load i64, ptr %0, align 8, !tbaa !16
  %15 = getelementptr inbounds i8, ptr %0, i64 8
  %16 = load i64, ptr %15, align 8, !tbaa !18
  %.not218 = icmp ult i64 %14, %16
  br i1 %.not218, label %19, label %17

17:                                               ; preds = %13
  %18 = tail call i32 @extend_solid(ptr noundef nonnull %0, i64 noundef %1, i64 noundef %6, i64 noundef %1)
  br label %.loopexit242

19:                                               ; preds = %13
  %20 = icmp ugt i64 %14, %1
  br i1 %20, label %21, label %25

21:                                               ; preds = %19
  %22 = icmp eq i64 %6, %14
  %or.cond231 = or i1 %22, %2
  br i1 %or.cond231, label %23, label %30

23:                                               ; preds = %21
  %24 = tail call i32 @extend_solid(ptr noundef nonnull %0, i64 noundef %1, i64 noundef %16, i64 noundef %1)
  br label %.loopexit242

25:                                               ; preds = %19
  %.not219 = icmp ugt i64 %16, %1
  br i1 %.not219, label %.loopexit242, label %26

26:                                               ; preds = %25
  %27 = icmp eq i64 %16, %1
  %or.cond232 = or i1 %27, %2
  br i1 %or.cond232, label %28, label %30

28:                                               ; preds = %26
  %29 = tail call i32 @extend_solid(ptr noundef nonnull %0, i64 noundef %14, i64 noundef %6, i64 noundef %1)
  br label %.loopexit242

30:                                               ; preds = %26, %21
  %31 = getelementptr inbounds i8, ptr %0, i64 16
  %32 = load i32, ptr %31, align 8, !tbaa !19
  %33 = icmp eq i32 %32, 1
  %34 = add nuw i64 %14, 1
  %35 = icmp eq i64 %16, %34
  %or.cond237 = select i1 %33, i1 %35, i1 false
  br i1 %or.cond237, label %36, label %49

36:                                               ; preds = %30
  %37 = getelementptr inbounds i8, ptr %0, i64 24
  %38 = load ptr, ptr %37, align 8, !tbaa !20
  %39 = load i64, ptr %38, align 8, !tbaa !21
  %40 = icmp eq i64 %39, %6
  %41 = add i64 %1, -1
  %42 = icmp eq i64 %39, %41
  %or.cond234 = or i1 %40, %42
  br i1 %or.cond234, label %43, label %49

43:                                               ; preds = %36
  %44 = select i1 %42, i64 %41, i64 %1
  store i64 %14, ptr %38, align 8, !tbaa !21
  store i64 %44, ptr %0, align 8, !tbaa !16
  %45 = add i64 %44, 2
  store i64 %45, ptr %15, align 8, !tbaa !18
  br i1 %.not217, label %.loopexit242, label %46, !prof !14

46:                                               ; preds = %43
  %47 = tail call zeroext i1 @rkl_check(ptr noundef nonnull %0) #6
  br i1 %47, label %.loopexit242, label %48, !prof !15

48:                                               ; preds = %46
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.rkl_push, i32 noundef 249) #5
  unreachable

49:                                               ; preds = %36, %30
  %50 = getelementptr inbounds i8, ptr %0, i64 20
  %51 = load i32, ptr %50, align 4, !tbaa !22
  %52 = icmp eq i32 %32, %51
  br i1 %52, label %53, label %.thread, !prof !14

53:                                               ; preds = %49
  %54 = shl i32 %32, 1
  %55 = add i32 %54, 2
  %56 = tail call i32 @llvm.umax.i32(i32 %55, i32 62)
  %57 = tail call i32 @llvm.umin.i32(i32 %56, i32 67108860)
  %58 = icmp ugt i32 %57, %32
  %59 = add i32 %32, 42
  %.in = select i1 %58, i32 %57, i32 %59
  %60 = zext i32 %.in to i64
  %61 = tail call i32 @rkl_resize(ptr noundef nonnull %0, i64 noundef %60)
  %.not220.not = icmp eq i32 %61, 0
  br i1 %.not220.not, label %62, label %.loopexit242, !prof !15

62:                                               ; preds = %53
  %63 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %64 = and i8 %63, 1
  %.not221 = icmp eq i8 %64, 0
  %.pre = load i32, ptr %31, align 8, !tbaa !19
  br i1 %.not221, label %.thread, label %65, !prof !14

65:                                               ; preds = %62
  %66 = load i32, ptr %50, align 4, !tbaa !22
  %.not222 = icmp ugt i32 %66, %.pre
  br i1 %.not222, label %.thread, label %67, !prof !15

67:                                               ; preds = %65
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.6, ptr noundef nonnull @__func__.rkl_push, i32 noundef 262) #5
  unreachable

.thread:                                          ; preds = %65, %62, %49
  %68 = phi i8 [ %63, %65 ], [ %63, %62 ], [ %4, %49 ]
  %69 = phi i32 [ %.pre, %65 ], [ %.pre, %62 ], [ %32, %49 ]
  %70 = zext i32 %69 to i64
  %.not223255 = icmp eq i32 %69, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 24
  %.pre281 = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !20
  br i1 %.not223255, label %.loopexit243, label %.lr.ph

.lr.ph:                                           ; preds = %.thread, %75
  %indvar = phi i64 [ %indvar.next, %75 ], [ 0, %.thread ]
  %.0184256 = phi i64 [ %71, %75 ], [ %70, %.thread ]
  %71 = add nsw i64 %.0184256, -1
  %72 = getelementptr inbounds i64, ptr %.pre281, i64 %71
  %73 = load i64, ptr %72, align 8, !tbaa !21
  %74 = icmp ugt i64 %73, %1
  br i1 %74, label %75, label %77

75:                                               ; preds = %.lr.ph
  %76 = getelementptr inbounds i64, ptr %.pre281, i64 %.0184256
  store i64 %73, ptr %76, align 8, !tbaa !21
  %.not223 = icmp eq i64 %71, 0
  %indvar.next = add i64 %indvar, 1
  br i1 %.not223, label %.loopexit243, label %.lr.ph, !llvm.loop !23

77:                                               ; preds = %.lr.ph
  %78 = icmp eq i64 %73, %1
  br i1 %78, label %.preheader241, label %.loopexit243, !prof !14

.preheader241:                                    ; preds = %77
  %79 = add nuw nsw i64 %.0184256, 1
  %80 = icmp ult i64 %79, %70
  br i1 %80, label %.lr.ph260.preheader, label %.loopexit242

.lr.ph260.preheader:                              ; preds = %.preheader241
  %81 = add i64 %indvar, -1
  %min.iters.check = icmp ult i64 %81, 4
  br i1 %min.iters.check, label %.lr.ph260.preheader392, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph260.preheader
  %n.vec = and i64 %81, -4
  %ind.end = add i64 %79, %n.vec
  %ind.end295 = add i64 %.0184256, %n.vec
  %82 = getelementptr i64, ptr %.pre281, i64 %79
  %83 = getelementptr i64, ptr %.pre281, i64 %.0184256
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %84 = getelementptr i64, ptr %82, i64 %index
  %85 = getelementptr inbounds i8, ptr %84, i64 16
  %wide.load = load <2 x i64>, ptr %84, align 8, !tbaa !21
  %wide.load298 = load <2 x i64>, ptr %85, align 8, !tbaa !21
  %86 = getelementptr i64, ptr %83, i64 %index
  %87 = getelementptr inbounds i8, ptr %86, i64 16
  store <2 x i64> %wide.load, ptr %86, align 8, !tbaa !21
  store <2 x i64> %wide.load298, ptr %87, align 8, !tbaa !21
  %index.next = add nuw i64 %index, 4
  %88 = icmp eq i64 %index.next, %n.vec
  br i1 %88, label %middle.block, label %vector.body, !llvm.loop !25

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %81, %n.vec
  br i1 %cmp.n, label %.loopexit242, label %.lr.ph260.preheader392

.lr.ph260.preheader392:                           ; preds = %middle.block, %.lr.ph260.preheader
  %.ph = phi i64 [ %79, %.lr.ph260.preheader ], [ %ind.end, %middle.block ]
  %.1185259.ph = phi i64 [ %.0184256, %.lr.ph260.preheader ], [ %ind.end295, %middle.block ]
  br label %.lr.ph260

.lr.ph260:                                        ; preds = %.lr.ph260.preheader392, %.lr.ph260
  %89 = phi i64 [ %93, %.lr.ph260 ], [ %.ph, %.lr.ph260.preheader392 ]
  %.1185259 = phi i64 [ %89, %.lr.ph260 ], [ %.1185259.ph, %.lr.ph260.preheader392 ]
  %90 = getelementptr inbounds i64, ptr %.pre281, i64 %89
  %91 = load i64, ptr %90, align 8, !tbaa !21
  %92 = getelementptr inbounds i64, ptr %.pre281, i64 %.1185259
  store i64 %91, ptr %92, align 8, !tbaa !21
  %93 = add nuw nsw i64 %89, 1
  %exitcond.not = icmp eq i64 %93, %70
  br i1 %exitcond.not, label %.loopexit242, label %.lr.ph260, !llvm.loop !28

.loopexit243:                                     ; preds = %75, %.thread, %77
  %.0184252 = phi i64 [ %.0184256, %77 ], [ 0, %.thread ], [ 0, %75 ]
  %.not223250 = phi i1 [ false, %77 ], [ true, %.thread ], [ true, %75 ]
  %94 = getelementptr inbounds i8, ptr %0, i64 24
  %95 = getelementptr inbounds i64, ptr %.pre281, i64 %.0184252
  store i64 %1, ptr %95, align 8, !tbaa !21
  %96 = add i32 %69, 1
  store i32 %96, ptr %31, align 8, !tbaa !19
  %97 = and i8 %68, 1
  %.not224 = icmp eq i8 %97, 0
  br i1 %.not224, label %101, label %98, !prof !14

98:                                               ; preds = %.loopexit243
  %99 = tail call zeroext i1 @rkl_check(ptr noundef nonnull %0) #6
  br i1 %99, label %101, label %100, !prof !15

100:                                              ; preds = %98
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.rkl_push, i32 noundef 283) #5
  unreachable

101:                                              ; preds = %98, %.loopexit243
  %102 = icmp ugt i32 %96, 2
  br i1 %102, label %103, label %.loopexit242

103:                                              ; preds = %101
  br i1 %.not223250, label %109, label %104

104:                                              ; preds = %103
  %105 = getelementptr i8, ptr %95, i64 -8
  %106 = load i64, ptr %105, align 8, !tbaa !21
  %107 = add i64 %1, -1
  %108 = icmp eq i64 %106, %107
  br i1 %108, label %117, label %109

109:                                              ; preds = %104, %103
  %110 = add nuw nsw i64 %.0184252, 1
  %111 = zext i32 %96 to i64
  %112 = icmp ult i64 %110, %111
  br i1 %112, label %113, label %.loopexit242

113:                                              ; preds = %109
  %114 = getelementptr inbounds i64, ptr %.pre281, i64 %110
  %115 = load i64, ptr %114, align 8, !tbaa !21
  %116 = icmp eq i64 %115, %6
  br i1 %116, label %117, label %.loopexit242

117:                                              ; preds = %113, %104
  %118 = sub i64 %1, %.0184252
  br label %119

119:                                              ; preds = %120, %117
  %indvar299 = phi i64 [ %indvar.next300, %120 ], [ 0, %117 ]
  %.0192 = phi i64 [ %121, %120 ], [ %.0184252, %117 ]
  %.0187 = phi i64 [ %123, %120 ], [ %1, %117 ]
  %.not225 = icmp eq i64 %.0192, 0
  br i1 %.not225, label %.critedge, label %120

120:                                              ; preds = %119
  %121 = add nsw i64 %.0192, -1
  %122 = getelementptr inbounds i64, ptr %.pre281, i64 %121
  %123 = load i64, ptr %122, align 8, !tbaa !21
  %124 = add i64 %.0187, -1
  %125 = icmp eq i64 %123, %124
  %indvar.next300 = add i64 %indvar299, 1
  br i1 %125, label %119, label %.critedge, !llvm.loop !29

.critedge:                                        ; preds = %119, %120
  %.0187.lcssa = phi i64 [ %118, %119 ], [ %.0187, %120 ]
  %126 = zext i32 %96 to i64
  %127 = add nsw i64 %.0184252, 1
  %umax = tail call i64 @llvm.umax.i64(i64 %127, i64 %126)
  br label %128

128:                                              ; preds = %130, %.critedge
  %.0191.in = phi i64 [ %1, %.critedge ], [ %.0191, %130 ]
  %.0188.in = phi i64 [ %.0184252, %.critedge ], [ %.0188, %130 ]
  %.0188 = add nuw nsw i64 %.0188.in, 1
  %.0191 = add i64 %.0191.in, 1
  %129 = icmp ult i64 %.0188, %126
  br i1 %129, label %130, label %.critedge2

130:                                              ; preds = %128
  %131 = getelementptr inbounds i64, ptr %.pre281, i64 %.0188
  %132 = load i64, ptr %131, align 8, !tbaa !21
  %133 = icmp eq i64 %132, %.0191
  br i1 %133, label %128, label %.critedge2, !llvm.loop !30

.critedge2:                                       ; preds = %128, %130
  %.0188.lcssa = phi i64 [ %umax, %128 ], [ %.0188, %130 ]
  %134 = sub nsw i64 %.0188.lcssa, %.0192
  %135 = icmp ugt i64 %134, 3
  br i1 %135, label %136, label %.loopexit242

136:                                              ; preds = %.critedge2
  %137 = load i64, ptr %15, align 8, !tbaa !18
  %138 = load i64, ptr %0, align 8, !tbaa !16
  %139 = sub i64 %137, %138
  %140 = icmp ugt i64 %134, %139
  br i1 %140, label %141, label %.loopexit242

141:                                              ; preds = %136
  %142 = tail call ptr @rkl_bsearch(ptr noundef nonnull %.pre281, i64 noundef %126, i64 noundef %138)
  %143 = load ptr, ptr %94, align 8, !tbaa !20
  %144 = ptrtoint ptr %142 to i64
  %145 = ptrtoint ptr %143 to i64
  %146 = sub i64 %144, %145
  %147 = ashr exact i64 %146, 3
  %148 = icmp ugt i64 %.0192, %147
  %149 = sub nsw i64 %.0192, %147
  br i1 %148, label %.preheader238.preheader, label %182

.preheader238.preheader:                          ; preds = %141
  %150 = sub i64 %.0192, %147
  %min.iters.check331 = icmp ult i64 %150, 74
  br i1 %min.iters.check331, label %.preheader238.preheader388, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %.preheader238.preheader
  %151 = xor i64 %indvar299, -1
  %152 = add i64 %.0184252, %151
  %153 = sub i64 %152, %147
  %154 = sub i64 %137, %138
  %155 = shl i64 %154, 3
  %scevgep = getelementptr i8, ptr %143, i64 %155
  %156 = shl nsw i64 %.0184252, 3
  %157 = add nsw i64 %156, -8
  %158 = shl i64 %indvar299, 3
  %159 = sub i64 %157, %158
  %scevgep322 = getelementptr i8, ptr %scevgep, i64 %159
  %mul.result.neg = mul i64 %153, -8
  %160 = getelementptr i8, ptr %scevgep322, i64 %mul.result.neg
  %161 = icmp ugt ptr %160, %scevgep322
  %scevgep323 = getelementptr i8, ptr %143, i64 %159
  %mul.result325.neg = mul i64 %153, -8
  %mul.overflow326 = icmp ugt i64 %153, 2305843009213693951
  %162 = getelementptr i8, ptr %scevgep323, i64 %mul.result325.neg
  %163 = icmp ugt ptr %162, %scevgep323
  %164 = or i1 %163, %mul.overflow326
  %165 = or i1 %161, %164
  br i1 %165, label %.preheader238.preheader388, label %vector.memcheck327

vector.memcheck327:                               ; preds = %vector.scevcheck
  %166 = sub i64 %138, %137
  %167 = and i64 %166, 2305843009213693948
  %diff.check328 = icmp eq i64 %167, 0
  br i1 %diff.check328, label %.preheader238.preheader388, label %vector.ph332

vector.ph332:                                     ; preds = %vector.memcheck327
  %n.vec334 = and i64 %150, -4
  %ind.end335 = sub i64 %.0192, %n.vec334
  %168 = getelementptr i64, ptr %143, i64 %.0192
  br label %vector.body337

vector.body337:                                   ; preds = %vector.body337, %vector.ph332
  %index338 = phi i64 [ 0, %vector.ph332 ], [ %index.next345, %vector.body337 ]
  %169 = xor i64 %index338, -1
  %170 = getelementptr i64, ptr %168, i64 %169
  %171 = getelementptr inbounds i8, ptr %170, i64 -8
  %172 = getelementptr inbounds i8, ptr %170, i64 -24
  %wide.load340 = load <2 x i64>, ptr %171, align 8, !tbaa !21
  %wide.load341 = load <2 x i64>, ptr %172, align 8, !tbaa !21
  %173 = getelementptr i64, ptr %170, i64 %139
  %174 = getelementptr i8, ptr %173, i64 -8
  %175 = getelementptr i8, ptr %173, i64 -24
  store <2 x i64> %wide.load340, ptr %174, align 8, !tbaa !21
  store <2 x i64> %wide.load341, ptr %175, align 8, !tbaa !21
  %index.next345 = add nuw i64 %index338, 4
  %176 = icmp eq i64 %index.next345, %n.vec334
  br i1 %176, label %middle.block329, label %vector.body337, !llvm.loop !31

middle.block329:                                  ; preds = %vector.body337
  %cmp.n346 = icmp eq i64 %150, %n.vec334
  br i1 %cmp.n346, label %.loopexit, label %.preheader238.preheader388

.preheader238.preheader388:                       ; preds = %middle.block329, %vector.memcheck327, %vector.scevcheck, %.preheader238.preheader
  %.1193.ph = phi i64 [ %.0192, %vector.memcheck327 ], [ %.0192, %vector.scevcheck ], [ %.0192, %.preheader238.preheader ], [ %ind.end335, %middle.block329 ]
  br label %.preheader238

.preheader238:                                    ; preds = %.preheader238.preheader388, %.preheader238
  %.1193 = phi i64 [ %177, %.preheader238 ], [ %.1193.ph, %.preheader238.preheader388 ]
  %177 = add i64 %.1193, -1
  %178 = getelementptr inbounds i64, ptr %143, i64 %177
  %179 = load i64, ptr %178, align 8, !tbaa !21
  %180 = getelementptr i64, ptr %178, i64 %139
  store i64 %179, ptr %180, align 8, !tbaa !21
  %181 = icmp ugt i64 %177, %147
  br i1 %181, label %.preheader238, label %.loopexit, !llvm.loop !32

182:                                              ; preds = %141
  %183 = icmp ult i64 %.0188.lcssa, %147
  br i1 %183, label %.preheader239, label %.loopexit

.preheader239:                                    ; preds = %182
  %184 = sub nsw i64 %147, %134
  %185 = sub i64 %127, %indvar299
  %umax302 = tail call i64 @llvm.umax.i64(i64 %185, i64 %184)
  %186 = sub i64 %indvar299, %.0184252
  %187 = add i64 %umax302, %186
  %min.iters.check305 = icmp ult i64 %187, 16
  br i1 %min.iters.check305, label %scalar.ph304.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %.preheader239
  %188 = add i64 %indvar299, %.0188.lcssa
  %189 = sub i64 %.0184252, %188
  %190 = and i64 %189, 2305843009213693948
  %diff.check = icmp eq i64 %190, 0
  br i1 %diff.check, label %scalar.ph304.preheader, label %vector.ph306

vector.ph306:                                     ; preds = %vector.memcheck
  %n.vec308 = and i64 %187, -4
  %ind.end309 = add i64 %.0192, %n.vec308
  %ind.end311 = add i64 %.0188.lcssa, %n.vec308
  %191 = getelementptr i64, ptr %143, i64 %.0188.lcssa
  %192 = getelementptr i64, ptr %143, i64 %.0192
  br label %vector.body313

vector.body313:                                   ; preds = %vector.body313, %vector.ph306
  %index314 = phi i64 [ 0, %vector.ph306 ], [ %index.next319, %vector.body313 ]
  %193 = getelementptr i64, ptr %191, i64 %index314
  %194 = getelementptr inbounds i8, ptr %193, i64 16
  %wide.load317 = load <2 x i64>, ptr %193, align 8, !tbaa !21
  %wide.load318 = load <2 x i64>, ptr %194, align 8, !tbaa !21
  %195 = getelementptr i64, ptr %192, i64 %index314
  %196 = getelementptr inbounds i8, ptr %195, i64 16
  store <2 x i64> %wide.load317, ptr %195, align 8, !tbaa !21
  store <2 x i64> %wide.load318, ptr %196, align 8, !tbaa !21
  %index.next319 = add nuw i64 %index314, 4
  %197 = icmp eq i64 %index.next319, %n.vec308
  br i1 %197, label %middle.block303, label %vector.body313, !llvm.loop !33

middle.block303:                                  ; preds = %vector.body313
  %cmp.n320 = icmp eq i64 %187, %n.vec308
  br i1 %cmp.n320, label %.loopexit, label %scalar.ph304.preheader

scalar.ph304.preheader:                           ; preds = %middle.block303, %vector.memcheck, %.preheader239
  %.2194.ph = phi i64 [ %.0192, %vector.memcheck ], [ %.0192, %.preheader239 ], [ %ind.end309, %middle.block303 ]
  %.1189.ph = phi i64 [ %.0188.lcssa, %vector.memcheck ], [ %.0188.lcssa, %.preheader239 ], [ %ind.end311, %middle.block303 ]
  br label %scalar.ph304

scalar.ph304:                                     ; preds = %scalar.ph304.preheader, %scalar.ph304
  %.2194 = phi i64 [ %201, %scalar.ph304 ], [ %.2194.ph, %scalar.ph304.preheader ]
  %.1189 = phi i64 [ %198, %scalar.ph304 ], [ %.1189.ph, %scalar.ph304.preheader ]
  %198 = add i64 %.1189, 1
  %199 = getelementptr inbounds i64, ptr %143, i64 %.1189
  %200 = load i64, ptr %199, align 8, !tbaa !21
  %201 = add i64 %.2194, 1
  %202 = getelementptr inbounds i64, ptr %143, i64 %.2194
  store i64 %200, ptr %202, align 8, !tbaa !21
  %203 = icmp ult i64 %201, %184
  br i1 %203, label %scalar.ph304, label %.loopexit, !llvm.loop !34

.loopexit:                                        ; preds = %scalar.ph304, %.preheader238, %middle.block303, %middle.block329, %182
  %.3195 = phi i64 [ %.0192, %182 ], [ %147, %middle.block329 ], [ %ind.end309, %middle.block303 ], [ %147, %.preheader238 ], [ %201, %scalar.ph304 ]
  %.2190 = phi i64 [ %.0188.lcssa, %182 ], [ %.0188.lcssa, %middle.block329 ], [ %ind.end311, %middle.block303 ], [ %.0188.lcssa, %.preheader238 ], [ %198, %scalar.ph304 ]
  %.0 = phi i64 [ 0, %182 ], [ %149, %middle.block329 ], [ 0, %middle.block303 ], [ %149, %.preheader238 ], [ 0, %scalar.ph304 ]
  %min.iters.check352 = icmp ult i64 %139, 14
  br i1 %min.iters.check352, label %scalar.ph351.preheader, label %vector.memcheck347

vector.memcheck347:                               ; preds = %.loopexit
  %204 = shl i64 %.3195, 3
  %scevgep348 = getelementptr i8, ptr %143, i64 %204
  %205 = add i64 %.3195, %137
  %206 = sub i64 %205, %138
  %207 = shl i64 %206, 3
  %scevgep349 = getelementptr i8, ptr %143, i64 %207
  %bound0 = icmp ult ptr %scevgep348, %15
  %bound1 = icmp ugt ptr %scevgep349, %0
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph351.preheader, label %vector.ph353

vector.ph353:                                     ; preds = %vector.memcheck347
  %n.vec355 = and i64 %139, -4
  %ind.end356 = add i64 %.3195, %n.vec355
  %208 = load i64, ptr %0, align 8, !tbaa !16, !alias.scope !35
  %broadcast.splatinsert363 = insertelement <2 x i64> poison, i64 %208, i64 0
  %broadcast.splat364 = shufflevector <2 x i64> %broadcast.splatinsert363, <2 x i64> poison, <2 x i32> zeroinitializer
  %209 = getelementptr i64, ptr %143, i64 %.3195
  br label %vector.body359

vector.body359:                                   ; preds = %vector.body359, %vector.ph353
  %index360 = phi i64 [ 0, %vector.ph353 ], [ %index.next365, %vector.body359 ]
  %vec.ind = phi <2 x i64> [ <i64 0, i64 1>, %vector.ph353 ], [ %vec.ind.next, %vector.body359 ]
  %step.add = add <2 x i64> %vec.ind, <i64 2, i64 2>
  %210 = add <2 x i64> %broadcast.splat364, %vec.ind
  %211 = add <2 x i64> %broadcast.splat364, %step.add
  %212 = getelementptr i64, ptr %209, i64 %index360
  %213 = getelementptr inbounds i8, ptr %212, i64 16
  store <2 x i64> %210, ptr %212, align 8, !tbaa !21, !alias.scope !38, !noalias !35
  store <2 x i64> %211, ptr %213, align 8, !tbaa !21, !alias.scope !38, !noalias !35
  %index.next365 = add nuw i64 %index360, 4
  %vec.ind.next = add <2 x i64> %vec.ind, <i64 4, i64 4>
  %214 = icmp eq i64 %index.next365, %n.vec355
  br i1 %214, label %middle.block350, label %vector.body359, !llvm.loop !40

middle.block350:                                  ; preds = %vector.body359
  %cmp.n366 = icmp eq i64 %139, %n.vec355
  br i1 %cmp.n366, label %.preheader, label %scalar.ph351.preheader

scalar.ph351.preheader:                           ; preds = %middle.block350, %vector.memcheck347, %.loopexit
  %.4.ph = phi i64 [ %.3195, %vector.memcheck347 ], [ %.3195, %.loopexit ], [ %ind.end356, %middle.block350 ]
  %.2186.ph = phi i64 [ 0, %vector.memcheck347 ], [ 0, %.loopexit ], [ %n.vec355, %middle.block350 ]
  br label %scalar.ph351

scalar.ph351:                                     ; preds = %scalar.ph351.preheader, %scalar.ph351
  %.4 = phi i64 [ %218, %scalar.ph351 ], [ %.4.ph, %scalar.ph351.preheader ]
  %.2186 = phi i64 [ %216, %scalar.ph351 ], [ %.2186.ph, %scalar.ph351.preheader ]
  %215 = load i64, ptr %0, align 8, !tbaa !16
  %216 = add i64 %.2186, 1
  %217 = add i64 %215, %.2186
  %218 = add i64 %.4, 1
  %219 = getelementptr inbounds i64, ptr %143, i64 %.4
  store i64 %217, ptr %219, align 8, !tbaa !21
  %.not226 = icmp eq i64 %216, %139
  br i1 %.not226, label %.preheader, label %scalar.ph351, !llvm.loop !41

.preheader:                                       ; preds = %scalar.ph351, %middle.block350
  %.lcssa = phi i64 [ %ind.end356, %middle.block350 ], [ %218, %scalar.ph351 ]
  %220 = load i32, ptr %31, align 8, !tbaa !19
  %221 = zext i32 %220 to i64
  %222 = icmp ult i64 %.2190, %221
  br i1 %222, label %.lr.ph263, label %._crit_edge

.lr.ph263:                                        ; preds = %.preheader
  %223 = getelementptr i64, ptr %143, i64 %.0
  %224 = sub i64 %221, %.2190
  %min.iters.check371 = icmp ult i64 %224, 10
  br i1 %min.iters.check371, label %scalar.ph370.preheader, label %vector.memcheck367

vector.memcheck367:                               ; preds = %.lr.ph263
  %225 = add i64 %.0, %.lcssa
  %226 = sub i64 %225, %.2190
  %227 = and i64 %226, 2305843009213693948
  %diff.check368 = icmp eq i64 %227, 0
  br i1 %diff.check368, label %scalar.ph370.preheader, label %vector.ph372

vector.ph372:                                     ; preds = %vector.memcheck367
  %n.vec374 = and i64 %224, -4
  %ind.end375 = add i64 %.2190, %n.vec374
  %ind.end377 = add i64 %.lcssa, %n.vec374
  %228 = getelementptr i64, ptr %143, i64 %.2190
  %229 = getelementptr i64, ptr %223, i64 %.lcssa
  br label %vector.body379

vector.body379:                                   ; preds = %vector.body379, %vector.ph372
  %index380 = phi i64 [ 0, %vector.ph372 ], [ %index.next385, %vector.body379 ]
  %230 = getelementptr i64, ptr %228, i64 %index380
  %231 = getelementptr inbounds i8, ptr %230, i64 16
  %wide.load383 = load <2 x i64>, ptr %230, align 8, !tbaa !21
  %wide.load384 = load <2 x i64>, ptr %231, align 8, !tbaa !21
  %232 = getelementptr i64, ptr %229, i64 %index380
  %233 = getelementptr i8, ptr %232, i64 16
  store <2 x i64> %wide.load383, ptr %232, align 8, !tbaa !21
  store <2 x i64> %wide.load384, ptr %233, align 8, !tbaa !21
  %index.next385 = add nuw i64 %index380, 4
  %234 = icmp eq i64 %index.next385, %n.vec374
  br i1 %234, label %middle.block369, label %vector.body379, !llvm.loop !42

middle.block369:                                  ; preds = %vector.body379
  %cmp.n386 = icmp eq i64 %224, %n.vec374
  br i1 %cmp.n386, label %._crit_edge, label %scalar.ph370.preheader

scalar.ph370.preheader:                           ; preds = %middle.block369, %vector.memcheck367, %.lr.ph263
  %.3262.ph = phi i64 [ %.2190, %vector.memcheck367 ], [ %.2190, %.lr.ph263 ], [ %ind.end375, %middle.block369 ]
  %.5261.ph = phi i64 [ %.lcssa, %vector.memcheck367 ], [ %.lcssa, %.lr.ph263 ], [ %ind.end377, %middle.block369 ]
  %235 = sub i64 %221, %.3262.ph
  %xtraiter = and i64 %235, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %scalar.ph370.prol.loopexit, label %scalar.ph370.prol

scalar.ph370.prol:                                ; preds = %scalar.ph370.preheader, %scalar.ph370.prol
  %.3262.prol = phi i64 [ %236, %scalar.ph370.prol ], [ %.3262.ph, %scalar.ph370.preheader ]
  %.5261.prol = phi i64 [ %239, %scalar.ph370.prol ], [ %.5261.ph, %scalar.ph370.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph370.prol ], [ 0, %scalar.ph370.preheader ]
  %236 = add nuw nsw i64 %.3262.prol, 1
  %237 = getelementptr inbounds i64, ptr %143, i64 %.3262.prol
  %238 = load i64, ptr %237, align 8, !tbaa !21
  %239 = add i64 %.5261.prol, 1
  %240 = getelementptr i64, ptr %223, i64 %.5261.prol
  store i64 %238, ptr %240, align 8, !tbaa !21
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %scalar.ph370.prol.loopexit, label %scalar.ph370.prol, !llvm.loop !43

scalar.ph370.prol.loopexit:                       ; preds = %scalar.ph370.prol, %scalar.ph370.preheader
  %.3262.unr = phi i64 [ %.3262.ph, %scalar.ph370.preheader ], [ %236, %scalar.ph370.prol ]
  %.5261.unr = phi i64 [ %.5261.ph, %scalar.ph370.preheader ], [ %239, %scalar.ph370.prol ]
  %241 = sub i64 %.3262.ph, %221
  %242 = icmp ugt i64 %241, -4
  br i1 %242, label %._crit_edge, label %scalar.ph370.preheader.new

scalar.ph370.preheader.new:                       ; preds = %scalar.ph370.prol.loopexit
  %invariant.gep = getelementptr i8, ptr %143, i64 8
  %invariant.gep406 = getelementptr i8, ptr %223, i64 8
  %invariant.gep408 = getelementptr i8, ptr %143, i64 16
  %invariant.gep410 = getelementptr i8, ptr %223, i64 16
  %invariant.gep412 = getelementptr i8, ptr %143, i64 24
  %invariant.gep414 = getelementptr i8, ptr %223, i64 24
  br label %scalar.ph370

scalar.ph370:                                     ; preds = %scalar.ph370, %scalar.ph370.preheader.new
  %.3262 = phi i64 [ %.3262.unr, %scalar.ph370.preheader.new ], [ %248, %scalar.ph370 ]
  %.5261 = phi i64 [ %.5261.unr, %scalar.ph370.preheader.new ], [ %250, %scalar.ph370 ]
  %243 = getelementptr inbounds i64, ptr %143, i64 %.3262
  %244 = load i64, ptr %243, align 8, !tbaa !21
  %245 = getelementptr i64, ptr %223, i64 %.5261
  store i64 %244, ptr %245, align 8, !tbaa !21
  %gep = getelementptr i64, ptr %invariant.gep, i64 %.3262
  %246 = load i64, ptr %gep, align 8, !tbaa !21
  %gep407 = getelementptr i64, ptr %invariant.gep406, i64 %.5261
  store i64 %246, ptr %gep407, align 8, !tbaa !21
  %gep409 = getelementptr i64, ptr %invariant.gep408, i64 %.3262
  %247 = load i64, ptr %gep409, align 8, !tbaa !21
  %gep411 = getelementptr i64, ptr %invariant.gep410, i64 %.5261
  store i64 %247, ptr %gep411, align 8, !tbaa !21
  %248 = add nuw nsw i64 %.3262, 4
  %gep413 = getelementptr i64, ptr %invariant.gep412, i64 %.3262
  %249 = load i64, ptr %gep413, align 8, !tbaa !21
  %250 = add i64 %.5261, 4
  %gep415 = getelementptr i64, ptr %invariant.gep414, i64 %.5261
  store i64 %249, ptr %gep415, align 8, !tbaa !21
  %exitcond280.not.3 = icmp eq i64 %248, %221
  br i1 %exitcond280.not.3, label %._crit_edge, label %scalar.ph370, !llvm.loop !45

._crit_edge:                                      ; preds = %scalar.ph370.prol.loopexit, %scalar.ph370, %middle.block369, %.preheader
  %251 = sub i64 %139, %134
  %252 = trunc i64 %251 to i32
  %253 = add i32 %220, %252
  store i32 %253, ptr %31, align 8, !tbaa !19
  store i64 %.0187.lcssa, ptr %0, align 8, !tbaa !16
  store i64 %.0191, ptr %15, align 8, !tbaa !18
  %254 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !5
  %255 = and i8 %254, 1
  %.not227 = icmp eq i8 %255, 0
  br i1 %.not227, label %.loopexit242, label %256, !prof !14

256:                                              ; preds = %._crit_edge
  %257 = tail call zeroext i1 @rkl_check(ptr noundef nonnull %0) #6
  br i1 %257, label %.loopexit242, label %258, !prof !15

258:                                              ; preds = %256
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.rkl_push, i32 noundef 356) #5
  unreachable

.loopexit242:                                     ; preds = %.lr.ph260, %middle.block, %.preheader241, %53, %.critedge2, %._crit_edge, %256, %136, %113, %109, %101, %43, %46, %25, %28, %23, %17
  %.2 = phi i32 [ %18, %17 ], [ %24, %23 ], [ %29, %28 ], [ -1, %25 ], [ 0, %46 ], [ 0, %43 ], [ 0, %.critedge2 ], [ 0, %._crit_edge ], [ 0, %256 ], [ 0, %136 ], [ 0, %113 ], [ 0, %109 ], [ 0, %101 ], [ %61, %53 ], [ -1, %.preheader241 ], [ -1, %middle.block ], [ -1, %.lr.ph260 ]
  ret i32 %.2
}

; Function Attrs: nounwind uwtable
declare hidden i32 @extend_solid(ptr noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #2

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

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

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

attributes #0 = { 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 = { alwaysinline 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 = { noreturn nounwind }
attributes #6 = { 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, !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 = !{!"branch_weights", i32 2000, i32 4002001}
!14 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!15 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!16 = !{!17, !11, i64 0}
!17 = !{!"MDBX_rkl", !11, i64 0, !11, i64 8, !9, i64 16, !9, i64 20, !12, i64 24, !7, i64 32}
!18 = !{!17, !11, i64 8}
!19 = !{!17, !9, i64 16}
!20 = !{!17, !12, i64 24}
!21 = !{!11, !11, i64 0}
!22 = !{!17, !9, i64 20}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = distinct !{!25, !24, !26, !27}
!26 = !{!"llvm.loop.isvectorized", i32 1}
!27 = !{!"llvm.loop.unroll.runtime.disable"}
!28 = distinct !{!28, !24, !27, !26}
!29 = distinct !{!29, !24}
!30 = distinct !{!30, !24}
!31 = distinct !{!31, !24, !26, !27}
!32 = distinct !{!32, !24, !26}
!33 = distinct !{!33, !24, !26, !27}
!34 = distinct !{!34, !24, !26}
!35 = !{!36}
!36 = distinct !{!36, !37}
!37 = distinct !{!37, !"LVerDomain"}
!38 = !{!39}
!39 = distinct !{!39, !37}
!40 = distinct !{!40, !24, !26, !27}
!41 = distinct !{!41, !24, !26}
!42 = distinct !{!42, !24, !26, !27}
!43 = distinct !{!43, !44}
!44 = !{!"llvm.loop.unroll.disable"}
!45 = distinct !{!45, !24, !26}


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