; LLVM IR from erthink/libmdbx :: src (txn-basal)

; 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.7 }
%struct.anon.7 = 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.meta_ptr = type { i64, %union.anon.6, i64 }
%union.anon.6 = type { ptr }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.MDBX_cursor = type { i32, %union.anon.20, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon.20 = 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.iovec = type { ptr, i64 }
%struct.gc_update_context = type { i32, i32, i8, i32, i64, i64, i64, i64, i64, %struct.MDBX_rkl, %struct.MDBX_rkl, i64, %union.anon.22, %struct.gc_dense_histogram }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.22 = type { %struct.cursor_couple }
%struct.gc_dense_histogram = type { i32, [31 x i32] }
%struct.iov_ctx = type { ptr, ptr, i32, i32, i32, i32, i64 }
%struct.meta = type { [2 x i32], %union.anon.23, i16, i8, i8, %struct.geo, %union.anon.24, %struct.MDBX_canary, %union.anon.27, [2 x %union.mdbx_atomic_uint32_t], [2 x i32], %union.bin128, %union.bin128 }
%union.anon.23 = type { i64 }
%struct.geo = type { i16, i16, i32, i32, %union.anon, %union.anon.0 }
%union.anon = type { i32 }
%union.anon.0 = type { i32 }
%union.anon.24 = type { %struct.anon.25 }
%struct.anon.25 = type { %struct.tree, %struct.tree }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.27 = type { i64 }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.MDBX_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.1 }
%union.anon.1 = type { %struct.anon.2 }
%struct.anon.2 = type { %struct.troika, ptr, %struct.anon.3, i8, i32, i32, i64, ptr, ptr, ptr, i64, %union.anon.4 }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }
%struct.anon.3 = type { %struct.MDBX_rkl, i64, %struct.MDBX_rkl }
%union.anon.4 = type { %struct.anon.5 }
%struct.anon.5 = type { i64, ptr }
%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 }
%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 }
%struct.dpl = type { i64, i64, i64, i64, [18 x %struct.dp] }
%struct.dp = type { ptr, i32, i32 }
%struct.shared_lck = type { i64, i32, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, [2 x %union.mdbx_atomic_uint32_t], [16 x i8], %struct.pgops, [16 x i8], %union.pthread_mutex_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, i32, %struct.anon.19, %union.pthread_mutex_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, [16 x i8], [0 x %struct.reader_slot] }
%struct.pgops = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %struct.anon.17 }
%struct.anon.17 = type { %struct.gc_prof_stat, %struct.gc_prof_stat, i32, i32, i32, i32, i32 }
%struct.gc_prof_stat = type { i64, i64, i32, i32, i32, i32, %struct.anon.18 }
%struct.anon.18 = type { i64, i64, i32 }
%struct.anon.19 = type { [4 x i32], [4 x i64] }
%struct.reader_slot = type { %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint64_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint32_t, %union.mdbx_atomic_uint64_t }
%struct.kvx = type { %struct.clc2, %struct.iovec }
%struct.clc2 = type { %struct.clc, %struct.clc }
%struct.clc = type { ptr, i64, i64 }
%struct.commit_timestamp = type { i64, i64, i64, i64, i64, i64, i64 }

@globals = external global %struct.libmdbx_globals, align 8
@.str.10 = external hidden unnamed_addr constant [54 x i8], align 1
@__func__.txn_basal_commit = external hidden unnamed_addr constant [17 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [5 x i8], align 1

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_recent(ptr dead_on_unwind noalias writable sret(%struct.meta_ptr) align 8, ptr noundef, ptr noundef) #3

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @txn_basal_commit(ptr noundef %0, ptr noundef %1) #6 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i8, align 1
  %8 = alloca %struct.meta_ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca %struct.cursor_couple, align 8
  %16 = alloca i32, align 4
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca ptr, align 8
  %20 = alloca %struct.iovec, align 8
  %21 = alloca %struct.gc_update_context, align 8
  %22 = alloca i32, align 4
  %23 = alloca i64, align 8
  %24 = alloca i32, align 4
  %25 = alloca %struct.iov_ctx, align 8
  %26 = alloca %struct.meta, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  %27 = load ptr, ptr %4, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.MDBX_txn, ptr %27, i32 0, i32 9
  %29 = load ptr, ptr %28, align 8, !tbaa !9
  store ptr %29, ptr %6, align 8, !tbaa !5
  br label %30

30:                                               ; preds = %2
  %31 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %32 = zext i8 %31 to i32
  %33 = and i32 %32, 1
  %34 = icmp ne i32 %33, 0
  %35 = xor i1 %34, true
  %36 = xor i1 %35, true
  %37 = zext i1 %36 to i32
  %38 = sext i32 %37 to i64
  %39 = call i64 @llvm.expect.i64(i64 %38, i64 1)
  %40 = icmp ne i64 %39, 0
  br i1 %40, label %41, label %75

41:                                               ; preds = %30
  br label %42

42:                                               ; preds = %41
  %43 = load ptr, ptr %4, align 8, !tbaa !5
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.MDBX_env, ptr %44, i32 0, i32 24
  %46 = load ptr, ptr %45, align 8, !tbaa !19
  %47 = icmp eq ptr %43, %46
  br i1 %47, label %48, label %59

48:                                               ; preds = %42
  %49 = load ptr, ptr %4, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.MDBX_txn, ptr %49, i32 0, i32 4
  %51 = load ptr, ptr %50, align 8, !tbaa !28
  %52 = icmp ne ptr %51, null
  br i1 %52, label %59, label %53

53:                                               ; preds = %48
  %54 = load ptr, ptr %4, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.MDBX_txn, ptr %54, i32 0, i32 5
  %56 = load ptr, ptr %55, align 8, !tbaa !29
  %57 = icmp ne ptr %56, null
  %58 = xor i1 %57, true
  br label %59

59:                                               ; preds = %53, %48, %42
  %60 = phi i1 [ false, %48 ], [ false, %42 ], [ %58, %53 ]
  %61 = xor i1 %60, true
  %62 = xor i1 %61, true
  %63 = xor i1 %62, true
  %64 = zext i1 %63 to i32
  %65 = sext i32 %64 to i64
  %66 = call i64 @llvm.expect.i64(i64 %65, i64 0)
  %67 = icmp ne i64 %66, 0
  br i1 %67, label %68, label %72

68:                                               ; preds = %59
  %69 = load ptr, ptr %4, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.MDBX_txn, ptr %69, i32 0, i32 9
  %71 = load ptr, ptr %70, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %71, ptr noundef @.str.10, ptr noundef @__func__.txn_basal_commit, i32 noundef 169) #10
  unreachable

72:                                               ; preds = %59
  br label %73

73:                                               ; preds = %72
  br label %74

74:                                               ; preds = %73
  br label %75

75:                                               ; preds = %74, %30
  br label %76

76:                                               ; preds = %75
  br label %77

77:                                               ; preds = %76
  %78 = load ptr, ptr %4, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.MDBX_txn, ptr %78, i32 0, i32 17
  %80 = getelementptr inbounds %struct.anon.2, ptr %79, i32 0, i32 7
  %81 = load ptr, ptr %80, align 8, !tbaa !30
  %82 = icmp ne ptr %81, null
  br i1 %82, label %122, label %83

83:                                               ; preds = %77
  br label %84

84:                                               ; preds = %83
  %85 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %86 = zext i8 %85 to i32
  %87 = and i32 %86, 1
  %88 = icmp ne i32 %87, 0
  %89 = xor i1 %88, true
  %90 = xor i1 %89, true
  %91 = zext i1 %90 to i32
  %92 = sext i32 %91 to i64
  %93 = call i64 @llvm.expect.i64(i64 %92, i64 1)
  %94 = icmp ne i64 %93, 0
  br i1 %94, label %95, label %119

95:                                               ; preds = %84
  br label %96

96:                                               ; preds = %95
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.MDBX_txn, ptr %97, i32 0, i32 1
  %99 = load i32, ptr %98, align 4, !tbaa !31
  %100 = and i32 %99, 524288
  %101 = icmp ne i32 %100, 0
  br i1 %101, label %102, label %103

102:                                              ; preds = %96
  br label %103

103:                                              ; preds = %102, %96
  %104 = phi i1 [ false, %96 ], [ true, %102 ]
  %105 = xor i1 %104, true
  %106 = xor i1 %105, true
  %107 = xor i1 %106, true
  %108 = zext i1 %107 to i32
  %109 = sext i32 %108 to i64
  %110 = call i64 @llvm.expect.i64(i64 %109, i64 0)
  %111 = icmp ne i64 %110, 0
  br i1 %111, label %112, label %116

112:                                              ; preds = %103
  %113 = load ptr, ptr %4, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.MDBX_txn, ptr %113, i32 0, i32 9
  %115 = load ptr, ptr %114, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %115, ptr noundef @.str.11, ptr noundef @__func__.txn_basal_commit, i32 noundef 171) #10
  unreachable

116:                                              ; preds = %103
  br label %117

117:                                              ; preds = %116
  br label %118

118:                                              ; preds = %117
  br label %119

119:                                              ; preds = %118, %84
  br label %120

120:                                              ; preds = %119
  br label %121

121:                                              ; preds = %120
  br label %208

122:                                              ; preds = %77
  br label %123

123:                                              ; preds = %122
  %124 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %125 = zext i8 %124 to i32
  %126 = and i32 %125, 1
  %127 = icmp ne i32 %126, 0
  %128 = xor i1 %127, true
  %129 = xor i1 %128, true
  %130 = zext i1 %129 to i32
  %131 = sext i32 %130 to i64
  %132 = call i64 @llvm.expect.i64(i64 %131, i64 1)
  %133 = icmp ne i64 %132, 0
  br i1 %133, label %134, label %158

134:                                              ; preds = %123
  br label %135

135:                                              ; preds = %134
  %136 = load ptr, ptr %4, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.MDBX_txn, ptr %136, i32 0, i32 1
  %138 = load i32, ptr %137, align 4, !tbaa !31
  %139 = and i32 %138, 524288
  %140 = icmp eq i32 %139, 0
  br i1 %140, label %142, label %141

141:                                              ; preds = %135
  br label %142

142:                                              ; preds = %141, %135
  %143 = phi i1 [ true, %135 ], [ false, %141 ]
  %144 = xor i1 %143, true
  %145 = xor i1 %144, true
  %146 = xor i1 %145, true
  %147 = zext i1 %146 to i32
  %148 = sext i32 %147 to i64
  %149 = call i64 @llvm.expect.i64(i64 %148, i64 0)
  %150 = icmp ne i64 %149, 0
  br i1 %150, label %151, label %155

151:                                              ; preds = %142
  %152 = load ptr, ptr %4, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.MDBX_txn, ptr %152, i32 0, i32 9
  %154 = load ptr, ptr %153, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %154, ptr noundef @.str.12, ptr noundef @__func__.txn_basal_commit, i32 noundef 173) #10
  unreachable

155:                                              ; preds = %142
  br label %156

156:                                              ; preds = %155
  br label %157

157:                                              ; preds = %156
  br label %158

158:                                              ; preds = %157, %123
  br label %159

159:                                              ; preds = %158
  br label %160

160:                                              ; preds = %159
  br label %161

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

172:                                              ; preds = %161
  br label %173

173:                                              ; preds = %172
  %174 = load ptr, ptr %4, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.MDBX_txn, ptr %174, i32 0, i32 17
  %176 = getelementptr inbounds %struct.anon.2, ptr %175, i32 0, i32 6
  %177 = load i64, ptr %176, align 8, !tbaa !30
  %178 = load ptr, ptr %4, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.MDBX_txn, ptr %178, i32 0, i32 17
  %180 = getelementptr inbounds %struct.anon.2, ptr %179, i32 0, i32 7
  %181 = load ptr, ptr %180, align 8, !tbaa !30
  %182 = getelementptr inbounds %struct.dpl, ptr %181, i32 0, i32 1
  %183 = load i64, ptr %182, align 8, !tbaa !32
  %184 = add i64 %177, %183
  %185 = load ptr, ptr %6, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.MDBX_env, ptr %185, i32 0, i32 34
  %187 = getelementptr inbounds %struct.anon.11, ptr %186, i32 0, i32 2
  %188 = load i32, ptr %187, align 8, !tbaa !34
  %189 = zext i32 %188 to i64
  %190 = icmp eq i64 %184, %189
  %191 = xor i1 %190, true
  %192 = xor i1 %191, true
  %193 = xor i1 %192, true
  %194 = zext i1 %193 to i32
  %195 = sext i32 %194 to i64
  %196 = call i64 @llvm.expect.i64(i64 %195, i64 0)
  %197 = icmp ne i64 %196, 0
  br i1 %197, label %198, label %202

198:                                              ; preds = %173
  %199 = load ptr, ptr %4, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.MDBX_txn, ptr %199, i32 0, i32 9
  %201 = load ptr, ptr %200, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %201, ptr noundef @.str.13, ptr noundef @__func__.txn_basal_commit, i32 noundef 174) #10
  unreachable

202:                                              ; preds = %173
  br label %203

203:                                              ; preds = %202
  br label %204

204:                                              ; preds = %203
  br label %205

205:                                              ; preds = %204, %161
  br label %206

206:                                              ; preds = %205
  br label %207

207:                                              ; preds = %206
  br label %208

208:                                              ; preds = %207, %121
  %209 = load ptr, ptr %4, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.MDBX_txn, ptr %209, i32 0, i32 1
  %211 = load i32, ptr %210, align 4, !tbaa !31
  %212 = and i32 %211, 256
  %213 = icmp ne i32 %212, 0
  br i1 %213, label %214, label %216

214:                                              ; preds = %208
  %215 = load ptr, ptr %4, align 8, !tbaa !5
  call void @txn_done_cursors(ptr noundef %215)
  br label %216

216:                                              ; preds = %214, %208
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #9
  store i8 0, ptr %7, align 1, !tbaa !35
  call void @llvm.lifetime.start.p0(i64 24, ptr %8) #9
  %217 = load ptr, ptr %6, align 8, !tbaa !5
  %218 = load ptr, ptr %4, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.MDBX_txn, ptr %218, i32 0, i32 17
  %220 = getelementptr inbounds %struct.anon.2, ptr %219, i32 0, i32 0
  call void @meta_recent(ptr dead_on_unwind writable sret(%struct.meta_ptr) align 8 %8, ptr noundef %217, ptr noundef %220)
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #9
  %221 = load ptr, ptr %6, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.MDBX_env, ptr %221, i32 0, i32 7
  %223 = load ptr, ptr %222, align 8, !tbaa !36
  %224 = getelementptr inbounds %struct.shared_lck, ptr %223, i32 0, i32 4
  %225 = call i32 @atomic_load32(ptr noundef %224, i32 noundef 0)
  store i32 %225, ptr %9, align 4, !tbaa !37
  %226 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 2
  %227 = load i64, ptr %226, align 8, !tbaa !38
  %228 = icmp ne i64 %227, 0
  br i1 %228, label %229, label %290

229:                                              ; preds = %216
  %230 = load i32, ptr %9, align 4, !tbaa !37
  %231 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 0
  %232 = load i64, ptr %231, align 8, !tbaa !40
  %233 = trunc i64 %232 to i32
  %234 = icmp ne i32 %230, %233
  br i1 %234, label %235, label %290

235:                                              ; preds = %229
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #9
  %236 = load ptr, ptr %4, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.MDBX_txn, ptr %236, i32 0, i32 1
  %238 = load i32, ptr %237, align 4, !tbaa !31
  %239 = and i32 %238, 524288
  %240 = icmp eq i32 %239, 0
  br i1 %240, label %242, label %241

241:                                              ; preds = %235
  br label %242

242:                                              ; preds = %241, %235
  %243 = phi i1 [ true, %235 ], [ false, %241 ]
  %244 = zext i1 %243 to i64
  %245 = select i1 %243, i32 1968526676, i32 894784854
  store i32 %245, ptr %10, align 4, !tbaa !37
  %246 = load i32, ptr %9, align 4, !tbaa !37
  %247 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 0
  %248 = load i64, ptr %247, align 8, !tbaa !40
  %249 = trunc i64 %248 to i32
  %250 = load i32, ptr %10, align 4, !tbaa !37
  %251 = sub i32 %249, %250
  %252 = icmp eq i32 %246, %251
  br i1 %252, label %253, label %254

253:                                              ; preds = %242
  store i8 1, ptr %7, align 1, !tbaa !35
  br label %286

254:                                              ; preds = %242
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #9
  %255 = load ptr, ptr %6, align 8, !tbaa !5
  %256 = call i32 @meta_sync(ptr noundef %255, ptr noundef byval(%struct.meta_ptr) align 8 %8)
  store i32 %256, ptr %11, align 4, !tbaa !37
  %257 = load i32, ptr %11, align 4, !tbaa !37
  %258 = icmp ne i32 %257, 0
  %259 = xor i1 %258, true
  %260 = xor i1 %259, true
  %261 = zext i1 %260 to i32
  %262 = sext i32 %261 to i64
  %263 = call i64 @llvm.expect.i64(i64 %262, i64 0)
  %264 = icmp ne i64 %263, 0
  br i1 %264, label %265, label %282

265:                                              ; preds = %254
  br label %266

266:                                              ; preds = %265
  %267 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %268 = zext i8 %267 to i32
  %269 = icmp sle i32 1, %268
  %270 = xor i1 %269, true
  %271 = xor i1 %270, true
  %272 = zext i1 %271 to i32
  %273 = sext i32 %272 to i64
  %274 = call i64 @llvm.expect.i64(i64 %273, i64 0)
  %275 = icmp ne i64 %274, 0
  br i1 %275, label %276, label %278

276:                                              ; preds = %266
  %277 = load i32, ptr %11, align 4, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.txn_basal_commit, i32 noundef 218, ptr noundef @.str.14, ptr noundef @.str.15, i32 noundef %277)
  br label %278

278:                                              ; preds = %276, %266
  br label %279

279:                                              ; preds = %278
  br label %280

280:                                              ; preds = %279
  %281 = load i32, ptr %11, align 4, !tbaa !37
  store i32 %281, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %283

282:                                              ; preds = %254
  store i32 0, ptr %12, align 4
  br label %283

283:                                              ; preds = %282, %280
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #9
  %284 = load i32, ptr %12, align 4
  switch i32 %284, label %287 [
    i32 0, label %285
  ]

285:                                              ; preds = %283
  br label %286

286:                                              ; preds = %285, %253
  store i32 0, ptr %12, align 4
  br label %287

287:                                              ; preds = %286, %283
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #9
  %288 = load i32, ptr %12, align 4
  switch i32 %288, label %1150 [
    i32 0, label %289
  ]

289:                                              ; preds = %287
  br label %290

290:                                              ; preds = %289, %229, %216
  %291 = load ptr, ptr %4, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.MDBX_txn, ptr %291, i32 0, i32 17
  %293 = getelementptr inbounds %struct.anon.2, ptr %292, i32 0, i32 7
  %294 = load ptr, ptr %293, align 8, !tbaa !30
  %295 = icmp ne ptr %294, null
  br i1 %295, label %296, label %304

296:                                              ; preds = %290
  %297 = load ptr, ptr %4, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.MDBX_txn, ptr %297, i32 0, i32 17
  %299 = getelementptr inbounds %struct.anon.2, ptr %298, i32 0, i32 7
  %300 = load ptr, ptr %299, align 8, !tbaa !30
  %301 = getelementptr inbounds %struct.dpl, ptr %300, i32 0, i32 1
  %302 = load i64, ptr %301, align 8, !tbaa !32
  %303 = icmp eq i64 %302, 0
  br i1 %303, label %304, label %392

304:                                              ; preds = %296, %290
  %305 = load ptr, ptr %4, align 8, !tbaa !5
  %306 = getelementptr inbounds %struct.MDBX_txn, ptr %305, i32 0, i32 1
  %307 = load i32, ptr %306, align 4, !tbaa !31
  %308 = and i32 %307, 327692
  %309 = icmp eq i32 %308, 0
  br i1 %309, label %310, label %392

310:                                              ; preds = %304
  %311 = load i8, ptr %7, align 1, !tbaa !35, !range !42, !noundef !43
  %312 = trunc i8 %311 to i1
  br i1 %312, label %392, label %313

313:                                              ; preds = %310
  %314 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 2
  %315 = load i64, ptr %314, align 8, !tbaa !38
  %316 = icmp ne i64 %315, 0
  br i1 %316, label %392, label %317

317:                                              ; preds = %313
  %318 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %319 = zext i8 %318 to i32
  %320 = and i32 %319, 2
  %321 = icmp ne i32 %320, 0
  %322 = xor i1 %321, true
  %323 = xor i1 %322, true
  %324 = zext i1 %323 to i32
  %325 = sext i32 %324 to i64
  %326 = call i64 @llvm.expect.i64(i64 %325, i64 0)
  %327 = icmp ne i64 %326, 0
  br i1 %327, label %392, label %328

328:                                              ; preds = %317
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %329 = load ptr, ptr %4, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.MDBX_txn, ptr %329, i32 0, i32 11
  %331 = load ptr, ptr %330, align 8, !tbaa !44
  %332 = getelementptr inbounds i32, ptr %331, i64 0
  %333 = load i32, ptr %332, align 4, !tbaa !37
  %334 = lshr i32 %333, 0
  %335 = zext i32 %334 to i64
  store i64 %335, ptr %13, align 8, !tbaa !45
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  store i64 0, ptr %14, align 8, !tbaa !45
  br label %336

336:                                              ; preds = %388, %328
  %337 = load i64, ptr %14, align 8, !tbaa !45
  %338 = load ptr, ptr %4, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.MDBX_txn, ptr %338, i32 0, i32 2
  %340 = load i64, ptr %339, align 8, !tbaa !46
  %341 = icmp ult i64 %337, %340
  br i1 %341, label %343, label %342

342:                                              ; preds = %336
  store i32 20, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  br label %391

343:                                              ; preds = %336
  %344 = load ptr, ptr %4, align 8, !tbaa !5
  %345 = call zeroext i1 @dbi_foreach_step(ptr noundef %344, ptr noundef %13, ptr noundef %14)
  br i1 %345, label %346, label %387

346:                                              ; preds = %343
  br label %347

347:                                              ; preds = %346
  %348 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %349 = zext i8 %348 to i32
  %350 = and i32 %349, 1
  %351 = icmp ne i32 %350, 0
  %352 = xor i1 %351, true
  %353 = xor i1 %352, true
  %354 = zext i1 %353 to i32
  %355 = sext i32 %354 to i64
  %356 = call i64 @llvm.expect.i64(i64 %355, i64 1)
  %357 = icmp ne i64 %356, 0
  br i1 %357, label %358, label %384

358:                                              ; preds = %347
  br label %359

359:                                              ; preds = %358
  %360 = load ptr, ptr %4, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.MDBX_txn, ptr %360, i32 0, i32 12
  %362 = load ptr, ptr %361, align 8, !tbaa !47
  %363 = load i64, ptr %14, align 8, !tbaa !45
  %364 = getelementptr inbounds i8, ptr %362, i64 %363
  %365 = load i8, ptr %364, align 1, !tbaa !30
  %366 = zext i8 %365 to i32
  %367 = and i32 %366, 1
  %368 = icmp ne i32 %367, 0
  %369 = xor i1 %368, true
  %370 = xor i1 %369, true
  %371 = xor i1 %370, true
  %372 = xor i1 %371, true
  %373 = zext i1 %372 to i32
  %374 = sext i32 %373 to i64
  %375 = call i64 @llvm.expect.i64(i64 %374, i64 0)
  %376 = icmp ne i64 %375, 0
  br i1 %376, label %377, label %381

377:                                              ; preds = %359
  %378 = load ptr, ptr %4, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.MDBX_txn, ptr %378, i32 0, i32 9
  %380 = load ptr, ptr %379, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %380, ptr noundef @.str.16, ptr noundef @__func__.txn_basal_commit, i32 noundef 227) #10
  unreachable

381:                                              ; preds = %359
  br label %382

382:                                              ; preds = %381
  br label %383

383:                                              ; preds = %382
  br label %384

384:                                              ; preds = %383, %347
  br label %385

385:                                              ; preds = %384
  br label %386

386:                                              ; preds = %385
  br label %387

387:                                              ; preds = %386, %343
  br label %388

388:                                              ; preds = %387
  %389 = load i64, ptr %14, align 8, !tbaa !45
  %390 = add i64 %389, 1
  store i64 %390, ptr %14, align 8, !tbaa !45
  br label %336, !llvm.loop !48

391:                                              ; preds = %342
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %1150

392:                                              ; preds = %317, %313, %310, %304, %296
  br label %393

393:                                              ; preds = %392
  %394 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %395 = zext i8 %394 to i32
  %396 = icmp sle i32 5, %395
  %397 = xor i1 %396, true
  %398 = xor i1 %397, true
  %399 = zext i1 %398 to i32
  %400 = sext i32 %399 to i64
  %401 = call i64 @llvm.expect.i64(i64 %400, i64 0)
  %402 = icmp ne i64 %401, 0
  br i1 %402, label %403, label %421

403:                                              ; preds = %393
  %404 = load ptr, ptr %4, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.MDBX_txn, ptr %404, i32 0, i32 7
  %406 = load i64, ptr %405, align 8, !tbaa !50
  %407 = load ptr, ptr %4, align 8, !tbaa !5
  %408 = load ptr, ptr %6, align 8, !tbaa !5
  %409 = load ptr, ptr %4, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.MDBX_txn, ptr %409, i32 0, i32 10
  %411 = load ptr, ptr %410, align 8, !tbaa !51
  %412 = getelementptr inbounds %struct.tree, ptr %411, i64 1
  %413 = getelementptr inbounds %struct.tree, ptr %412, i32 0, i32 3
  %414 = load i32, ptr %413, align 4, !tbaa !52
  %415 = load ptr, ptr %4, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.MDBX_txn, ptr %415, i32 0, i32 10
  %417 = load ptr, ptr %416, align 8, !tbaa !51
  %418 = getelementptr inbounds %struct.tree, ptr %417, i64 0
  %419 = getelementptr inbounds %struct.tree, ptr %418, i32 0, i32 3
  %420 = load i32, ptr %419, align 4, !tbaa !52
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.txn_basal_commit, i32 noundef 233, ptr noundef @.str.17, i64 noundef %406, ptr noundef %407, ptr noundef %408, i32 noundef %414, i32 noundef %420)
  br label %421

421:                                              ; preds = %403, %393
  br label %422

422:                                              ; preds = %421
  br label %423

423:                                              ; preds = %422
  %424 = load ptr, ptr %4, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.MDBX_txn, ptr %424, i32 0, i32 2
  %426 = load i64, ptr %425, align 8, !tbaa !46
  %427 = icmp ugt i64 %426, 2
  br i1 %427, label %428, label %564

428:                                              ; preds = %423
  call void @llvm.lifetime.start.p0(i64 824, ptr %15) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #9
  %429 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %430 = load ptr, ptr %4, align 8, !tbaa !5
  %431 = call i32 @cursor_init(ptr noundef %429, ptr noundef %430, i64 noundef 1)
  store i32 %431, ptr %16, align 4, !tbaa !37
  %432 = load i32, ptr %16, align 4, !tbaa !37
  %433 = icmp ne i32 %432, 0
  %434 = xor i1 %433, true
  %435 = xor i1 %434, true
  %436 = zext i1 %435 to i32
  %437 = sext i32 %436 to i64
  %438 = call i64 @llvm.expect.i64(i64 %437, i64 0)
  %439 = icmp ne i64 %438, 0
  br i1 %439, label %440, label %442

440:                                              ; preds = %428
  %441 = load i32, ptr %16, align 4, !tbaa !37
  store i32 %441, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %561

442:                                              ; preds = %428
  %443 = load ptr, ptr %4, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.MDBX_txn, ptr %443, i32 0, i32 14
  %445 = load ptr, ptr %444, align 8, !tbaa !54
  %446 = getelementptr inbounds ptr, ptr %445, i64 1
  %447 = load ptr, ptr %446, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %449 = getelementptr inbounds %struct.MDBX_cursor, ptr %448, i32 0, i32 11
  store ptr %447, ptr %449, align 8, !tbaa !55
  %450 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %451 = load ptr, ptr %4, align 8, !tbaa !5
  %452 = getelementptr inbounds %struct.MDBX_txn, ptr %451, i32 0, i32 14
  %453 = load ptr, ptr %452, align 8, !tbaa !54
  %454 = getelementptr inbounds ptr, ptr %453, i64 1
  store ptr %450, ptr %454, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #9
  %455 = load ptr, ptr %4, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.MDBX_txn, ptr %455, i32 0, i32 11
  %457 = load ptr, ptr %456, align 8, !tbaa !44
  %458 = getelementptr inbounds i32, ptr %457, i64 0
  %459 = load i32, ptr %458, align 4, !tbaa !37
  %460 = lshr i32 %459, 2
  %461 = zext i32 %460 to i64
  store i64 %461, ptr %17, align 8, !tbaa !45
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #9
  store i64 2, ptr %18, align 8, !tbaa !45
  br label %462

462:                                              ; preds = %548, %442
  %463 = load i64, ptr %18, align 8, !tbaa !45
  %464 = load ptr, ptr %4, align 8, !tbaa !5
  %465 = getelementptr inbounds %struct.MDBX_txn, ptr %464, i32 0, i32 2
  %466 = load i64, ptr %465, align 8, !tbaa !46
  %467 = icmp ult i64 %463, %466
  br i1 %467, label %469, label %468

468:                                              ; preds = %462
  store i32 29, ptr %12, align 4
  br label %551

469:                                              ; preds = %462
  %470 = load ptr, ptr %4, align 8, !tbaa !5
  %471 = call zeroext i1 @dbi_foreach_step(ptr noundef %470, ptr noundef %17, ptr noundef %18)
  br i1 %471, label %472, label %547

472:                                              ; preds = %469
  %473 = load ptr, ptr %4, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.MDBX_txn, ptr %473, i32 0, i32 12
  %475 = load ptr, ptr %474, align 8, !tbaa !47
  %476 = load i64, ptr %18, align 8, !tbaa !45
  %477 = getelementptr inbounds i8, ptr %475, i64 %476
  %478 = load i8, ptr %477, align 1, !tbaa !30
  %479 = zext i8 %478 to i32
  %480 = and i32 %479, 1
  %481 = icmp eq i32 %480, 0
  br i1 %481, label %482, label %483

482:                                              ; preds = %472
  br label %548

483:                                              ; preds = %472
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #9
  %484 = load ptr, ptr %4, align 8, !tbaa !5
  %485 = getelementptr inbounds %struct.MDBX_txn, ptr %484, i32 0, i32 10
  %486 = load ptr, ptr %485, align 8, !tbaa !51
  %487 = load i64, ptr %18, align 8, !tbaa !45
  %488 = getelementptr inbounds %struct.tree, ptr %486, i64 %487
  store ptr %488, ptr %19, align 8, !tbaa !5
  br label %489

489:                                              ; preds = %483
  %490 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %491 = zext i8 %490 to i32
  %492 = icmp sle i32 5, %491
  %493 = xor i1 %492, true
  %494 = xor i1 %493, true
  %495 = zext i1 %494 to i32
  %496 = sext i32 %495 to i64
  %497 = call i64 @llvm.expect.i64(i64 %496, i64 0)
  %498 = icmp ne i64 %497, 0
  br i1 %498, label %499, label %507

499:                                              ; preds = %489
  %500 = load i64, ptr %18, align 8, !tbaa !45
  %501 = load ptr, ptr %19, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.tree, ptr %501, i32 0, i32 9
  %503 = load i64, ptr %502, align 4, !tbaa !59
  %504 = load ptr, ptr %4, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.MDBX_txn, ptr %504, i32 0, i32 7
  %506 = load i64, ptr %505, align 8, !tbaa !50
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.txn_basal_commit, i32 noundef 247, ptr noundef @.str.18, i64 noundef %500, i64 noundef %503, i64 noundef %506)
  br label %507

507:                                              ; preds = %499, %489
  br label %508

508:                                              ; preds = %507
  br label %509

509:                                              ; preds = %508
  %510 = load ptr, ptr %4, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.MDBX_txn, ptr %510, i32 0, i32 7
  %512 = load i64, ptr %511, align 8, !tbaa !50
  %513 = load ptr, ptr %19, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.tree, ptr %513, i32 0, i32 9
  store i64 %512, ptr %514, align 4, !tbaa !59
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #9
  %515 = getelementptr inbounds %struct.iovec, ptr %20, i32 0, i32 0
  %516 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %516, ptr %515, align 8, !tbaa !60
  %517 = getelementptr inbounds %struct.iovec, ptr %20, i32 0, i32 1
  store i64 48, ptr %517, align 8, !tbaa !62
  %518 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %519 = load ptr, ptr %6, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.MDBX_env, ptr %519, i32 0, i32 25
  %521 = load ptr, ptr %520, align 8, !tbaa !63
  %522 = load i64, ptr %18, align 8, !tbaa !45
  %523 = getelementptr inbounds %struct.kvx, ptr %521, i64 %522
  %524 = getelementptr inbounds %struct.kvx, ptr %523, i32 0, i32 1
  %525 = call i32 @cursor_put(ptr noundef %518, ptr noundef %524, ptr noundef %20, i32 noundef 2)
  store i32 %525, ptr %16, align 4, !tbaa !37
  %526 = load i32, ptr %16, align 4, !tbaa !37
  %527 = icmp ne i32 %526, 0
  %528 = xor i1 %527, true
  %529 = xor i1 %528, true
  %530 = zext i1 %529 to i32
  %531 = sext i32 %530 to i64
  %532 = call i64 @llvm.expect.i64(i64 %531, i64 0)
  %533 = icmp ne i64 %532, 0
  br i1 %533, label %534, label %543

534:                                              ; preds = %509
  %535 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %536 = getelementptr inbounds %struct.MDBX_cursor, ptr %535, i32 0, i32 11
  %537 = load ptr, ptr %536, align 8, !tbaa !55
  %538 = load ptr, ptr %4, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.MDBX_txn, ptr %538, i32 0, i32 14
  %540 = load ptr, ptr %539, align 8, !tbaa !54
  %541 = getelementptr inbounds ptr, ptr %540, i64 1
  store ptr %537, ptr %541, align 8, !tbaa !5
  %542 = load i32, ptr %16, align 4, !tbaa !37
  store i32 %542, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %544

543:                                              ; preds = %509
  store i32 0, ptr %12, align 4
  br label %544

544:                                              ; preds = %543, %534
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #9
  %545 = load i32, ptr %12, align 4
  switch i32 %545, label %551 [
    i32 0, label %546
  ]

546:                                              ; preds = %544
  br label %547

547:                                              ; preds = %546, %469
  br label %548

548:                                              ; preds = %547, %482
  %549 = load i64, ptr %18, align 8, !tbaa !45
  %550 = add i64 %549, 1
  store i64 %550, ptr %18, align 8, !tbaa !45
  br label %462, !llvm.loop !64

551:                                              ; preds = %544, %468
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #9
  %552 = load i32, ptr %12, align 4
  switch i32 %552, label %561 [
    i32 29, label %553
  ]

553:                                              ; preds = %551
  %554 = getelementptr inbounds %struct.cursor_couple, ptr %15, i32 0, i32 0
  %555 = getelementptr inbounds %struct.MDBX_cursor, ptr %554, i32 0, i32 11
  %556 = load ptr, ptr %555, align 8, !tbaa !55
  %557 = load ptr, ptr %4, align 8, !tbaa !5
  %558 = getelementptr inbounds %struct.MDBX_txn, ptr %557, i32 0, i32 14
  %559 = load ptr, ptr %558, align 8, !tbaa !54
  %560 = getelementptr inbounds ptr, ptr %559, i64 1
  store ptr %556, ptr %560, align 8, !tbaa !5
  store i32 0, ptr %12, align 4
  br label %561

561:                                              ; preds = %553, %551, %440
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #9
  call void @llvm.lifetime.end.p0(i64 824, ptr %15) #9
  %562 = load i32, ptr %12, align 4
  switch i32 %562, label %1150 [
    i32 0, label %563
  ]

563:                                              ; preds = %561
  br label %564

564:                                              ; preds = %563, %423
  %565 = load ptr, ptr %5, align 8, !tbaa !5
  %566 = icmp ne ptr %565, null
  br i1 %566, label %567, label %574

567:                                              ; preds = %564
  %568 = call i64 @osal_monotime()
  %569 = load ptr, ptr %5, align 8, !tbaa !5
  %570 = getelementptr inbounds %struct.commit_timestamp, ptr %569, i32 0, i32 1
  store i64 %568, ptr %570, align 8, !tbaa !65
  %571 = call i64 @osal_cputime(ptr noundef null)
  %572 = load ptr, ptr %5, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.commit_timestamp, ptr %572, i32 0, i32 6
  store i64 %571, ptr %573, align 8, !tbaa !67
  br label %574

574:                                              ; preds = %567, %564
  call void @llvm.lifetime.start.p0(i64 1272, ptr %21) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #9
  %575 = load ptr, ptr %4, align 8, !tbaa !5
  %576 = call i32 @gc_put_init(ptr noundef %575, ptr noundef %21)
  store i32 %576, ptr %22, align 4, !tbaa !37
  %577 = load i32, ptr %22, align 4, !tbaa !37
  %578 = icmp eq i32 %577, 0
  %579 = xor i1 %578, true
  %580 = xor i1 %579, true
  %581 = zext i1 %580 to i32
  %582 = sext i32 %581 to i64
  %583 = call i64 @llvm.expect.i64(i64 %582, i64 1)
  %584 = icmp ne i64 %583, 0
  br i1 %584, label %585, label %588

585:                                              ; preds = %574
  %586 = load ptr, ptr %4, align 8, !tbaa !5
  %587 = call i32 @gc_update(ptr noundef %586, ptr noundef %21)
  store i32 %587, ptr %22, align 4, !tbaa !37
  br label %588

588:                                              ; preds = %585, %574
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #9
  %589 = getelementptr inbounds %struct.gc_update_context, ptr %21, i32 0, i32 11
  %590 = load i64, ptr %589, align 8, !tbaa !68
  store i64 %590, ptr %23, align 8, !tbaa !45
  %591 = load i64, ptr %23, align 8, !tbaa !45
  %592 = load ptr, ptr %4, align 8, !tbaa !5
  %593 = getelementptr inbounds %struct.MDBX_txn, ptr %592, i32 0, i32 7
  %594 = load i64, ptr %593, align 8, !tbaa !50
  %595 = icmp ugt i64 %591, %594
  br i1 %595, label %596, label %617

596:                                              ; preds = %588
  br label %597

597:                                              ; preds = %596
  %598 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %599 = zext i8 %598 to i32
  %600 = icmp sle i32 6, %599
  %601 = xor i1 %600, true
  %602 = xor i1 %601, true
  %603 = zext i1 %602 to i32
  %604 = sext i32 %603 to i64
  %605 = call i64 @llvm.expect.i64(i64 %604, i64 0)
  %606 = icmp ne i64 %605, 0
  br i1 %606, label %607, label %614

607:                                              ; preds = %597
  %608 = load i64, ptr %23, align 8, !tbaa !45
  %609 = load i64, ptr %23, align 8, !tbaa !45
  %610 = load ptr, ptr %4, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.MDBX_txn, ptr %610, i32 0, i32 7
  %612 = load i64, ptr %611, align 8, !tbaa !50
  %613 = sub i64 %609, %612
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.txn_basal_commit, i32 noundef 273, ptr noundef @.str.19, i64 noundef %608, i64 noundef %613)
  br label %614

614:                                              ; preds = %607, %597
  br label %615

615:                                              ; preds = %614
  br label %616

616:                                              ; preds = %615
  br label %617

617:                                              ; preds = %616, %588
  call void @gc_put_destroy(ptr noundef %21)
  %618 = load ptr, ptr %5, align 8, !tbaa !5
  %619 = icmp ne ptr %618, null
  br i1 %619, label %620, label %628

620:                                              ; preds = %617
  %621 = call i64 @osal_cputime(ptr noundef null)
  %622 = load ptr, ptr %5, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.commit_timestamp, ptr %622, i32 0, i32 6
  %624 = load i64, ptr %623, align 8, !tbaa !67
  %625 = sub i64 %621, %624
  %626 = load ptr, ptr %5, align 8, !tbaa !5
  %627 = getelementptr inbounds %struct.commit_timestamp, ptr %626, i32 0, i32 6
  store i64 %625, ptr %627, align 8, !tbaa !67
  br label %628

628:                                              ; preds = %620, %617
  %629 = load i32, ptr %22, align 4, !tbaa !37
  %630 = icmp ne i32 %629, 0
  %631 = xor i1 %630, true
  %632 = xor i1 %631, true
  %633 = zext i1 %632 to i32
  %634 = sext i32 %633 to i64
  %635 = call i64 @llvm.expect.i64(i64 %634, i64 0)
  %636 = icmp ne i64 %635, 0
  br i1 %636, label %637, label %639

637:                                              ; preds = %628
  %638 = load i32, ptr %22, align 4, !tbaa !37
  store i32 %638, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %1149

639:                                              ; preds = %628
  br label %640

640:                                              ; preds = %639
  %641 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %642 = zext i8 %641 to i32
  %643 = and i32 %642, 1
  %644 = icmp ne i32 %643, 0
  %645 = xor i1 %644, true
  %646 = xor i1 %645, true
  %647 = zext i1 %646 to i32
  %648 = sext i32 %647 to i64
  %649 = call i64 @llvm.expect.i64(i64 %648, i64 1)
  %650 = icmp ne i64 %649, 0
  br i1 %650, label %651, label %672

651:                                              ; preds = %640
  br label %652

652:                                              ; preds = %651
  %653 = load ptr, ptr %4, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.MDBX_txn, ptr %653, i32 0, i32 17
  %655 = getelementptr inbounds %struct.anon.2, ptr %654, i32 0, i32 10
  %656 = load i64, ptr %655, align 8, !tbaa !30
  %657 = icmp eq i64 %656, 0
  %658 = xor i1 %657, true
  %659 = xor i1 %658, true
  %660 = xor i1 %659, true
  %661 = zext i1 %660 to i32
  %662 = sext i32 %661 to i64
  %663 = call i64 @llvm.expect.i64(i64 %662, i64 0)
  %664 = icmp ne i64 %663, 0
  br i1 %664, label %665, label %669

665:                                              ; preds = %652
  %666 = load ptr, ptr %4, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.MDBX_txn, ptr %666, i32 0, i32 9
  %668 = load ptr, ptr %667, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %668, ptr noundef @.str.20, ptr noundef @__func__.txn_basal_commit, i32 noundef 284) #10
  unreachable

669:                                              ; preds = %652
  br label %670

670:                                              ; preds = %669
  br label %671

671:                                              ; preds = %670
  br label %672

672:                                              ; preds = %671, %640
  br label %673

673:                                              ; preds = %672
  br label %674

674:                                              ; preds = %673
  %675 = load ptr, ptr %4, align 8, !tbaa !5
  %676 = getelementptr inbounds %struct.MDBX_txn, ptr %675, i32 0, i32 12
  %677 = load ptr, ptr %676, align 8, !tbaa !47
  %678 = getelementptr inbounds i8, ptr %677, i64 0
  %679 = load i8, ptr %678, align 1, !tbaa !30
  %680 = zext i8 %679 to i32
  %681 = and i32 %680, 1
  %682 = icmp ne i32 %681, 0
  br i1 %682, label %683, label %687

683:                                              ; preds = %674
  %684 = load ptr, ptr %4, align 8, !tbaa !5
  %685 = getelementptr inbounds %struct.MDBX_txn, ptr %684, i32 0, i32 7
  %686 = load i64, ptr %685, align 8, !tbaa !50
  br label %694

687:                                              ; preds = %674
  %688 = load ptr, ptr %4, align 8, !tbaa !5
  %689 = getelementptr inbounds %struct.MDBX_txn, ptr %688, i32 0, i32 10
  %690 = load ptr, ptr %689, align 8, !tbaa !51
  %691 = getelementptr inbounds %struct.tree, ptr %690, i64 0
  %692 = getelementptr inbounds %struct.tree, ptr %691, i32 0, i32 9
  %693 = load i64, ptr %692, align 4, !tbaa !59
  br label %694

694:                                              ; preds = %687, %683
  %695 = phi i64 [ %686, %683 ], [ %693, %687 ]
  %696 = load ptr, ptr %4, align 8, !tbaa !5
  %697 = getelementptr inbounds %struct.MDBX_txn, ptr %696, i32 0, i32 10
  %698 = load ptr, ptr %697, align 8, !tbaa !51
  %699 = getelementptr inbounds %struct.tree, ptr %698, i64 0
  %700 = getelementptr inbounds %struct.tree, ptr %699, i32 0, i32 9
  store i64 %695, ptr %700, align 4, !tbaa !59
  %701 = load ptr, ptr %4, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.MDBX_txn, ptr %701, i32 0, i32 12
  %703 = load ptr, ptr %702, align 8, !tbaa !47
  %704 = getelementptr inbounds i8, ptr %703, i64 1
  %705 = load i8, ptr %704, align 1, !tbaa !30
  %706 = zext i8 %705 to i32
  %707 = and i32 %706, 1
  %708 = icmp ne i32 %707, 0
  br i1 %708, label %709, label %713

709:                                              ; preds = %694
  %710 = load ptr, ptr %4, align 8, !tbaa !5
  %711 = getelementptr inbounds %struct.MDBX_txn, ptr %710, i32 0, i32 7
  %712 = load i64, ptr %711, align 8, !tbaa !50
  br label %720

713:                                              ; preds = %694
  %714 = load ptr, ptr %4, align 8, !tbaa !5
  %715 = getelementptr inbounds %struct.MDBX_txn, ptr %714, i32 0, i32 10
  %716 = load ptr, ptr %715, align 8, !tbaa !51
  %717 = getelementptr inbounds %struct.tree, ptr %716, i64 1
  %718 = getelementptr inbounds %struct.tree, ptr %717, i32 0, i32 9
  %719 = load i64, ptr %718, align 4, !tbaa !59
  br label %720

720:                                              ; preds = %713, %709
  %721 = phi i64 [ %712, %709 ], [ %719, %713 ]
  %722 = load ptr, ptr %4, align 8, !tbaa !5
  %723 = getelementptr inbounds %struct.MDBX_txn, ptr %722, i32 0, i32 10
  %724 = load ptr, ptr %723, align 8, !tbaa !51
  %725 = getelementptr inbounds %struct.tree, ptr %724, i64 1
  %726 = getelementptr inbounds %struct.tree, ptr %725, i32 0, i32 9
  store i64 %721, ptr %726, align 4, !tbaa !59
  %727 = load ptr, ptr %5, align 8, !tbaa !5
  %728 = icmp ne ptr %727, null
  br i1 %728, label %729, label %738

729:                                              ; preds = %720
  %730 = call i64 @osal_monotime()
  %731 = load ptr, ptr %5, align 8, !tbaa !5
  %732 = getelementptr inbounds %struct.commit_timestamp, ptr %731, i32 0, i32 2
  store i64 %730, ptr %732, align 8, !tbaa !72
  %733 = load ptr, ptr %5, align 8, !tbaa !5
  %734 = getelementptr inbounds %struct.commit_timestamp, ptr %733, i32 0, i32 2
  %735 = load i64, ptr %734, align 8, !tbaa !72
  %736 = load ptr, ptr %5, align 8, !tbaa !5
  %737 = getelementptr inbounds %struct.commit_timestamp, ptr %736, i32 0, i32 3
  store i64 %735, ptr %737, align 8, !tbaa !73
  br label %738

738:                                              ; preds = %729, %720
  %739 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %740 = zext i8 %739 to i32
  %741 = and i32 %740, 2
  %742 = icmp ne i32 %741, 0
  %743 = xor i1 %742, true
  %744 = xor i1 %743, true
  %745 = zext i1 %744 to i32
  %746 = sext i32 %745 to i64
  %747 = call i64 @llvm.expect.i64(i64 %746, i64 0)
  %748 = icmp ne i64 %747, 0
  br i1 %748, label %749, label %777

749:                                              ; preds = %738
  %750 = load ptr, ptr %4, align 8, !tbaa !5
  %751 = load ptr, ptr %4, align 8, !tbaa !5
  %752 = getelementptr inbounds %struct.MDBX_txn, ptr %751, i32 0, i32 17
  %753 = getelementptr inbounds %struct.anon.2, ptr %752, i32 0, i32 8
  %754 = load ptr, ptr %753, align 8, !tbaa !30
  %755 = getelementptr inbounds i32, ptr %754, i64 0
  %756 = load i32, ptr %755, align 4, !tbaa !37
  %757 = zext i32 %756 to i64
  %758 = call i32 @audit_ex(ptr noundef %750, i64 noundef %757, i1 noundef zeroext true)
  store i32 %758, ptr %22, align 4, !tbaa !37
  %759 = load ptr, ptr %5, align 8, !tbaa !5
  %760 = icmp ne ptr %759, null
  br i1 %760, label %761, label %765

761:                                              ; preds = %749
  %762 = call i64 @osal_monotime()
  %763 = load ptr, ptr %5, align 8, !tbaa !5
  %764 = getelementptr inbounds %struct.commit_timestamp, ptr %763, i32 0, i32 3
  store i64 %762, ptr %764, align 8, !tbaa !73
  br label %765

765:                                              ; preds = %761, %749
  %766 = load i32, ptr %22, align 4, !tbaa !37
  %767 = icmp ne i32 %766, 0
  %768 = xor i1 %767, true
  %769 = xor i1 %768, true
  %770 = zext i1 %769 to i32
  %771 = sext i32 %770 to i64
  %772 = call i64 @llvm.expect.i64(i64 %771, i64 0)
  %773 = icmp ne i64 %772, 0
  br i1 %773, label %774, label %776

774:                                              ; preds = %765
  %775 = load i32, ptr %22, align 4, !tbaa !37
  store i32 %775, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %1149

776:                                              ; preds = %765
  br label %777

777:                                              ; preds = %776, %738
  %778 = load ptr, ptr %4, align 8, !tbaa !5
  %779 = getelementptr inbounds %struct.MDBX_txn, ptr %778, i32 0, i32 17
  %780 = getelementptr inbounds %struct.anon.2, ptr %779, i32 0, i32 7
  %781 = load ptr, ptr %780, align 8, !tbaa !30
  %782 = icmp ne ptr %781, null
  br i1 %782, label %783, label %967

783:                                              ; preds = %777
  br label %784

784:                                              ; preds = %783
  %785 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %786 = zext i8 %785 to i32
  %787 = and i32 %786, 1
  %788 = icmp ne i32 %787, 0
  %789 = xor i1 %788, true
  %790 = xor i1 %789, true
  %791 = zext i1 %790 to i32
  %792 = sext i32 %791 to i64
  %793 = call i64 @llvm.expect.i64(i64 %792, i64 1)
  %794 = icmp ne i64 %793, 0
  br i1 %794, label %795, label %819

795:                                              ; preds = %784
  br label %796

796:                                              ; preds = %795
  %797 = load ptr, ptr %4, align 8, !tbaa !5
  %798 = getelementptr inbounds %struct.MDBX_txn, ptr %797, i32 0, i32 1
  %799 = load i32, ptr %798, align 4, !tbaa !31
  %800 = and i32 %799, 524288
  %801 = icmp eq i32 %800, 0
  br i1 %801, label %803, label %802

802:                                              ; preds = %796
  br label %803

803:                                              ; preds = %802, %796
  %804 = phi i1 [ true, %796 ], [ false, %802 ]
  %805 = xor i1 %804, true
  %806 = xor i1 %805, true
  %807 = xor i1 %806, true
  %808 = zext i1 %807 to i32
  %809 = sext i32 %808 to i64
  %810 = call i64 @llvm.expect.i64(i64 %809, i64 0)
  %811 = icmp ne i64 %810, 0
  br i1 %811, label %812, label %816

812:                                              ; preds = %803
  %813 = load ptr, ptr %4, align 8, !tbaa !5
  %814 = getelementptr inbounds %struct.MDBX_txn, ptr %813, i32 0, i32 9
  %815 = load ptr, ptr %814, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %815, ptr noundef @.str.12, ptr noundef @__func__.txn_basal_commit, i32 noundef 301) #10
  unreachable

816:                                              ; preds = %803
  br label %817

817:                                              ; preds = %816
  br label %818

818:                                              ; preds = %817
  br label %819

819:                                              ; preds = %818, %784
  br label %820

820:                                              ; preds = %819
  br label %821

821:                                              ; preds = %820
  br label %822

822:                                              ; preds = %821
  %823 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %824 = zext i8 %823 to i32
  %825 = and i32 %824, 1
  %826 = icmp ne i32 %825, 0
  %827 = xor i1 %826, true
  %828 = xor i1 %827, true
  %829 = zext i1 %828 to i32
  %830 = sext i32 %829 to i64
  %831 = call i64 @llvm.expect.i64(i64 %830, i64 1)
  %832 = icmp ne i64 %831, 0
  br i1 %832, label %833, label %854

833:                                              ; preds = %822
  br label %834

834:                                              ; preds = %833
  %835 = load ptr, ptr %4, align 8, !tbaa !5
  %836 = getelementptr inbounds %struct.MDBX_txn, ptr %835, i32 0, i32 17
  %837 = getelementptr inbounds %struct.anon.2, ptr %836, i32 0, i32 10
  %838 = load i64, ptr %837, align 8, !tbaa !30
  %839 = icmp eq i64 %838, 0
  %840 = xor i1 %839, true
  %841 = xor i1 %840, true
  %842 = xor i1 %841, true
  %843 = zext i1 %842 to i32
  %844 = sext i32 %843 to i64
  %845 = call i64 @llvm.expect.i64(i64 %844, i64 0)
  %846 = icmp ne i64 %845, 0
  br i1 %846, label %847, label %851

847:                                              ; preds = %834
  %848 = load ptr, ptr %4, align 8, !tbaa !5
  %849 = getelementptr inbounds %struct.MDBX_txn, ptr %848, i32 0, i32 9
  %850 = load ptr, ptr %849, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %850, ptr noundef @.str.20, ptr noundef @__func__.txn_basal_commit, i32 noundef 302) #10
  unreachable

851:                                              ; preds = %834
  br label %852

852:                                              ; preds = %851
  br label %853

853:                                              ; preds = %852
  br label %854

854:                                              ; preds = %853, %822
  br label %855

855:                                              ; preds = %854
  br label %856

856:                                              ; preds = %855
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #9
  %857 = load i8, ptr %7, align 1, !tbaa !35, !range !42, !noundef !43
  %858 = trunc i8 %857 to i1
  br i1 %858, label %884, label %859

859:                                              ; preds = %856
  %860 = load ptr, ptr %6, align 8, !tbaa !5
  %861 = getelementptr inbounds %struct.MDBX_env, ptr %860, i32 0, i32 4
  %862 = load i32, ptr %861, align 8, !tbaa !74
  %863 = icmp eq i32 %862, -1
  br i1 %863, label %884, label %864

864:                                              ; preds = %859
  %865 = load ptr, ptr %4, align 8, !tbaa !5
  %866 = getelementptr inbounds %struct.MDBX_txn, ptr %865, i32 0, i32 17
  %867 = getelementptr inbounds %struct.anon.2, ptr %866, i32 0, i32 7
  %868 = load ptr, ptr %867, align 8, !tbaa !30
  %869 = getelementptr inbounds %struct.dpl, ptr %868, i32 0, i32 1
  %870 = load i64, ptr %869, align 8, !tbaa !32
  %871 = load ptr, ptr %6, align 8, !tbaa !5
  %872 = getelementptr inbounds %struct.MDBX_env, ptr %871, i32 0, i32 34
  %873 = getelementptr inbounds %struct.anon.11, ptr %872, i32 0, i32 10
  %874 = load i32, ptr %873, align 8, !tbaa !75
  %875 = zext i32 %874 to i64
  %876 = icmp ugt i64 %870, %875
  br i1 %876, label %884, label %877

877:                                              ; preds = %864
  %878 = load ptr, ptr %6, align 8, !tbaa !5
  %879 = getelementptr inbounds %struct.MDBX_env, ptr %878, i32 0, i32 7
  %880 = load ptr, ptr %879, align 8, !tbaa !36
  %881 = getelementptr inbounds %struct.shared_lck, ptr %880, i32 0, i32 14
  %882 = call i64 @atomic_load64(ptr noundef %881, i32 noundef 0)
  %883 = icmp ne i64 %882, 0
  br i1 %883, label %884, label %889

884:                                              ; preds = %877, %864, %859, %856
  %885 = load ptr, ptr %6, align 8, !tbaa !5
  %886 = getelementptr inbounds %struct.MDBX_env, ptr %885, i32 0, i32 3
  %887 = getelementptr inbounds %struct.osal_mmap, ptr %886, i32 0, i32 1
  %888 = load i32, ptr %887, align 8, !tbaa !76
  br label %893

889:                                              ; preds = %877
  %890 = load ptr, ptr %6, align 8, !tbaa !5
  %891 = getelementptr inbounds %struct.MDBX_env, ptr %890, i32 0, i32 4
  %892 = load i32, ptr %891, align 8, !tbaa !74
  br label %893

893:                                              ; preds = %889, %884
  %894 = phi i32 [ %888, %884 ], [ %892, %889 ]
  store i32 %894, ptr %24, align 4, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 40, ptr %25) #9
  %895 = load ptr, ptr %4, align 8, !tbaa !5
  %896 = load ptr, ptr %4, align 8, !tbaa !5
  %897 = getelementptr inbounds %struct.MDBX_txn, ptr %896, i32 0, i32 17
  %898 = getelementptr inbounds %struct.anon.2, ptr %897, i32 0, i32 7
  %899 = load ptr, ptr %898, align 8, !tbaa !30
  %900 = getelementptr inbounds %struct.dpl, ptr %899, i32 0, i32 1
  %901 = load i64, ptr %900, align 8, !tbaa !32
  %902 = load ptr, ptr %4, align 8, !tbaa !5
  %903 = getelementptr inbounds %struct.MDBX_txn, ptr %902, i32 0, i32 17
  %904 = getelementptr inbounds %struct.anon.2, ptr %903, i32 0, i32 7
  %905 = load ptr, ptr %904, align 8, !tbaa !30
  %906 = getelementptr inbounds %struct.dpl, ptr %905, i32 0, i32 2
  %907 = load i64, ptr %906, align 8, !tbaa !77
  %908 = load i32, ptr %24, align 4, !tbaa !37
  %909 = call i32 @iov_init(ptr noundef %895, ptr noundef %25, i64 noundef %901, i64 noundef %907, i32 noundef %908, i1 noundef zeroext false)
  store i32 %909, ptr %22, align 4, !tbaa !37
  %910 = load i32, ptr %22, align 4, !tbaa !37
  %911 = icmp ne i32 %910, 0
  %912 = xor i1 %911, true
  %913 = xor i1 %912, true
  %914 = zext i1 %913 to i32
  %915 = sext i32 %914 to i64
  %916 = call i64 @llvm.expect.i64(i64 %915, i64 0)
  %917 = icmp ne i64 %916, 0
  br i1 %917, label %918, label %935

918:                                              ; preds = %893
  br label %919

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

929:                                              ; preds = %919
  %930 = load i32, ptr %22, align 4, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.txn_basal_commit, i32 noundef 319, ptr noundef @.str.14, ptr noundef @.str.21, i32 noundef %930)
  br label %931

931:                                              ; preds = %929, %919
  br label %932

932:                                              ; preds = %931
  br label %933

933:                                              ; preds = %932
  %934 = load i32, ptr %22, align 4, !tbaa !37
  store i32 %934, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %964

935:                                              ; preds = %893
  %936 = load ptr, ptr %4, align 8, !tbaa !5
  %937 = call i32 @txn_write(ptr noundef %936, ptr noundef %25)
  store i32 %937, ptr %22, align 4, !tbaa !37
  %938 = load i32, ptr %22, align 4, !tbaa !37
  %939 = icmp ne i32 %938, 0
  %940 = xor i1 %939, true
  %941 = xor i1 %940, true
  %942 = zext i1 %941 to i32
  %943 = sext i32 %942 to i64
  %944 = call i64 @llvm.expect.i64(i64 %943, i64 0)
  %945 = icmp ne i64 %944, 0
  br i1 %945, label %946, label %963

946:                                              ; preds = %935
  br label %947

947:                                              ; preds = %946
  %948 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %949 = zext i8 %948 to i32
  %950 = icmp sle i32 1, %949
  %951 = xor i1 %950, true
  %952 = xor i1 %951, true
  %953 = zext i1 %952 to i32
  %954 = sext i32 %953 to i64
  %955 = call i64 @llvm.expect.i64(i64 %954, i64 0)
  %956 = icmp ne i64 %955, 0
  br i1 %956, label %957, label %959

957:                                              ; preds = %947
  %958 = load i32, ptr %22, align 4, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.txn_basal_commit, i32 noundef 325, ptr noundef @.str.14, ptr noundef @.str.22, i32 noundef %958)
  br label %959

959:                                              ; preds = %957, %947
  br label %960

960:                                              ; preds = %959
  br label %961

961:                                              ; preds = %960
  %962 = load i32, ptr %22, align 4, !tbaa !37
  store i32 %962, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %964

963:                                              ; preds = %935
  store i32 0, ptr %12, align 4
  br label %964

964:                                              ; preds = %963, %961, %933
  call void @llvm.lifetime.end.p0(i64 40, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #9
  %965 = load i32, ptr %12, align 4
  switch i32 %965, label %1149 [
    i32 0, label %966
  ]

966:                                              ; preds = %964
  br label %1029

967:                                              ; preds = %777
  br label %968

968:                                              ; preds = %967
  %969 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !16
  %970 = zext i8 %969 to i32
  %971 = and i32 %970, 1
  %972 = icmp ne i32 %971, 0
  %973 = xor i1 %972, true
  %974 = xor i1 %973, true
  %975 = zext i1 %974 to i32
  %976 = sext i32 %975 to i64
  %977 = call i64 @llvm.expect.i64(i64 %976, i64 1)
  %978 = icmp ne i64 %977, 0
  br i1 %978, label %979, label %1003

979:                                              ; preds = %968
  br label %980

980:                                              ; preds = %979
  %981 = load ptr, ptr %4, align 8, !tbaa !5
  %982 = getelementptr inbounds %struct.MDBX_txn, ptr %981, i32 0, i32 1
  %983 = load i32, ptr %982, align 4, !tbaa !31
  %984 = and i32 %983, 524288
  %985 = icmp ne i32 %984, 0
  br i1 %985, label %986, label %987

986:                                              ; preds = %980
  br label %987

987:                                              ; preds = %986, %980
  %988 = phi i1 [ false, %980 ], [ true, %986 ]
  %989 = xor i1 %988, true
  %990 = xor i1 %989, true
  %991 = xor i1 %990, true
  %992 = zext i1 %991 to i32
  %993 = sext i32 %992 to i64
  %994 = call i64 @llvm.expect.i64(i64 %993, i64 0)
  %995 = icmp ne i64 %994, 0
  br i1 %995, label %996, label %1000

996:                                              ; preds = %987
  %997 = load ptr, ptr %4, align 8, !tbaa !5
  %998 = getelementptr inbounds %struct.MDBX_txn, ptr %997, i32 0, i32 9
  %999 = load ptr, ptr %998, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %999, ptr noundef @.str.11, ptr noundef @__func__.txn_basal_commit, i32 noundef 329) #10
  unreachable

1000:                                             ; preds = %987
  br label %1001

1001:                                             ; preds = %1000
  br label %1002

1002:                                             ; preds = %1001
  br label %1003

1003:                                             ; preds = %1002, %968
  br label %1004

1004:                                             ; preds = %1003
  br label %1005

1005:                                             ; preds = %1004
  %1006 = load ptr, ptr %4, align 8, !tbaa !5
  %1007 = getelementptr inbounds %struct.MDBX_txn, ptr %1006, i32 0, i32 17
  %1008 = getelementptr inbounds %struct.anon.2, ptr %1007, i32 0, i32 11
  %1009 = load i64, ptr %1008, align 8, !tbaa !30
  %1010 = load ptr, ptr %6, align 8, !tbaa !5
  %1011 = getelementptr inbounds %struct.MDBX_env, ptr %1010, i32 0, i32 7
  %1012 = load ptr, ptr %1011, align 8, !tbaa !36
  %1013 = getelementptr inbounds %struct.shared_lck, ptr %1012, i32 0, i32 14
  %1014 = load volatile i64, ptr %1013, align 8, !tbaa !30
  %1015 = add i64 %1014, %1009
  store volatile i64 %1015, ptr %1013, align 8, !tbaa !30
  %1016 = load ptr, ptr %6, align 8, !tbaa !5
  %1017 = getelementptr inbounds %struct.MDBX_env, ptr %1016, i32 0, i32 7
  %1018 = load ptr, ptr %1017, align 8, !tbaa !36
  %1019 = getelementptr inbounds %struct.shared_lck, ptr %1018, i32 0, i32 13
  %1020 = load volatile i64, ptr %1019, align 16, !tbaa !30
  %1021 = icmp ne i64 %1020, 0
  br i1 %1021, label %1028, label %1022

1022:                                             ; preds = %1005
  %1023 = call i64 @osal_monotime()
  %1024 = load ptr, ptr %6, align 8, !tbaa !5
  %1025 = getelementptr inbounds %struct.MDBX_env, ptr %1024, i32 0, i32 7
  %1026 = load ptr, ptr %1025, align 8, !tbaa !36
  %1027 = getelementptr inbounds %struct.shared_lck, ptr %1026, i32 0, i32 13
  store volatile i64 %1023, ptr %1027, align 16, !tbaa !30
  br label %1028

1028:                                             ; preds = %1022, %1005
  br label %1029

1029:                                             ; preds = %1028, %966
  %1030 = load ptr, ptr %5, align 8, !tbaa !5
  %1031 = icmp ne ptr %1030, null
  br i1 %1031, label %1032, label %1036

1032:                                             ; preds = %1029
  %1033 = call i64 @osal_monotime()
  %1034 = load ptr, ptr %5, align 8, !tbaa !5
  %1035 = getelementptr inbounds %struct.commit_timestamp, ptr %1034, i32 0, i32 4
  store i64 %1033, ptr %1035, align 8, !tbaa !78
  br label %1036

1036:                                             ; preds = %1032, %1029
  call void @llvm.lifetime.start.p0(i64 224, ptr %26) #9
  %1037 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 0
  %1038 = getelementptr inbounds [2 x i32], ptr %1037, i64 0, i64 0
  %1039 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1040 = load ptr, ptr %1039, align 8, !tbaa !30
  %1041 = getelementptr inbounds %struct.meta, ptr %1040, i32 0, i32 0
  %1042 = getelementptr inbounds [2 x i32], ptr %1041, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1038, ptr align 4 %1042, i64 8, i1 false)
  %1043 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1044 = load ptr, ptr %1043, align 8, !tbaa !30
  %1045 = getelementptr inbounds %struct.meta, ptr %1044, i32 0, i32 2
  %1046 = load i16, ptr %1045, align 4, !tbaa !79
  %1047 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 2
  store i16 %1046, ptr %1047, align 4, !tbaa !79
  %1048 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1049 = load ptr, ptr %1048, align 8, !tbaa !30
  %1050 = getelementptr inbounds %struct.meta, ptr %1049, i32 0, i32 3
  %1051 = load i8, ptr %1050, align 2, !tbaa !81
  %1052 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 3
  store i8 %1051, ptr %1052, align 2, !tbaa !81
  %1053 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1054 = load ptr, ptr %1053, align 8, !tbaa !30
  %1055 = getelementptr inbounds %struct.meta, ptr %1054, i32 0, i32 4
  %1056 = load i8, ptr %1055, align 1, !tbaa !82
  %1057 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 4
  store i8 %1056, ptr %1057, align 1, !tbaa !82
  %1058 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 10
  %1059 = getelementptr inbounds [2 x i32], ptr %1058, i64 0, i64 0
  %1060 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1061 = load ptr, ptr %1060, align 8, !tbaa !30
  %1062 = getelementptr inbounds %struct.meta, ptr %1061, i32 0, i32 10
  %1063 = getelementptr inbounds [2 x i32], ptr %1062, i64 0, i64 0
  %1064 = call i64 @unaligned_peek_u64(i64 noundef 4, ptr noundef %1063) #11
  %1065 = load ptr, ptr %4, align 8, !tbaa !5
  %1066 = getelementptr inbounds %struct.MDBX_txn, ptr %1065, i32 0, i32 17
  %1067 = getelementptr inbounds %struct.anon.2, ptr %1066, i32 0, i32 8
  %1068 = load ptr, ptr %1067, align 8, !tbaa !30
  %1069 = getelementptr inbounds i32, ptr %1068, i64 0
  %1070 = load i32, ptr %1069, align 4, !tbaa !37
  %1071 = zext i32 %1070 to i64
  %1072 = add i64 %1064, %1071
  call void @unaligned_poke_u64(i64 noundef 4, ptr noundef %1059, i64 noundef %1072)
  %1073 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 5
  %1074 = load ptr, ptr %4, align 8, !tbaa !5
  %1075 = getelementptr inbounds %struct.MDBX_txn, ptr %1074, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1073, ptr align 8 %1075, i64 20, i1 false), !tbaa.struct !83
  %1076 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 6
  %1077 = getelementptr inbounds %struct.anon.25, ptr %1076, i32 0, i32 0
  %1078 = load ptr, ptr %4, align 8, !tbaa !5
  %1079 = getelementptr inbounds %struct.MDBX_txn, ptr %1078, i32 0, i32 10
  %1080 = load ptr, ptr %1079, align 8, !tbaa !51
  %1081 = getelementptr inbounds %struct.tree, ptr %1080, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1077, ptr align 4 %1081, i64 48, i1 false), !tbaa.struct !85
  %1082 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 6
  %1083 = getelementptr inbounds %struct.anon.25, ptr %1082, i32 0, i32 1
  %1084 = load ptr, ptr %4, align 8, !tbaa !5
  %1085 = getelementptr inbounds %struct.MDBX_txn, ptr %1084, i32 0, i32 10
  %1086 = load ptr, ptr %1085, align 8, !tbaa !51
  %1087 = getelementptr inbounds %struct.tree, ptr %1086, i64 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1083, ptr align 4 %1087, i64 48, i1 false), !tbaa.struct !85
  %1088 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 7
  %1089 = load ptr, ptr %4, align 8, !tbaa !5
  %1090 = getelementptr inbounds %struct.MDBX_txn, ptr %1089, i32 0, i32 15
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1088, ptr align 8 %1090, i64 32, i1 false), !tbaa.struct !86
  %1091 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 12
  %1092 = getelementptr inbounds %struct.meta_ptr, ptr %8, i32 0, i32 1
  %1093 = load ptr, ptr %1092, align 8, !tbaa !30
  %1094 = getelementptr inbounds %struct.meta, ptr %1093, i32 0, i32 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %1091, ptr align 4 %1094, i64 16, i1 false)
  %1095 = getelementptr inbounds %struct.meta, ptr %26, i32 0, i32 8
  store i64 0, ptr %1095, align 4, !tbaa !30
  %1096 = load ptr, ptr %6, align 8, !tbaa !5
  %1097 = load i64, ptr %23, align 8, !tbaa !45
  call void @meta_set_txnid(ptr noundef %1096, ptr noundef %26, i64 noundef %1097)
  %1098 = load ptr, ptr %6, align 8, !tbaa !5
  %1099 = load ptr, ptr %6, align 8, !tbaa !5
  %1100 = getelementptr inbounds %struct.MDBX_env, ptr %1099, i32 0, i32 1
  %1101 = load i32, ptr %1100, align 4, !tbaa !87
  %1102 = load ptr, ptr %4, align 8, !tbaa !5
  %1103 = getelementptr inbounds %struct.MDBX_txn, ptr %1102, i32 0, i32 1
  %1104 = load i32, ptr %1103, align 4, !tbaa !31
  %1105 = or i32 %1101, %1104
  %1106 = or i32 %1105, 1073741824
  %1107 = load ptr, ptr %4, align 8, !tbaa !5
  %1108 = getelementptr inbounds %struct.MDBX_txn, ptr %1107, i32 0, i32 17
  %1109 = getelementptr inbounds %struct.anon.2, ptr %1108, i32 0, i32 0
  %1110 = call i32 @dxb_sync_locked(ptr noundef %1098, i32 noundef %1106, ptr noundef %26, ptr noundef %1109)
  store i32 %1110, ptr %22, align 4, !tbaa !37
  %1111 = load ptr, ptr %5, align 8, !tbaa !5
  %1112 = icmp ne ptr %1111, null
  br i1 %1112, label %1113, label %1117

1113:                                             ; preds = %1036
  %1114 = call i64 @osal_monotime()
  %1115 = load ptr, ptr %5, align 8, !tbaa !5
  %1116 = getelementptr inbounds %struct.commit_timestamp, ptr %1115, i32 0, i32 5
  store i64 %1114, ptr %1116, align 8, !tbaa !88
  br label %1117

1117:                                             ; preds = %1113, %1036
  %1118 = load i32, ptr %22, align 4, !tbaa !37
  %1119 = icmp ne i32 %1118, 0
  %1120 = xor i1 %1119, true
  %1121 = xor i1 %1120, true
  %1122 = zext i1 %1121 to i32
  %1123 = sext i32 %1122 to i64
  %1124 = call i64 @llvm.expect.i64(i64 %1123, i64 0)
  %1125 = icmp ne i64 %1124, 0
  br i1 %1125, label %1126, label %1147

1126:                                             ; preds = %1117
  %1127 = load ptr, ptr %6, align 8, !tbaa !5
  %1128 = getelementptr inbounds %struct.MDBX_env, ptr %1127, i32 0, i32 1
  %1129 = load i32, ptr %1128, align 4, !tbaa !87
  %1130 = or i32 %1129, -2147483648
  store i32 %1130, ptr %1128, align 4, !tbaa !87
  br label %1131

1131:                                             ; preds = %1126
  %1132 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !41
  %1133 = zext i8 %1132 to i32
  %1134 = icmp sle i32 1, %1133
  %1135 = xor i1 %1134, true
  %1136 = xor i1 %1135, true
  %1137 = zext i1 %1136 to i32
  %1138 = sext i32 %1137 to i64
  %1139 = call i64 @llvm.expect.i64(i64 %1138, i64 0)
  %1140 = icmp ne i64 %1139, 0
  br i1 %1140, label %1141, label %1143

1141:                                             ; preds = %1131
  %1142 = load i32, ptr %22, align 4, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef @__func__.txn_basal_commit, i32 noundef 361, ptr noundef @.str.14, ptr noundef @.str.23, i32 noundef %1142)
  br label %1143

1143:                                             ; preds = %1141, %1131
  br label %1144

1144:                                             ; preds = %1143
  br label %1145

1145:                                             ; preds = %1144
  %1146 = load i32, ptr %22, align 4, !tbaa !37
  store i32 %1146, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %1148

1147:                                             ; preds = %1117
  store i32 0, ptr %3, align 4
  store i32 1, ptr %12, align 4
  br label %1148

1148:                                             ; preds = %1147, %1145
  call void @llvm.lifetime.end.p0(i64 224, ptr %26) #9
  br label %1149

1149:                                             ; preds = %1148, %964, %774, %637
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 1272, ptr %21) #9
  br label %1150

1150:                                             ; preds = %1149, %561, %391, %287
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  %1151 = load i32, ptr %3, align 4
  ret i32 %1151
}

declare void @txn_done_cursors(ptr noundef) #5

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @atomic_load32(ptr noundef, i32 noundef) #7

declare i32 @meta_sync(ptr noundef, ptr noundef byval(%struct.meta_ptr) align 8) #5

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

declare i32 @cursor_init(ptr noundef, ptr noundef, i64 noundef) #5

declare i32 @cursor_put(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #5

declare i64 @osal_monotime() #5

declare i64 @osal_cputime(ptr noundef) #5

declare i32 @gc_put_init(ptr noundef, ptr noundef) #5

declare i32 @gc_update(ptr noundef, ptr noundef) #5

declare void @gc_put_destroy(ptr noundef) #5

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i64 @atomic_load64(ptr noundef, i32 noundef) #7

declare i32 @iov_init(ptr noundef, ptr noundef, i64 noundef, i64 noundef, i32 noundef, i1 noundef zeroext) #5

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @unaligned_poke_u64(i64 noundef, ptr noalias noundef, i64 noundef) #3

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_set_txnid(ptr noundef, ptr noundef, i64 noundef) #3

declare i32 @dxb_sync_locked(ptr noundef, i32 noundef, ptr noundef, ptr noundef) #5

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 80}
!10 = !{!"MDBX_txn", !11, i64 0, !11, i64 4, !12, i64 8, !12, i64 16, !6, i64 24, !6, i64 32, !13, i64 40, !12, i64 64, !12, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !15, i64 128, !6, i64 160, !7, i64 168}
!11 = !{!"int", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!"geo", !14, i64 0, !14, i64 2, !11, i64 4, !11, i64 8, !7, i64 12, !7, i64 16}
!14 = !{!"short", !7, i64 0}
!15 = !{!"MDBX_canary", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!16 = !{!17, !7, i64 25}
!17 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !18, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !12, i64 80, !6, i64 88}
!18 = !{!"_Bool", !7, i64 0}
!19 = !{!20, !6, i64 192}
!20 = !{!"MDBX_env", !7, i64 0, !11, i64 4, !11, i64 8, !21, i64 16, !11, i64 56, !11, i64 60, !21, i64 64, !6, i64 104, !14, i64 112, !14, i64 114, !14, i64 116, !14, i64 118, !14, i64 120, !14, i64 122, !7, i64 124, !7, i64 128, !7, i64 129, !14, i64 130, !11, i64 132, !11, i64 136, !11, i64 140, !11, i64 144, !22, 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, !12, i64 256, !23, i64 264, !25, i64 320, !18, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !26, i64 392, !7, i64 400, !11, i64 440, !11, i64 444, !6, i64 448, !27, i64 456, !7, i64 496, !7, i64 536}
!21 = !{!"osal_mmap", !7, i64 0, !11, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!22 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!23 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !12, i64 16, !7, i64 24, !7, i64 25, !7, i64 26, !7, i64 27, !11, i64 28, !11, i64 32, !18, i64 36, !18, i64 37, !18, i64 38, !24, i64 40, !7, i64 48}
!24 = !{!"", !14, i64 0, !14, i64 2, !14, i64 4, !14, i64 6}
!25 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!26 = !{!"", !12, i64 0}
!27 = !{!"osal_ioring", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!28 = !{!10, !6, i64 24}
!29 = !{!10, !6, i64 32}
!30 = !{!7, !7, i64 0}
!31 = !{!10, !11, i64 4}
!32 = !{!33, !12, i64 8}
!33 = !{!"dpl", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !7, i64 32}
!34 = !{!20, !11, i64 272}
!35 = !{!18, !18, i64 0}
!36 = !{!20, !6, i64 104}
!37 = !{!11, !11, i64 0}
!38 = !{!39, !12, i64 16}
!39 = !{!"meta_ptr", !12, i64 0, !7, i64 8, !12, i64 16}
!40 = !{!39, !12, i64 0}
!41 = !{!17, !7, i64 26}
!42 = !{i8 0, i8 2}
!43 = !{}
!44 = !{!10, !6, i64 96}
!45 = !{!12, !12, i64 0}
!46 = !{!10, !12, i64 8}
!47 = !{!10, !6, i64 104}
!48 = distinct !{!48, !49}
!49 = !{!"llvm.loop.mustprogress"}
!50 = !{!10, !12, i64 64}
!51 = !{!10, !6, i64 88}
!52 = !{!53, !11, i64 8}
!53 = !{!"tree", !14, i64 0, !14, i64 2, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !12, i64 24, !12, i64 32, !12, i64 40}
!54 = !{!10, !6, i64 120}
!55 = !{!56, !6, i64 368}
!56 = !{!"cursor_couple", !57, i64 0, !6, i64 384, !58, i64 392}
!57 = !{!"MDBX_cursor", !11, i64 0, !7, i64 4, !7, i64 6, !7, i64 7, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !7, i64 48, !7, i64 304, !6, i64 368, !6, i64 376}
!58 = !{!"inner_cursor", !57, i64 0, !53, i64 384}
!59 = !{!53, !12, i64 40}
!60 = !{!61, !6, i64 0}
!61 = !{!"iovec", !6, i64 0, !12, i64 8}
!62 = !{!61, !12, i64 8}
!63 = !{!20, !6, i64 200}
!64 = distinct !{!64, !49}
!65 = !{!66, !12, i64 8}
!66 = !{!"commit_timestamp", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48}
!67 = !{!66, !12, i64 48}
!68 = !{!69, !12, i64 312}
!69 = !{!"gc_update_context", !11, i64 0, !11, i64 4, !18, i64 8, !11, i64 12, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !70, i64 56, !70, i64 184, !12, i64 312, !7, i64 320, !71, i64 1144}
!70 = !{!"MDBX_rkl", !12, i64 0, !12, i64 8, !11, i64 16, !11, i64 20, !6, i64 24, !7, i64 32}
!71 = !{!"gc_dense_histogram", !11, i64 0, !7, i64 4}
!72 = !{!66, !12, i64 16}
!73 = !{!66, !12, i64 24}
!74 = !{!20, !11, i64 56}
!75 = !{!20, !11, i64 296}
!76 = !{!20, !11, i64 24}
!77 = !{!33, !12, i64 16}
!78 = !{!66, !12, i64 32}
!79 = !{!80, !14, i64 16}
!80 = !{!"meta", !7, i64 0, !7, i64 8, !14, i64 16, !7, i64 18, !7, i64 19, !13, i64 20, !7, i64 40, !15, i64 136, !7, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 208}
!81 = !{!80, !7, i64 18}
!82 = !{!80, !7, i64 19}
!83 = !{i64 0, i64 2, !84, i64 2, i64 2, !84, i64 4, i64 4, !37, i64 8, i64 4, !37, i64 12, i64 4, !30, i64 16, i64 4, !30}
!84 = !{!14, !14, i64 0}
!85 = !{i64 0, i64 2, !84, i64 2, i64 2, !84, i64 4, i64 4, !37, i64 8, i64 4, !37, i64 12, i64 4, !37, i64 16, i64 4, !37, i64 20, i64 4, !37, i64 24, i64 8, !45, i64 32, i64 8, !45, i64 40, i64 8, !45}
!86 = !{i64 0, i64 8, !45, i64 8, i64 8, !45, i64 16, i64 8, !45, i64 24, i64 8, !45}
!87 = !{!20, !11, i64 4}
!88 = !{!66, !12, i64 40}


; 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.7 }
%struct.anon.7 = 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.meta_ptr = type { i64, %union.anon.6, i64 }
%union.anon.6 = type { ptr }
%struct.cursor_couple = type { %struct.MDBX_cursor, ptr, %struct.inner_cursor }
%struct.MDBX_cursor = type { i32, %union.anon.20, i8, i8, ptr, ptr, ptr, ptr, ptr, [32 x ptr], [32 x i16], ptr, ptr }
%union.anon.20 = 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.iovec = type { ptr, i64 }
%struct.gc_update_context = type { i32, i32, i8, i32, i64, i64, i64, i64, i64, %struct.MDBX_rkl, %struct.MDBX_rkl, i64, %union.anon.22, %struct.gc_dense_histogram }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%union.anon.22 = type { %struct.cursor_couple }
%struct.gc_dense_histogram = type { i32, [31 x i32] }
%struct.iov_ctx = type { ptr, ptr, i32, i32, i32, i32, i64 }
%struct.meta = type { [2 x i32], %union.anon.23, i16, i8, i8, %struct.geo, %union.anon.24, %struct.MDBX_canary, %union.anon.27, [2 x %union.mdbx_atomic_uint32_t], [2 x i32], %union.bin128, %union.bin128 }
%union.anon.23 = type { i64 }
%struct.geo = type { i16, i16, i32, i32, %union.anon, %union.anon.0 }
%union.anon = type { i32 }
%union.anon.0 = type { i32 }
%union.anon.24 = type { %struct.anon.25 }
%struct.anon.25 = type { %struct.tree, %struct.tree }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%union.anon.27 = type { i64 }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.kvx = type { %struct.clc2, %struct.iovec }
%struct.clc2 = type { %struct.clc, %struct.clc }
%struct.clc = type { ptr, i64, i64 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.10 = external hidden unnamed_addr constant [54 x i8], align 1
@__func__.txn_basal_commit = external hidden unnamed_addr constant [17 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [5 x i8], align 1

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_recent(ptr dead_on_unwind noalias writable sret(%struct.meta_ptr) align 8, ptr noundef, ptr noundef) local_unnamed_addr #2

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @txn_basal_commit(ptr noundef %0, ptr noundef %1) local_unnamed_addr #5 {
  %3 = alloca %struct.meta_ptr, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = alloca %struct.cursor_couple, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca %struct.iovec, align 8
  %10 = alloca %struct.gc_update_context, align 8
  %11 = alloca %struct.iov_ctx, align 8
  %12 = alloca %struct.meta, align 8
  %13 = getelementptr inbounds i8, ptr %0, i64 80
  %14 = load ptr, ptr %13, align 8, !tbaa !5
  %15 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  %16 = and i8 %15, 1
  %.not = icmp eq i8 %16, 0
  br i1 %.not, label %27, label %17, !prof !18

17:                                               ; preds = %2
  %18 = getelementptr inbounds i8, ptr %14, i64 192
  %19 = load ptr, ptr %18, align 8, !tbaa !19
  %20 = icmp eq ptr %19, %0
  br i1 %20, label %21, label %.critedge, !prof !28

21:                                               ; preds = %17
  %22 = getelementptr inbounds i8, ptr %0, i64 24
  %23 = load ptr, ptr %22, align 8, !tbaa !29
  %.not191 = icmp eq ptr %23, null
  br i1 %.not191, label %24, label %.critedge, !prof !28

24:                                               ; preds = %21
  %25 = getelementptr inbounds i8, ptr %0, i64 32
  %26 = load ptr, ptr %25, align 8, !tbaa !30
  %.not192 = icmp eq ptr %26, null
  br i1 %.not192, label %.thread, label %.critedge, !prof !28

.critedge:                                        ; preds = %21, %17, %24
  tail call void @mdbx_assert_fail(ptr noundef nonnull %14, ptr noundef nonnull @.str.10, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 169) #8
  unreachable

27:                                               ; preds = %2
  %28 = getelementptr inbounds i8, ptr %0, i64 496
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 4
  %.pre = load i32, ptr %.phi.trans.insert, align 4, !tbaa !31
  br label %48

.thread:                                          ; preds = %24
  %29 = getelementptr inbounds i8, ptr %0, i64 496
  %30 = load ptr, ptr %29, align 8, !tbaa !32
  %.not193242 = icmp eq ptr %30, null
  %31 = getelementptr inbounds i8, ptr %0, i64 4
  %32 = load i32, ptr %31, align 4, !tbaa !31
  %33 = and i32 %32, 524288
  %.not195 = icmp eq i32 %33, 0
  br i1 %.not193242, label %34, label %36

34:                                               ; preds = %.thread
  br i1 %.not195, label %35, label %48, !prof !18

35:                                               ; preds = %34
  tail call void @mdbx_assert_fail(ptr noundef nonnull %14, ptr noundef nonnull @.str.11, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 171) #8
  unreachable

36:                                               ; preds = %.thread
  br i1 %.not195, label %38, label %37, !prof !28

37:                                               ; preds = %36
  tail call void @mdbx_assert_fail(ptr noundef nonnull %14, ptr noundef nonnull @.str.12, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 173) #8
  unreachable

38:                                               ; preds = %36
  %39 = getelementptr inbounds i8, ptr %0, i64 488
  %40 = load i64, ptr %39, align 8, !tbaa !32
  %41 = getelementptr inbounds i8, ptr %30, i64 8
  %42 = load i64, ptr %41, align 8, !tbaa !33
  %43 = add i64 %42, %40
  %44 = getelementptr inbounds i8, ptr %14, i64 272
  %45 = load i32, ptr %44, align 8, !tbaa !35
  %46 = zext i32 %45 to i64
  %.not199 = icmp eq i64 %43, %46
  br i1 %.not199, label %48, label %47, !prof !28

47:                                               ; preds = %38
  tail call void @mdbx_assert_fail(ptr noundef nonnull %14, ptr noundef nonnull @.str.13, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 174) #8
  unreachable

48:                                               ; preds = %27, %38, %34
  %49 = phi i32 [ %32, %38 ], [ %32, %34 ], [ %.pre, %27 ]
  %50 = phi ptr [ %29, %38 ], [ %29, %34 ], [ %28, %27 ]
  %51 = getelementptr inbounds i8, ptr %0, i64 168
  %52 = getelementptr inbounds i8, ptr %0, i64 4
  %53 = and i32 %49, 256
  %.not200 = icmp eq i32 %53, 0
  br i1 %.not200, label %55, label %54

54:                                               ; preds = %48
  tail call void @txn_done_cursors(ptr noundef nonnull %0) #9
  br label %55

55:                                               ; preds = %54, %48
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %3) #9
  call void @meta_recent(ptr dead_on_unwind nonnull writable sret(%struct.meta_ptr) align 8 %3, ptr noundef %14, ptr noundef nonnull %51)
  %56 = getelementptr inbounds i8, ptr %14, i64 104
  %57 = load ptr, ptr %56, align 8, !tbaa !36
  %58 = getelementptr inbounds i8, ptr %57, i64 20
  %59 = call i32 @atomic_load32(ptr noundef nonnull %58, i32 noundef 0)
  %60 = getelementptr inbounds i8, ptr %3, i64 16
  %61 = load i64, ptr %60, align 8, !tbaa !37
  %.not201 = icmp eq i64 %61, 0
  br i1 %.not201, label %.critedge239.thread, label %62

62:                                               ; preds = %55
  %63 = load i64, ptr %3, align 8, !tbaa !39
  %64 = trunc i64 %63 to i32
  %.not202 = icmp eq i32 %59, %64
  br i1 %.not202, label %.critedge239.thread, label %65

65:                                               ; preds = %62
  %66 = load i32, ptr %52, align 4, !tbaa !31
  %67 = and i32 %66, 524288
  %68 = icmp eq i32 %67, 0
  %.neg = select i1 %68, i32 -1968526676, i32 -894784854
  %69 = add i32 %.neg, %64
  %70 = icmp eq i32 %59, %69
  br i1 %70, label %.critedge239.thread, label %71

71:                                               ; preds = %65
  %72 = call i32 @meta_sync(ptr noundef nonnull %14, ptr noundef nonnull byval(%struct.meta_ptr) align 8 %3) #9
  %.not203 = icmp eq i32 %72, 0
  br i1 %.not203, label %.critedge239.thread, label %73, !prof !28

73:                                               ; preds = %71
  %74 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %.not204 = icmp eq i8 %74, 0
  br i1 %.not204, label %.critedge239, label %75, !prof !28

75:                                               ; preds = %73
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 218, ptr noundef nonnull @.str.14, ptr noundef nonnull @.str.15, i32 noundef %72) #9
  br label %.critedge239

.critedge239.thread:                              ; preds = %71, %65, %62, %55
  %.2164 = phi i1 [ false, %62 ], [ false, %55 ], [ false, %71 ], [ true, %65 ]
  %76 = load ptr, ptr %50, align 8, !tbaa !32
  %.not205 = icmp eq ptr %76, null
  br i1 %.not205, label %81, label %77

77:                                               ; preds = %.critedge239.thread
  %78 = getelementptr inbounds i8, ptr %76, i64 8
  %79 = load i64, ptr %78, align 8, !tbaa !33
  %80 = icmp eq i64 %79, 0
  br i1 %80, label %81, label %116

81:                                               ; preds = %77, %.critedge239.thread
  %82 = load i32, ptr %52, align 4, !tbaa !31
  %83 = and i32 %82, 327692
  %84 = icmp eq i32 %83, 0
  br i1 %84, label %85, label %116

85:                                               ; preds = %81
  %86 = load i64, ptr %60, align 8
  %87 = icmp ne i64 %86, 0
  %or.cond = select i1 %.2164, i1 true, i1 %87
  br i1 %or.cond, label %116, label %88

88:                                               ; preds = %85
  %89 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  %90 = and i8 %89, 2
  %.not206 = icmp eq i8 %90, 0
  br i1 %.not206, label %91, label %116, !prof !28

91:                                               ; preds = %88
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #9
  %92 = getelementptr inbounds i8, ptr %0, i64 96
  %93 = load ptr, ptr %92, align 8, !tbaa !41
  %94 = load i32, ptr %93, align 4, !tbaa !42
  %95 = zext i32 %94 to i64
  store i64 %95, ptr %4, align 8, !tbaa !43
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #9
  %96 = getelementptr inbounds i8, ptr %0, i64 8
  store i64 0, ptr %5, align 8, !tbaa !43
  %97 = load i64, ptr %96, align 8, !tbaa !44
  %.not265 = icmp eq i64 %97, 0
  br i1 %.not265, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %91
  %98 = getelementptr inbounds i8, ptr %0, i64 104
  br label %99

._crit_edge:                                      ; preds = %111, %91
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #9
  br label %.critedge239

99:                                               ; preds = %.lr.ph, %111
  %100 = call zeroext i1 @dbi_foreach_step(ptr noundef nonnull %0, ptr noundef nonnull %4, ptr noundef nonnull %5)
  br i1 %100, label %101, label %._crit_edge266

._crit_edge266:                                   ; preds = %99
  %.pre267 = load i64, ptr %5, align 8, !tbaa !43
  br label %111

101:                                              ; preds = %99
  %102 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  %103 = and i8 %102, 1
  %.not207 = icmp eq i8 %103, 0
  %.pre268 = load i64, ptr %5, align 8, !tbaa !43
  br i1 %.not207, label %111, label %104, !prof !18

104:                                              ; preds = %101
  %105 = load ptr, ptr %98, align 8, !tbaa !45
  %106 = getelementptr inbounds i8, ptr %105, i64 %.pre268
  %107 = load i8, ptr %106, align 1, !tbaa !32
  %108 = and i8 %107, 1
  %.not208 = icmp eq i8 %108, 0
  br i1 %.not208, label %111, label %109, !prof !28

109:                                              ; preds = %104
  %110 = load ptr, ptr %13, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %110, ptr noundef nonnull @.str.16, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 227) #8
  unreachable

111:                                              ; preds = %._crit_edge266, %104, %101
  %112 = phi i64 [ %.pre267, %._crit_edge266 ], [ %.pre268, %104 ], [ %.pre268, %101 ]
  %113 = add i64 %112, 1
  store i64 %113, ptr %5, align 8, !tbaa !43
  %114 = load i64, ptr %96, align 8, !tbaa !44
  %115 = icmp ult i64 %113, %114
  br i1 %115, label %99, label %._crit_edge, !llvm.loop !46

116:                                              ; preds = %77, %81, %85, %88
  %117 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %118 = icmp ugt i8 %117, 4
  br i1 %118, label %119, label %128, !prof !18

119:                                              ; preds = %116
  %120 = getelementptr inbounds i8, ptr %0, i64 64
  %121 = load i64, ptr %120, align 8, !tbaa !48
  %122 = getelementptr inbounds i8, ptr %0, i64 88
  %123 = load ptr, ptr %122, align 8, !tbaa !49
  %124 = getelementptr inbounds i8, ptr %123, i64 56
  %125 = load i32, ptr %124, align 4, !tbaa !50
  %126 = getelementptr inbounds i8, ptr %123, i64 8
  %127 = load i32, ptr %126, align 4, !tbaa !50
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 233, ptr noundef nonnull @.str.17, i64 noundef %121, ptr noundef nonnull %0, ptr noundef nonnull %14, i32 noundef %125, i32 noundef %127) #9
  br label %128

128:                                              ; preds = %119, %116
  %129 = getelementptr inbounds i8, ptr %0, i64 8
  %130 = load i64, ptr %129, align 8, !tbaa !44
  %131 = icmp ugt i64 %130, 2
  br i1 %131, label %132, label %185

132:                                              ; preds = %128
  call void @llvm.lifetime.start.p0(i64 824, ptr nonnull %6) #9
  %133 = call i32 @cursor_init(ptr noundef nonnull %6, ptr noundef nonnull %0, i64 noundef 1) #9
  %.not209 = icmp eq i32 %133, 0
  br i1 %.not209, label %134, label %.thread253, !prof !28

134:                                              ; preds = %132
  %135 = getelementptr inbounds i8, ptr %0, i64 120
  %136 = load ptr, ptr %135, align 8, !tbaa !52
  %137 = getelementptr inbounds i8, ptr %136, i64 8
  %138 = load ptr, ptr %137, align 8, !tbaa !53
  %139 = getelementptr inbounds i8, ptr %6, i64 368
  store ptr %138, ptr %139, align 8, !tbaa !54
  store ptr %6, ptr %137, align 8, !tbaa !53
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #9
  %140 = getelementptr inbounds i8, ptr %0, i64 96
  %141 = load ptr, ptr %140, align 8, !tbaa !41
  %142 = load i32, ptr %141, align 4, !tbaa !42
  %143 = lshr i32 %142, 2
  %144 = zext nneg i32 %143 to i64
  store i64 %144, ptr %7, align 8, !tbaa !43
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #9
  store i64 2, ptr %8, align 8, !tbaa !43
  %145 = load i64, ptr %129, align 8, !tbaa !44
  %.not212261 = icmp ugt i64 %145, 2
  br i1 %.not212261, label %.lr.ph263, label %._crit_edge264

.lr.ph263:                                        ; preds = %134
  %146 = getelementptr inbounds i8, ptr %0, i64 104
  %147 = getelementptr inbounds i8, ptr %0, i64 88
  %148 = getelementptr inbounds i8, ptr %0, i64 64
  %149 = getelementptr inbounds i8, ptr %9, i64 8
  %150 = getelementptr inbounds i8, ptr %14, i64 200
  br label %151

151:                                              ; preds = %.lr.ph263, %178
  %152 = call zeroext i1 @dbi_foreach_step(ptr noundef nonnull %0, ptr noundef nonnull %7, ptr noundef nonnull %8)
  %.pre270 = load i64, ptr %8, align 8, !tbaa !43
  br i1 %152, label %153, label %178

153:                                              ; preds = %151
  %154 = load ptr, ptr %146, align 8, !tbaa !45
  %155 = getelementptr inbounds i8, ptr %154, i64 %.pre270
  %156 = load i8, ptr %155, align 1, !tbaa !32
  %157 = and i8 %156, 1
  %158 = icmp eq i8 %157, 0
  br i1 %158, label %178, label %159

159:                                              ; preds = %153
  %160 = load ptr, ptr %147, align 8, !tbaa !49
  %161 = getelementptr inbounds %struct.tree, ptr %160, i64 %.pre270
  %162 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %163 = icmp ugt i8 %162, 4
  br i1 %163, label %164, label %168, !prof !18

164:                                              ; preds = %159
  %165 = getelementptr inbounds i8, ptr %161, i64 40
  %166 = load i64, ptr %165, align 4, !tbaa !58
  %167 = load i64, ptr %148, align 8, !tbaa !48
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 247, ptr noundef nonnull @.str.18, i64 noundef %.pre270, i64 noundef %166, i64 noundef %167) #9
  br label %168

168:                                              ; preds = %164, %159
  %169 = load i64, ptr %148, align 8, !tbaa !48
  %170 = getelementptr inbounds i8, ptr %161, i64 40
  store i64 %169, ptr %170, align 4, !tbaa !58
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #9
  store ptr %161, ptr %9, align 8, !tbaa !59
  store i64 48, ptr %149, align 8, !tbaa !61
  %171 = load ptr, ptr %150, align 8, !tbaa !62
  %172 = load i64, ptr %8, align 8, !tbaa !43
  %173 = getelementptr inbounds %struct.kvx, ptr %171, i64 %172, i32 1
  %174 = call i32 @cursor_put(ptr noundef nonnull %6, ptr noundef nonnull %173, ptr noundef nonnull %9, i32 noundef 2) #9
  %.not211 = icmp eq i32 %174, 0
  br i1 %.not211, label %.thread249, label %.thread251, !prof !28

.thread249:                                       ; preds = %168
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #9
  %.pre269 = load i64, ptr %8, align 8, !tbaa !43
  br label %178

.thread251:                                       ; preds = %168
  %175 = load ptr, ptr %139, align 8, !tbaa !54
  %176 = load ptr, ptr %135, align 8, !tbaa !52
  %177 = getelementptr inbounds i8, ptr %176, i64 8
  store ptr %175, ptr %177, align 8, !tbaa !53
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #9
  br label %.thread253

178:                                              ; preds = %.thread249, %151, %153
  %179 = phi i64 [ %.pre269, %.thread249 ], [ %.pre270, %151 ], [ %.pre270, %153 ]
  %180 = add i64 %179, 1
  store i64 %180, ptr %8, align 8, !tbaa !43
  %181 = load i64, ptr %129, align 8, !tbaa !44
  %.not212 = icmp ult i64 %180, %181
  br i1 %.not212, label %151, label %._crit_edge264, !llvm.loop !63

.thread253:                                       ; preds = %132, %.thread251
  %.8.ph = phi i32 [ %174, %.thread251 ], [ %133, %132 ]
  call void @llvm.lifetime.end.p0(i64 824, ptr nonnull %6) #9
  br label %.critedge239

._crit_edge264:                                   ; preds = %178, %134
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #9
  %182 = load ptr, ptr %139, align 8, !tbaa !54
  %183 = load ptr, ptr %135, align 8, !tbaa !52
  %184 = getelementptr inbounds i8, ptr %183, i64 8
  store ptr %182, ptr %184, align 8, !tbaa !53
  call void @llvm.lifetime.end.p0(i64 824, ptr nonnull %6) #9
  br label %185

185:                                              ; preds = %._crit_edge264, %128
  %.not213 = icmp eq ptr %1, null
  br i1 %.not213, label %191, label %186

186:                                              ; preds = %185
  %187 = call i64 @osal_monotime() #9
  %188 = getelementptr inbounds i8, ptr %1, i64 8
  store i64 %187, ptr %188, align 8, !tbaa !64
  %189 = call i64 @osal_cputime(ptr noundef null) #9
  %190 = getelementptr inbounds i8, ptr %1, i64 48
  store i64 %189, ptr %190, align 8, !tbaa !66
  br label %191

191:                                              ; preds = %186, %185
  call void @llvm.lifetime.start.p0(i64 1272, ptr nonnull %10) #9
  %192 = call i32 @gc_put_init(ptr noundef nonnull %0, ptr noundef nonnull %10) #9
  %193 = icmp eq i32 %192, 0
  br i1 %193, label %194, label %196, !prof !28

194:                                              ; preds = %191
  %195 = call i32 @gc_update(ptr noundef nonnull %0, ptr noundef nonnull %10) #9
  br label %196

196:                                              ; preds = %194, %191
  %.0165 = phi i32 [ %195, %194 ], [ %192, %191 ]
  %197 = getelementptr inbounds i8, ptr %10, i64 312
  %198 = load i64, ptr %197, align 8, !tbaa !67
  %199 = getelementptr inbounds i8, ptr %0, i64 64
  %200 = load i64, ptr %199, align 8, !tbaa !48
  %201 = icmp ugt i64 %198, %200
  %202 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2
  %203 = icmp ugt i8 %202, 5
  %or.cond241 = select i1 %201, i1 %203, i1 false
  br i1 %or.cond241, label %204, label %206, !prof !71

204:                                              ; preds = %196
  %205 = sub i64 %198, %200
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 273, ptr noundef nonnull @.str.19, i64 noundef %198, i64 noundef %205) #9
  br label %206

206:                                              ; preds = %204, %196
  call void @gc_put_destroy(ptr noundef nonnull %10) #9
  br i1 %.not213, label %212, label %207

207:                                              ; preds = %206
  %208 = call i64 @osal_cputime(ptr noundef null) #9
  %209 = getelementptr inbounds i8, ptr %1, i64 48
  %210 = load i64, ptr %209, align 8, !tbaa !66
  %211 = sub i64 %208, %210
  store i64 %211, ptr %209, align 8, !tbaa !66
  br label %212

212:                                              ; preds = %207, %206
  %.not214 = icmp eq i32 %.0165, 0
  br i1 %.not214, label %213, label %375, !prof !28

213:                                              ; preds = %212
  %214 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  %215 = and i8 %214, 1
  %.not215 = icmp eq i8 %215, 0
  br i1 %.not215, label %._crit_edge271, label %216, !prof !18

216:                                              ; preds = %213
  %217 = getelementptr inbounds i8, ptr %0, i64 520
  %218 = load i64, ptr %217, align 8, !tbaa !32
  %.not216 = icmp eq i64 %218, 0
  br i1 %.not216, label %._crit_edge271, label %219, !prof !28

219:                                              ; preds = %216
  %220 = load ptr, ptr %13, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %220, ptr noundef nonnull @.str.20, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 284) #8
  unreachable

._crit_edge271:                                   ; preds = %216, %213
  %221 = getelementptr inbounds i8, ptr %0, i64 104
  %222 = load ptr, ptr %221, align 8, !tbaa !45
  %223 = load i8, ptr %222, align 1, !tbaa !32
  %224 = and i8 %223, 1
  %.not217 = icmp eq i8 %224, 0
  %225 = getelementptr inbounds i8, ptr %0, i64 88
  %226 = load ptr, ptr %225, align 8, !tbaa !49
  %227 = getelementptr inbounds i8, ptr %226, i64 40
  %.in = select i1 %.not217, ptr %227, ptr %199
  %228 = load i64, ptr %.in, align 4, !tbaa !43
  %229 = getelementptr inbounds i8, ptr %0, i64 88
  %230 = getelementptr inbounds i8, ptr %226, i64 40
  store i64 %228, ptr %230, align 4, !tbaa !58
  %231 = getelementptr inbounds i8, ptr %222, i64 1
  %232 = load i8, ptr %231, align 1, !tbaa !32
  %233 = and i8 %232, 1
  %.not218 = icmp eq i8 %233, 0
  %234 = getelementptr inbounds i8, ptr %226, i64 88
  %spec.select = select i1 %.not218, ptr %234, ptr %199
  %235 = load i64, ptr %spec.select, align 4, !tbaa !43
  store i64 %235, ptr %234, align 4, !tbaa !58
  br i1 %.not213, label %240, label %236

236:                                              ; preds = %._crit_edge271
  %237 = call i64 @osal_monotime() #9
  %238 = getelementptr inbounds i8, ptr %1, i64 16
  store i64 %237, ptr %238, align 8, !tbaa !72
  %239 = getelementptr inbounds i8, ptr %1, i64 24
  store i64 %237, ptr %239, align 8, !tbaa !73
  %.pre274 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  br label %240

240:                                              ; preds = %236, %._crit_edge271
  %241 = phi i8 [ %.pre274, %236 ], [ %214, %._crit_edge271 ]
  %242 = and i8 %241, 2
  %.not220 = icmp eq i8 %242, 0
  br i1 %.not220, label %253, label %243, !prof !28

243:                                              ; preds = %240
  %244 = getelementptr inbounds i8, ptr %0, i64 504
  %245 = load ptr, ptr %244, align 8, !tbaa !32
  %246 = load i32, ptr %245, align 4, !tbaa !42
  %247 = zext i32 %246 to i64
  %248 = call i32 @audit_ex(ptr noundef nonnull %0, i64 noundef %247, i1 noundef zeroext true) #9
  br i1 %.not213, label %252, label %249

249:                                              ; preds = %243
  %250 = call i64 @osal_monotime() #9
  %251 = getelementptr inbounds i8, ptr %1, i64 24
  store i64 %250, ptr %251, align 8, !tbaa !73
  br label %252

252:                                              ; preds = %249, %243
  %.not221 = icmp eq i32 %248, 0
  br i1 %.not221, label %253, label %375, !prof !28

253:                                              ; preds = %252, %240
  %254 = load ptr, ptr %50, align 8, !tbaa !32
  %.not222 = icmp eq ptr %254, null
  %255 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !15
  %256 = and i8 %255, 1
  %.not223 = icmp eq i8 %256, 0
  br i1 %.not222, label %302, label %257

257:                                              ; preds = %253
  br i1 %.not223, label %.thread256, label %258, !prof !18

258:                                              ; preds = %257
  %259 = load i32, ptr %52, align 4, !tbaa !31
  %260 = and i32 %259, 524288
  %.not227 = icmp eq i32 %260, 0
  br i1 %.not227, label %263, label %261, !prof !28

261:                                              ; preds = %258
  %262 = load ptr, ptr %13, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %262, ptr noundef nonnull @.str.12, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 301) #8
  unreachable

263:                                              ; preds = %258
  %264 = getelementptr inbounds i8, ptr %0, i64 520
  %265 = load i64, ptr %264, align 8, !tbaa !32
  %.not229 = icmp eq i64 %265, 0
  br i1 %.not229, label %.thread256, label %266, !prof !28

266:                                              ; preds = %263
  %267 = load ptr, ptr %13, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %267, ptr noundef nonnull @.str.20, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 302) #8
  unreachable

.thread256:                                       ; preds = %257, %263
  br i1 %.2164, label %283, label %268

268:                                              ; preds = %.thread256
  %269 = getelementptr inbounds i8, ptr %14, i64 56
  %270 = load i32, ptr %269, align 8, !tbaa !74
  %271 = icmp eq i32 %270, -1
  br i1 %271, label %283, label %272

272:                                              ; preds = %268
  %273 = getelementptr inbounds i8, ptr %254, i64 8
  %274 = load i64, ptr %273, align 8, !tbaa !33
  %275 = getelementptr inbounds i8, ptr %14, i64 296
  %276 = load i32, ptr %275, align 8, !tbaa !75
  %277 = zext i32 %276 to i64
  %278 = icmp ugt i64 %274, %277
  br i1 %278, label %283, label %279

279:                                              ; preds = %272
  %280 = load ptr, ptr %56, align 8, !tbaa !36
  %281 = getelementptr inbounds i8, ptr %280, i64 376
  %282 = call i64 @atomic_load64(ptr noundef nonnull %281, i32 noundef 0)
  %.not230 = icmp eq i64 %282, 0
  br i1 %.not230, label %285, label %283

283:                                              ; preds = %279, %272, %268, %.thread256
  %284 = getelementptr inbounds i8, ptr %14, i64 24
  br label %285

285:                                              ; preds = %279, %283
  %.in231 = phi ptr [ %284, %283 ], [ %269, %279 ]
  %286 = load i32, ptr %.in231, align 8, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %11) #9
  %287 = load ptr, ptr %50, align 8, !tbaa !32
  %288 = getelementptr inbounds i8, ptr %287, i64 8
  %289 = load i64, ptr %288, align 8, !tbaa !33
  %290 = getelementptr inbounds i8, ptr %287, i64 16
  %291 = load i64, ptr %290, align 8, !tbaa !76
  %292 = call i32 @iov_init(ptr noundef nonnull %0, ptr noundef nonnull %11, i64 noundef %289, i64 noundef %291, i32 noundef %286, i1 noundef zeroext false) #9
  %.not232 = icmp eq i32 %292, 0
  br i1 %.not232, label %296, label %293, !prof !28

293:                                              ; preds = %285
  %294 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %.not235 = icmp eq i8 %294, 0
  br i1 %.not235, label %.thread258, label %295, !prof !28

295:                                              ; preds = %293
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 319, ptr noundef nonnull @.str.14, ptr noundef nonnull @.str.21, i32 noundef %292) #9
  br label %.thread258

296:                                              ; preds = %285
  %297 = call i32 @txn_write(ptr noundef nonnull %0, ptr noundef nonnull %11)
  %.not233 = icmp eq i32 %297, 0
  br i1 %.not233, label %301, label %298, !prof !28

298:                                              ; preds = %296
  %299 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %.not234 = icmp eq i8 %299, 0
  br i1 %.not234, label %.thread258, label %300, !prof !28

300:                                              ; preds = %298
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 325, ptr noundef nonnull @.str.14, ptr noundef nonnull @.str.22, i32 noundef %297) #9
  br label %.thread258

.thread258:                                       ; preds = %295, %293, %300, %298
  %.10.ph = phi i32 [ %297, %298 ], [ %297, %300 ], [ %292, %293 ], [ %292, %295 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #9
  br label %375

301:                                              ; preds = %296
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #9
  br label %322

302:                                              ; preds = %253
  br i1 %.not223, label %308, label %303, !prof !18

303:                                              ; preds = %302
  %304 = load i32, ptr %52, align 4, !tbaa !31
  %305 = and i32 %304, 524288
  %.not224 = icmp eq i32 %305, 0
  br i1 %.not224, label %306, label %308, !prof !18

306:                                              ; preds = %303
  %307 = load ptr, ptr %13, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %307, ptr noundef nonnull @.str.11, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 329) #8
  unreachable

308:                                              ; preds = %303, %302
  %309 = getelementptr inbounds i8, ptr %0, i64 528
  %310 = load i64, ptr %309, align 8, !tbaa !32
  %311 = load ptr, ptr %56, align 8, !tbaa !36
  %312 = getelementptr inbounds i8, ptr %311, i64 376
  %313 = load volatile i64, ptr %312, align 8, !tbaa !32
  %314 = add i64 %313, %310
  store volatile i64 %314, ptr %312, align 8, !tbaa !32
  %315 = load ptr, ptr %56, align 8, !tbaa !36
  %316 = getelementptr inbounds i8, ptr %315, i64 368
  %317 = load volatile i64, ptr %316, align 16, !tbaa !32
  %.not225 = icmp eq i64 %317, 0
  br i1 %.not225, label %318, label %322

318:                                              ; preds = %308
  %319 = call i64 @osal_monotime() #9
  %320 = load ptr, ptr %56, align 8, !tbaa !36
  %321 = getelementptr inbounds i8, ptr %320, i64 368
  store volatile i64 %319, ptr %321, align 16, !tbaa !32
  br label %322

322:                                              ; preds = %301, %308, %318
  br i1 %.not213, label %326, label %323

323:                                              ; preds = %322
  %324 = call i64 @osal_monotime() #9
  %325 = getelementptr inbounds i8, ptr %1, i64 32
  store i64 %324, ptr %325, align 8, !tbaa !77
  br label %326

326:                                              ; preds = %323, %322
  call void @llvm.lifetime.start.p0(i64 224, ptr nonnull %12) #9
  %327 = getelementptr inbounds i8, ptr %3, i64 8
  %328 = load ptr, ptr %327, align 8, !tbaa !32
  %329 = load i64, ptr %328, align 4
  store i64 %329, ptr %12, align 8
  %330 = getelementptr inbounds i8, ptr %328, i64 16
  %331 = load i16, ptr %330, align 4, !tbaa !78
  %332 = getelementptr inbounds i8, ptr %12, i64 16
  store i16 %331, ptr %332, align 8, !tbaa !78
  %333 = getelementptr inbounds i8, ptr %328, i64 18
  %334 = load i8, ptr %333, align 2, !tbaa !80
  %335 = getelementptr inbounds i8, ptr %12, i64 18
  store i8 %334, ptr %335, align 2, !tbaa !80
  %336 = getelementptr inbounds i8, ptr %328, i64 19
  %337 = load i8, ptr %336, align 1, !tbaa !81
  %338 = getelementptr inbounds i8, ptr %12, i64 19
  store i8 %337, ptr %338, align 1, !tbaa !81
  %339 = getelementptr inbounds i8, ptr %12, i64 184
  %340 = getelementptr inbounds i8, ptr %328, i64 184
  %341 = call i64 @unaligned_peek_u64(i64 noundef 4, ptr noundef nonnull %340) #10
  %342 = getelementptr inbounds i8, ptr %0, i64 504
  %343 = load ptr, ptr %342, align 8, !tbaa !32
  %344 = load i32, ptr %343, align 4, !tbaa !42
  %345 = zext i32 %344 to i64
  %346 = add i64 %341, %345
  call void @unaligned_poke_u64(i64 noundef 4, ptr noundef nonnull %339, i64 noundef %346)
  %347 = getelementptr inbounds i8, ptr %12, i64 20
  %348 = getelementptr inbounds i8, ptr %0, i64 40
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(20) %347, ptr noundef nonnull align 8 dereferenceable(20) %348, i64 20, i1 false), !tbaa.struct !82
  %349 = getelementptr inbounds i8, ptr %12, i64 40
  %350 = load ptr, ptr %229, align 8, !tbaa !49
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(48) %349, ptr noundef nonnull align 4 dereferenceable(48) %350, i64 48, i1 false), !tbaa.struct !84
  %351 = getelementptr inbounds i8, ptr %12, i64 88
  %352 = getelementptr inbounds i8, ptr %350, i64 48
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(48) %351, ptr noundef nonnull align 4 dereferenceable(48) %352, i64 48, i1 false), !tbaa.struct !84
  %353 = getelementptr inbounds i8, ptr %12, i64 136
  %354 = getelementptr inbounds i8, ptr %0, i64 128
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %353, ptr noundef nonnull align 8 dereferenceable(32) %354, i64 32, i1 false), !tbaa.struct !85
  %355 = getelementptr inbounds i8, ptr %12, i64 208
  %356 = load ptr, ptr %327, align 8, !tbaa !32
  %357 = getelementptr inbounds i8, ptr %356, i64 208
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %355, ptr noundef nonnull align 4 dereferenceable(16) %357, i64 16, i1 false)
  %358 = getelementptr inbounds i8, ptr %12, i64 168
  store i64 0, ptr %358, align 8, !tbaa !32
  call void @meta_set_txnid(ptr noundef %14, ptr noundef nonnull %12, i64 noundef %198)
  %359 = getelementptr inbounds i8, ptr %14, i64 4
  %360 = load i32, ptr %359, align 4, !tbaa !86
  %361 = load i32, ptr %52, align 4, !tbaa !31
  %362 = or i32 %360, %361
  %363 = or i32 %362, 1073741824
  %364 = call i32 @dxb_sync_locked(ptr noundef %14, i32 noundef %363, ptr noundef nonnull %12, ptr noundef nonnull %51) #9
  br i1 %.not213, label %368, label %365

365:                                              ; preds = %326
  %366 = call i64 @osal_monotime() #9
  %367 = getelementptr inbounds i8, ptr %1, i64 40
  store i64 %366, ptr %367, align 8, !tbaa !87
  br label %368

368:                                              ; preds = %365, %326
  %.not236 = icmp eq i32 %364, 0
  br i1 %.not236, label %374, label %369, !prof !28

369:                                              ; preds = %368
  %370 = load i32, ptr %359, align 4, !tbaa !86
  %371 = or i32 %370, -2147483648
  store i32 %371, ptr %359, align 4, !tbaa !86
  %372 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !40
  %.not237 = icmp eq i8 %372, 0
  br i1 %.not237, label %374, label %373, !prof !28

373:                                              ; preds = %369
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 1, ptr noundef nonnull @__func__.txn_basal_commit, i32 noundef 361, ptr noundef nonnull @.str.14, ptr noundef nonnull @.str.23, i32 noundef %364) #9
  br label %374

374:                                              ; preds = %368, %369, %373
  call void @llvm.lifetime.end.p0(i64 224, ptr nonnull %12) #9
  br label %375

375:                                              ; preds = %.thread258, %252, %212, %374
  %.12 = phi i32 [ %364, %374 ], [ %.0165, %212 ], [ %248, %252 ], [ %.10.ph, %.thread258 ]
  call void @llvm.lifetime.end.p0(i64 1272, ptr nonnull %10) #9
  br label %.critedge239

.critedge239:                                     ; preds = %.thread253, %73, %75, %375, %._crit_edge
  %.13 = phi i32 [ %.12, %375 ], [ 0, %._crit_edge ], [ %72, %73 ], [ %72, %75 ], [ %.8.ph, %.thread253 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %3) #9
  ret i32 %.13
}

declare void @txn_done_cursors(ptr noundef) local_unnamed_addr #4

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @atomic_load32(ptr noundef, i32 noundef) local_unnamed_addr #6

declare i32 @meta_sync(ptr noundef, ptr noundef byval(%struct.meta_ptr) align 8) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i1 @dbi_foreach_step(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

declare i32 @cursor_init(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #4

declare i32 @cursor_put(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #4

declare i64 @osal_monotime() local_unnamed_addr #4

declare i64 @osal_cputime(ptr noundef) local_unnamed_addr #4

declare i32 @gc_put_init(ptr noundef, ptr noundef) local_unnamed_addr #4

declare i32 @gc_update(ptr noundef, ptr noundef) local_unnamed_addr #4

declare void @gc_put_destroy(ptr noundef) local_unnamed_addr #4

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i64 @atomic_load64(ptr noundef, i32 noundef) local_unnamed_addr #6

declare i32 @iov_init(ptr noundef, ptr noundef, i64 noundef, i64 noundef, i32 noundef, i1 noundef zeroext) local_unnamed_addr #4

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @unaligned_poke_u64(i64 noundef, ptr noalias noundef, i64 noundef) local_unnamed_addr #2

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_set_txnid(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #2

declare i32 @dxb_sync_locked(ptr noundef, i32 noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !11, i64 80}
!6 = !{!"MDBX_txn", !7, i64 0, !7, i64 4, !10, i64 8, !10, i64 16, !11, i64 24, !11, i64 32, !12, i64 40, !10, i64 64, !10, i64 72, !11, i64 80, !11, i64 88, !11, i64 96, !11, i64 104, !11, i64 112, !11, i64 120, !14, i64 128, !11, i64 160, !8, i64 168}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"geo", !13, i64 0, !13, i64 2, !7, i64 4, !7, i64 8, !8, i64 12, !8, i64 16}
!13 = !{!"short", !8, i64 0}
!14 = !{!"MDBX_canary", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!15 = !{!16, !8, i64 25}
!16 = !{!"libmdbx_globals", !8, i64 0, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !17, i64 27, !7, i64 28, !8, i64 32, !8, i64 40, !10, i64 80, !11, i64 88}
!17 = !{!"_Bool", !8, i64 0}
!18 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!19 = !{!20, !11, i64 192}
!20 = !{!"MDBX_env", !8, i64 0, !7, i64 4, !7, i64 8, !21, i64 16, !7, i64 56, !7, i64 60, !21, i64 64, !11, i64 104, !13, i64 112, !13, i64 114, !13, i64 116, !13, i64 118, !13, i64 120, !13, i64 122, !8, i64 124, !8, i64 128, !8, i64 129, !13, i64 130, !7, i64 132, !7, i64 136, !7, i64 140, !7, i64 144, !22, i64 152, !11, i64 184, !11, i64 192, !11, i64 200, !11, i64 208, !11, i64 216, !7, i64 224, !7, i64 228, !7, i64 232, !11, i64 240, !11, i64 248, !10, i64 256, !23, i64 264, !25, i64 320, !17, i64 360, !11, i64 368, !11, i64 376, !11, i64 384, !26, i64 392, !8, i64 400, !7, i64 440, !7, i64 444, !11, i64 448, !27, i64 456, !8, i64 496, !8, i64 536}
!21 = !{!"osal_mmap", !8, i64 0, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!22 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!23 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !10, i64 16, !8, i64 24, !8, i64 25, !8, i64 26, !8, i64 27, !7, i64 28, !7, i64 32, !17, i64 36, !17, i64 37, !17, i64 38, !24, i64 40, !8, i64 48}
!24 = !{!"", !13, i64 0, !13, i64 2, !13, i64 4, !13, i64 6}
!25 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!26 = !{!"", !10, i64 0}
!27 = !{!"osal_ioring", !7, i64 0, !7, i64 4, !7, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!28 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!29 = !{!6, !11, i64 24}
!30 = !{!6, !11, i64 32}
!31 = !{!6, !7, i64 4}
!32 = !{!8, !8, i64 0}
!33 = !{!34, !10, i64 8}
!34 = !{!"dpl", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !8, i64 32}
!35 = !{!20, !7, i64 272}
!36 = !{!20, !11, i64 104}
!37 = !{!38, !10, i64 16}
!38 = !{!"meta_ptr", !10, i64 0, !8, i64 8, !10, i64 16}
!39 = !{!38, !10, i64 0}
!40 = !{!16, !8, i64 26}
!41 = !{!6, !11, i64 96}
!42 = !{!7, !7, i64 0}
!43 = !{!10, !10, i64 0}
!44 = !{!6, !10, i64 8}
!45 = !{!6, !11, i64 104}
!46 = distinct !{!46, !47}
!47 = !{!"llvm.loop.mustprogress"}
!48 = !{!6, !10, i64 64}
!49 = !{!6, !11, i64 88}
!50 = !{!51, !7, i64 8}
!51 = !{!"tree", !13, i64 0, !13, i64 2, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !10, i64 24, !10, i64 32, !10, i64 40}
!52 = !{!6, !11, i64 120}
!53 = !{!11, !11, i64 0}
!54 = !{!55, !11, i64 368}
!55 = !{!"cursor_couple", !56, i64 0, !11, i64 384, !57, i64 392}
!56 = !{!"MDBX_cursor", !7, i64 0, !8, i64 4, !8, i64 6, !8, i64 7, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !8, i64 48, !8, i64 304, !11, i64 368, !11, i64 376}
!57 = !{!"inner_cursor", !56, i64 0, !51, i64 384}
!58 = !{!51, !10, i64 40}
!59 = !{!60, !11, i64 0}
!60 = !{!"iovec", !11, i64 0, !10, i64 8}
!61 = !{!60, !10, i64 8}
!62 = !{!20, !11, i64 200}
!63 = distinct !{!63, !47}
!64 = !{!65, !10, i64 8}
!65 = !{!"commit_timestamp", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48}
!66 = !{!65, !10, i64 48}
!67 = !{!68, !10, i64 312}
!68 = !{!"gc_update_context", !7, i64 0, !7, i64 4, !17, i64 8, !7, i64 12, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !69, i64 56, !69, i64 184, !10, i64 312, !8, i64 320, !70, i64 1144}
!69 = !{!"MDBX_rkl", !10, i64 0, !10, i64 8, !7, i64 16, !7, i64 20, !11, i64 24, !8, i64 32}
!70 = !{!"gc_dense_histogram", !7, i64 0, !8, i64 4}
!71 = !{!"branch_weights", i32 1, i32 4001}
!72 = !{!65, !10, i64 16}
!73 = !{!65, !10, i64 24}
!74 = !{!20, !7, i64 56}
!75 = !{!20, !7, i64 296}
!76 = !{!34, !10, i64 16}
!77 = !{!65, !10, i64 32}
!78 = !{!79, !13, i64 16}
!79 = !{!"meta", !8, i64 0, !8, i64 8, !13, i64 16, !8, i64 18, !8, i64 19, !12, i64 20, !8, i64 40, !14, i64 136, !8, i64 168, !8, i64 176, !8, i64 184, !8, i64 192, !8, i64 208}
!80 = !{!79, !8, i64 18}
!81 = !{!79, !8, i64 19}
!82 = !{i64 0, i64 2, !83, i64 2, i64 2, !83, i64 4, i64 4, !42, i64 8, i64 4, !42, i64 12, i64 4, !32, i64 16, i64 4, !32}
!83 = !{!13, !13, i64 0}
!84 = !{i64 0, i64 2, !83, i64 2, i64 2, !83, i64 4, i64 4, !42, i64 8, i64 4, !42, i64 12, i64 4, !42, i64 16, i64 4, !42, i64 20, i64 4, !42, i64 24, i64 8, !43, i64 32, i64 8, !43, i64 40, i64 8, !43}
!85 = !{i64 0, i64 8, !43, i64 8, i64 8, !43, i64 16, i64 8, !43, i64 24, i64 8, !43}
!86 = !{!20, !7, i64 4}
!87 = !{!65, !10, i64 40}


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