; LLVM IR from erthink/libmdbx :: src (gc-put)

; 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.17 }
%struct.anon.17 = 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_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.3 }
%struct.geo = type { i16, i16, i32, i32, %union.anon.1, %union.anon.2 }
%union.anon.1 = type { i32 }
%union.anon.2 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.3 = type { %struct.anon.5 }
%struct.anon.5 = type { %struct.troika, ptr, %struct.anon.6, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.7 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.6 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.7 = type { %struct.anon.8 }
%struct.anon.8 = type { i64, ptr }
%struct.gc_update_context = type { i32, i32, i8, i32, i64, i64, i64, i64, i64, %struct.MDBX_rkl, %struct.MDBX_rkl, i64, %union.anon, %struct.gc_dense_histogram }
%union.anon = type { %struct.cursor_couple }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.MDBX_cursor = type { i32, %union.anon.0, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon.0 = type { i16 }
%struct.inner_cursor = type { %struct.MDBX_cursor, %struct.tree }
%struct.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%struct.gc_dense_histogram = type { i32, [31 x i32] }
%struct.MDBX_env = type { %union.mdbx_atomic_uint32_t, i32, i32, %struct.osal_mmap, i32, i32, %struct.osal_mmap, ptr, i16, i16, i16, i16, i16, i16, %union.mdbx_atomic_uint32_t, i8, i8, i16, i32, i32, i32, i32, %struct.anon.10, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.11, %struct.anon.15, i8, ptr, ptr, ptr, %struct.anon.16, %union.pthread_mutex_t, i32, i32, ptr, %struct.osal_ioring, %union.pthread_mutex_t, [71 x %union.mdbx_atomic_uint64_t] }
%struct.osal_mmap = type { %union.anon.9, i32, i64, i64, i64 }
%union.anon.9 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.10 = type { ptr, ptr, ptr, ptr }
%struct.anon.11 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.12, %union.anon.13 }
%struct.anon.12 = type { i16, i16, i16, i16 }
%union.anon.13 = type { i32 }
%struct.anon.15 = type { i64, i64, i64, i64, i64 }
%struct.anon.16 = type { i64 }
%struct.osal_ioring = type { i32, i32, i32, ptr, ptr, ptr }
%union.mdbx_atomic_uint64_t = type { i64 }

@globals = external global %struct.libmdbx_globals, align 8
@__func__.gc_update = external hidden unnamed_addr constant [10 x i8], align 1
@.str = external hidden unnamed_addr constant [11 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [24 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @gc_update(ptr noundef %0, ptr noundef %1) #0 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i64, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  br label %8

8:                                                ; preds = %2
  %9 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %10 = zext i8 %9 to i32
  %11 = icmp sle i32 6, %10
  %12 = xor i1 %11, true
  %13 = xor i1 %12, true
  %14 = zext i1 %13 to i32
  %15 = sext i32 %14 to i64
  %16 = call i64 @llvm.expect.i64(i64 %15, i64 0)
  %17 = icmp ne i64 %16, 0
  br i1 %17, label %18, label %22

18:                                               ; preds = %8
  %19 = load ptr, ptr %3, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.MDBX_txn, ptr %19, i32 0, i32 7
  %21 = load i64, ptr %20, align 8, !tbaa !14
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1365, ptr noundef @.str, i64 noundef %21)
  br label %22

22:                                               ; preds = %18, %8
  br label %23

23:                                               ; preds = %22
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #8
  %24 = load ptr, ptr %3, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.MDBX_txn, ptr %24, i32 0, i32 9
  %26 = load ptr, ptr %25, align 8, !tbaa !19
  store ptr %26, ptr %5, align 8, !tbaa !5
  %27 = load ptr, ptr %3, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.MDBX_txn, ptr %27, i32 0, i32 14
  %29 = load ptr, ptr %28, align 8, !tbaa !20
  %30 = getelementptr inbounds ptr, ptr %29, i64 0
  %31 = load ptr, ptr %30, align 8, !tbaa !5
  %32 = load ptr, ptr %4, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.gc_update_context, ptr %32, i32 0, i32 12
  %34 = getelementptr inbounds %struct.MDBX_cursor, ptr %33, i32 0, i32 11
  store ptr %31, ptr %34, align 8, !tbaa !21
  %35 = load ptr, ptr %4, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.gc_update_context, ptr %35, i32 0, i32 12
  %37 = load ptr, ptr %3, align 8, !tbaa !5
  %38 = getelementptr inbounds %struct.MDBX_txn, ptr %37, i32 0, i32 14
  %39 = load ptr, ptr %38, align 8, !tbaa !20
  %40 = getelementptr inbounds ptr, ptr %39, i64 0
  store ptr %36, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #8
  %41 = load ptr, ptr %3, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct.MDBX_txn, ptr %41, i32 0, i32 9
  %43 = load ptr, ptr %42, align 8, !tbaa !19
  %44 = getelementptr inbounds %struct.MDBX_env, ptr %43, i32 0, i32 40
  %45 = getelementptr inbounds %struct.anon.16, ptr %44, i32 0, i32 0
  %46 = load i64, ptr %45, align 8, !tbaa !22
  %47 = icmp ne i64 %46, 0
  %48 = xor i1 %47, true
  %49 = xor i1 %48, true
  %50 = xor i1 %49, true
  %51 = zext i1 %50 to i32
  %52 = sext i32 %51 to i64
  %53 = call i64 @llvm.expect.i64(i64 %52, i64 0)
  %54 = icmp ne i64 %53, 0
  br i1 %54, label %55, label %58

55:                                               ; preds = %23
  %56 = load ptr, ptr %3, align 8, !tbaa !5
  %57 = call zeroext i1 @txn_gc_detent(ptr noundef %56)
  br label %58

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

69:                                               ; preds = %58
  %70 = load ptr, ptr %3, align 8, !tbaa !5
  %71 = call i32 @audit_ex(ptr noundef %70, i64 noundef 0, i1 noundef zeroext false)
  store i32 %71, ptr %6, align 4, !tbaa !32
  %72 = load i32, ptr %6, align 4, !tbaa !32
  %73 = icmp ne i32 %72, 0
  %74 = xor i1 %73, true
  %75 = xor i1 %74, true
  %76 = zext i1 %75 to i32
  %77 = sext i32 %76 to i64
  %78 = call i64 @llvm.expect.i64(i64 %77, i64 0)
  %79 = icmp ne i64 %78, 0
  br i1 %79, label %80, label %81

80:                                               ; preds = %69
  br label %984

81:                                               ; preds = %69
  br label %82

82:                                               ; preds = %81, %58
  br label %83

83:                                               ; preds = %982, %881, %827, %768, %82
  %84 = load ptr, ptr %4, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.gc_update_context, ptr %84, i32 0, i32 3
  %86 = load i32, ptr %85, align 4, !tbaa !33
  %87 = load ptr, ptr %3, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.MDBX_txn, ptr %87, i32 0, i32 6
  %89 = getelementptr inbounds %struct.geo, ptr %88, i32 0, i32 5
  %90 = load i32, ptr %89, align 8, !tbaa !21
  %91 = icmp ugt i32 %86, %90
  %92 = xor i1 %91, true
  %93 = zext i1 %92 to i32
  %94 = load ptr, ptr %4, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.gc_update_context, ptr %94, i32 0, i32 0
  %96 = load i32, ptr %95, align 8, !tbaa !37
  %97 = add i32 %96, %93
  store i32 %97, ptr %95, align 8, !tbaa !37
  br label %98

98:                                               ; preds = %83
  %99 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %100 = zext i8 %99 to i32
  %101 = icmp sle i32 6, %100
  %102 = xor i1 %101, true
  %103 = xor i1 %102, true
  %104 = zext i1 %103 to i32
  %105 = sext i32 %104 to i64
  %106 = call i64 @llvm.expect.i64(i64 %105, i64 0)
  %107 = icmp ne i64 %106, 0
  br i1 %107, label %108, label %129

108:                                              ; preds = %98
  %109 = load ptr, ptr %4, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.gc_update_context, ptr %109, i32 0, i32 0
  %111 = load i32, ptr %110, align 8, !tbaa !37
  %112 = icmp ugt i32 %111, 1
  %113 = zext i1 %112 to i64
  %114 = select i1 %112, ptr @.str.2, ptr @.str.3
  %115 = load ptr, ptr %4, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.gc_update_context, ptr %115, i32 0, i32 0
  %117 = load i32, ptr %116, align 8, !tbaa !37
  %118 = load ptr, ptr %3, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.MDBX_txn, ptr %118, i32 0, i32 17
  %120 = getelementptr inbounds %struct.anon.5, ptr %119, i32 0, i32 2
  %121 = getelementptr inbounds %struct.anon.6, ptr %120, i32 0, i32 0
  %122 = call i64 @rkl_len(ptr noundef %121) #9
  %123 = load ptr, ptr %3, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.MDBX_txn, ptr %123, i32 0, i32 9
  %125 = load ptr, ptr %124, align 8, !tbaa !19
  %126 = getelementptr inbounds %struct.MDBX_env, ptr %125, i32 0, i32 40
  %127 = getelementptr inbounds %struct.anon.16, ptr %126, i32 0, i32 0
  %128 = load i64, ptr %127, align 8, !tbaa !22
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1386, ptr noundef @.str.1, ptr noundef %114, i32 noundef %117, i64 noundef %122, i64 noundef %128)
  br label %129

129:                                              ; preds = %108, %98
  br label %130

130:                                              ; preds = %129
  br label %131

131:                                              ; preds = %130
  br label %132

132:                                              ; preds = %131
  %133 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %134 = zext i8 %133 to i32
  %135 = and i32 %134, 1
  %136 = icmp ne i32 %135, 0
  %137 = xor i1 %136, true
  %138 = xor i1 %137, true
  %139 = zext i1 %138 to i32
  %140 = sext i32 %139 to i64
  %141 = call i64 @llvm.expect.i64(i64 %140, i64 1)
  %142 = icmp ne i64 %141, 0
  br i1 %142, label %143, label %170

143:                                              ; preds = %132
  br label %144

144:                                              ; preds = %143
  %145 = load ptr, ptr %3, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.MDBX_txn, ptr %145, i32 0, i32 17
  %147 = getelementptr inbounds %struct.anon.5, ptr %146, i32 0, i32 1
  %148 = load ptr, ptr %147, align 8, !tbaa !21
  %149 = load ptr, ptr %3, align 8, !tbaa !5
  %150 = getelementptr inbounds %struct.MDBX_txn, ptr %149, i32 0, i32 6
  %151 = getelementptr inbounds %struct.geo, ptr %150, i32 0, i32 5
  %152 = load i32, ptr %151, align 8, !tbaa !21
  %153 = sub i32 %152, 1
  %154 = zext i32 %153 to i64
  %155 = call zeroext i1 @pnl_check_allocated(ptr noundef %148, i64 noundef %154)
  %156 = xor i1 %155, true
  %157 = xor i1 %156, true
  %158 = xor i1 %157, true
  %159 = zext i1 %158 to i32
  %160 = sext i32 %159 to i64
  %161 = call i64 @llvm.expect.i64(i64 %160, i64 0)
  %162 = icmp ne i64 %161, 0
  br i1 %162, label %163, label %167

163:                                              ; preds = %144
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.MDBX_txn, ptr %164, i32 0, i32 9
  %166 = load ptr, ptr %165, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %166, ptr noundef @.str.4, ptr noundef @__func__.gc_update, i32 noundef 1388) #10
  unreachable

167:                                              ; preds = %144
  br label %168

168:                                              ; preds = %167
  br label %169

169:                                              ; preds = %168
  br label %170

170:                                              ; preds = %169, %132
  br label %171

171:                                              ; preds = %170
  br label %172

172:                                              ; preds = %171
  br label %173

173:                                              ; preds = %172
  %174 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %175 = zext i8 %174 to i32
  %176 = and i32 %175, 1
  %177 = icmp ne i32 %176, 0
  %178 = xor i1 %177, true
  %179 = xor i1 %178, true
  %180 = zext i1 %179 to i32
  %181 = sext i32 %180 to i64
  %182 = call i64 @llvm.expect.i64(i64 %181, i64 1)
  %183 = icmp ne i64 %182, 0
  br i1 %183, label %184, label %202

184:                                              ; preds = %173
  br label %185

185:                                              ; preds = %184
  %186 = load ptr, ptr %3, align 8, !tbaa !5
  %187 = call zeroext i1 @dpl_check(ptr noundef %186)
  %188 = xor i1 %187, true
  %189 = xor i1 %188, true
  %190 = xor i1 %189, true
  %191 = zext i1 %190 to i32
  %192 = sext i32 %191 to i64
  %193 = call i64 @llvm.expect.i64(i64 %192, i64 0)
  %194 = icmp ne i64 %193, 0
  br i1 %194, label %195, label %199

195:                                              ; preds = %185
  %196 = load ptr, ptr %3, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.MDBX_txn, ptr %196, i32 0, i32 9
  %198 = load ptr, ptr %197, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %198, ptr noundef @.str.5, ptr noundef @__func__.gc_update, i32 noundef 1389) #10
  unreachable

199:                                              ; preds = %185
  br label %200

200:                                              ; preds = %199
  br label %201

201:                                              ; preds = %200
  br label %202

202:                                              ; preds = %201, %173
  br label %203

203:                                              ; preds = %202
  br label %204

204:                                              ; preds = %203
  %205 = load ptr, ptr %4, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.gc_update_context, ptr %205, i32 0, i32 0
  %207 = load i32, ptr %206, align 8, !tbaa !37
  %208 = icmp ugt i32 %207, 12
  %209 = xor i1 %208, true
  %210 = xor i1 %209, true
  %211 = zext i1 %210 to i32
  %212 = sext i32 %211 to i64
  %213 = call i64 @llvm.expect.i64(i64 %212, i64 0)
  %214 = icmp ne i64 %213, 0
  br i1 %214, label %215, label %236

215:                                              ; preds = %204
  br label %216

216:                                              ; preds = %215
  %217 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %218 = zext i8 %217 to i32
  %219 = icmp sle i32 1, %218
  %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 %233

226:                                              ; preds = %216
  %227 = load ptr, ptr %3, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.MDBX_txn, ptr %227, i32 0, i32 7
  %229 = load i64, ptr %228, align 8, !tbaa !14
  %230 = load ptr, ptr %4, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.gc_update_context, ptr %230, i32 0, i32 0
  %232 = load i32, ptr %231, align 8, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.gc_update, i32 noundef 1391, ptr noundef @.str.6, i64 noundef %229, i32 noundef %232)
  br label %233

233:                                              ; preds = %226, %216
  br label %234

234:                                              ; preds = %233
  br label %235

235:                                              ; preds = %234
  store i32 -30779, ptr %6, align 4, !tbaa !32
  br label %984

236:                                              ; preds = %204
  %237 = load ptr, ptr %4, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.gc_update_context, ptr %237, i32 0, i32 3
  %239 = load i32, ptr %238, align 4, !tbaa !33
  %240 = load ptr, ptr %3, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.MDBX_txn, ptr %240, i32 0, i32 6
  %242 = getelementptr inbounds %struct.geo, ptr %241, i32 0, i32 5
  %243 = load i32, ptr %242, align 8, !tbaa !21
  %244 = icmp ugt i32 %239, %243
  %245 = xor i1 %244, true
  %246 = xor i1 %245, true
  %247 = zext i1 %246 to i32
  %248 = sext i32 %247 to i64
  %249 = call i64 @llvm.expect.i64(i64 %248, i64 0)
  %250 = icmp ne i64 %249, 0
  br i1 %250, label %251, label %265

251:                                              ; preds = %236
  %252 = load ptr, ptr %3, align 8, !tbaa !5
  %253 = load ptr, ptr %4, align 8, !tbaa !5
  %254 = call i32 @gc_clean_stored_retired(ptr noundef %252, ptr noundef %253)
  store i32 %254, ptr %6, align 4, !tbaa !32
  %255 = load i32, ptr %6, align 4, !tbaa !32
  %256 = icmp ne i32 %255, 0
  %257 = xor i1 %256, true
  %258 = xor i1 %257, true
  %259 = zext i1 %258 to i32
  %260 = sext i32 %259 to i64
  %261 = call i64 @llvm.expect.i64(i64 %260, i64 0)
  %262 = icmp ne i64 %261, 0
  br i1 %262, label %263, label %264

263:                                              ; preds = %251
  br label %984

264:                                              ; preds = %251
  br label %265

265:                                              ; preds = %264, %236
  %266 = load ptr, ptr %3, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.MDBX_txn, ptr %266, i32 0, i32 6
  %268 = getelementptr inbounds %struct.geo, ptr %267, i32 0, i32 5
  %269 = load i32, ptr %268, align 8, !tbaa !21
  %270 = load ptr, ptr %4, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.gc_update_context, ptr %270, i32 0, i32 3
  store i32 %269, ptr %271, align 4, !tbaa !33
  %272 = load ptr, ptr %3, align 8, !tbaa !5
  %273 = load ptr, ptr %4, align 8, !tbaa !5
  %274 = call i32 @gc_clear_returned(ptr noundef %272, ptr noundef %273)
  store i32 %274, ptr %6, align 4, !tbaa !32
  %275 = load i32, ptr %6, align 4, !tbaa !32
  %276 = icmp ne i32 %275, 0
  %277 = xor i1 %276, true
  %278 = xor i1 %277, true
  %279 = zext i1 %278 to i32
  %280 = sext i32 %279 to i64
  %281 = call i64 @llvm.expect.i64(i64 %280, i64 0)
  %282 = icmp ne i64 %281, 0
  br i1 %282, label %283, label %284

283:                                              ; preds = %265
  br label %984

284:                                              ; preds = %265
  br label %285

285:                                              ; preds = %829, %610, %547, %284
  br label %286

286:                                              ; preds = %285
  br label %287

287:                                              ; preds = %286
  %288 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %289 = zext i8 %288 to i32
  %290 = icmp sle i32 6, %289
  %291 = xor i1 %290, true
  %292 = xor i1 %291, true
  %293 = zext i1 %292 to i32
  %294 = sext i32 %293 to i64
  %295 = call i64 @llvm.expect.i64(i64 %294, i64 0)
  %296 = icmp ne i64 %295, 0
  br i1 %296, label %297, label %298

297:                                              ; preds = %287
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1409, ptr noundef @.str.7, ptr noundef @.str.8)
  br label %298

298:                                              ; preds = %297, %287
  br label %299

299:                                              ; preds = %298
  br label %300

300:                                              ; preds = %299
  br label %301

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

312:                                              ; preds = %301
  br label %313

313:                                              ; preds = %312
  %314 = load ptr, ptr %3, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct.MDBX_txn, ptr %314, i32 0, i32 17
  %316 = getelementptr inbounds %struct.anon.5, ptr %315, i32 0, i32 1
  %317 = load ptr, ptr %316, align 8, !tbaa !21
  %318 = load ptr, ptr %3, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.MDBX_txn, ptr %318, i32 0, i32 6
  %320 = getelementptr inbounds %struct.geo, ptr %319, i32 0, i32 5
  %321 = load i32, ptr %320, align 8, !tbaa !21
  %322 = sub i32 %321, 1
  %323 = zext i32 %322 to i64
  %324 = call zeroext i1 @pnl_check_allocated(ptr noundef %317, i64 noundef %323)
  %325 = xor i1 %324, true
  %326 = xor i1 %325, true
  %327 = xor i1 %326, true
  %328 = zext i1 %327 to i32
  %329 = sext i32 %328 to i64
  %330 = call i64 @llvm.expect.i64(i64 %329, i64 0)
  %331 = icmp ne i64 %330, 0
  br i1 %331, label %332, label %336

332:                                              ; preds = %313
  %333 = load ptr, ptr %3, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.MDBX_txn, ptr %333, i32 0, i32 9
  %335 = load ptr, ptr %334, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %335, ptr noundef @.str.4, ptr noundef @__func__.gc_update, i32 noundef 1411) #10
  unreachable

336:                                              ; preds = %313
  br label %337

337:                                              ; preds = %336
  br label %338

338:                                              ; preds = %337
  br label %339

339:                                              ; preds = %338, %301
  br label %340

340:                                              ; preds = %339
  br label %341

341:                                              ; preds = %340
  %342 = load ptr, ptr %3, align 8, !tbaa !5
  %343 = load ptr, ptr %4, align 8, !tbaa !5
  %344 = call i32 @gc_clear_reclaimed(ptr noundef %342, ptr noundef %343)
  store i32 %344, ptr %6, align 4, !tbaa !32
  %345 = load i32, ptr %6, align 4, !tbaa !32
  %346 = icmp ne i32 %345, 0
  %347 = xor i1 %346, true
  %348 = xor i1 %347, true
  %349 = zext i1 %348 to i32
  %350 = sext i32 %349 to i64
  %351 = call i64 @llvm.expect.i64(i64 %350, i64 0)
  %352 = icmp ne i64 %351, 0
  br i1 %352, label %353, label %354

353:                                              ; preds = %341
  br label %984

354:                                              ; preds = %341
  br label %355

355:                                              ; preds = %354
  %356 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %357 = zext i8 %356 to i32
  %358 = and i32 %357, 1
  %359 = icmp ne i32 %358, 0
  %360 = xor i1 %359, true
  %361 = xor i1 %360, true
  %362 = zext i1 %361 to i32
  %363 = sext i32 %362 to i64
  %364 = call i64 @llvm.expect.i64(i64 %363, i64 1)
  %365 = icmp ne i64 %364, 0
  br i1 %365, label %366, label %393

366:                                              ; preds = %355
  br label %367

367:                                              ; preds = %366
  %368 = load ptr, ptr %3, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.MDBX_txn, ptr %368, i32 0, i32 17
  %370 = getelementptr inbounds %struct.anon.5, ptr %369, i32 0, i32 1
  %371 = load ptr, ptr %370, align 8, !tbaa !21
  %372 = load ptr, ptr %3, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.MDBX_txn, ptr %372, i32 0, i32 6
  %374 = getelementptr inbounds %struct.geo, ptr %373, i32 0, i32 5
  %375 = load i32, ptr %374, align 8, !tbaa !21
  %376 = sub i32 %375, 1
  %377 = zext i32 %376 to i64
  %378 = call zeroext i1 @pnl_check_allocated(ptr noundef %371, i64 noundef %377)
  %379 = xor i1 %378, true
  %380 = xor i1 %379, true
  %381 = xor i1 %380, true
  %382 = zext i1 %381 to i32
  %383 = sext i32 %382 to i64
  %384 = call i64 @llvm.expect.i64(i64 %383, i64 0)
  %385 = icmp ne i64 %384, 0
  br i1 %385, label %386, label %390

386:                                              ; preds = %367
  %387 = load ptr, ptr %3, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.MDBX_txn, ptr %387, i32 0, i32 9
  %389 = load ptr, ptr %388, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %389, ptr noundef @.str.4, ptr noundef @__func__.gc_update, i32 noundef 1416) #10
  unreachable

390:                                              ; preds = %367
  br label %391

391:                                              ; preds = %390
  br label %392

392:                                              ; preds = %391
  br label %393

393:                                              ; preds = %392, %355
  br label %394

394:                                              ; preds = %393
  br label %395

395:                                              ; preds = %394
  br label %396

396:                                              ; preds = %395
  %397 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %398 = zext i8 %397 to i32
  %399 = and i32 %398, 1
  %400 = icmp ne i32 %399, 0
  %401 = xor i1 %400, true
  %402 = xor i1 %401, true
  %403 = zext i1 %402 to i32
  %404 = sext i32 %403 to i64
  %405 = call i64 @llvm.expect.i64(i64 %404, i64 1)
  %406 = icmp ne i64 %405, 0
  br i1 %406, label %407, label %425

407:                                              ; preds = %396
  br label %408

408:                                              ; preds = %407
  %409 = load ptr, ptr %3, align 8, !tbaa !5
  %410 = call zeroext i1 @dpl_check(ptr noundef %409)
  %411 = xor i1 %410, true
  %412 = xor i1 %411, true
  %413 = xor i1 %412, true
  %414 = zext i1 %413 to i32
  %415 = sext i32 %414 to i64
  %416 = call i64 @llvm.expect.i64(i64 %415, i64 0)
  %417 = icmp ne i64 %416, 0
  br i1 %417, label %418, label %422

418:                                              ; preds = %408
  %419 = load ptr, ptr %3, align 8, !tbaa !5
  %420 = getelementptr inbounds %struct.MDBX_txn, ptr %419, i32 0, i32 9
  %421 = load ptr, ptr %420, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %421, ptr noundef @.str.5, ptr noundef @__func__.gc_update, i32 noundef 1417) #10
  unreachable

422:                                              ; preds = %408
  br label %423

423:                                              ; preds = %422
  br label %424

424:                                              ; preds = %423
  br label %425

425:                                              ; preds = %424, %396
  br label %426

426:                                              ; preds = %425
  br label %427

427:                                              ; preds = %426
  %428 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %429 = zext i8 %428 to i32
  %430 = and i32 %429, 2
  %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 0)
  %437 = icmp ne i64 %436, 0
  br i1 %437, label %438, label %454

438:                                              ; preds = %427
  %439 = load ptr, ptr %3, align 8, !tbaa !5
  %440 = load ptr, ptr %4, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.gc_update_context, ptr %440, i32 0, i32 4
  %442 = load i64, ptr %441, align 8, !tbaa !38
  %443 = call i32 @audit_ex(ptr noundef %439, i64 noundef %442, i1 noundef zeroext false)
  store i32 %443, ptr %6, align 4, !tbaa !32
  %444 = load i32, ptr %6, align 4, !tbaa !32
  %445 = icmp ne i32 %444, 0
  %446 = xor i1 %445, true
  %447 = xor i1 %446, true
  %448 = zext i1 %447 to i32
  %449 = sext i32 %448 to i64
  %450 = call i64 @llvm.expect.i64(i64 %449, i64 0)
  %451 = icmp ne i64 %450, 0
  br i1 %451, label %452, label %453

452:                                              ; preds = %438
  br label %984

453:                                              ; preds = %438
  br label %454

454:                                              ; preds = %453, %427
  %455 = load ptr, ptr %3, align 8, !tbaa !5
  %456 = call zeroext i1 @txn_refund(ptr noundef %455)
  br i1 %456, label %457, label %526

457:                                              ; preds = %454
  br label %458

458:                                              ; preds = %457
  %459 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %460 = zext i8 %459 to i32
  %461 = and i32 %460, 1
  %462 = icmp ne i32 %461, 0
  %463 = xor i1 %462, true
  %464 = xor i1 %463, true
  %465 = zext i1 %464 to i32
  %466 = sext i32 %465 to i64
  %467 = call i64 @llvm.expect.i64(i64 %466, i64 1)
  %468 = icmp ne i64 %467, 0
  br i1 %468, label %469, label %496

469:                                              ; preds = %458
  br label %470

470:                                              ; preds = %469
  %471 = load ptr, ptr %3, align 8, !tbaa !5
  %472 = getelementptr inbounds %struct.MDBX_txn, ptr %471, i32 0, i32 17
  %473 = getelementptr inbounds %struct.anon.5, ptr %472, i32 0, i32 1
  %474 = load ptr, ptr %473, align 8, !tbaa !21
  %475 = load ptr, ptr %3, align 8, !tbaa !5
  %476 = getelementptr inbounds %struct.MDBX_txn, ptr %475, i32 0, i32 6
  %477 = getelementptr inbounds %struct.geo, ptr %476, i32 0, i32 5
  %478 = load i32, ptr %477, align 8, !tbaa !21
  %479 = sub i32 %478, 1
  %480 = zext i32 %479 to i64
  %481 = call zeroext i1 @pnl_check_allocated(ptr noundef %474, i64 noundef %480)
  %482 = xor i1 %481, true
  %483 = xor i1 %482, true
  %484 = xor i1 %483, true
  %485 = zext i1 %484 to i32
  %486 = sext i32 %485 to i64
  %487 = call i64 @llvm.expect.i64(i64 %486, i64 0)
  %488 = icmp ne i64 %487, 0
  br i1 %488, label %489, label %493

489:                                              ; preds = %470
  %490 = load ptr, ptr %3, align 8, !tbaa !5
  %491 = getelementptr inbounds %struct.MDBX_txn, ptr %490, i32 0, i32 9
  %492 = load ptr, ptr %491, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %492, ptr noundef @.str.4, ptr noundef @__func__.gc_update, i32 noundef 1426) #10
  unreachable

493:                                              ; preds = %470
  br label %494

494:                                              ; preds = %493
  br label %495

495:                                              ; preds = %494
  br label %496

496:                                              ; preds = %495, %458
  br label %497

497:                                              ; preds = %496
  br label %498

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

509:                                              ; preds = %498
  %510 = load ptr, ptr %3, align 8, !tbaa !5
  %511 = load ptr, ptr %4, align 8, !tbaa !5
  %512 = getelementptr inbounds %struct.gc_update_context, ptr %511, i32 0, i32 4
  %513 = load i64, ptr %512, align 8, !tbaa !38
  %514 = call i32 @audit_ex(ptr noundef %510, i64 noundef %513, i1 noundef zeroext false)
  store i32 %514, ptr %6, align 4, !tbaa !32
  %515 = load i32, ptr %6, align 4, !tbaa !32
  %516 = icmp ne i32 %515, 0
  %517 = xor i1 %516, true
  %518 = xor i1 %517, true
  %519 = zext i1 %518 to i32
  %520 = sext i32 %519 to i64
  %521 = call i64 @llvm.expect.i64(i64 %520, i64 0)
  %522 = icmp ne i64 %521, 0
  br i1 %522, label %523, label %524

523:                                              ; preds = %509
  br label %984

524:                                              ; preds = %509
  br label %525

525:                                              ; preds = %524, %498
  br label %526

526:                                              ; preds = %525, %454
  %527 = load ptr, ptr %3, align 8, !tbaa !5
  %528 = getelementptr inbounds %struct.MDBX_txn, ptr %527, i32 0, i32 17
  %529 = getelementptr inbounds %struct.anon.5, ptr %528, i32 0, i32 9
  %530 = load ptr, ptr %529, align 8, !tbaa !21
  %531 = icmp ne ptr %530, null
  br i1 %531, label %532, label %585

532:                                              ; preds = %526
  %533 = load ptr, ptr %3, align 8, !tbaa !5
  %534 = load ptr, ptr %4, align 8, !tbaa !5
  %535 = call i32 @gc_merge_loose(ptr noundef %533, ptr noundef %534)
  store i32 %535, ptr %6, align 4, !tbaa !32
  %536 = load i32, ptr %6, align 4, !tbaa !32
  %537 = icmp ne i32 %536, 0
  %538 = xor i1 %537, true
  %539 = xor i1 %538, true
  %540 = zext i1 %539 to i32
  %541 = sext i32 %540 to i64
  %542 = call i64 @llvm.expect.i64(i64 %541, i64 0)
  %543 = icmp ne i64 %542, 0
  br i1 %543, label %544, label %549

544:                                              ; preds = %532
  %545 = load i32, ptr %6, align 4, !tbaa !32
  %546 = icmp eq i32 %545, -1
  br i1 %546, label %547, label %548

547:                                              ; preds = %544
  br label %285

548:                                              ; preds = %544
  br label %984

549:                                              ; preds = %532
  br label %550

550:                                              ; preds = %549
  %551 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %552 = zext i8 %551 to i32
  %553 = and i32 %552, 1
  %554 = icmp ne i32 %553, 0
  %555 = xor i1 %554, true
  %556 = xor i1 %555, true
  %557 = zext i1 %556 to i32
  %558 = sext i32 %557 to i64
  %559 = call i64 @llvm.expect.i64(i64 %558, i64 1)
  %560 = icmp ne i64 %559, 0
  br i1 %560, label %561, label %582

561:                                              ; preds = %550
  br label %562

562:                                              ; preds = %561
  %563 = load ptr, ptr %3, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.MDBX_txn, ptr %563, i32 0, i32 17
  %565 = getelementptr inbounds %struct.anon.5, ptr %564, i32 0, i32 9
  %566 = load ptr, ptr %565, align 8, !tbaa !21
  %567 = icmp eq ptr %566, null
  %568 = xor i1 %567, true
  %569 = xor i1 %568, true
  %570 = xor i1 %569, true
  %571 = zext i1 %570 to i32
  %572 = sext i32 %571 to i64
  %573 = call i64 @llvm.expect.i64(i64 %572, i64 0)
  %574 = icmp ne i64 %573, 0
  br i1 %574, label %575, label %579

575:                                              ; preds = %562
  %576 = load ptr, ptr %3, align 8, !tbaa !5
  %577 = getelementptr inbounds %struct.MDBX_txn, ptr %576, i32 0, i32 9
  %578 = load ptr, ptr %577, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %578, ptr noundef @.str.9, ptr noundef @__func__.gc_update, i32 noundef 1442) #10
  unreachable

579:                                              ; preds = %562
  br label %580

580:                                              ; preds = %579
  br label %581

581:                                              ; preds = %580
  br label %582

582:                                              ; preds = %581, %550
  br label %583

583:                                              ; preds = %582
  br label %584

584:                                              ; preds = %583
  br label %585

585:                                              ; preds = %584, %526
  %586 = load ptr, ptr %4, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.gc_update_context, ptr %586, i32 0, i32 4
  %588 = load i64, ptr %587, align 8, !tbaa !38
  %589 = load ptr, ptr %3, align 8, !tbaa !5
  %590 = getelementptr inbounds %struct.MDBX_txn, ptr %589, i32 0, i32 17
  %591 = getelementptr inbounds %struct.anon.5, ptr %590, i32 0, i32 8
  %592 = load ptr, ptr %591, align 8, !tbaa !21
  %593 = getelementptr inbounds i32, ptr %592, i64 0
  %594 = load i32, ptr %593, align 4, !tbaa !32
  %595 = zext i32 %594 to i64
  %596 = icmp ult i64 %588, %595
  br i1 %596, label %597, label %611

597:                                              ; preds = %585
  %598 = load ptr, ptr %3, align 8, !tbaa !5
  %599 = load ptr, ptr %4, align 8, !tbaa !5
  %600 = call i32 @gc_store_retired(ptr noundef %598, ptr noundef %599)
  store i32 %600, ptr %6, align 4, !tbaa !32
  %601 = load i32, ptr %6, align 4, !tbaa !32
  %602 = icmp ne i32 %601, 0
  %603 = xor i1 %602, true
  %604 = xor i1 %603, true
  %605 = zext i1 %604 to i32
  %606 = sext i32 %605 to i64
  %607 = call i64 @llvm.expect.i64(i64 %606, i64 0)
  %608 = icmp ne i64 %607, 0
  br i1 %608, label %609, label %610

609:                                              ; preds = %597
  br label %984

610:                                              ; preds = %597
  br label %285

611:                                              ; preds = %585
  br label %612

612:                                              ; preds = %611
  %613 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %614 = zext i8 %613 to i32
  %615 = and i32 %614, 1
  %616 = icmp ne i32 %615, 0
  %617 = xor i1 %616, true
  %618 = xor i1 %617, true
  %619 = zext i1 %618 to i32
  %620 = sext i32 %619 to i64
  %621 = call i64 @llvm.expect.i64(i64 %620, i64 1)
  %622 = icmp ne i64 %621, 0
  br i1 %622, label %623, label %650

623:                                              ; preds = %612
  br label %624

624:                                              ; preds = %623
  %625 = load ptr, ptr %3, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.MDBX_txn, ptr %625, i32 0, i32 17
  %627 = getelementptr inbounds %struct.anon.5, ptr %626, i32 0, i32 1
  %628 = load ptr, ptr %627, align 8, !tbaa !21
  %629 = load ptr, ptr %3, align 8, !tbaa !5
  %630 = getelementptr inbounds %struct.MDBX_txn, ptr %629, i32 0, i32 6
  %631 = getelementptr inbounds %struct.geo, ptr %630, i32 0, i32 5
  %632 = load i32, ptr %631, align 8, !tbaa !21
  %633 = sub i32 %632, 1
  %634 = zext i32 %633 to i64
  %635 = call zeroext i1 @pnl_check_allocated(ptr noundef %628, i64 noundef %634)
  %636 = xor i1 %635, true
  %637 = xor i1 %636, true
  %638 = xor i1 %637, true
  %639 = zext i1 %638 to i32
  %640 = sext i32 %639 to i64
  %641 = call i64 @llvm.expect.i64(i64 %640, i64 0)
  %642 = icmp ne i64 %641, 0
  br i1 %642, label %643, label %647

643:                                              ; preds = %624
  %644 = load ptr, ptr %3, align 8, !tbaa !5
  %645 = getelementptr inbounds %struct.MDBX_txn, ptr %644, i32 0, i32 9
  %646 = load ptr, ptr %645, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %646, ptr noundef @.str.4, ptr noundef @__func__.gc_update, i32 noundef 1453) #10
  unreachable

647:                                              ; preds = %624
  br label %648

648:                                              ; preds = %647
  br label %649

649:                                              ; preds = %648
  br label %650

650:                                              ; preds = %649, %612
  br label %651

651:                                              ; preds = %650
  br label %652

652:                                              ; preds = %651
  br label %653

653:                                              ; preds = %652
  %654 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %655 = zext i8 %654 to i32
  %656 = and i32 %655, 1
  %657 = icmp ne i32 %656, 0
  %658 = xor i1 %657, true
  %659 = xor i1 %658, true
  %660 = zext i1 %659 to i32
  %661 = sext i32 %660 to i64
  %662 = call i64 @llvm.expect.i64(i64 %661, i64 1)
  %663 = icmp ne i64 %662, 0
  br i1 %663, label %664, label %685

664:                                              ; preds = %653
  br label %665

665:                                              ; preds = %664
  %666 = load ptr, ptr %3, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.MDBX_txn, ptr %666, i32 0, i32 17
  %668 = getelementptr inbounds %struct.anon.5, ptr %667, i32 0, i32 10
  %669 = load i64, ptr %668, align 8, !tbaa !21
  %670 = icmp eq i64 %669, 0
  %671 = xor i1 %670, true
  %672 = xor i1 %671, true
  %673 = xor i1 %672, true
  %674 = zext i1 %673 to i32
  %675 = sext i32 %674 to i64
  %676 = call i64 @llvm.expect.i64(i64 %675, i64 0)
  %677 = icmp ne i64 %676, 0
  br i1 %677, label %678, label %682

678:                                              ; preds = %665
  %679 = load ptr, ptr %3, align 8, !tbaa !5
  %680 = getelementptr inbounds %struct.MDBX_txn, ptr %679, i32 0, i32 9
  %681 = load ptr, ptr %680, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %681, ptr noundef @.str.10, ptr noundef @__func__.gc_update, i32 noundef 1454) #10
  unreachable

682:                                              ; preds = %665
  br label %683

683:                                              ; preds = %682
  br label %684

684:                                              ; preds = %683
  br label %685

685:                                              ; preds = %684, %653
  br label %686

686:                                              ; preds = %685
  br label %687

687:                                              ; preds = %686
  %688 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %689 = zext i8 %688 to i32
  %690 = and i32 %689, 2
  %691 = icmp ne i32 %690, 0
  %692 = xor i1 %691, true
  %693 = xor i1 %692, true
  %694 = zext i1 %693 to i32
  %695 = sext i32 %694 to i64
  %696 = call i64 @llvm.expect.i64(i64 %695, i64 0)
  %697 = icmp ne i64 %696, 0
  br i1 %697, label %698, label %714

698:                                              ; preds = %687
  %699 = load ptr, ptr %3, align 8, !tbaa !5
  %700 = load ptr, ptr %4, align 8, !tbaa !5
  %701 = getelementptr inbounds %struct.gc_update_context, ptr %700, i32 0, i32 4
  %702 = load i64, ptr %701, align 8, !tbaa !38
  %703 = call i32 @audit_ex(ptr noundef %699, i64 noundef %702, i1 noundef zeroext false)
  store i32 %703, ptr %6, align 4, !tbaa !32
  %704 = load i32, ptr %6, align 4, !tbaa !32
  %705 = icmp ne i32 %704, 0
  %706 = xor i1 %705, true
  %707 = xor i1 %706, true
  %708 = zext i1 %707 to i32
  %709 = sext i32 %708 to i64
  %710 = call i64 @llvm.expect.i64(i64 %709, i64 0)
  %711 = icmp ne i64 %710, 0
  br i1 %711, label %712, label %713

712:                                              ; preds = %698
  br label %984

713:                                              ; preds = %698
  br label %714

714:                                              ; preds = %713, %687
  %715 = load ptr, ptr %3, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.MDBX_txn, ptr %715, i32 0, i32 17
  %717 = getelementptr inbounds %struct.anon.5, ptr %716, i32 0, i32 1
  %718 = load ptr, ptr %717, align 8, !tbaa !21
  %719 = getelementptr inbounds i32, ptr %718, i64 0
  %720 = load i32, ptr %719, align 4, !tbaa !32
  %721 = zext i32 %720 to i64
  %722 = load ptr, ptr %5, align 8, !tbaa !5
  %723 = getelementptr inbounds %struct.MDBX_env, ptr %722, i32 0, i32 28
  %724 = load i32, ptr %723, align 8, !tbaa !39
  %725 = zext i32 %724 to i64
  %726 = add i64 %721, %725
  %727 = load ptr, ptr %4, align 8, !tbaa !5
  %728 = getelementptr inbounds %struct.gc_update_context, ptr %727, i32 0, i32 5
  %729 = load i64, ptr %728, align 8, !tbaa !40
  %730 = icmp ule i64 %726, %729
  %731 = xor i1 %730, true
  %732 = xor i1 %731, true
  %733 = zext i1 %732 to i32
  %734 = sext i32 %733 to i64
  %735 = call i64 @llvm.expect.i64(i64 %734, i64 0)
  %736 = icmp ne i64 %735, 0
  br i1 %736, label %737, label %769

737:                                              ; preds = %714
  %738 = load ptr, ptr %4, align 8, !tbaa !5
  %739 = getelementptr inbounds %struct.gc_update_context, ptr %738, i32 0, i32 2
  %740 = load i8, ptr %739, align 8, !tbaa !41, !range !42, !noundef !43
  %741 = trunc i8 %740 to i1
  br i1 %741, label %769, label %742

742:                                              ; preds = %737
  br label %743

743:                                              ; preds = %742
  %744 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %745 = zext i8 %744 to i32
  %746 = icmp sle i32 6, %745
  %747 = xor i1 %746, true
  %748 = xor i1 %747, true
  %749 = zext i1 %748 to i32
  %750 = sext i32 %749 to i64
  %751 = call i64 @llvm.expect.i64(i64 %750, i64 0)
  %752 = icmp ne i64 %751, 0
  br i1 %752, label %753, label %766

753:                                              ; preds = %743
  %754 = load ptr, ptr %4, align 8, !tbaa !5
  %755 = call ptr @dbg_prefix(ptr noundef %754) #9
  %756 = load ptr, ptr %3, align 8, !tbaa !5
  %757 = getelementptr inbounds %struct.MDBX_txn, ptr %756, i32 0, i32 17
  %758 = getelementptr inbounds %struct.anon.5, ptr %757, i32 0, i32 1
  %759 = load ptr, ptr %758, align 8, !tbaa !21
  %760 = getelementptr inbounds i32, ptr %759, i64 0
  %761 = load i32, ptr %760, align 4, !tbaa !32
  %762 = zext i32 %761 to i64
  %763 = load ptr, ptr %4, align 8, !tbaa !5
  %764 = getelementptr inbounds %struct.gc_update_context, ptr %763, i32 0, i32 5
  %765 = load i64, ptr %764, align 8, !tbaa !40
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1464, ptr noundef @.str.11, ptr noundef %755, i64 noundef %762, i64 noundef %765)
  br label %766

766:                                              ; preds = %753, %743
  br label %767

767:                                              ; preds = %766
  br label %768

768:                                              ; preds = %767
  br label %83

769:                                              ; preds = %737, %714
  %770 = load ptr, ptr %4, align 8, !tbaa !5
  %771 = getelementptr inbounds %struct.gc_update_context, ptr %770, i32 0, i32 6
  %772 = load i64, ptr %771, align 8, !tbaa !44
  %773 = load ptr, ptr %3, align 8, !tbaa !5
  %774 = getelementptr inbounds %struct.MDBX_txn, ptr %773, i32 0, i32 17
  %775 = getelementptr inbounds %struct.anon.5, ptr %774, i32 0, i32 1
  %776 = load ptr, ptr %775, align 8, !tbaa !21
  %777 = getelementptr inbounds i32, ptr %776, i64 0
  %778 = load i32, ptr %777, align 4, !tbaa !32
  %779 = zext i32 %778 to i64
  %780 = icmp ult i64 %772, %779
  br i1 %780, label %781, label %830

781:                                              ; preds = %769
  br label %782

782:                                              ; preds = %781
  %783 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %784 = zext i8 %783 to i32
  %785 = icmp sle i32 6, %784
  %786 = xor i1 %785, true
  %787 = xor i1 %786, true
  %788 = zext i1 %787 to i32
  %789 = sext i32 %788 to i64
  %790 = call i64 @llvm.expect.i64(i64 %789, i64 0)
  %791 = icmp ne i64 %790, 0
  br i1 %791, label %792, label %810

792:                                              ; preds = %782
  %793 = load ptr, ptr %4, align 8, !tbaa !5
  %794 = getelementptr inbounds %struct.gc_update_context, ptr %793, i32 0, i32 5
  %795 = load i64, ptr %794, align 8, !tbaa !40
  %796 = load ptr, ptr %4, align 8, !tbaa !5
  %797 = getelementptr inbounds %struct.gc_update_context, ptr %796, i32 0, i32 6
  %798 = load i64, ptr %797, align 8, !tbaa !44
  %799 = load ptr, ptr %3, align 8, !tbaa !5
  %800 = getelementptr inbounds %struct.MDBX_txn, ptr %799, i32 0, i32 17
  %801 = getelementptr inbounds %struct.anon.5, ptr %800, i32 0, i32 1
  %802 = load ptr, ptr %801, align 8, !tbaa !21
  %803 = getelementptr inbounds i32, ptr %802, i64 0
  %804 = load i32, ptr %803, align 4, !tbaa !32
  %805 = zext i32 %804 to i64
  %806 = load ptr, ptr %4, align 8, !tbaa !5
  %807 = getelementptr inbounds %struct.gc_update_context, ptr %806, i32 0, i32 6
  %808 = load i64, ptr %807, align 8, !tbaa !44
  %809 = sub i64 %805, %808
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1471, ptr noundef @.str.12, ptr noundef @.str.13, i64 noundef %795, i64 noundef %798, ptr noundef @.str.14, i64 noundef %809)
  br label %810

810:                                              ; preds = %792, %782
  br label %811

811:                                              ; preds = %810
  br label %812

812:                                              ; preds = %811
  %813 = load ptr, ptr %3, align 8, !tbaa !5
  %814 = load ptr, ptr %4, align 8, !tbaa !5
  %815 = call i32 @gc_rerere(ptr noundef %813, ptr noundef %814)
  store i32 %815, ptr %6, align 4, !tbaa !32
  %816 = load i32, ptr %6, align 4, !tbaa !32
  %817 = icmp ne i32 %816, 0
  %818 = xor i1 %817, true
  %819 = xor i1 %818, true
  %820 = zext i1 %819 to i32
  %821 = sext i32 %820 to i64
  %822 = call i64 @llvm.expect.i64(i64 %821, i64 0)
  %823 = icmp ne i64 %822, 0
  br i1 %823, label %824, label %829

824:                                              ; preds = %812
  %825 = load i32, ptr %6, align 4, !tbaa !32
  %826 = icmp eq i32 %825, -1
  br i1 %826, label %827, label %828

827:                                              ; preds = %824
  br label %83

828:                                              ; preds = %824
  br label %984

829:                                              ; preds = %812
  br label %285

830:                                              ; preds = %769
  %831 = load ptr, ptr %3, align 8, !tbaa !5
  %832 = getelementptr inbounds %struct.MDBX_txn, ptr %831, i32 0, i32 17
  %833 = getelementptr inbounds %struct.anon.5, ptr %832, i32 0, i32 1
  %834 = load ptr, ptr %833, align 8, !tbaa !21
  %835 = getelementptr inbounds i32, ptr %834, i64 0
  %836 = load i32, ptr %835, align 4, !tbaa !32
  %837 = zext i32 %836 to i64
  %838 = icmp ugt i64 %837, 0
  br i1 %838, label %839, label %884

839:                                              ; preds = %830
  br label %840

840:                                              ; preds = %839
  %841 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %842 = zext i8 %841 to i32
  %843 = icmp sle i32 6, %842
  %844 = xor i1 %843, true
  %845 = xor i1 %844, true
  %846 = zext i1 %845 to i32
  %847 = sext i32 %846 to i64
  %848 = call i64 @llvm.expect.i64(i64 %847, i64 0)
  %849 = icmp ne i64 %848, 0
  br i1 %849, label %850, label %864

850:                                              ; preds = %840
  %851 = load ptr, ptr %3, align 8, !tbaa !5
  %852 = getelementptr inbounds %struct.MDBX_txn, ptr %851, i32 0, i32 17
  %853 = getelementptr inbounds %struct.anon.5, ptr %852, i32 0, i32 1
  %854 = load ptr, ptr %853, align 8, !tbaa !21
  %855 = getelementptr inbounds i32, ptr %854, i64 0
  %856 = load i32, ptr %855, align 4, !tbaa !32
  %857 = zext i32 %856 to i64
  %858 = load ptr, ptr %4, align 8, !tbaa !5
  %859 = getelementptr inbounds %struct.gc_update_context, ptr %858, i32 0, i32 5
  %860 = load i64, ptr %859, align 8, !tbaa !40
  %861 = load ptr, ptr %4, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.gc_update_context, ptr %861, i32 0, i32 6
  %863 = load i64, ptr %862, align 8, !tbaa !44
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1483, ptr noundef @.str.15, ptr noundef @.str.16, ptr noundef @.str.17, i64 noundef %857, i64 noundef %860, i64 noundef %863)
  br label %864

864:                                              ; preds = %850, %840
  br label %865

865:                                              ; preds = %864
  br label %866

866:                                              ; preds = %865
  %867 = load ptr, ptr %3, align 8, !tbaa !5
  %868 = load ptr, ptr %4, align 8, !tbaa !5
  %869 = call i32 @gc_fill_returned(ptr noundef %867, ptr noundef %868)
  store i32 %869, ptr %6, align 4, !tbaa !32
  %870 = load i32, ptr %6, align 4, !tbaa !32
  %871 = icmp ne i32 %870, 0
  %872 = xor i1 %871, true
  %873 = xor i1 %872, true
  %874 = zext i1 %873 to i32
  %875 = sext i32 %874 to i64
  %876 = call i64 @llvm.expect.i64(i64 %875, i64 0)
  %877 = icmp ne i64 %876, 0
  br i1 %877, label %878, label %883

878:                                              ; preds = %866
  %879 = load i32, ptr %6, align 4, !tbaa !32
  %880 = icmp eq i32 %879, -1
  br i1 %880, label %881, label %882

881:                                              ; preds = %878
  br label %83

882:                                              ; preds = %878
  br label %984

883:                                              ; preds = %866
  br label %884

884:                                              ; preds = %883, %830
  br label %885

885:                                              ; preds = %884
  br label %886

886:                                              ; preds = %885
  %887 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %888 = zext i8 %887 to i32
  %889 = and i32 %888, 1
  %890 = icmp ne i32 %889, 0
  %891 = xor i1 %890, true
  %892 = xor i1 %891, true
  %893 = zext i1 %892 to i32
  %894 = sext i32 %893 to i64
  %895 = call i64 @llvm.expect.i64(i64 %894, i64 1)
  %896 = icmp ne i64 %895, 0
  br i1 %896, label %897, label %915

897:                                              ; preds = %886
  br label %898

898:                                              ; preds = %897
  %899 = load i32, ptr %6, align 4, !tbaa !32
  %900 = icmp eq i32 %899, 0
  %901 = xor i1 %900, true
  %902 = xor i1 %901, true
  %903 = xor i1 %902, true
  %904 = zext i1 %903 to i32
  %905 = sext i32 %904 to i64
  %906 = call i64 @llvm.expect.i64(i64 %905, i64 0)
  %907 = icmp ne i64 %906, 0
  br i1 %907, label %908, label %912

908:                                              ; preds = %898
  %909 = load ptr, ptr %3, align 8, !tbaa !5
  %910 = getelementptr inbounds %struct.MDBX_txn, ptr %909, i32 0, i32 9
  %911 = load ptr, ptr %910, align 8, !tbaa !19
  call void @mdbx_assert_fail(ptr noundef %911, ptr noundef @.str.18, ptr noundef @__func__.gc_update, i32 noundef 1494) #10
  unreachable

912:                                              ; preds = %898
  br label %913

913:                                              ; preds = %912
  br label %914

914:                                              ; preds = %913
  br label %915

915:                                              ; preds = %914, %886
  br label %916

916:                                              ; preds = %915
  br label %917

917:                                              ; preds = %916
  %918 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %919 = zext i8 %918 to i32
  %920 = and i32 %919, 2
  %921 = icmp ne i32 %920, 0
  %922 = xor i1 %921, true
  %923 = xor i1 %922, true
  %924 = zext i1 %923 to i32
  %925 = sext i32 %924 to i64
  %926 = call i64 @llvm.expect.i64(i64 %925, i64 0)
  %927 = icmp ne i64 %926, 0
  br i1 %927, label %928, label %952

928:                                              ; preds = %917
  %929 = load ptr, ptr %3, align 8, !tbaa !5
  %930 = load ptr, ptr %4, align 8, !tbaa !5
  %931 = getelementptr inbounds %struct.gc_update_context, ptr %930, i32 0, i32 4
  %932 = load i64, ptr %931, align 8, !tbaa !38
  %933 = load ptr, ptr %3, align 8, !tbaa !5
  %934 = getelementptr inbounds %struct.MDBX_txn, ptr %933, i32 0, i32 17
  %935 = getelementptr inbounds %struct.anon.5, ptr %934, i32 0, i32 1
  %936 = load ptr, ptr %935, align 8, !tbaa !21
  %937 = getelementptr inbounds i32, ptr %936, i64 0
  %938 = load i32, ptr %937, align 4, !tbaa !32
  %939 = zext i32 %938 to i64
  %940 = add i64 %932, %939
  %941 = call i32 @audit_ex(ptr noundef %929, i64 noundef %940, i1 noundef zeroext true)
  store i32 %941, ptr %6, align 4, !tbaa !32
  %942 = load i32, ptr %6, align 4, !tbaa !32
  %943 = icmp ne i32 %942, 0
  %944 = xor i1 %943, true
  %945 = xor i1 %944, true
  %946 = zext i1 %945 to i32
  %947 = sext i32 %946 to i64
  %948 = call i64 @llvm.expect.i64(i64 %947, i64 0)
  %949 = icmp ne i64 %948, 0
  br i1 %949, label %950, label %951

950:                                              ; preds = %928
  br label %984

951:                                              ; preds = %928
  br label %952

952:                                              ; preds = %951, %917
  %953 = load ptr, ptr %3, align 8, !tbaa !5
  %954 = getelementptr inbounds %struct.MDBX_txn, ptr %953, i32 0, i32 17
  %955 = getelementptr inbounds %struct.anon.5, ptr %954, i32 0, i32 10
  %956 = load i64, ptr %955, align 8, !tbaa !21
  %957 = icmp ugt i64 %956, 0
  %958 = xor i1 %957, true
  %959 = xor i1 %958, true
  %960 = zext i1 %959 to i32
  %961 = sext i32 %960 to i64
  %962 = call i64 @llvm.expect.i64(i64 %961, i64 0)
  %963 = icmp ne i64 %962, 0
  br i1 %963, label %964, label %983

964:                                              ; preds = %952
  br label %965

965:                                              ; preds = %964
  %966 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %967 = zext i8 %966 to i32
  %968 = icmp sle i32 5, %967
  %969 = xor i1 %968, true
  %970 = xor i1 %969, true
  %971 = zext i1 %970 to i32
  %972 = sext i32 %971 to i64
  %973 = call i64 @llvm.expect.i64(i64 %972, i64 0)
  %974 = icmp ne i64 %973, 0
  br i1 %974, label %975, label %980

975:                                              ; preds = %965
  %976 = load ptr, ptr %3, align 8, !tbaa !5
  %977 = getelementptr inbounds %struct.MDBX_txn, ptr %976, i32 0, i32 17
  %978 = getelementptr inbounds %struct.anon.5, ptr %977, i32 0, i32 10
  %979 = load i64, ptr %978, align 8, !tbaa !21
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.gc_update, i32 noundef 1501, ptr noundef @.str.19, i64 noundef %979)
  br label %980

980:                                              ; preds = %975, %965
  br label %981

981:                                              ; preds = %980
  br label %982

982:                                              ; preds = %981
  br label %83

983:                                              ; preds = %952
  br label %984

984:                                              ; preds = %983, %950, %882, %828, %712, %609, %548, %523, %452, %353, %283, %263, %235, %80
  %985 = load ptr, ptr %4, align 8, !tbaa !5
  %986 = getelementptr inbounds %struct.gc_update_context, ptr %985, i32 0, i32 12
  %987 = getelementptr inbounds %struct.MDBX_cursor, ptr %986, i32 0, i32 11
  %988 = load ptr, ptr %987, align 8, !tbaa !21
  %989 = load ptr, ptr %3, align 8, !tbaa !5
  %990 = getelementptr inbounds %struct.MDBX_txn, ptr %989, i32 0, i32 14
  %991 = load ptr, ptr %990, align 8, !tbaa !20
  %992 = getelementptr inbounds ptr, ptr %991, i64 0
  store ptr %988, ptr %992, align 8, !tbaa !5
  br label %993

993:                                              ; preds = %984
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #8
  store i64 0, ptr %7, align 8, !tbaa !45
  br label %994

994:                                              ; preds = %993
  %995 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !31
  %996 = zext i8 %995 to i32
  %997 = and i32 %996, 1
  %998 = icmp ne i32 %997, 0
  %999 = xor i1 %998, true
  %1000 = xor i1 %999, true
  %1001 = zext i1 %1000 to i32
  %1002 = sext i32 %1001 to i64
  %1003 = call i64 @llvm.expect.i64(i64 %1002, i64 1)
  %1004 = icmp ne i64 %1003, 0
  br i1 %1004, label %1005, label %1009

1005:                                             ; preds = %994
  br label %1006

1006:                                             ; preds = %1005
  br label %1007

1007:                                             ; preds = %1006
  br label %1008

1008:                                             ; preds = %1007
  br label %1009

1009:                                             ; preds = %1008, %994
  br label %1010

1010:                                             ; preds = %1009
  br label %1011

1011:                                             ; preds = %1010
  %1012 = load ptr, ptr %3, align 8, !tbaa !5
  %1013 = getelementptr inbounds %struct.MDBX_txn, ptr %1012, i32 0, i32 17
  %1014 = getelementptr inbounds %struct.anon.5, ptr %1013, i32 0, i32 1
  %1015 = load ptr, ptr %1014, align 8, !tbaa !21
  %1016 = getelementptr inbounds i32, ptr %1015, i64 0
  store i32 0, ptr %1016, align 4, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #8
  br label %1017

1017:                                             ; preds = %1011
  br label %1018

1018:                                             ; preds = %1017
  br label %1019

1019:                                             ; preds = %1018
  %1020 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !9
  %1021 = zext i8 %1020 to i32
  %1022 = icmp sle i32 6, %1021
  %1023 = xor i1 %1022, true
  %1024 = xor i1 %1023, true
  %1025 = zext i1 %1024 to i32
  %1026 = sext i32 %1025 to i64
  %1027 = call i64 @llvm.expect.i64(i64 %1026, i64 0)
  %1028 = icmp ne i64 %1027, 0
  br i1 %1028, label %1029, label %1034

1029:                                             ; preds = %1019
  %1030 = load ptr, ptr %4, align 8, !tbaa !5
  %1031 = getelementptr inbounds %struct.gc_update_context, ptr %1030, i32 0, i32 0
  %1032 = load i32, ptr %1031, align 8, !tbaa !37
  %1033 = load i32, ptr %6, align 4, !tbaa !32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.gc_update, i32 noundef 1512, ptr noundef @.str.20, i32 noundef %1032, i32 noundef %1033)
  br label %1034

1034:                                             ; preds = %1029, %1019
  br label %1035

1035:                                             ; preds = %1034
  br label %1036

1036:                                             ; preds = %1035
  %1037 = load i32, ptr %6, align 4, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #8
  ret i32 %1037
}

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

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

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

declare zeroext i1 @txn_gc_detent(ptr noundef) #2

declare i32 @audit_ex(ptr noundef, i64 noundef, i1 noundef zeroext) #2

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @pnl_check_allocated(ptr noundef, i64 noundef) #5

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

declare zeroext i1 @dpl_check(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_clean_stored_retired(ptr noundef, ptr noundef) #0

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

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

declare zeroext i1 @txn_refund(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_merge_loose(ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_store_retired(ptr noundef, ptr noundef) #0

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

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_rerere(ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_fill_returned(ptr noundef, ptr noundef) #0

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !7, i64 26}
!10 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !12, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !13, i64 80, !6, i64 88}
!11 = !{!"int", !7, i64 0}
!12 = !{!"_Bool", !7, i64 0}
!13 = !{!"long", !7, i64 0}
!14 = !{!15, !13, i64 64}
!15 = !{!"MDBX_txn", !11, i64 0, !11, i64 4, !13, i64 8, !13, i64 16, !6, i64 24, !6, i64 32, !16, i64 40, !13, i64 64, !13, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !18, i64 128, !6, i64 160, !7, i64 168}
!16 = !{!"geo", !17, i64 0, !17, i64 2, !11, i64 4, !11, i64 8, !7, i64 12, !7, i64 16}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MDBX_canary", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24}
!19 = !{!15, !6, i64 80}
!20 = !{!15, !6, i64 120}
!21 = !{!7, !7, i64 0}
!22 = !{!23, !13, i64 392}
!23 = !{!"MDBX_env", !7, i64 0, !11, i64 4, !11, i64 8, !24, i64 16, !11, i64 56, !11, i64 60, !24, i64 64, !6, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !11, i64 132, !11, i64 136, !11, i64 140, !11, i64 144, !25, i64 152, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !11, i64 224, !11, i64 228, !11, i64 232, !6, i64 240, !6, i64 248, !13, i64 256, !26, i64 264, !28, i64 320, !12, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !29, i64 392, !7, i64 400, !11, i64 440, !11, i64 444, !6, i64 448, !30, i64 456, !7, i64 496, !7, i64 536}
!24 = !{!"osal_mmap", !7, i64 0, !11, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!25 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!26 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !13, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !11, i64 28, !11, i64 32, !12, i64 36, !12, i64 37, !12, i64 38, !27, i64 40, !7, i64 48}
!27 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!28 = !{!"", !13, i64 0, !13, i64 8, !13, i64 16, !13, i64 24, !13, i64 32}
!29 = !{!"", !13, i64 0}
!30 = !{!"osal_ioring", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!31 = !{!10, !7, i64 25}
!32 = !{!11, !11, i64 0}
!33 = !{!34, !11, i64 12}
!34 = !{!"gc_update_context", !11, i64 0, !11, i64 4, !12, i64 8, !11, i64 12, !13, i64 16, !13, i64 24, !13, i64 32, !13, i64 40, !13, i64 48, !35, i64 56, !35, i64 184, !13, i64 312, !7, i64 320, !36, i64 1144}
!35 = !{!"MDBX_rkl", !13, i64 0, !13, i64 8, !11, i64 16, !11, i64 20, !6, i64 24, !7, i64 32}
!36 = !{!"gc_dense_histogram", !11, i64 0, !7, i64 4}
!37 = !{!34, !11, i64 0}
!38 = !{!34, !13, i64 16}
!39 = !{!23, !11, i64 224}
!40 = !{!34, !13, i64 24}
!41 = !{!34, !12, i64 8}
!42 = !{i8 0, i8 2}
!43 = !{}
!44 = !{!34, !13, i64 32}
!45 = !{!13, !13, i64 0}


; 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.17 }
%struct.anon.17 = 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__.gc_update = external hidden unnamed_addr constant [10 x i8], align 1
@.str = external hidden unnamed_addr constant [11 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [1 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [4 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [12 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [8 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [24 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @gc_update(ptr noundef %0, ptr noundef %1) local_unnamed_addr #0 {
  %3 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %4 = icmp ugt i8 %3, 5
  br i1 %4, label %5, label %8, !prof !13

5:                                                ; preds = %2
  %6 = getelementptr inbounds i8, ptr %0, i64 64
  %7 = load i64, ptr %6, align 8, !tbaa !14
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1365, ptr noundef nonnull @.str, i64 noundef %7) #6
  br label %8

8:                                                ; preds = %2, %5
  %9 = getelementptr inbounds i8, ptr %0, i64 80
  %10 = load ptr, ptr %9, align 8, !tbaa !19
  %11 = getelementptr inbounds i8, ptr %0, i64 120
  %12 = load ptr, ptr %11, align 8, !tbaa !20
  %13 = load ptr, ptr %12, align 8, !tbaa !21
  %14 = getelementptr inbounds i8, ptr %1, i64 320
  %15 = getelementptr inbounds i8, ptr %1, i64 688
  store ptr %13, ptr %15, align 8, !tbaa !22
  %16 = load ptr, ptr %11, align 8, !tbaa !20
  store ptr %14, ptr %16, align 8, !tbaa !21
  %17 = load ptr, ptr %9, align 8, !tbaa !19
  %18 = getelementptr inbounds i8, ptr %17, i64 392
  %19 = load i64, ptr %18, align 8, !tbaa !23
  %.not = icmp eq i64 %19, 0
  br i1 %.not, label %20, label %22, !prof !13

20:                                               ; preds = %8
  %21 = tail call zeroext i1 @txn_gc_detent(ptr noundef nonnull %0) #6
  br label %22

22:                                               ; preds = %20, %8
  %23 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %24 = and i8 %23, 2
  %.not140 = icmp eq i8 %24, 0
  br i1 %.not140, label %27, label %25, !prof !33

25:                                               ; preds = %22
  %26 = tail call i32 @audit_ex(ptr noundef nonnull %0, i64 noundef 0, i1 noundef zeroext false) #6
  %.not141 = icmp eq i32 %26, 0
  br i1 %.not141, label %27, label %.loopexit, !prof !33

27:                                               ; preds = %25, %22
  %28 = getelementptr inbounds i8, ptr %1, i64 12
  %29 = getelementptr inbounds i8, ptr %0, i64 56
  %30 = getelementptr inbounds i8, ptr %0, i64 208
  %31 = getelementptr inbounds i8, ptr %0, i64 200
  %32 = getelementptr inbounds i8, ptr %1, i64 16
  %33 = getelementptr inbounds i8, ptr %0, i64 512
  %34 = getelementptr inbounds i8, ptr %0, i64 504
  %35 = getelementptr inbounds i8, ptr %0, i64 520
  %36 = getelementptr inbounds i8, ptr %10, i64 224
  %37 = getelementptr inbounds i8, ptr %1, i64 24
  %38 = getelementptr inbounds i8, ptr %1, i64 8
  %39 = getelementptr inbounds i8, ptr %1, i64 32
  br label %.backedge177

.backedge177:                                     ; preds = %.backedge177.backedge, %27
  %40 = load i32, ptr %28, align 4, !tbaa !34
  %41 = load i32, ptr %29, align 8, !tbaa !22
  %42 = icmp ule i32 %40, %41
  %43 = zext i1 %42 to i32
  %44 = load i32, ptr %1, align 8, !tbaa !38
  %45 = add i32 %44, %43
  store i32 %45, ptr %1, align 8, !tbaa !38
  %46 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %47 = icmp ugt i8 %46, 5
  br i1 %47, label %48, label %55, !prof !13

48:                                               ; preds = %.backedge177
  %49 = icmp ugt i32 %45, 1
  %50 = select i1 %49, ptr @.str.2, ptr @.str.3
  %51 = tail call i64 @rkl_len(ptr noundef nonnull %30) #7
  %52 = load ptr, ptr %9, align 8, !tbaa !19
  %53 = getelementptr inbounds i8, ptr %52, i64 392
  %54 = load i64, ptr %53, align 8, !tbaa !23
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1386, ptr noundef nonnull @.str.1, ptr noundef nonnull %50, i32 noundef %45, i64 noundef %51, i64 noundef %54) #6
  br label %55

55:                                               ; preds = %.backedge177, %48
  %56 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %57 = and i8 %56, 1
  %.not142 = icmp eq i8 %57, 0
  br i1 %.not142, label %.thread, label %58, !prof !13

58:                                               ; preds = %55
  %59 = load ptr, ptr %31, align 8, !tbaa !22
  %60 = load i32, ptr %29, align 8, !tbaa !22
  %61 = add i32 %60, -1
  %62 = zext i32 %61 to i64
  %63 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %59, i64 noundef %62)
  br i1 %63, label %66, label %64, !prof !33

64:                                               ; preds = %58
  %65 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %65, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.gc_update, i32 noundef 1388) #8
  unreachable

66:                                               ; preds = %58
  %.pre = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %.pre237 = and i8 %.pre, 1
  %.not143 = icmp eq i8 %.pre237, 0
  br i1 %.not143, label %.thread, label %67, !prof !39

67:                                               ; preds = %66
  %68 = tail call zeroext i1 @dpl_check(ptr noundef nonnull %0) #6
  br i1 %68, label %.thread, label %69, !prof !33

69:                                               ; preds = %67
  %70 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %70, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.gc_update, i32 noundef 1389) #8
  unreachable

.thread:                                          ; preds = %55, %67, %66
  %71 = load i32, ptr %1, align 8, !tbaa !38
  %72 = icmp ugt i32 %71, 12
  br i1 %72, label %73, label %78, !prof !13

73:                                               ; preds = %.thread
  %74 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %.not173 = icmp eq i8 %74, 0
  br i1 %.not173, label %.loopexit, label %75, !prof !33

75:                                               ; preds = %73
  %76 = getelementptr inbounds i8, ptr %0, i64 64
  %77 = load i64, ptr %76, align 8, !tbaa !14
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.gc_update, i32 noundef 1391, ptr noundef nonnull @.str.6, i64 noundef %77, i32 noundef %71) #6
  br label %.loopexit

78:                                               ; preds = %.thread
  %79 = load i32, ptr %28, align 4, !tbaa !34
  %80 = load i32, ptr %29, align 8, !tbaa !22
  %81 = icmp ugt i32 %79, %80
  br i1 %81, label %82, label %84, !prof !13

82:                                               ; preds = %78
  %83 = tail call i32 @gc_clean_stored_retired(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %.not144 = icmp eq i32 %83, 0
  br i1 %.not144, label %._crit_edge227, label %.loopexit, !prof !33

._crit_edge227:                                   ; preds = %82
  %.pre228 = load i32, ptr %29, align 8, !tbaa !22
  br label %84

84:                                               ; preds = %._crit_edge227, %78
  %85 = phi i32 [ %.pre228, %._crit_edge227 ], [ %80, %78 ]
  store i32 %85, ptr %28, align 4, !tbaa !34
  %86 = tail call i32 @gc_clear_returned(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %.not145 = icmp eq i32 %86, 0
  br i1 %.not145, label %.preheader, label %.loopexit, !prof !33

.preheader:                                       ; preds = %84, %.preheader.backedge
  %87 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %88 = icmp ugt i8 %87, 5
  br i1 %88, label %89, label %90, !prof !13

89:                                               ; preds = %.preheader
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1409, ptr noundef nonnull @.str.7, ptr noundef nonnull @.str.8) #6
  br label %90

90:                                               ; preds = %.preheader, %89
  %91 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %92 = and i8 %91, 1
  %.not146 = icmp eq i8 %92, 0
  br i1 %.not146, label %101, label %93, !prof !13

93:                                               ; preds = %90
  %94 = load ptr, ptr %31, align 8, !tbaa !22
  %95 = load i32, ptr %29, align 8, !tbaa !22
  %96 = add i32 %95, -1
  %97 = zext i32 %96 to i64
  %98 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %94, i64 noundef %97)
  br i1 %98, label %101, label %99, !prof !33

99:                                               ; preds = %93
  %100 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %100, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.gc_update, i32 noundef 1411) #8
  unreachable

101:                                              ; preds = %93, %90
  %102 = tail call i32 @gc_clear_reclaimed(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %.not147 = icmp eq i32 %102, 0
  br i1 %.not147, label %103, label %.loopexit, !prof !33

103:                                              ; preds = %101
  %104 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %105 = and i8 %104, 1
  %.not148 = icmp eq i8 %105, 0
  br i1 %.not148, label %.thread244, label %106, !prof !13

106:                                              ; preds = %103
  %107 = load ptr, ptr %31, align 8, !tbaa !22
  %108 = load i32, ptr %29, align 8, !tbaa !22
  %109 = add i32 %108, -1
  %110 = zext i32 %109 to i64
  %111 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %107, i64 noundef %110)
  br i1 %111, label %114, label %112, !prof !33

112:                                              ; preds = %106
  %113 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %113, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.gc_update, i32 noundef 1416) #8
  unreachable

114:                                              ; preds = %106
  %.pre230 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %.pre238 = and i8 %.pre230, 1
  %.not149 = icmp eq i8 %.pre238, 0
  br i1 %.not149, label %.thread244, label %115, !prof !39

115:                                              ; preds = %114
  %116 = tail call zeroext i1 @dpl_check(ptr noundef nonnull %0) #6
  br i1 %116, label %._crit_edge231, label %117, !prof !33

._crit_edge231:                                   ; preds = %115
  %.pre232 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  br label %.thread244

117:                                              ; preds = %115
  %118 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %118, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.gc_update, i32 noundef 1417) #8
  unreachable

.thread244:                                       ; preds = %103, %._crit_edge231, %114
  %119 = phi i8 [ %.pre232, %._crit_edge231 ], [ %.pre230, %114 ], [ %104, %103 ]
  %120 = and i8 %119, 2
  %.not150 = icmp eq i8 %120, 0
  br i1 %.not150, label %124, label %121, !prof !33

121:                                              ; preds = %.thread244
  %122 = load i64, ptr %32, align 8, !tbaa !40
  %123 = tail call i32 @audit_ex(ptr noundef %0, i64 noundef %122, i1 noundef zeroext false) #6
  %.not151 = icmp eq i32 %123, 0
  br i1 %.not151, label %124, label %.loopexit, !prof !33

124:                                              ; preds = %121, %.thread244
  %125 = tail call zeroext i1 @txn_refund(ptr noundef %0) #6
  br i1 %125, label %126, label %143

126:                                              ; preds = %124
  %127 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %128 = and i8 %127, 1
  %.not152 = icmp eq i8 %128, 0
  br i1 %.not152, label %137, label %129, !prof !13

129:                                              ; preds = %126
  %130 = load ptr, ptr %31, align 8, !tbaa !22
  %131 = load i32, ptr %29, align 8, !tbaa !22
  %132 = add i32 %131, -1
  %133 = zext i32 %132 to i64
  %134 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %130, i64 noundef %133)
  br i1 %134, label %._crit_edge233, label %135, !prof !33

._crit_edge233:                                   ; preds = %129
  %.pre234 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  br label %137

135:                                              ; preds = %129
  %136 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %136, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.gc_update, i32 noundef 1426) #8
  unreachable

137:                                              ; preds = %._crit_edge233, %126
  %138 = phi i8 [ %.pre234, %._crit_edge233 ], [ %127, %126 ]
  %139 = and i8 %138, 2
  %.not153 = icmp eq i8 %139, 0
  br i1 %.not153, label %143, label %140, !prof !33

140:                                              ; preds = %137
  %141 = load i64, ptr %32, align 8, !tbaa !40
  %142 = tail call i32 @audit_ex(ptr noundef %0, i64 noundef %141, i1 noundef zeroext false) #6
  %.not154 = icmp eq i32 %142, 0
  br i1 %.not154, label %143, label %.loopexit, !prof !33

143:                                              ; preds = %137, %140, %124
  %144 = load ptr, ptr %33, align 8, !tbaa !22
  %.not155 = icmp eq ptr %144, null
  br i1 %.not155, label %154, label %145

145:                                              ; preds = %143
  %146 = tail call i32 @gc_merge_loose(ptr noundef nonnull %0, ptr noundef nonnull %1)
  switch i32 %146, label %.loopexit [
    i32 0, label %147
    i32 -1, label %.preheader.backedge
  ], !prof !41

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

150:                                              ; preds = %147
  %151 = load ptr, ptr %33, align 8, !tbaa !22
  %.not158 = icmp eq ptr %151, null
  br i1 %.not158, label %154, label %152, !prof !33

152:                                              ; preds = %150
  %153 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %153, ptr noundef nonnull @.str.9, ptr noundef nonnull @__func__.gc_update, i32 noundef 1442) #8
  unreachable

154:                                              ; preds = %147, %150, %143
  %155 = load i64, ptr %32, align 8, !tbaa !40
  %156 = load ptr, ptr %34, align 8, !tbaa !22
  %157 = load i32, ptr %156, align 4, !tbaa !42
  %158 = zext i32 %157 to i64
  %159 = icmp ult i64 %155, %158
  br i1 %159, label %160, label %162

160:                                              ; preds = %154
  %161 = tail call i32 @gc_store_retired(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %.not172 = icmp eq i32 %161, 0
  br i1 %.not172, label %.preheader.backedge, label %.loopexit, !prof !33

.preheader.backedge:                              ; preds = %160, %145, %207
  br label %.preheader

162:                                              ; preds = %154
  %163 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %164 = and i8 %163, 1
  %.not159 = icmp eq i8 %164, 0
  br i1 %.not159, label %.thread247, label %165, !prof !13

165:                                              ; preds = %162
  %166 = load ptr, ptr %31, align 8, !tbaa !22
  %167 = load i32, ptr %29, align 8, !tbaa !22
  %168 = add i32 %167, -1
  %169 = zext i32 %168 to i64
  %170 = tail call zeroext i1 @pnl_check_allocated(ptr noundef %166, i64 noundef %169)
  br i1 %170, label %173, label %171, !prof !33

171:                                              ; preds = %165
  %172 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %172, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.gc_update, i32 noundef 1453) #8
  unreachable

173:                                              ; preds = %165
  %.pre236 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %.pre240 = and i8 %.pre236, 1
  %.not160 = icmp eq i8 %.pre240, 0
  br i1 %.not160, label %.thread247, label %174, !prof !39

174:                                              ; preds = %173
  %175 = load i64, ptr %35, align 8, !tbaa !22
  %.not161 = icmp eq i64 %175, 0
  br i1 %.not161, label %.thread247, label %176, !prof !33

176:                                              ; preds = %174
  %177 = load ptr, ptr %9, align 8, !tbaa !19
  tail call void @mdbx_assert_fail(ptr noundef %177, ptr noundef nonnull @.str.10, ptr noundef nonnull @__func__.gc_update, i32 noundef 1454) #8
  unreachable

.thread247:                                       ; preds = %162, %174, %173
  %178 = phi i8 [ %.pre236, %174 ], [ %.pre236, %173 ], [ %163, %162 ]
  %179 = and i8 %178, 2
  %.not162 = icmp eq i8 %179, 0
  br i1 %.not162, label %183, label %180, !prof !33

180:                                              ; preds = %.thread247
  %181 = load i64, ptr %32, align 8, !tbaa !40
  %182 = tail call i32 @audit_ex(ptr noundef nonnull %0, i64 noundef %181, i1 noundef zeroext false) #6
  %.not163 = icmp eq i32 %182, 0
  br i1 %.not163, label %183, label %.loopexit, !prof !33

183:                                              ; preds = %180, %.thread247
  %184 = load ptr, ptr %31, align 8, !tbaa !22
  %185 = load i32, ptr %184, align 4, !tbaa !42
  %186 = zext i32 %185 to i64
  %187 = load i32, ptr %36, align 8, !tbaa !43
  %188 = zext i32 %187 to i64
  %189 = add nuw nsw i64 %188, %186
  %190 = load i64, ptr %37, align 8, !tbaa !44
  %.not164 = icmp ugt i64 %189, %190
  br i1 %.not164, label %199, label %191, !prof !33

191:                                              ; preds = %183
  %192 = load i8, ptr %38, align 8, !tbaa !45, !range !46, !noundef !47
  %193 = trunc nuw i8 %192 to i1
  br i1 %193, label %199, label %194

194:                                              ; preds = %191
  %195 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %196 = icmp ugt i8 %195, 5
  br i1 %196, label %197, label %.backedge177.backedge, !prof !13

197:                                              ; preds = %194
  %198 = tail call ptr @dbg_prefix(ptr noundef nonnull %1) #7
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1464, ptr noundef nonnull @.str.11, ptr noundef %198, i64 noundef %186, i64 noundef %190) #6
  br label %.backedge177.backedge

199:                                              ; preds = %191, %183
  %200 = load i64, ptr %39, align 8, !tbaa !48
  %201 = icmp ult i64 %200, %186
  br i1 %201, label %202, label %209

202:                                              ; preds = %199
  %203 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %204 = icmp ugt i8 %203, 5
  br i1 %204, label %205, label %207, !prof !13

205:                                              ; preds = %202
  %206 = sub nsw i64 %186, %200
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1471, ptr noundef nonnull @.str.12, ptr noundef nonnull @.str.13, i64 noundef %190, i64 noundef %200, ptr noundef nonnull @.str.14, i64 noundef %206) #6
  br label %207

207:                                              ; preds = %205, %202
  %208 = tail call i32 @gc_rerere(ptr noundef nonnull %0, ptr noundef nonnull %1)
  switch i32 %208, label %.loopexit [
    i32 0, label %.preheader.backedge
    i32 -1, label %.backedge177.backedge
  ], !prof !41

209:                                              ; preds = %199
  %.not165 = icmp eq i32 %185, 0
  br i1 %.not165, label %216, label %210

210:                                              ; preds = %209
  %211 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %212 = icmp ugt i8 %211, 5
  br i1 %212, label %213, label %214, !prof !13

213:                                              ; preds = %210
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1483, ptr noundef nonnull @.str.15, ptr noundef nonnull @.str.16, ptr noundef nonnull @.str.17, i64 noundef %186, i64 noundef %190, i64 noundef %200) #6
  br label %214

214:                                              ; preds = %213, %210
  %215 = tail call i32 @gc_fill_returned(ptr noundef nonnull %0, ptr noundef nonnull %1)
  switch i32 %215, label %.loopexit [
    i32 0, label %216
    i32 -1, label %.backedge177.backedge
  ], !prof !41

216:                                              ; preds = %214, %209
  %217 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !32
  %218 = and i8 %217, 2
  %.not168 = icmp eq i8 %218, 0
  br i1 %.not168, label %226, label %219, !prof !33

219:                                              ; preds = %216
  %220 = load i64, ptr %32, align 8, !tbaa !40
  %221 = load ptr, ptr %31, align 8, !tbaa !22
  %222 = load i32, ptr %221, align 4, !tbaa !42
  %223 = zext i32 %222 to i64
  %224 = add i64 %220, %223
  %225 = tail call i32 @audit_ex(ptr noundef nonnull %0, i64 noundef %224, i1 noundef zeroext true) #6
  %.not169 = icmp eq i32 %225, 0
  br i1 %.not169, label %226, label %.loopexit, !prof !33

226:                                              ; preds = %219, %216
  %227 = load i64, ptr %35, align 8, !tbaa !22
  %.not170 = icmp eq i64 %227, 0
  br i1 %.not170, label %.loopexit, label %228, !prof !33

228:                                              ; preds = %226
  %229 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %230 = icmp ugt i8 %229, 4
  br i1 %230, label %231, label %.backedge177.backedge, !prof !13

.backedge177.backedge:                            ; preds = %207, %228, %231, %194, %197, %214
  br label %.backedge177

231:                                              ; preds = %228
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.gc_update, i32 noundef 1501, ptr noundef nonnull @.str.19, i64 noundef %227) #6
  br label %.backedge177.backedge

.loopexit:                                        ; preds = %214, %226, %219, %84, %82, %207, %145, %180, %160, %140, %121, %101, %73, %75, %25
  %.6 = phi i32 [ %26, %25 ], [ -30779, %75 ], [ -30779, %73 ], [ %208, %207 ], [ %146, %145 ], [ %182, %180 ], [ %161, %160 ], [ %142, %140 ], [ %123, %121 ], [ %102, %101 ], [ %215, %214 ], [ 0, %226 ], [ %225, %219 ], [ %86, %84 ], [ %83, %82 ]
  %232 = load ptr, ptr %15, align 8, !tbaa !22
  %233 = load ptr, ptr %11, align 8, !tbaa !20
  store ptr %232, ptr %233, align 8, !tbaa !21
  %234 = getelementptr inbounds i8, ptr %0, i64 200
  %235 = load ptr, ptr %234, align 8, !tbaa !22
  store i32 0, ptr %235, align 4, !tbaa !42
  %236 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !5
  %237 = icmp ugt i8 %236, 5
  br i1 %237, label %238, label %240, !prof !13

238:                                              ; preds = %.loopexit
  %239 = load i32, ptr %1, align 8, !tbaa !38
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.gc_update, i32 noundef 1512, ptr noundef nonnull @.str.20, i32 noundef %239, i32 noundef %.6) #6
  br label %240

240:                                              ; preds = %238, %.loopexit
  ret i32 %.6
}

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

declare zeroext i1 @txn_gc_detent(ptr noundef) local_unnamed_addr #1

declare i32 @audit_ex(ptr noundef, i64 noundef, i1 noundef zeroext) local_unnamed_addr #1

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @pnl_check_allocated(ptr noundef, i64 noundef) local_unnamed_addr #3

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

declare zeroext i1 @dpl_check(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_clean_stored_retired(ptr noundef, ptr noundef) local_unnamed_addr #0

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

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

declare zeroext i1 @txn_refund(ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_merge_loose(ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_store_retired(ptr noundef, ptr noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_rerere(ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden i32 @gc_fill_returned(ptr noundef, ptr noundef) local_unnamed_addr #0

attributes #0 = { 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 #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nofree nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 #5 = { inlinehint mustprogress nofree nounwind willreturn memory(read) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { nounwind }
attributes #7 = { nounwind willreturn memory(read) }
attributes #8 = { 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 26}
!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", !"expected", i32 1, i32 2000}
!14 = !{!15, !11, i64 64}
!15 = !{!"MDBX_txn", !9, i64 0, !9, i64 4, !11, i64 8, !11, i64 16, !12, i64 24, !12, i64 32, !16, i64 40, !11, i64 64, !11, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !18, i64 128, !12, i64 160, !7, i64 168}
!16 = !{!"geo", !17, i64 0, !17, i64 2, !9, i64 4, !9, i64 8, !7, i64 12, !7, i64 16}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MDBX_canary", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!19 = !{!15, !12, i64 80}
!20 = !{!15, !12, i64 120}
!21 = !{!12, !12, i64 0}
!22 = !{!7, !7, i64 0}
!23 = !{!24, !11, i64 392}
!24 = !{!"MDBX_env", !7, i64 0, !9, i64 4, !9, i64 8, !25, i64 16, !9, i64 56, !9, i64 60, !25, i64 64, !12, i64 104, !17, i64 112, !17, i64 114, !17, i64 116, !17, i64 118, !17, i64 120, !17, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !17, i64 130, !9, i64 132, !9, i64 136, !9, i64 140, !9, i64 144, !26, i64 152, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !9, i64 224, !9, i64 228, !9, i64 232, !12, i64 240, !12, i64 248, !11, i64 256, !27, i64 264, !29, i64 320, !10, i64 360, !12, i64 368, !12, i64 376, !12, i64 384, !30, i64 392, !7, i64 400, !9, i64 440, !9, i64 444, !12, i64 448, !31, i64 456, !7, i64 496, !7, i64 536}
!25 = !{!"osal_mmap", !7, i64 0, !9, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!26 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!27 = !{!"", !9, i64 0, !9, i64 4, !9, i64 8, !9, i64 12, !11, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !9, i64 28, !9, i64 32, !10, i64 36, !10, i64 37, !10, i64 38, !28, i64 40, !7, i64 48}
!28 = !{!"", !17, i64 0, !17, i64 2, !17, i64 4, !17, i64 6}
!29 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!30 = !{!"", !11, i64 0}
!31 = !{!"osal_ioring", !9, i64 0, !9, i64 4, !9, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!32 = !{!6, !7, i64 25}
!33 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!34 = !{!35, !9, i64 12}
!35 = !{!"gc_update_context", !9, i64 0, !9, i64 4, !10, i64 8, !9, i64 12, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !11, i64 48, !36, i64 56, !36, i64 184, !11, i64 312, !7, i64 320, !37, i64 1144}
!36 = !{!"MDBX_rkl", !11, i64 0, !11, i64 8, !9, i64 16, !9, i64 20, !12, i64 24, !7, i64 32}
!37 = !{!"gc_dense_histogram", !9, i64 0, !7, i64 4}
!38 = !{!35, !9, i64 0}
!39 = !{!"branch_weights", !"expected", i32 0, i32 -2147483648}
!40 = !{!35, !11, i64 16}
!41 = !{!"branch_weights", i32 1, i32 4000, i32 1}
!42 = !{!9, !9, i64 0}
!43 = !{!24, !9, i64 224}
!44 = !{!35, !11, i64 24}
!45 = !{!35, !10, i64 8}
!46 = !{i8 0, i8 2}
!47 = !{}
!48 = !{!35, !11, i64 32}


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