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

; 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.14 }
%struct.anon.14 = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.MDBX_txn = type { i32, i32, i64, i64, ptr, ptr, %struct.geo, i64, i64, ptr, ptr, ptr, ptr, ptr, ptr, %struct.MDBX_canary, ptr, %union.anon.1 }
%struct.geo = type { i16, i16, i32, i32, %union.anon, %union.anon.0 }
%union.anon = type { i32 }
%union.anon.0 = type { i32 }
%struct.MDBX_canary = type { i64, i64, i64, i64 }
%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 }
%struct.MDBX_rkl = type { i64, i64, i32, i32, ptr, [12 x i64] }
%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.7, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, ptr, ptr, i64, %struct.anon.8, %struct.anon.12, i8, ptr, ptr, ptr, %struct.anon.13, %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.6, i32, i64, i64, i64 }
%union.anon.6 = type { ptr }
%union.mdbx_atomic_uint32_t = type { i32 }
%struct.anon.7 = type { ptr, ptr, ptr, ptr }
%struct.anon.8 = type { i32, i32, i32, i32, i64, i8, i8, i8, i8, i32, i32, i8, i8, i8, %struct.anon.9, %union.anon.10 }
%struct.anon.9 = type { i16, i16, i16, i16 }
%union.anon.10 = type { i32 }
%struct.anon.12 = type { i64, i64, i64, i64, i64 }
%struct.anon.13 = 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.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }
%struct.commit_timestamp = type { i64, i64, i64, i64, i64, i64, i64 }
%struct.page = type <{ i64, i16, i16, %union.anon.16, i32, [0 x i16] }>
%union.anon.16 = type { i32 }

@globals = external global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [30 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [27 x i8], align 1
@__func__.txn_nested_join = external hidden unnamed_addr constant [16 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [169 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [86 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [60 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

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

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

declare zeroext i1 @dpl_check(ptr noundef) #2

; 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) #4

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

declare ptr @spill_purge(ptr noundef) #2

declare void @pnl_free(ptr noundef) #2

; Function Attrs: nounwind
declare void @free(ptr noundef) #5

; Function Attrs: nounwind uwtable
define dso_local i32 @txn_nested_join(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 ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i8, align 1
  %11 = alloca i32, align 4
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i8, align 1
  %19 = alloca ptr, align 8
  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
  %20 = load ptr, ptr %4, align 8, !tbaa !5
  %21 = getelementptr inbounds %struct.MDBX_txn, ptr %20, i32 0, i32 9
  %22 = load ptr, ptr %21, align 8, !tbaa !9
  store ptr %22, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #9
  %23 = load ptr, ptr %4, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.MDBX_txn, ptr %23, i32 0, i32 4
  %25 = load ptr, ptr %24, align 8, !tbaa !16
  store ptr %25, ptr %7, align 8, !tbaa !5
  br label %26

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

37:                                               ; preds = %26
  br label %38

38:                                               ; preds = %37
  %39 = load ptr, ptr %4, align 8, !tbaa !5
  %40 = call i32 @audit_ex(ptr noundef %39, i64 noundef 0, i1 noundef zeroext false)
  %41 = icmp eq i32 %40, 0
  %42 = xor i1 %41, true
  %43 = xor i1 %42, true
  %44 = xor i1 %43, true
  %45 = zext i1 %44 to i32
  %46 = sext i32 %45 to i64
  %47 = call i64 @llvm.expect.i64(i64 %46, i64 0)
  %48 = icmp ne i64 %47, 0
  br i1 %48, label %49, label %53

49:                                               ; preds = %38
  %50 = load ptr, ptr %4, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.MDBX_txn, ptr %50, i32 0, i32 9
  %52 = load ptr, ptr %51, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %52, ptr noundef @.str.12, ptr noundef @__func__.txn_nested_join, i32 noundef 465) #10
  unreachable

53:                                               ; preds = %38
  br label %54

54:                                               ; preds = %53
  br label %55

55:                                               ; preds = %54
  br label %56

56:                                               ; preds = %55, %26
  br label %57

57:                                               ; preds = %56
  br label %58

58:                                               ; preds = %57
  br label %59

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

70:                                               ; preds = %59
  br label %71

71:                                               ; preds = %70
  %72 = load ptr, ptr %4, align 8, !tbaa !5
  %73 = load ptr, ptr %6, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.MDBX_env, ptr %73, i32 0, i32 24
  %75 = load ptr, ptr %74, align 8, !tbaa !20
  %76 = icmp ne ptr %72, %75
  %77 = xor i1 %76, true
  %78 = xor i1 %77, true
  %79 = xor i1 %78, true
  %80 = zext i1 %79 to i32
  %81 = sext i32 %80 to i64
  %82 = call i64 @llvm.expect.i64(i64 %81, i64 0)
  %83 = icmp ne i64 %82, 0
  br i1 %83, label %84, label %86

84:                                               ; preds = %71
  %85 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %85, ptr noundef @.str.13, ptr noundef @__func__.txn_nested_join, i32 noundef 466) #10
  unreachable

86:                                               ; preds = %71
  br label %87

87:                                               ; preds = %86
  br label %88

88:                                               ; preds = %87
  br label %89

89:                                               ; preds = %88, %59
  br label %90

90:                                               ; preds = %89
  br label %91

91:                                               ; preds = %90
  br label %92

92:                                               ; preds = %91
  %93 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %94 = zext i8 %93 to i32
  %95 = and i32 %94, 1
  %96 = icmp ne i32 %95, 0
  %97 = xor i1 %96, true
  %98 = xor i1 %97, true
  %99 = zext i1 %98 to i32
  %100 = sext i32 %99 to i64
  %101 = call i64 @llvm.expect.i64(i64 %100, i64 1)
  %102 = icmp ne i64 %101, 0
  br i1 %102, label %103, label %121

103:                                              ; preds = %92
  br label %104

104:                                              ; preds = %103
  %105 = load ptr, ptr %7, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.MDBX_txn, ptr %105, i32 0, i32 0
  %107 = load i32, ptr %106, align 8, !tbaa !29
  %108 = icmp eq i32 %107, 332741169
  %109 = xor i1 %108, true
  %110 = xor i1 %109, true
  %111 = xor i1 %110, true
  %112 = zext i1 %111 to i32
  %113 = sext i32 %112 to i64
  %114 = call i64 @llvm.expect.i64(i64 %113, i64 0)
  %115 = icmp ne i64 %114, 0
  br i1 %115, label %116, label %118

116:                                              ; preds = %104
  %117 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %117, ptr noundef @.str.14, ptr noundef @__func__.txn_nested_join, i32 noundef 467) #10
  unreachable

118:                                              ; preds = %104
  br label %119

119:                                              ; preds = %118
  br label %120

120:                                              ; preds = %119
  br label %121

121:                                              ; preds = %120, %92
  br label %122

122:                                              ; preds = %121
  br label %123

123:                                              ; preds = %122
  br label %124

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

135:                                              ; preds = %124
  br label %136

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

142:                                              ; preds = %136
  %143 = load ptr, ptr %7, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.MDBX_txn, ptr %143, i32 0, i32 1
  %145 = load i32, ptr %144, align 4, !tbaa !31
  %146 = and i32 %145, 16
  %147 = icmp ne i32 %146, 0
  br label %148

148:                                              ; preds = %142, %136
  %149 = phi i1 [ false, %136 ], [ %147, %142 ]
  %150 = xor i1 %149, true
  %151 = xor i1 %150, true
  %152 = xor i1 %151, true
  %153 = zext i1 %152 to i32
  %154 = sext i32 %153 to i64
  %155 = call i64 @llvm.expect.i64(i64 %154, i64 0)
  %156 = icmp ne i64 %155, 0
  br i1 %156, label %157, label %159

157:                                              ; preds = %148
  %158 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %158, ptr noundef @.str.15, ptr noundef @__func__.txn_nested_join, i32 noundef 468) #10
  unreachable

159:                                              ; preds = %148
  br label %160

160:                                              ; preds = %159
  br label %161

161:                                              ; preds = %160
  br label %162

162:                                              ; preds = %161, %124
  br label %163

163:                                              ; preds = %162
  br label %164

164:                                              ; preds = %163
  br label %165

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

176:                                              ; preds = %165
  br label %177

177:                                              ; preds = %176
  %178 = load ptr, ptr %4, align 8, !tbaa !5
  %179 = call zeroext i1 @dpl_check(ptr noundef %178)
  %180 = xor i1 %179, true
  %181 = xor i1 %180, true
  %182 = xor i1 %181, true
  %183 = zext i1 %182 to i32
  %184 = sext i32 %183 to i64
  %185 = call i64 @llvm.expect.i64(i64 %184, i64 0)
  %186 = icmp ne i64 %185, 0
  br i1 %186, label %187, label %189

187:                                              ; preds = %177
  %188 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %188, ptr noundef @.str.16, ptr noundef @__func__.txn_nested_join, i32 noundef 469) #10
  unreachable

189:                                              ; preds = %177
  br label %190

190:                                              ; preds = %189
  br label %191

191:                                              ; preds = %190
  br label %192

192:                                              ; preds = %191, %165
  br label %193

193:                                              ; preds = %192
  br label %194

194:                                              ; preds = %193
  %195 = load ptr, ptr %4, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.MDBX_txn, ptr %195, i32 0, i32 17
  %197 = getelementptr inbounds %struct.anon.2, ptr %196, i32 0, i32 7
  %198 = load ptr, ptr %197, align 8, !tbaa !32
  %199 = getelementptr inbounds %struct.dpl, ptr %198, i32 0, i32 1
  %200 = load i64, ptr %199, align 8, !tbaa !33
  %201 = icmp eq i64 %200, 0
  br i1 %201, label %202, label %560

202:                                              ; preds = %194
  %203 = load ptr, ptr %4, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.MDBX_txn, ptr %203, i32 0, i32 1
  %205 = load i32, ptr %204, align 4, !tbaa !31
  %206 = and i32 %205, 4
  %207 = icmp ne i32 %206, 0
  br i1 %207, label %560, label %208

208:                                              ; preds = %202
  %209 = load ptr, ptr %7, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.MDBX_txn, ptr %209, i32 0, i32 2
  %211 = load i64, ptr %210, align 8, !tbaa !35
  %212 = load ptr, ptr %4, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.MDBX_txn, ptr %212, i32 0, i32 2
  %214 = load i64, ptr %213, align 8, !tbaa !35
  %215 = icmp eq i64 %211, %214
  br i1 %215, label %216, label %560

216:                                              ; preds = %208
  br label %217

217:                                              ; preds = %216
  %218 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !36
  %219 = zext i8 %218 to i32
  %220 = icmp sle i32 4, %219
  %221 = xor i1 %220, true
  %222 = xor i1 %221, true
  %223 = zext i1 %222 to i32
  %224 = sext i32 %223 to i64
  %225 = call i64 @llvm.expect.i64(i64 %224, i64 0)
  %226 = icmp ne i64 %225, 0
  br i1 %226, label %227, label %231

227:                                              ; preds = %217
  %228 = load ptr, ptr %4, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.MDBX_txn, ptr %228, i32 0, i32 7
  %230 = load i64, ptr %229, align 8, !tbaa !37
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 4, ptr noundef @__func__.txn_nested_join, i32 noundef 472, ptr noundef @.str.17, i64 noundef %230)
  br label %231

231:                                              ; preds = %227, %217
  br label %232

232:                                              ; preds = %231
  br label %233

233:                                              ; preds = %232
  br label %234

234:                                              ; preds = %233
  %235 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %236 = zext i8 %235 to i32
  %237 = and i32 %236, 1
  %238 = icmp ne i32 %237, 0
  %239 = xor i1 %238, true
  %240 = xor i1 %239, true
  %241 = zext i1 %240 to i32
  %242 = sext i32 %241 to i64
  %243 = call i64 @llvm.expect.i64(i64 %242, i64 1)
  %244 = icmp ne i64 %243, 0
  br i1 %244, label %245, label %267

245:                                              ; preds = %234
  br label %246

246:                                              ; preds = %245
  %247 = load ptr, ptr %7, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.MDBX_txn, ptr %247, i32 0, i32 6
  %249 = load ptr, ptr %4, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.MDBX_txn, ptr %249, i32 0, i32 6
  %251 = call i32 @memcmp(ptr noundef %248, ptr noundef %250, i64 noundef 20) #11
  %252 = icmp eq i32 %251, 0
  %253 = xor i1 %252, true
  %254 = xor i1 %253, true
  %255 = xor i1 %254, true
  %256 = zext i1 %255 to i32
  %257 = sext i32 %256 to i64
  %258 = call i64 @llvm.expect.i64(i64 %257, i64 0)
  %259 = icmp ne i64 %258, 0
  br i1 %259, label %260, label %264

260:                                              ; preds = %246
  %261 = load ptr, ptr %4, align 8, !tbaa !5
  %262 = getelementptr inbounds %struct.MDBX_txn, ptr %261, i32 0, i32 9
  %263 = load ptr, ptr %262, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %263, ptr noundef @.str.18, ptr noundef @__func__.txn_nested_join, i32 noundef 474) #10
  unreachable

264:                                              ; preds = %246
  br label %265

265:                                              ; preds = %264
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266, %234
  br label %268

268:                                              ; preds = %267
  br label %269

269:                                              ; preds = %268
  br label %270

270:                                              ; preds = %269
  %271 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %272 = zext i8 %271 to i32
  %273 = and i32 %272, 1
  %274 = icmp ne i32 %273, 0
  %275 = xor i1 %274, true
  %276 = xor i1 %275, true
  %277 = zext i1 %276 to i32
  %278 = sext i32 %277 to i64
  %279 = call i64 @llvm.expect.i64(i64 %278, i64 1)
  %280 = icmp ne i64 %279, 0
  br i1 %280, label %281, label %303

281:                                              ; preds = %270
  br label %282

282:                                              ; preds = %281
  %283 = load ptr, ptr %7, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.MDBX_txn, ptr %283, i32 0, i32 15
  %285 = load ptr, ptr %4, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.MDBX_txn, ptr %285, i32 0, i32 15
  %287 = call i32 @memcmp(ptr noundef %284, ptr noundef %286, i64 noundef 32) #11
  %288 = icmp eq i32 %287, 0
  %289 = xor i1 %288, true
  %290 = xor i1 %289, true
  %291 = xor i1 %290, true
  %292 = zext i1 %291 to i32
  %293 = sext i32 %292 to i64
  %294 = call i64 @llvm.expect.i64(i64 %293, i64 0)
  %295 = icmp ne i64 %294, 0
  br i1 %295, label %296, label %300

296:                                              ; preds = %282
  %297 = load ptr, ptr %4, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.MDBX_txn, ptr %297, i32 0, i32 9
  %299 = load ptr, ptr %298, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %299, ptr noundef @.str.19, ptr noundef @__func__.txn_nested_join, i32 noundef 475) #10
  unreachable

300:                                              ; preds = %282
  br label %301

301:                                              ; preds = %300
  br label %302

302:                                              ; preds = %301
  br label %303

303:                                              ; preds = %302, %270
  br label %304

304:                                              ; preds = %303
  br label %305

305:                                              ; preds = %304
  br label %306

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

317:                                              ; preds = %306
  br label %318

318:                                              ; preds = %317
  %319 = load ptr, ptr %4, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.MDBX_txn, ptr %319, i32 0, i32 17
  %321 = getelementptr inbounds %struct.anon.2, ptr %320, i32 0, i32 11
  %322 = getelementptr inbounds %struct.anon.5, ptr %321, i32 0, i32 1
  %323 = load ptr, ptr %322, align 8, !tbaa !32
  %324 = icmp ne ptr %323, null
  br i1 %324, label %325, label %335

325:                                              ; preds = %318
  %326 = load ptr, ptr %4, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct.MDBX_txn, ptr %326, i32 0, i32 17
  %328 = getelementptr inbounds %struct.anon.2, ptr %327, i32 0, i32 11
  %329 = getelementptr inbounds %struct.anon.5, ptr %328, i32 0, i32 1
  %330 = load ptr, ptr %329, align 8, !tbaa !32
  %331 = getelementptr inbounds i32, ptr %330, i64 0
  %332 = load i32, ptr %331, align 4, !tbaa !38
  %333 = zext i32 %332 to i64
  %334 = icmp eq i64 %333, 0
  br label %335

335:                                              ; preds = %325, %318
  %336 = phi i1 [ true, %318 ], [ %334, %325 ]
  %337 = xor i1 %336, true
  %338 = xor i1 %337, true
  %339 = xor i1 %338, true
  %340 = zext i1 %339 to i32
  %341 = sext i32 %340 to i64
  %342 = call i64 @llvm.expect.i64(i64 %341, i64 0)
  %343 = icmp ne i64 %342, 0
  br i1 %343, label %344, label %348

344:                                              ; preds = %335
  %345 = load ptr, ptr %4, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.MDBX_txn, ptr %345, i32 0, i32 9
  %347 = load ptr, ptr %346, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %347, ptr noundef @.str.20, ptr noundef @__func__.txn_nested_join, i32 noundef 476) #10
  unreachable

348:                                              ; preds = %335
  br label %349

349:                                              ; preds = %348
  br label %350

350:                                              ; preds = %349
  br label %351

351:                                              ; preds = %350, %306
  br label %352

352:                                              ; preds = %351
  br label %353

353:                                              ; preds = %352
  br label %354

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

365:                                              ; preds = %354
  br label %366

366:                                              ; preds = %365
  %367 = load ptr, ptr %4, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.MDBX_txn, ptr %367, i32 0, i32 17
  %369 = getelementptr inbounds %struct.anon.2, ptr %368, i32 0, i32 10
  %370 = load i64, ptr %369, align 8, !tbaa !32
  %371 = icmp eq i64 %370, 0
  %372 = xor i1 %371, true
  %373 = xor i1 %372, true
  %374 = xor i1 %373, true
  %375 = zext i1 %374 to i32
  %376 = sext i32 %375 to i64
  %377 = call i64 @llvm.expect.i64(i64 %376, i64 0)
  %378 = icmp ne i64 %377, 0
  br i1 %378, label %379, label %383

379:                                              ; preds = %366
  %380 = load ptr, ptr %4, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.MDBX_txn, ptr %380, i32 0, i32 9
  %382 = load ptr, ptr %381, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %382, ptr noundef @.str.21, ptr noundef @__func__.txn_nested_join, i32 noundef 477) #10
  unreachable

383:                                              ; preds = %366
  br label %384

384:                                              ; preds = %383
  br label %385

385:                                              ; preds = %384
  br label %386

386:                                              ; preds = %385, %354
  br label %387

387:                                              ; preds = %386
  br label %388

388:                                              ; preds = %387
  br label %389

389:                                              ; preds = %388
  %390 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %391 = zext i8 %390 to i32
  %392 = and i32 %391, 1
  %393 = icmp ne i32 %392, 0
  %394 = xor i1 %393, true
  %395 = xor i1 %394, true
  %396 = zext i1 %395 to i32
  %397 = sext i32 %396 to i64
  %398 = call i64 @llvm.expect.i64(i64 %397, i64 1)
  %399 = icmp ne i64 %398, 0
  br i1 %399, label %400, label %421

400:                                              ; preds = %389
  br label %401

401:                                              ; preds = %400
  %402 = load ptr, ptr %7, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.MDBX_txn, ptr %402, i32 0, i32 2
  %404 = load i64, ptr %403, align 8, !tbaa !35
  %405 = load ptr, ptr %4, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.MDBX_txn, ptr %405, i32 0, i32 2
  %407 = load i64, ptr %406, align 8, !tbaa !35
  %408 = icmp eq i64 %404, %407
  %409 = xor i1 %408, true
  %410 = xor i1 %409, true
  %411 = xor i1 %410, true
  %412 = zext i1 %411 to i32
  %413 = sext i32 %412 to i64
  %414 = call i64 @llvm.expect.i64(i64 %413, i64 0)
  %415 = icmp ne i64 %414, 0
  br i1 %415, label %416, label %418

416:                                              ; preds = %401
  %417 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %417, ptr noundef @.str.22, ptr noundef @__func__.txn_nested_join, i32 noundef 480) #10
  unreachable

418:                                              ; preds = %401
  br label %419

419:                                              ; preds = %418
  br label %420

420:                                              ; preds = %419
  br label %421

421:                                              ; preds = %420, %389
  br label %422

422:                                              ; preds = %421
  br label %423

423:                                              ; preds = %422
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #9
  %424 = load ptr, ptr %4, align 8, !tbaa !5
  %425 = getelementptr inbounds %struct.MDBX_txn, ptr %424, i32 0, i32 11
  %426 = load ptr, ptr %425, align 8, !tbaa !39
  %427 = getelementptr inbounds i32, ptr %426, i64 0
  %428 = load i32, ptr %427, align 4, !tbaa !38
  %429 = lshr i32 %428, 0
  %430 = zext i32 %429 to i64
  store i64 %430, ptr %8, align 8, !tbaa !40
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  store i64 0, ptr %9, align 8, !tbaa !40
  br label %431

431:                                              ; preds = %554, %423
  %432 = load i64, ptr %9, align 8, !tbaa !40
  %433 = load ptr, ptr %4, align 8, !tbaa !5
  %434 = getelementptr inbounds %struct.MDBX_txn, ptr %433, i32 0, i32 2
  %435 = load i64, ptr %434, align 8, !tbaa !35
  %436 = icmp ult i64 %432, %435
  br i1 %436, label %438, label %437

437:                                              ; preds = %431
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #9
  br label %557

438:                                              ; preds = %431
  %439 = load ptr, ptr %4, align 8, !tbaa !5
  %440 = call zeroext i1 @dbi_foreach_step(ptr noundef %439, ptr noundef %8, ptr noundef %9)
  br i1 %440, label %441, label %553

441:                                              ; preds = %438
  br label %442

442:                                              ; preds = %441
  %443 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %444 = zext i8 %443 to i32
  %445 = and i32 %444, 1
  %446 = icmp ne i32 %445, 0
  %447 = xor i1 %446, true
  %448 = xor i1 %447, true
  %449 = zext i1 %448 to i32
  %450 = sext i32 %449 to i64
  %451 = call i64 @llvm.expect.i64(i64 %450, i64 1)
  %452 = icmp ne i64 %451, 0
  br i1 %452, label %453, label %478

453:                                              ; preds = %442
  br label %454

454:                                              ; preds = %453
  %455 = load ptr, ptr %4, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.MDBX_txn, ptr %455, i32 0, i32 12
  %457 = load ptr, ptr %456, align 8, !tbaa !41
  %458 = load i64, ptr %9, align 8, !tbaa !40
  %459 = getelementptr inbounds i8, ptr %457, i64 %458
  %460 = load i8, ptr %459, align 1, !tbaa !32
  %461 = zext i8 %460 to i32
  %462 = and i32 %461, 9
  %463 = icmp eq i32 %462, 0
  %464 = xor i1 %463, true
  %465 = xor i1 %464, true
  %466 = xor i1 %465, true
  %467 = zext i1 %466 to i32
  %468 = sext i32 %467 to i64
  %469 = call i64 @llvm.expect.i64(i64 %468, i64 0)
  %470 = icmp ne i64 %469, 0
  br i1 %470, label %471, label %475

471:                                              ; preds = %454
  %472 = load ptr, ptr %4, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.MDBX_txn, ptr %472, i32 0, i32 9
  %474 = load ptr, ptr %473, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %474, ptr noundef @.str.23, ptr noundef @__func__.txn_nested_join, i32 noundef 482) #10
  unreachable

475:                                              ; preds = %454
  br label %476

476:                                              ; preds = %475
  br label %477

477:                                              ; preds = %476
  br label %478

478:                                              ; preds = %477, %442
  br label %479

479:                                              ; preds = %478
  br label %480

480:                                              ; preds = %479
  %481 = load ptr, ptr %4, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.MDBX_txn, ptr %481, i32 0, i32 12
  %483 = load ptr, ptr %482, align 8, !tbaa !41
  %484 = load i64, ptr %9, align 8, !tbaa !40
  %485 = getelementptr inbounds i8, ptr %483, i64 %484
  %486 = load i8, ptr %485, align 1, !tbaa !32
  %487 = zext i8 %486 to i32
  %488 = and i32 %487, 4
  %489 = icmp ne i32 %488, 0
  br i1 %489, label %490, label %552

490:                                              ; preds = %480
  %491 = load ptr, ptr %7, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.MDBX_txn, ptr %491, i32 0, i32 10
  %493 = load ptr, ptr %492, align 8, !tbaa !42
  %494 = load i64, ptr %9, align 8, !tbaa !40
  %495 = getelementptr inbounds %struct.tree, ptr %493, i64 %494
  %496 = load ptr, ptr %4, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.MDBX_txn, ptr %496, i32 0, i32 10
  %498 = load ptr, ptr %497, align 8, !tbaa !42
  %499 = load i64, ptr %9, align 8, !tbaa !40
  %500 = getelementptr inbounds %struct.tree, ptr %498, i64 %499
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %495, ptr align 4 %500, i64 48, i1 false), !tbaa.struct !43
  call void @llvm.lifetime.start.p0(i64 1, ptr %10) #9
  %501 = load ptr, ptr %4, align 8, !tbaa !5
  %502 = getelementptr inbounds %struct.MDBX_txn, ptr %501, i32 0, i32 12
  %503 = load ptr, ptr %502, align 8, !tbaa !41
  %504 = load i64, ptr %9, align 8, !tbaa !40
  %505 = getelementptr inbounds i8, ptr %503, i64 %504
  %506 = load i8, ptr %505, align 1, !tbaa !32
  %507 = zext i8 %506 to i32
  %508 = or i32 %507, 4
  %509 = trunc i32 %508 to i8
  store i8 %509, ptr %10, align 1, !tbaa !32
  br label %510

510:                                              ; preds = %490
  %511 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !36
  %512 = zext i8 %511 to i32
  %513 = icmp sle i32 5, %512
  %514 = xor i1 %513, true
  %515 = xor i1 %514, true
  %516 = zext i1 %515 to i32
  %517 = sext i32 %516 to i64
  %518 = call i64 @llvm.expect.i64(i64 %517, i64 0)
  %519 = icmp ne i64 %518, 0
  br i1 %519, label %520, label %543

520:                                              ; preds = %510
  %521 = load i64, ptr %9, align 8, !tbaa !40
  %522 = load ptr, ptr %7, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.MDBX_txn, ptr %522, i32 0, i32 12
  %524 = load ptr, ptr %523, align 8, !tbaa !41
  %525 = load i64, ptr %9, align 8, !tbaa !40
  %526 = getelementptr inbounds i8, ptr %524, i64 %525
  %527 = load i8, ptr %526, align 1, !tbaa !32
  %528 = zext i8 %527 to i32
  %529 = load i8, ptr %10, align 1, !tbaa !32
  %530 = zext i8 %529 to i32
  %531 = icmp ne i32 %528, %530
  %532 = zext i1 %531 to i64
  %533 = select i1 %531, ptr @.str.25, ptr @.str.26
  %534 = load ptr, ptr %7, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.MDBX_txn, ptr %534, i32 0, i32 12
  %536 = load ptr, ptr %535, align 8, !tbaa !41
  %537 = load i64, ptr %9, align 8, !tbaa !40
  %538 = getelementptr inbounds i8, ptr %536, i64 %537
  %539 = load i8, ptr %538, align 1, !tbaa !32
  %540 = zext i8 %539 to i32
  %541 = load i8, ptr %10, align 1, !tbaa !32
  %542 = zext i8 %541 to i32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.txn_nested_join, i32 noundef 488, ptr noundef @.str.24, i64 noundef %521, ptr noundef %533, i32 noundef %540, i32 noundef %542)
  br label %543

543:                                              ; preds = %520, %510
  br label %544

544:                                              ; preds = %543
  br label %545

545:                                              ; preds = %544
  %546 = load i8, ptr %10, align 1, !tbaa !32
  %547 = load ptr, ptr %7, align 8, !tbaa !5
  %548 = getelementptr inbounds %struct.MDBX_txn, ptr %547, i32 0, i32 12
  %549 = load ptr, ptr %548, align 8, !tbaa !41
  %550 = load i64, ptr %9, align 8, !tbaa !40
  %551 = getelementptr inbounds i8, ptr %549, i64 %550
  store i8 %546, ptr %551, align 1, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 1, ptr %10) #9
  br label %552

552:                                              ; preds = %545, %480
  br label %553

553:                                              ; preds = %552, %438
  br label %554

554:                                              ; preds = %553
  %555 = load i64, ptr %9, align 8, !tbaa !40
  %556 = add i64 %555, 1
  store i64 %556, ptr %9, align 8, !tbaa !40
  br label %431, !llvm.loop !45

557:                                              ; preds = %437
  %558 = load ptr, ptr %4, align 8, !tbaa !5
  %559 = call i32 @txn_end(ptr noundef %558, i32 noundef 97)
  store i32 %559, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %1324

560:                                              ; preds = %208, %202, %194
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #9
  %561 = load ptr, ptr %7, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.MDBX_txn, ptr %561, i32 0, i32 17
  %563 = getelementptr inbounds %struct.anon.2, ptr %562, i32 0, i32 8
  %564 = load ptr, ptr %563, align 8, !tbaa !32
  %565 = ptrtoint ptr %564 to i64
  store i64 %565, ptr %12, align 8, !tbaa !40
  br label %566

566:                                              ; preds = %560
  %567 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %568 = zext i8 %567 to i32
  %569 = and i32 %568, 1
  %570 = icmp ne i32 %569, 0
  %571 = xor i1 %570, true
  %572 = xor i1 %571, true
  %573 = zext i1 %572 to i32
  %574 = sext i32 %573 to i64
  %575 = call i64 @llvm.expect.i64(i64 %574, i64 1)
  %576 = icmp ne i64 %575, 0
  br i1 %576, label %577, label %602

577:                                              ; preds = %566
  br label %578

578:                                              ; preds = %577
  %579 = load i64, ptr %12, align 8, !tbaa !40
  %580 = load ptr, ptr %4, align 8, !tbaa !5
  %581 = getelementptr inbounds %struct.MDBX_txn, ptr %580, i32 0, i32 17
  %582 = getelementptr inbounds %struct.anon.2, ptr %581, i32 0, i32 8
  %583 = load ptr, ptr %582, align 8, !tbaa !32
  %584 = getelementptr inbounds i32, ptr %583, i64 0
  %585 = load i32, ptr %584, align 4, !tbaa !38
  %586 = zext i32 %585 to i64
  %587 = icmp ule i64 %579, %586
  %588 = xor i1 %587, true
  %589 = xor i1 %588, true
  %590 = xor i1 %589, true
  %591 = zext i1 %590 to i32
  %592 = sext i32 %591 to i64
  %593 = call i64 @llvm.expect.i64(i64 %592, i64 0)
  %594 = icmp ne i64 %593, 0
  br i1 %594, label %595, label %599

595:                                              ; preds = %578
  %596 = load ptr, ptr %4, align 8, !tbaa !5
  %597 = getelementptr inbounds %struct.MDBX_txn, ptr %596, i32 0, i32 9
  %598 = load ptr, ptr %597, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %598, ptr noundef @.str.27, ptr noundef @__func__.txn_nested_join, i32 noundef 498) #10
  unreachable

599:                                              ; preds = %578
  br label %600

600:                                              ; preds = %599
  br label %601

601:                                              ; preds = %600
  br label %602

602:                                              ; preds = %601, %566
  br label %603

603:                                              ; preds = %602
  br label %604

604:                                              ; preds = %603
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %605 = load ptr, ptr %4, align 8, !tbaa !5
  %606 = getelementptr inbounds %struct.MDBX_txn, ptr %605, i32 0, i32 17
  %607 = getelementptr inbounds %struct.anon.2, ptr %606, i32 0, i32 8
  %608 = load ptr, ptr %607, align 8, !tbaa !32
  %609 = getelementptr inbounds i32, ptr %608, i64 0
  %610 = load i32, ptr %609, align 4, !tbaa !38
  %611 = zext i32 %610 to i64
  %612 = load i64, ptr %12, align 8, !tbaa !40
  %613 = sub i64 %611, %612
  store i64 %613, ptr %13, align 8, !tbaa !40
  %614 = load i64, ptr %13, align 8, !tbaa !40
  %615 = icmp ne i64 %614, 0
  br i1 %615, label %616, label %636

616:                                              ; preds = %604
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #9
  %617 = load ptr, ptr %4, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.MDBX_txn, ptr %617, i32 0, i32 17
  %619 = getelementptr inbounds %struct.anon.2, ptr %618, i32 0, i32 1
  %620 = load i64, ptr %13, align 8, !tbaa !40
  %621 = call i32 @pnl_need(ptr noundef %619, i64 noundef %620)
  store i32 %621, ptr %14, align 4, !tbaa !38
  %622 = load i32, ptr %14, align 4, !tbaa !38
  %623 = icmp ne i32 %622, 0
  %624 = xor i1 %623, true
  %625 = xor i1 %624, true
  %626 = zext i1 %625 to i32
  %627 = sext i32 %626 to i64
  %628 = call i64 @llvm.expect.i64(i64 %627, i64 0)
  %629 = icmp ne i64 %628, 0
  br i1 %629, label %630, label %632

630:                                              ; preds = %616
  %631 = load i32, ptr %14, align 4, !tbaa !38
  store i32 %631, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %633

632:                                              ; preds = %616
  store i32 0, ptr %11, align 4
  br label %633

633:                                              ; preds = %632, %630
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #9
  %634 = load i32, ptr %11, align 4
  switch i32 %634, label %1323 [
    i32 0, label %635
  ]

635:                                              ; preds = %633
  br label %636

636:                                              ; preds = %635, %604
  %637 = load ptr, ptr %4, align 8, !tbaa !5
  %638 = getelementptr inbounds %struct.MDBX_txn, ptr %637, i32 0, i32 17
  %639 = getelementptr inbounds %struct.anon.2, ptr %638, i32 0, i32 11
  %640 = getelementptr inbounds %struct.anon.5, ptr %639, i32 0, i32 1
  %641 = load ptr, ptr %640, align 8, !tbaa !32
  %642 = icmp ne ptr %641, null
  br i1 %642, label %643, label %681

643:                                              ; preds = %636
  %644 = load ptr, ptr %7, align 8, !tbaa !5
  %645 = getelementptr inbounds %struct.MDBX_txn, ptr %644, i32 0, i32 17
  %646 = getelementptr inbounds %struct.anon.2, ptr %645, i32 0, i32 11
  %647 = getelementptr inbounds %struct.anon.5, ptr %646, i32 0, i32 1
  %648 = load ptr, ptr %647, align 8, !tbaa !32
  %649 = icmp ne ptr %648, null
  br i1 %649, label %650, label %678

650:                                              ; preds = %643
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #9
  %651 = load ptr, ptr %7, align 8, !tbaa !5
  %652 = getelementptr inbounds %struct.MDBX_txn, ptr %651, i32 0, i32 17
  %653 = getelementptr inbounds %struct.anon.2, ptr %652, i32 0, i32 11
  %654 = getelementptr inbounds %struct.anon.5, ptr %653, i32 0, i32 1
  %655 = load ptr, ptr %4, align 8, !tbaa !5
  %656 = getelementptr inbounds %struct.MDBX_txn, ptr %655, i32 0, i32 17
  %657 = getelementptr inbounds %struct.anon.2, ptr %656, i32 0, i32 11
  %658 = getelementptr inbounds %struct.anon.5, ptr %657, i32 0, i32 1
  %659 = load ptr, ptr %658, align 8, !tbaa !32
  %660 = getelementptr inbounds i32, ptr %659, i64 0
  %661 = load i32, ptr %660, align 4, !tbaa !38
  %662 = zext i32 %661 to i64
  %663 = call i32 @pnl_need(ptr noundef %654, i64 noundef %662)
  store i32 %663, ptr %15, align 4, !tbaa !38
  %664 = load i32, ptr %15, align 4, !tbaa !38
  %665 = icmp ne i32 %664, 0
  %666 = xor i1 %665, true
  %667 = xor i1 %666, true
  %668 = zext i1 %667 to i32
  %669 = sext i32 %668 to i64
  %670 = call i64 @llvm.expect.i64(i64 %669, i64 0)
  %671 = icmp ne i64 %670, 0
  br i1 %671, label %672, label %674

672:                                              ; preds = %650
  %673 = load i32, ptr %15, align 4, !tbaa !38
  store i32 %673, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %675

674:                                              ; preds = %650
  store i32 0, ptr %11, align 4
  br label %675

675:                                              ; preds = %674, %672
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #9
  %676 = load i32, ptr %11, align 4
  switch i32 %676, label %1323 [
    i32 0, label %677
  ]

677:                                              ; preds = %675
  br label %678

678:                                              ; preds = %677, %643
  %679 = load ptr, ptr %4, align 8, !tbaa !5
  %680 = call ptr @spill_purge(ptr noundef %679)
  br label %681

681:                                              ; preds = %678, %636
  %682 = load ptr, ptr %4, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.MDBX_txn, ptr %682, i32 0, i32 17
  %684 = getelementptr inbounds %struct.anon.2, ptr %683, i32 0, i32 7
  %685 = load ptr, ptr %684, align 8, !tbaa !32
  %686 = getelementptr inbounds %struct.dpl, ptr %685, i32 0, i32 1
  %687 = load i64, ptr %686, align 8, !tbaa !33
  %688 = load ptr, ptr %7, align 8, !tbaa !5
  %689 = getelementptr inbounds %struct.MDBX_txn, ptr %688, i32 0, i32 17
  %690 = getelementptr inbounds %struct.anon.2, ptr %689, i32 0, i32 7
  %691 = load ptr, ptr %690, align 8, !tbaa !32
  %692 = getelementptr inbounds %struct.dpl, ptr %691, i32 0, i32 1
  %693 = load i64, ptr %692, align 8, !tbaa !33
  %694 = add i64 %687, %693
  %695 = load ptr, ptr %7, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.MDBX_txn, ptr %695, i32 0, i32 17
  %697 = getelementptr inbounds %struct.anon.2, ptr %696, i32 0, i32 7
  %698 = load ptr, ptr %697, align 8, !tbaa !32
  %699 = getelementptr inbounds %struct.dpl, ptr %698, i32 0, i32 3
  %700 = load i64, ptr %699, align 8, !tbaa !47
  %701 = icmp ugt i64 %694, %700
  br i1 %701, label %702, label %720

702:                                              ; preds = %681
  %703 = load ptr, ptr %7, align 8, !tbaa !5
  %704 = load ptr, ptr %4, align 8, !tbaa !5
  %705 = getelementptr inbounds %struct.MDBX_txn, ptr %704, i32 0, i32 17
  %706 = getelementptr inbounds %struct.anon.2, ptr %705, i32 0, i32 7
  %707 = load ptr, ptr %706, align 8, !tbaa !32
  %708 = getelementptr inbounds %struct.dpl, ptr %707, i32 0, i32 1
  %709 = load i64, ptr %708, align 8, !tbaa !33
  %710 = load ptr, ptr %7, align 8, !tbaa !5
  %711 = getelementptr inbounds %struct.MDBX_txn, ptr %710, i32 0, i32 17
  %712 = getelementptr inbounds %struct.anon.2, ptr %711, i32 0, i32 7
  %713 = load ptr, ptr %712, align 8, !tbaa !32
  %714 = getelementptr inbounds %struct.dpl, ptr %713, i32 0, i32 1
  %715 = load i64, ptr %714, align 8, !tbaa !33
  %716 = add i64 %709, %715
  %717 = call ptr @dpl_reserve(ptr noundef %703, i64 noundef %716)
  %718 = icmp ne ptr %717, null
  %719 = xor i1 %718, true
  br label %720

720:                                              ; preds = %702, %681
  %721 = phi i1 [ false, %681 ], [ %719, %702 ]
  %722 = xor i1 %721, true
  %723 = xor i1 %722, true
  %724 = zext i1 %723 to i32
  %725 = sext i32 %724 to i64
  %726 = call i64 @llvm.expect.i64(i64 %725, i64 0)
  %727 = icmp ne i64 %726, 0
  br i1 %727, label %728, label %729

728:                                              ; preds = %720
  store i32 12, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %1323

729:                                              ; preds = %720
  %730 = load ptr, ptr %4, align 8, !tbaa !5
  %731 = getelementptr inbounds %struct.MDBX_txn, ptr %730, i32 0, i32 17
  %732 = getelementptr inbounds %struct.anon.2, ptr %731, i32 0, i32 8
  %733 = load ptr, ptr %732, align 8, !tbaa !32
  %734 = load ptr, ptr %7, align 8, !tbaa !5
  %735 = getelementptr inbounds %struct.MDBX_txn, ptr %734, i32 0, i32 17
  %736 = getelementptr inbounds %struct.anon.2, ptr %735, i32 0, i32 8
  store ptr %733, ptr %736, align 8, !tbaa !32
  %737 = load ptr, ptr %4, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.MDBX_txn, ptr %737, i32 0, i32 17
  %739 = getelementptr inbounds %struct.anon.2, ptr %738, i32 0, i32 8
  store ptr null, ptr %739, align 8, !tbaa !32
  %740 = load ptr, ptr %7, align 8, !tbaa !5
  %741 = getelementptr inbounds %struct.MDBX_txn, ptr %740, i32 0, i32 17
  %742 = getelementptr inbounds %struct.anon.2, ptr %741, i32 0, i32 1
  %743 = load ptr, ptr %742, align 8, !tbaa !32
  call void @pnl_free(ptr noundef %743)
  %744 = load ptr, ptr %4, align 8, !tbaa !5
  %745 = getelementptr inbounds %struct.MDBX_txn, ptr %744, i32 0, i32 17
  %746 = getelementptr inbounds %struct.anon.2, ptr %745, i32 0, i32 1
  %747 = load ptr, ptr %746, align 8, !tbaa !32
  %748 = load ptr, ptr %7, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.MDBX_txn, ptr %748, i32 0, i32 17
  %750 = getelementptr inbounds %struct.anon.2, ptr %749, i32 0, i32 1
  store ptr %747, ptr %750, align 8, !tbaa !32
  %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 1
  store ptr null, ptr %753, align 8, !tbaa !32
  %754 = load ptr, ptr %4, align 8, !tbaa !5
  %755 = getelementptr inbounds %struct.MDBX_txn, ptr %754, i32 0, i32 17
  %756 = getelementptr inbounds %struct.anon.2, ptr %755, i32 0, i32 2
  %757 = getelementptr inbounds %struct.anon.3, ptr %756, i32 0, i32 1
  %758 = load i64, ptr %757, align 8, !tbaa !32
  %759 = load ptr, ptr %7, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.MDBX_txn, ptr %759, i32 0, i32 17
  %761 = getelementptr inbounds %struct.anon.2, ptr %760, i32 0, i32 2
  %762 = getelementptr inbounds %struct.anon.3, ptr %761, i32 0, i32 1
  store i64 %758, ptr %762, align 8, !tbaa !32
  %763 = load ptr, ptr %4, align 8, !tbaa !5
  %764 = getelementptr inbounds %struct.MDBX_txn, ptr %763, i32 0, i32 17
  %765 = getelementptr inbounds %struct.anon.2, ptr %764, i32 0, i32 2
  %766 = getelementptr inbounds %struct.anon.3, ptr %765, i32 0, i32 0
  %767 = load ptr, ptr %7, align 8, !tbaa !5
  %768 = getelementptr inbounds %struct.MDBX_txn, ptr %767, i32 0, i32 17
  %769 = getelementptr inbounds %struct.anon.2, ptr %768, i32 0, i32 2
  %770 = getelementptr inbounds %struct.anon.3, ptr %769, i32 0, i32 0
  call void @rkl_destructive_move(ptr noundef %766, ptr noundef %770)
  %771 = load ptr, ptr %7, align 8, !tbaa !5
  %772 = getelementptr inbounds %struct.MDBX_txn, ptr %771, i32 0, i32 6
  %773 = load ptr, ptr %4, align 8, !tbaa !5
  %774 = getelementptr inbounds %struct.MDBX_txn, ptr %773, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %772, ptr align 8 %774, i64 20, i1 false), !tbaa.struct !48
  %775 = load ptr, ptr %7, align 8, !tbaa !5
  %776 = getelementptr inbounds %struct.MDBX_txn, ptr %775, i32 0, i32 15
  %777 = load ptr, ptr %4, align 8, !tbaa !5
  %778 = getelementptr inbounds %struct.MDBX_txn, ptr %777, i32 0, i32 15
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %776, ptr align 8 %778, i64 32, i1 false), !tbaa.struct !49
  %779 = load ptr, ptr %4, align 8, !tbaa !5
  %780 = getelementptr inbounds %struct.MDBX_txn, ptr %779, i32 0, i32 1
  %781 = load i32, ptr %780, align 4, !tbaa !31
  %782 = and i32 %781, 4
  %783 = load ptr, ptr %7, align 8, !tbaa !5
  %784 = getelementptr inbounds %struct.MDBX_txn, ptr %783, i32 0, i32 1
  %785 = load i32, ptr %784, align 4, !tbaa !31
  %786 = or i32 %785, %782
  store i32 %786, ptr %784, align 4, !tbaa !31
  %787 = load ptr, ptr %4, align 8, !tbaa !5
  %788 = getelementptr inbounds %struct.MDBX_txn, ptr %787, i32 0, i32 17
  %789 = getelementptr inbounds %struct.anon.2, ptr %788, i32 0, i32 4
  %790 = load i32, ptr %789, align 4, !tbaa !32
  %791 = load ptr, ptr %7, align 8, !tbaa !5
  %792 = getelementptr inbounds %struct.MDBX_txn, ptr %791, i32 0, i32 17
  %793 = getelementptr inbounds %struct.anon.2, ptr %792, i32 0, i32 4
  store i32 %790, ptr %793, align 4, !tbaa !32
  %794 = load ptr, ptr %4, align 8, !tbaa !5
  %795 = getelementptr inbounds %struct.MDBX_txn, ptr %794, i32 0, i32 17
  %796 = getelementptr inbounds %struct.anon.2, ptr %795, i32 0, i32 10
  %797 = load i64, ptr %796, align 8, !tbaa !32
  %798 = load ptr, ptr %7, align 8, !tbaa !5
  %799 = getelementptr inbounds %struct.MDBX_txn, ptr %798, i32 0, i32 17
  %800 = getelementptr inbounds %struct.anon.2, ptr %799, i32 0, i32 10
  store i64 %797, ptr %800, align 8, !tbaa !32
  %801 = load ptr, ptr %4, align 8, !tbaa !5
  %802 = getelementptr inbounds %struct.MDBX_txn, ptr %801, i32 0, i32 17
  %803 = getelementptr inbounds %struct.anon.2, ptr %802, i32 0, i32 9
  %804 = load ptr, ptr %803, align 8, !tbaa !32
  %805 = load ptr, ptr %7, align 8, !tbaa !5
  %806 = getelementptr inbounds %struct.MDBX_txn, ptr %805, i32 0, i32 17
  %807 = getelementptr inbounds %struct.anon.2, ptr %806, i32 0, i32 9
  store ptr %804, ptr %807, align 8, !tbaa !32
  %808 = load ptr, ptr %4, align 8, !tbaa !5
  %809 = getelementptr inbounds %struct.MDBX_txn, ptr %808, i32 0, i32 1
  %810 = load i32, ptr %809, align 4, !tbaa !31
  %811 = and i32 %810, 256
  %812 = icmp ne i32 %811, 0
  br i1 %812, label %813, label %815

813:                                              ; preds = %729
  %814 = load ptr, ptr %4, align 8, !tbaa !5
  call void @txn_done_cursors(ptr noundef %814)
  br label %815

815:                                              ; preds = %813, %729
  br label %816

816:                                              ; preds = %815
  %817 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %818 = zext i8 %817 to i32
  %819 = and i32 %818, 1
  %820 = icmp ne i32 %819, 0
  %821 = xor i1 %820, true
  %822 = xor i1 %821, true
  %823 = zext i1 %822 to i32
  %824 = sext i32 %823 to i64
  %825 = call i64 @llvm.expect.i64(i64 %824, i64 1)
  %826 = icmp ne i64 %825, 0
  br i1 %826, label %827, label %848

827:                                              ; preds = %816
  br label %828

828:                                              ; preds = %827
  %829 = load ptr, ptr %7, align 8, !tbaa !5
  %830 = getelementptr inbounds %struct.MDBX_txn, ptr %829, i32 0, i32 2
  %831 = load i64, ptr %830, align 8, !tbaa !35
  %832 = load ptr, ptr %4, align 8, !tbaa !5
  %833 = getelementptr inbounds %struct.MDBX_txn, ptr %832, i32 0, i32 2
  %834 = load i64, ptr %833, align 8, !tbaa !35
  %835 = icmp eq i64 %831, %834
  %836 = xor i1 %835, true
  %837 = xor i1 %836, true
  %838 = xor i1 %837, true
  %839 = zext i1 %838 to i32
  %840 = sext i32 %839 to i64
  %841 = call i64 @llvm.expect.i64(i64 %840, i64 0)
  %842 = icmp ne i64 %841, 0
  br i1 %842, label %843, label %845

843:                                              ; preds = %828
  %844 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %844, ptr noundef @.str.22, ptr noundef @__func__.txn_nested_join, i32 noundef 547) #10
  unreachable

845:                                              ; preds = %828
  br label %846

846:                                              ; preds = %845
  br label %847

847:                                              ; preds = %846
  br label %848

848:                                              ; preds = %847, %816
  br label %849

849:                                              ; preds = %848
  br label %850

850:                                              ; preds = %849
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #9
  %851 = load ptr, ptr %4, align 8, !tbaa !5
  %852 = getelementptr inbounds %struct.MDBX_txn, ptr %851, i32 0, i32 11
  %853 = load ptr, ptr %852, align 8, !tbaa !39
  %854 = getelementptr inbounds i32, ptr %853, i64 0
  %855 = load i32, ptr %854, align 4, !tbaa !38
  %856 = lshr i32 %855, 0
  %857 = zext i32 %856 to i64
  store i64 %857, ptr %16, align 8, !tbaa !40
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #9
  store i64 0, ptr %17, align 8, !tbaa !40
  br label %858

858:                                              ; preds = %1014, %850
  %859 = load i64, ptr %17, align 8, !tbaa !40
  %860 = load ptr, ptr %4, align 8, !tbaa !5
  %861 = getelementptr inbounds %struct.MDBX_txn, ptr %860, i32 0, i32 2
  %862 = load i64, ptr %861, align 8, !tbaa !35
  %863 = icmp ult i64 %859, %862
  br i1 %863, label %865, label %864

864:                                              ; preds = %858
  store i32 61, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #9
  br label %1017

865:                                              ; preds = %858
  %866 = load ptr, ptr %4, align 8, !tbaa !5
  %867 = call zeroext i1 @dbi_foreach_step(ptr noundef %866, ptr noundef %16, ptr noundef %17)
  br i1 %867, label %868, label %1013

868:                                              ; preds = %865
  %869 = load ptr, ptr %4, align 8, !tbaa !5
  %870 = getelementptr inbounds %struct.MDBX_txn, ptr %869, i32 0, i32 12
  %871 = load ptr, ptr %870, align 8, !tbaa !41
  %872 = load i64, ptr %17, align 8, !tbaa !40
  %873 = getelementptr inbounds i8, ptr %871, i64 %872
  %874 = load i8, ptr %873, align 1, !tbaa !32
  %875 = zext i8 %874 to i32
  %876 = load ptr, ptr %7, align 8, !tbaa !5
  %877 = getelementptr inbounds %struct.MDBX_txn, ptr %876, i32 0, i32 12
  %878 = load ptr, ptr %877, align 8, !tbaa !41
  %879 = load i64, ptr %17, align 8, !tbaa !40
  %880 = getelementptr inbounds i8, ptr %878, i64 %879
  %881 = load i8, ptr %880, align 1, !tbaa !32
  %882 = zext i8 %881 to i32
  %883 = and i32 %882, -14
  %884 = icmp ne i32 %875, %883
  br i1 %884, label %885, label %1012

885:                                              ; preds = %868
  br label %886

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

897:                                              ; preds = %886
  br label %898

898:                                              ; preds = %897
  %899 = load ptr, ptr %4, align 8, !tbaa !5
  %900 = getelementptr inbounds %struct.MDBX_txn, ptr %899, i32 0, i32 12
  %901 = load ptr, ptr %900, align 8, !tbaa !41
  %902 = load i64, ptr %17, align 8, !tbaa !40
  %903 = getelementptr inbounds i8, ptr %901, i64 %902
  %904 = load i8, ptr %903, align 1, !tbaa !32
  %905 = zext i8 %904 to i32
  %906 = and i32 %905, 13
  %907 = icmp ne i32 %906, 0
  br i1 %907, label %926, label %908

908:                                              ; preds = %898
  %909 = load ptr, ptr %4, align 8, !tbaa !5
  %910 = getelementptr inbounds %struct.MDBX_txn, ptr %909, i32 0, i32 12
  %911 = load ptr, ptr %910, align 8, !tbaa !41
  %912 = load i64, ptr %17, align 8, !tbaa !40
  %913 = getelementptr inbounds i8, ptr %911, i64 %912
  %914 = load i8, ptr %913, align 1, !tbaa !32
  %915 = zext i8 %914 to i32
  %916 = or i32 %915, 2
  %917 = load ptr, ptr %7, align 8, !tbaa !5
  %918 = getelementptr inbounds %struct.MDBX_txn, ptr %917, i32 0, i32 12
  %919 = load ptr, ptr %918, align 8, !tbaa !41
  %920 = load i64, ptr %17, align 8, !tbaa !40
  %921 = getelementptr inbounds i8, ptr %919, i64 %920
  %922 = load i8, ptr %921, align 1, !tbaa !32
  %923 = zext i8 %922 to i32
  %924 = and i32 %923, -14
  %925 = icmp eq i32 %916, %924
  br label %926

926:                                              ; preds = %908, %898
  %927 = phi i1 [ true, %898 ], [ %925, %908 ]
  %928 = xor i1 %927, true
  %929 = xor i1 %928, true
  %930 = xor i1 %929, true
  %931 = zext i1 %930 to i32
  %932 = sext i32 %931 to i64
  %933 = call i64 @llvm.expect.i64(i64 %932, i64 0)
  %934 = icmp ne i64 %933, 0
  br i1 %934, label %935, label %937

935:                                              ; preds = %926
  %936 = load ptr, ptr %6, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %936, ptr noundef @.str.28, ptr noundef @__func__.txn_nested_join, i32 noundef 552) #10
  unreachable

937:                                              ; preds = %926
  br label %938

938:                                              ; preds = %937
  br label %939

939:                                              ; preds = %938
  br label %940

940:                                              ; preds = %939, %886
  br label %941

941:                                              ; preds = %940
  br label %942

942:                                              ; preds = %941
  %943 = load ptr, ptr %7, align 8, !tbaa !5
  %944 = getelementptr inbounds %struct.MDBX_txn, ptr %943, i32 0, i32 10
  %945 = load ptr, ptr %944, align 8, !tbaa !42
  %946 = load i64, ptr %17, align 8, !tbaa !40
  %947 = getelementptr inbounds %struct.tree, ptr %945, i64 %946
  %948 = load ptr, ptr %4, align 8, !tbaa !5
  %949 = getelementptr inbounds %struct.MDBX_txn, ptr %948, i32 0, i32 10
  %950 = load ptr, ptr %949, align 8, !tbaa !42
  %951 = load i64, ptr %17, align 8, !tbaa !40
  %952 = getelementptr inbounds %struct.tree, ptr %950, i64 %951
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %947, ptr align 4 %952, i64 48, i1 false), !tbaa.struct !43
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #9
  %953 = load ptr, ptr %4, align 8, !tbaa !5
  %954 = getelementptr inbounds %struct.MDBX_txn, ptr %953, i32 0, i32 12
  %955 = load ptr, ptr %954, align 8, !tbaa !41
  %956 = load i64, ptr %17, align 8, !tbaa !40
  %957 = getelementptr inbounds i8, ptr %955, i64 %956
  %958 = load i8, ptr %957, align 1, !tbaa !32
  %959 = zext i8 %958 to i32
  %960 = load ptr, ptr %7, align 8, !tbaa !5
  %961 = getelementptr inbounds %struct.MDBX_txn, ptr %960, i32 0, i32 12
  %962 = load ptr, ptr %961, align 8, !tbaa !41
  %963 = load i64, ptr %17, align 8, !tbaa !40
  %964 = getelementptr inbounds i8, ptr %962, i64 %963
  %965 = load i8, ptr %964, align 1, !tbaa !32
  %966 = zext i8 %965 to i32
  %967 = and i32 %966, 13
  %968 = or i32 %959, %967
  %969 = trunc i32 %968 to i8
  store i8 %969, ptr %18, align 1, !tbaa !32
  br label %970

970:                                              ; preds = %942
  %971 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !36
  %972 = zext i8 %971 to i32
  %973 = icmp sle i32 5, %972
  %974 = xor i1 %973, true
  %975 = xor i1 %974, true
  %976 = zext i1 %975 to i32
  %977 = sext i32 %976 to i64
  %978 = call i64 @llvm.expect.i64(i64 %977, i64 0)
  %979 = icmp ne i64 %978, 0
  br i1 %979, label %980, label %1003

980:                                              ; preds = %970
  %981 = load i64, ptr %17, align 8, !tbaa !40
  %982 = load ptr, ptr %7, align 8, !tbaa !5
  %983 = getelementptr inbounds %struct.MDBX_txn, ptr %982, i32 0, i32 12
  %984 = load ptr, ptr %983, align 8, !tbaa !41
  %985 = load i64, ptr %17, align 8, !tbaa !40
  %986 = getelementptr inbounds i8, ptr %984, i64 %985
  %987 = load i8, ptr %986, align 1, !tbaa !32
  %988 = zext i8 %987 to i32
  %989 = load i8, ptr %18, align 1, !tbaa !32
  %990 = zext i8 %989 to i32
  %991 = icmp ne i32 %988, %990
  %992 = zext i1 %991 to i64
  %993 = select i1 %991, ptr @.str.25, ptr @.str.26
  %994 = load ptr, ptr %7, align 8, !tbaa !5
  %995 = getelementptr inbounds %struct.MDBX_txn, ptr %994, i32 0, i32 12
  %996 = load ptr, ptr %995, align 8, !tbaa !41
  %997 = load i64, ptr %17, align 8, !tbaa !40
  %998 = getelementptr inbounds i8, ptr %996, i64 %997
  %999 = load i8, ptr %998, align 1, !tbaa !32
  %1000 = zext i8 %999 to i32
  %1001 = load i8, ptr %18, align 1, !tbaa !32
  %1002 = zext i8 %1001 to i32
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef @__func__.txn_nested_join, i32 noundef 557, ptr noundef @.str.24, i64 noundef %981, ptr noundef %993, i32 noundef %1000, i32 noundef %1002)
  br label %1003

1003:                                             ; preds = %980, %970
  br label %1004

1004:                                             ; preds = %1003
  br label %1005

1005:                                             ; preds = %1004
  %1006 = load i8, ptr %18, align 1, !tbaa !32
  %1007 = load ptr, ptr %7, align 8, !tbaa !5
  %1008 = getelementptr inbounds %struct.MDBX_txn, ptr %1007, i32 0, i32 12
  %1009 = load ptr, ptr %1008, align 8, !tbaa !41
  %1010 = load i64, ptr %17, align 8, !tbaa !40
  %1011 = getelementptr inbounds i8, ptr %1009, i64 %1010
  store i8 %1006, ptr %1011, align 1, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #9
  br label %1012

1012:                                             ; preds = %1005, %868
  br label %1013

1013:                                             ; preds = %1012, %865
  br label %1014

1014:                                             ; preds = %1013
  %1015 = load i64, ptr %17, align 8, !tbaa !40
  %1016 = add i64 %1015, 1
  store i64 %1016, ptr %17, align 8, !tbaa !40
  br label %858, !llvm.loop !50

1017:                                             ; preds = %864
  %1018 = load ptr, ptr %5, align 8, !tbaa !5
  %1019 = icmp ne ptr %1018, null
  br i1 %1019, label %1020, label %1044

1020:                                             ; preds = %1017
  %1021 = call i64 @osal_monotime()
  %1022 = load ptr, ptr %5, align 8, !tbaa !5
  %1023 = getelementptr inbounds %struct.commit_timestamp, ptr %1022, i32 0, i32 1
  store i64 %1021, ptr %1023, align 8, !tbaa !51
  %1024 = load ptr, ptr %5, align 8, !tbaa !5
  %1025 = getelementptr inbounds %struct.commit_timestamp, ptr %1024, i32 0, i32 1
  %1026 = load i64, ptr %1025, align 8, !tbaa !51
  %1027 = load ptr, ptr %5, align 8, !tbaa !5
  %1028 = getelementptr inbounds %struct.commit_timestamp, ptr %1027, i32 0, i32 2
  store i64 %1026, ptr %1028, align 8, !tbaa !53
  %1029 = load ptr, ptr %5, align 8, !tbaa !5
  %1030 = getelementptr inbounds %struct.commit_timestamp, ptr %1029, i32 0, i32 2
  %1031 = load i64, ptr %1030, align 8, !tbaa !53
  %1032 = load ptr, ptr %5, align 8, !tbaa !5
  %1033 = getelementptr inbounds %struct.commit_timestamp, ptr %1032, i32 0, i32 3
  store i64 %1031, ptr %1033, align 8, !tbaa !54
  %1034 = load ptr, ptr %5, align 8, !tbaa !5
  %1035 = getelementptr inbounds %struct.commit_timestamp, ptr %1034, i32 0, i32 3
  %1036 = load i64, ptr %1035, align 8, !tbaa !54
  %1037 = load ptr, ptr %5, align 8, !tbaa !5
  %1038 = getelementptr inbounds %struct.commit_timestamp, ptr %1037, i32 0, i32 4
  store i64 %1036, ptr %1038, align 8, !tbaa !55
  %1039 = load ptr, ptr %5, align 8, !tbaa !5
  %1040 = getelementptr inbounds %struct.commit_timestamp, ptr %1039, i32 0, i32 4
  %1041 = load i64, ptr %1040, align 8, !tbaa !55
  %1042 = load ptr, ptr %5, align 8, !tbaa !5
  %1043 = getelementptr inbounds %struct.commit_timestamp, ptr %1042, i32 0, i32 5
  store i64 %1041, ptr %1043, align 8, !tbaa !56
  br label %1044

1044:                                             ; preds = %1020, %1017
  %1045 = load ptr, ptr %7, align 8, !tbaa !5
  %1046 = load ptr, ptr %4, align 8, !tbaa !5
  %1047 = load i64, ptr %12, align 8, !tbaa !40
  call void @txn_merge(ptr noundef %1045, ptr noundef %1046, i64 noundef %1047)
  br label %1048

1048:                                             ; preds = %1044
  %1049 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1050 = zext i8 %1049 to i32
  %1051 = and i32 %1050, 1
  %1052 = icmp ne i32 %1051, 0
  %1053 = xor i1 %1052, true
  %1054 = xor i1 %1053, true
  %1055 = zext i1 %1054 to i32
  %1056 = sext i32 %1055 to i64
  %1057 = call i64 @llvm.expect.i64(i64 %1056, i64 1)
  %1058 = icmp ne i64 %1057, 0
  br i1 %1058, label %1059, label %1080

1059:                                             ; preds = %1048
  br label %1060

1060:                                             ; preds = %1059
  %1061 = load ptr, ptr %7, align 8, !tbaa !5
  %1062 = getelementptr inbounds %struct.MDBX_txn, ptr %1061, i32 0, i32 1
  %1063 = load i32, ptr %1062, align 4, !tbaa !31
  %1064 = and i32 %1063, 16
  %1065 = icmp ne i32 %1064, 0
  %1066 = xor i1 %1065, true
  %1067 = xor i1 %1066, true
  %1068 = xor i1 %1067, true
  %1069 = zext i1 %1068 to i32
  %1070 = sext i32 %1069 to i64
  %1071 = call i64 @llvm.expect.i64(i64 %1070, i64 0)
  %1072 = icmp ne i64 %1071, 0
  br i1 %1072, label %1073, label %1077

1073:                                             ; preds = %1060
  %1074 = load ptr, ptr %7, align 8, !tbaa !5
  %1075 = getelementptr inbounds %struct.MDBX_txn, ptr %1074, i32 0, i32 9
  %1076 = load ptr, ptr %1075, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %1076, ptr noundef @.str.29, ptr noundef @__func__.txn_nested_join, i32 noundef 570) #10
  unreachable

1077:                                             ; preds = %1060
  br label %1078

1078:                                             ; preds = %1077
  br label %1079

1079:                                             ; preds = %1078
  br label %1080

1080:                                             ; preds = %1079, %1048
  br label %1081

1081:                                             ; preds = %1080
  br label %1082

1082:                                             ; preds = %1081
  %1083 = load ptr, ptr %7, align 8, !tbaa !5
  %1084 = getelementptr inbounds %struct.MDBX_txn, ptr %1083, i32 0, i32 1
  %1085 = load i32, ptr %1084, align 4, !tbaa !31
  %1086 = sub i32 %1085, 16
  store i32 %1086, ptr %1084, align 4, !tbaa !31
  %1087 = load ptr, ptr %7, align 8, !tbaa !5
  %1088 = load ptr, ptr %6, align 8, !tbaa !5
  %1089 = getelementptr inbounds %struct.MDBX_env, ptr %1088, i32 0, i32 39
  store ptr %1087, ptr %1089, align 8, !tbaa !57
  %1090 = load ptr, ptr %7, align 8, !tbaa !5
  %1091 = getelementptr inbounds %struct.MDBX_txn, ptr %1090, i32 0, i32 5
  store ptr null, ptr %1091, align 8, !tbaa !30
  br label %1092

1092:                                             ; preds = %1082
  %1093 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1094 = zext i8 %1093 to i32
  %1095 = and i32 %1094, 1
  %1096 = icmp ne i32 %1095, 0
  %1097 = xor i1 %1096, true
  %1098 = xor i1 %1097, true
  %1099 = zext i1 %1098 to i32
  %1100 = sext i32 %1099 to i64
  %1101 = call i64 @llvm.expect.i64(i64 %1100, i64 1)
  %1102 = icmp ne i64 %1101, 0
  br i1 %1102, label %1103, label %1121

1103:                                             ; preds = %1092
  br label %1104

1104:                                             ; preds = %1103
  %1105 = load ptr, ptr %7, align 8, !tbaa !5
  %1106 = call zeroext i1 @dpl_check(ptr noundef %1105)
  %1107 = xor i1 %1106, true
  %1108 = xor i1 %1107, true
  %1109 = xor i1 %1108, true
  %1110 = zext i1 %1109 to i32
  %1111 = sext i32 %1110 to i64
  %1112 = call i64 @llvm.expect.i64(i64 %1111, i64 0)
  %1113 = icmp ne i64 %1112, 0
  br i1 %1113, label %1114, label %1118

1114:                                             ; preds = %1104
  %1115 = load ptr, ptr %7, align 8, !tbaa !5
  %1116 = getelementptr inbounds %struct.MDBX_txn, ptr %1115, i32 0, i32 9
  %1117 = load ptr, ptr %1116, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %1117, ptr noundef @.str.1, ptr noundef @__func__.txn_nested_join, i32 noundef 574) #10
  unreachable

1118:                                             ; preds = %1104
  br label %1119

1119:                                             ; preds = %1118
  br label %1120

1120:                                             ; preds = %1119
  br label %1121

1121:                                             ; preds = %1120, %1092
  br label %1122

1122:                                             ; preds = %1121
  br label %1123

1123:                                             ; preds = %1122
  %1124 = load ptr, ptr %7, align 8, !tbaa !5
  %1125 = call zeroext i1 @txn_refund(ptr noundef %1124)
  %1126 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1127 = zext i8 %1126 to i32
  %1128 = and i32 %1127, 1
  %1129 = icmp ne i32 %1128, 0
  %1130 = xor i1 %1129, true
  %1131 = xor i1 %1130, true
  %1132 = zext i1 %1131 to i32
  %1133 = sext i32 %1132 to i64
  %1134 = call i64 @llvm.expect.i64(i64 %1133, i64 1)
  %1135 = icmp ne i64 %1134, 0
  br i1 %1135, label %1136, label %1286

1136:                                             ; preds = %1123
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #9
  %1137 = load ptr, ptr %7, align 8, !tbaa !5
  %1138 = getelementptr inbounds %struct.MDBX_txn, ptr %1137, i32 0, i32 17
  %1139 = getelementptr inbounds %struct.anon.2, ptr %1138, i32 0, i32 9
  %1140 = load ptr, ptr %1139, align 8, !tbaa !32
  store ptr %1140, ptr %19, align 8, !tbaa !5
  br label %1141

1141:                                             ; preds = %1225, %1136
  %1142 = load ptr, ptr %19, align 8, !tbaa !5
  %1143 = icmp ne ptr %1142, null
  br i1 %1143, label %1145, label %1144

1144:                                             ; preds = %1141
  store i32 78, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #9
  br label %1233

1145:                                             ; preds = %1141
  br label %1146

1146:                                             ; preds = %1145
  %1147 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1148 = zext i8 %1147 to i32
  %1149 = and i32 %1148, 1
  %1150 = icmp ne i32 %1149, 0
  %1151 = xor i1 %1150, true
  %1152 = xor i1 %1151, true
  %1153 = zext i1 %1152 to i32
  %1154 = sext i32 %1153 to i64
  %1155 = call i64 @llvm.expect.i64(i64 %1154, i64 1)
  %1156 = icmp ne i64 %1155, 0
  br i1 %1156, label %1157, label %1193

1157:                                             ; preds = %1146
  br label %1158

1158:                                             ; preds = %1157
  %1159 = load ptr, ptr %19, align 8, !tbaa !5
  %1160 = getelementptr inbounds %struct.page, ptr %1159, i32 0, i32 4
  %1161 = load i32, ptr %1160, align 1, !tbaa !38
  %1162 = load ptr, ptr %7, align 8, !tbaa !5
  %1163 = getelementptr inbounds %struct.MDBX_txn, ptr %1162, i32 0, i32 17
  %1164 = getelementptr inbounds %struct.anon.2, ptr %1163, i32 0, i32 4
  %1165 = load i32, ptr %1164, align 4, !tbaa !32
  %1166 = icmp ult i32 %1161, %1165
  br i1 %1166, label %1167, label %1177

1167:                                             ; preds = %1158
  %1168 = load ptr, ptr %19, align 8, !tbaa !5
  %1169 = getelementptr inbounds %struct.page, ptr %1168, i32 0, i32 4
  %1170 = load i32, ptr %1169, align 1, !tbaa !38
  %1171 = add i32 %1170, 1
  %1172 = load ptr, ptr %7, align 8, !tbaa !5
  %1173 = getelementptr inbounds %struct.MDBX_txn, ptr %1172, i32 0, i32 6
  %1174 = getelementptr inbounds %struct.geo, ptr %1173, i32 0, i32 5
  %1175 = load i32, ptr %1174, align 8, !tbaa !32
  %1176 = icmp ult i32 %1171, %1175
  br label %1177

1177:                                             ; preds = %1167, %1158
  %1178 = phi i1 [ false, %1158 ], [ %1176, %1167 ]
  %1179 = xor i1 %1178, true
  %1180 = xor i1 %1179, true
  %1181 = xor i1 %1180, true
  %1182 = zext i1 %1181 to i32
  %1183 = sext i32 %1182 to i64
  %1184 = call i64 @llvm.expect.i64(i64 %1183, i64 0)
  %1185 = icmp ne i64 %1184, 0
  br i1 %1185, label %1186, label %1190

1186:                                             ; preds = %1177
  %1187 = load ptr, ptr %7, align 8, !tbaa !5
  %1188 = getelementptr inbounds %struct.MDBX_txn, ptr %1187, i32 0, i32 9
  %1189 = load ptr, ptr %1188, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %1189, ptr noundef @.str.30, ptr noundef @__func__.txn_nested_join, i32 noundef 581) #10
  unreachable

1190:                                             ; preds = %1177
  br label %1191

1191:                                             ; preds = %1190
  br label %1192

1192:                                             ; preds = %1191
  br label %1193

1193:                                             ; preds = %1192, %1146
  br label %1194

1194:                                             ; preds = %1193
  br label %1195

1195:                                             ; preds = %1194
  br label %1196

1196:                                             ; preds = %1195
  br label %1197

1197:                                             ; preds = %1196
  %1198 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 5), align 2, !tbaa !36
  %1199 = zext i8 %1198 to i32
  %1200 = icmp sle i32 6, %1199
  %1201 = xor i1 %1200, true
  %1202 = xor i1 %1201, true
  %1203 = zext i1 %1202 to i32
  %1204 = sext i32 %1203 to i64
  %1205 = call i64 @llvm.expect.i64(i64 %1204, i64 0)
  %1206 = icmp ne i64 %1205, 0
  br i1 %1206, label %1207, label %1214

1207:                                             ; preds = %1197
  %1208 = load ptr, ptr %19, align 8, !tbaa !5
  %1209 = getelementptr inbounds %struct.page, ptr %1208, i32 0, i32 5
  %1210 = getelementptr inbounds [0 x i16], ptr %1209, i64 0, i64 0
  %1211 = ptrtoint ptr %1210 to i64
  %1212 = add nsw i64 %1211, 4
  %1213 = inttoptr i64 %1212 to ptr
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef @__func__.txn_nested_join, i32 noundef 582, ptr noundef @.str.3, ptr noundef %1213, i64 noundef 8, i32 noundef 582)
  br label %1214

1214:                                             ; preds = %1207, %1197
  br label %1215

1215:                                             ; preds = %1214
  br label %1216

1216:                                             ; preds = %1215
  %1217 = load ptr, ptr %19, align 8, !tbaa !5
  %1218 = getelementptr inbounds %struct.page, ptr %1217, i32 0, i32 5
  %1219 = getelementptr inbounds [0 x i16], ptr %1218, i64 0, i64 0
  %1220 = ptrtoint ptr %1219 to i64
  %1221 = add nsw i64 %1220, 4
  %1222 = inttoptr i64 %1221 to ptr
  br label %1223

1223:                                             ; preds = %1216
  br label %1224

1224:                                             ; preds = %1223
  br label %1225

1225:                                             ; preds = %1224
  %1226 = load ptr, ptr %19, align 8, !tbaa !5
  %1227 = getelementptr inbounds %struct.page, ptr %1226, i32 0, i32 5
  %1228 = getelementptr inbounds [0 x i16], ptr %1227, i64 0, i64 0
  %1229 = ptrtoint ptr %1228 to i64
  %1230 = add nsw i64 %1229, 4
  %1231 = inttoptr i64 %1230 to ptr
  %1232 = load ptr, ptr %1231, align 8, !tbaa !5
  store ptr %1232, ptr %19, align 8, !tbaa !5
  br label %1141, !llvm.loop !58

1233:                                             ; preds = %1144
  %1234 = load ptr, ptr %7, align 8, !tbaa !5
  %1235 = getelementptr inbounds %struct.MDBX_txn, ptr %1234, i32 0, i32 17
  %1236 = getelementptr inbounds %struct.anon.2, ptr %1235, i32 0, i32 1
  %1237 = load ptr, ptr %1236, align 8, !tbaa !32
  %1238 = getelementptr inbounds i32, ptr %1237, i64 0
  %1239 = load i32, ptr %1238, align 4, !tbaa !38
  %1240 = zext i32 %1239 to i64
  %1241 = icmp ne i64 %1240, 0
  br i1 %1241, label %1242, label %1285

1242:                                             ; preds = %1233
  br label %1243

1243:                                             ; preds = %1242
  %1244 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1245 = zext i8 %1244 to i32
  %1246 = and i32 %1245, 1
  %1247 = icmp ne i32 %1246, 0
  %1248 = xor i1 %1247, true
  %1249 = xor i1 %1248, true
  %1250 = zext i1 %1249 to i32
  %1251 = sext i32 %1250 to i64
  %1252 = call i64 @llvm.expect.i64(i64 %1251, i64 1)
  %1253 = icmp ne i64 %1252, 0
  br i1 %1253, label %1254, label %1282

1254:                                             ; preds = %1243
  br label %1255

1255:                                             ; preds = %1254
  %1256 = load ptr, ptr %7, align 8, !tbaa !5
  %1257 = getelementptr inbounds %struct.MDBX_txn, ptr %1256, i32 0, i32 17
  %1258 = getelementptr inbounds %struct.anon.2, ptr %1257, i32 0, i32 1
  %1259 = load ptr, ptr %1258, align 8, !tbaa !32
  %1260 = getelementptr inbounds i32, ptr %1259, i64 1
  %1261 = load i32, ptr %1260, align 4, !tbaa !38
  %1262 = add i32 %1261, 1
  %1263 = load ptr, ptr %7, align 8, !tbaa !5
  %1264 = getelementptr inbounds %struct.MDBX_txn, ptr %1263, i32 0, i32 6
  %1265 = getelementptr inbounds %struct.geo, ptr %1264, i32 0, i32 5
  %1266 = load i32, ptr %1265, align 8, !tbaa !32
  %1267 = icmp ult i32 %1262, %1266
  %1268 = xor i1 %1267, true
  %1269 = xor i1 %1268, true
  %1270 = xor i1 %1269, true
  %1271 = zext i1 %1270 to i32
  %1272 = sext i32 %1271 to i64
  %1273 = call i64 @llvm.expect.i64(i64 %1272, i64 0)
  %1274 = icmp ne i64 %1273, 0
  br i1 %1274, label %1275, label %1279

1275:                                             ; preds = %1255
  %1276 = load ptr, ptr %7, align 8, !tbaa !5
  %1277 = getelementptr inbounds %struct.MDBX_txn, ptr %1276, i32 0, i32 9
  %1278 = load ptr, ptr %1277, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %1278, ptr noundef @.str.31, ptr noundef @__func__.txn_nested_join, i32 noundef 587) #10
  unreachable

1279:                                             ; preds = %1255
  br label %1280

1280:                                             ; preds = %1279
  br label %1281

1281:                                             ; preds = %1280
  br label %1282

1282:                                             ; preds = %1281, %1243
  br label %1283

1283:                                             ; preds = %1282
  br label %1284

1284:                                             ; preds = %1283
  br label %1285

1285:                                             ; preds = %1284, %1233
  br label %1286

1286:                                             ; preds = %1285, %1123
  %1287 = load ptr, ptr %4, align 8, !tbaa !5
  %1288 = getelementptr inbounds %struct.MDBX_txn, ptr %1287, i32 0, i32 0
  store i32 0, ptr %1288, align 8, !tbaa !29
  %1289 = load ptr, ptr %4, align 8, !tbaa !5
  call void @free(ptr noundef %1289) #9
  br label %1290

1290:                                             ; preds = %1286
  %1291 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !17
  %1292 = zext i8 %1291 to i32
  %1293 = and i32 %1292, 1
  %1294 = icmp ne i32 %1293, 0
  %1295 = xor i1 %1294, true
  %1296 = xor i1 %1295, true
  %1297 = zext i1 %1296 to i32
  %1298 = sext i32 %1297 to i64
  %1299 = call i64 @llvm.expect.i64(i64 %1298, i64 1)
  %1300 = icmp ne i64 %1299, 0
  br i1 %1300, label %1301, label %1320

1301:                                             ; preds = %1290
  br label %1302

1302:                                             ; preds = %1301
  %1303 = load ptr, ptr %7, align 8, !tbaa !5
  %1304 = call i32 @audit_ex(ptr noundef %1303, i64 noundef 0, i1 noundef zeroext false)
  %1305 = icmp eq i32 %1304, 0
  %1306 = xor i1 %1305, true
  %1307 = xor i1 %1306, true
  %1308 = xor i1 %1307, true
  %1309 = zext i1 %1308 to i32
  %1310 = sext i32 %1309 to i64
  %1311 = call i64 @llvm.expect.i64(i64 %1310, i64 0)
  %1312 = icmp ne i64 %1311, 0
  br i1 %1312, label %1313, label %1317

1313:                                             ; preds = %1302
  %1314 = load ptr, ptr %7, align 8, !tbaa !5
  %1315 = getelementptr inbounds %struct.MDBX_txn, ptr %1314, i32 0, i32 9
  %1316 = load ptr, ptr %1315, align 8, !tbaa !9
  call void @mdbx_assert_fail(ptr noundef %1316, ptr noundef @.str, ptr noundef @__func__.txn_nested_join, i32 noundef 593) #10
  unreachable

1317:                                             ; preds = %1302
  br label %1318

1318:                                             ; preds = %1317
  br label %1319

1319:                                             ; preds = %1318
  br label %1320

1320:                                             ; preds = %1319, %1290
  br label %1321

1321:                                             ; preds = %1320
  br label %1322

1322:                                             ; preds = %1321
  store i32 0, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %1323

1323:                                             ; preds = %1322, %728, %675, %633
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #9
  br label %1324

1324:                                             ; preds = %1323, %557
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  %1325 = load i32, ptr %3, align 4
  ret i32 %1325
}

; Function Attrs: nounwind willreturn memory(read)
declare i32 @memcmp(ptr noundef, ptr noundef, i64 noundef) #7

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

declare i32 @txn_end(ptr noundef, i32 noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @pnl_need(ptr noalias noundef, i64 noundef) #8

declare ptr @dpl_reserve(ptr noundef, i64 noundef) #2

declare void @rkl_destructive_move(ptr noundef, ptr noundef) #2

declare void @txn_done_cursors(ptr noundef) #2

declare i64 @osal_monotime() #2

; Function Attrs: nounwind uwtable
declare hidden void @txn_merge(ptr noundef, ptr noundef, i64 noundef) #6

declare zeroext i1 @txn_refund(ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #5 = { nounwind "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 = { nounwind willreturn memory(read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { 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 #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 = !{!10, !6, i64 24}
!17 = !{!18, !7, i64 25}
!18 = !{!"libmdbx_globals", !7, i64 0, !11, i64 16, !11, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !19, i64 27, !11, i64 28, !7, i64 32, !7, i64 40, !12, i64 80, !6, i64 88}
!19 = !{!"_Bool", !7, i64 0}
!20 = !{!21, !6, i64 192}
!21 = !{!"MDBX_env", !7, i64 0, !11, i64 4, !11, i64 8, !22, i64 16, !11, i64 56, !11, i64 60, !22, 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, !23, 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, !24, i64 264, !26, i64 320, !19, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !27, i64 392, !7, i64 400, !11, i64 440, !11, i64 444, !6, i64 448, !28, i64 456, !7, i64 496, !7, i64 536}
!22 = !{!"osal_mmap", !7, i64 0, !11, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!23 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!24 = !{!"", !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, !19, i64 36, !19, i64 37, !19, i64 38, !25, i64 40, !7, i64 48}
!25 = !{!"", !14, i64 0, !14, i64 2, !14, i64 4, !14, i64 6}
!26 = !{!"", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!27 = !{!"", !12, i64 0}
!28 = !{!"osal_ioring", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32}
!29 = !{!10, !11, i64 0}
!30 = !{!10, !6, i64 32}
!31 = !{!10, !11, i64 4}
!32 = !{!7, !7, i64 0}
!33 = !{!34, !12, i64 8}
!34 = !{!"dpl", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !7, i64 32}
!35 = !{!10, !12, i64 8}
!36 = !{!18, !7, i64 26}
!37 = !{!10, !12, i64 64}
!38 = !{!11, !11, i64 0}
!39 = !{!10, !6, i64 96}
!40 = !{!12, !12, i64 0}
!41 = !{!10, !6, i64 104}
!42 = !{!10, !6, i64 88}
!43 = !{i64 0, i64 2, !44, i64 2, i64 2, !44, i64 4, i64 4, !38, i64 8, i64 4, !38, i64 12, i64 4, !38, i64 16, i64 4, !38, i64 20, i64 4, !38, i64 24, i64 8, !40, i64 32, i64 8, !40, i64 40, i64 8, !40}
!44 = !{!14, !14, i64 0}
!45 = distinct !{!45, !46}
!46 = !{!"llvm.loop.mustprogress"}
!47 = !{!34, !12, i64 24}
!48 = !{i64 0, i64 2, !44, i64 2, i64 2, !44, i64 4, i64 4, !38, i64 8, i64 4, !38, i64 12, i64 4, !32, i64 16, i64 4, !32}
!49 = !{i64 0, i64 8, !40, i64 8, i64 8, !40, i64 16, i64 8, !40, i64 24, i64 8, !40}
!50 = distinct !{!50, !46}
!51 = !{!52, !12, i64 8}
!52 = !{!"commit_timestamp", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48}
!53 = !{!52, !12, i64 16}
!54 = !{!52, !12, i64 24}
!55 = !{!52, !12, i64 32}
!56 = !{!52, !12, i64 40}
!57 = !{!21, !6, i64 384}
!58 = distinct !{!58, !46}


; 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.14 }
%struct.anon.14 = 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.tree = type { i16, i16, i32, i32, i32, i32, i32, i64, i64, i64 }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [30 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [27 x i8], align 1
@__func__.txn_nested_join = external hidden unnamed_addr constant [16 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [6 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [169 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [86 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [60 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

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

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

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

; 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) #3

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

declare ptr @spill_purge(ptr noundef) local_unnamed_addr #1

declare void @pnl_free(ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
define dso_local i32 @txn_nested_join(ptr noundef %0, ptr noundef writeonly %1) local_unnamed_addr #5 {
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = alloca i64, align 8
  %7 = getelementptr inbounds i8, ptr %0, i64 80
  %8 = load ptr, ptr %7, align 8, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %0, i64 24
  %10 = load ptr, ptr %9, align 8, !tbaa !15
  %11 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %12 = and i8 %11, 1
  %.not = icmp eq i8 %12, 0
  br i1 %.not, label %.thread234, label %13, !prof !19

13:                                               ; preds = %2
  %14 = tail call i32 @audit_ex(ptr noundef nonnull %0, i64 noundef 0, i1 noundef zeroext false) #8
  %.not176 = icmp eq i32 %14, 0
  br i1 %.not176, label %17, label %15, !prof !20

15:                                               ; preds = %13
  %16 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %16, ptr noundef nonnull @.str.12, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 465) #9
  unreachable

17:                                               ; preds = %13
  %.pre = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %.pre272 = and i8 %.pre, 1
  %.not177 = icmp eq i8 %.pre272, 0
  br i1 %.not177, label %.thread234, label %18, !prof !21

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

21:                                               ; preds = %18
  tail call void @mdbx_assert_fail(ptr noundef nonnull %8, ptr noundef nonnull @.str.13, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 466) #9
  unreachable

22:                                               ; preds = %18
  %23 = load i32, ptr %10, align 8, !tbaa !31
  %.not180 = icmp eq i32 %23, 332741169
  br i1 %.not180, label %25, label %24, !prof !20

24:                                               ; preds = %22
  tail call void @mdbx_assert_fail(ptr noundef nonnull %8, ptr noundef nonnull @.str.14, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 467) #9
  unreachable

25:                                               ; preds = %22
  %26 = getelementptr inbounds i8, ptr %10, i64 32
  %27 = load ptr, ptr %26, align 8, !tbaa !32
  %28 = icmp eq ptr %27, %0
  br i1 %28, label %29, label %.critedge, !prof !20

29:                                               ; preds = %25
  %30 = getelementptr inbounds i8, ptr %10, i64 4
  %31 = load i32, ptr %30, align 4, !tbaa !33
  %32 = and i32 %31, 16
  %.not239 = icmp eq i32 %32, 0
  br i1 %.not239, label %.critedge, label %33, !prof !19

.critedge:                                        ; preds = %25, %29
  tail call void @mdbx_assert_fail(ptr noundef nonnull %8, ptr noundef nonnull @.str.15, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 468) #9
  unreachable

33:                                               ; preds = %29
  %34 = tail call zeroext i1 @dpl_check(ptr noundef nonnull %0) #8
  br i1 %34, label %.thread234, label %35, !prof !20

35:                                               ; preds = %33
  tail call void @mdbx_assert_fail(ptr noundef nonnull %8, ptr noundef nonnull @.str.16, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 469) #9
  unreachable

.thread234:                                       ; preds = %2, %17, %33
  %36 = getelementptr inbounds i8, ptr %0, i64 496
  %37 = load ptr, ptr %36, align 8, !tbaa !34
  %38 = getelementptr inbounds i8, ptr %37, i64 8
  %39 = load i64, ptr %38, align 8, !tbaa !35
  %40 = icmp eq i64 %39, 0
  br i1 %40, label %41, label %131

41:                                               ; preds = %.thread234
  %42 = getelementptr inbounds i8, ptr %0, i64 4
  %43 = load i32, ptr %42, align 4, !tbaa !33
  %44 = and i32 %43, 4
  %.not183 = icmp eq i32 %44, 0
  br i1 %.not183, label %45, label %131

45:                                               ; preds = %41
  %46 = getelementptr inbounds i8, ptr %10, i64 8
  %47 = load i64, ptr %46, align 8, !tbaa !37
  %48 = getelementptr inbounds i8, ptr %0, i64 8
  %49 = load i64, ptr %48, align 8, !tbaa !37
  %50 = icmp eq i64 %47, %49
  br i1 %50, label %51, label %131

51:                                               ; preds = %45
  %52 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !38
  %53 = icmp ugt i8 %52, 3
  br i1 %53, label %54, label %57, !prof !19

54:                                               ; preds = %51
  %55 = getelementptr inbounds i8, ptr %0, i64 64
  %56 = load i64, ptr %55, align 8, !tbaa !39
  tail call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 4, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 472, ptr noundef nonnull @.str.17, i64 noundef %56) #8
  br label %57

57:                                               ; preds = %51, %54
  %58 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %59 = and i8 %58, 1
  %.not184 = icmp eq i8 %59, 0
  br i1 %.not184, label %..critedge228.thread237_crit_edge, label %60, !prof !19

..critedge228.thread237_crit_edge:                ; preds = %57
  %.pre263 = load i64, ptr %48, align 8, !tbaa !37
  br label %.critedge228.thread237

60:                                               ; preds = %57
  %61 = getelementptr inbounds i8, ptr %10, i64 40
  %62 = getelementptr inbounds i8, ptr %0, i64 40
  %bcmp = tail call i32 @bcmp(ptr noundef nonnull dereferenceable(20) %61, ptr noundef nonnull dereferenceable(20) %62, i64 20)
  %.not185 = icmp eq i32 %bcmp, 0
  br i1 %.not185, label %65, label %63, !prof !20

63:                                               ; preds = %60
  %64 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %64, ptr noundef nonnull @.str.18, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 474) #9
  unreachable

65:                                               ; preds = %60
  %66 = getelementptr inbounds i8, ptr %10, i64 128
  %67 = getelementptr inbounds i8, ptr %0, i64 128
  %bcmp187 = tail call i32 @bcmp(ptr noundef nonnull dereferenceable(32) %66, ptr noundef nonnull dereferenceable(32) %67, i64 32)
  %.not188 = icmp eq i32 %bcmp187, 0
  br i1 %.not188, label %70, label %68, !prof !20

68:                                               ; preds = %65
  %69 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %69, ptr noundef nonnull @.str.19, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 475) #9
  unreachable

70:                                               ; preds = %65
  %71 = getelementptr inbounds i8, ptr %0, i64 536
  %72 = load ptr, ptr %71, align 8, !tbaa !34
  %.not190 = icmp eq ptr %72, null
  br i1 %.not190, label %77, label %73

73:                                               ; preds = %70
  %74 = load i32, ptr %72, align 4, !tbaa !40
  %.not240 = icmp eq i32 %74, 0
  br i1 %.not240, label %77, label %75, !prof !20

75:                                               ; preds = %73
  %76 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %76, ptr noundef nonnull @.str.20, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 476) #9
  unreachable

77:                                               ; preds = %70, %73
  %78 = getelementptr inbounds i8, ptr %0, i64 520
  %79 = load i64, ptr %78, align 8, !tbaa !34
  %.not192 = icmp eq i64 %79, 0
  br i1 %.not192, label %.critedge228, label %80, !prof !20

80:                                               ; preds = %77
  %81 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %81, ptr noundef nonnull @.str.21, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 477) #9
  unreachable

.critedge228:                                     ; preds = %77
  %82 = load i64, ptr %46, align 8, !tbaa !37
  %83 = load i64, ptr %48, align 8, !tbaa !37
  %.not194 = icmp eq i64 %82, %83
  br i1 %.not194, label %.critedge228.thread237, label %84, !prof !20

84:                                               ; preds = %.critedge228
  tail call void @mdbx_assert_fail(ptr noundef %8, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 480) #9
  unreachable

.critedge228.thread237:                           ; preds = %..critedge228.thread237_crit_edge, %.critedge228
  %85 = phi i64 [ %.pre263, %..critedge228.thread237_crit_edge ], [ %82, %.critedge228 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #8
  %86 = getelementptr inbounds i8, ptr %0, i64 96
  %87 = load ptr, ptr %86, align 8, !tbaa !41
  %88 = load i32, ptr %87, align 4, !tbaa !40
  %89 = zext i32 %88 to i64
  store i64 %89, ptr %3, align 8, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #8
  store i64 0, ptr %4, align 8, !tbaa !42
  %.not249 = icmp eq i64 %85, 0
  br i1 %.not249, label %._crit_edge247, label %.lr.ph246

.lr.ph246:                                        ; preds = %.critedge228.thread237
  %90 = getelementptr inbounds i8, ptr %0, i64 104
  %91 = getelementptr inbounds i8, ptr %10, i64 88
  %92 = getelementptr inbounds i8, ptr %0, i64 88
  %93 = getelementptr inbounds i8, ptr %10, i64 104
  br label %95

._crit_edge247:                                   ; preds = %126, %.critedge228.thread237
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #8
  %94 = call i32 @txn_end(ptr noundef nonnull %0, i32 noundef 97) #8
  br label %351

95:                                               ; preds = %.lr.ph246, %126
  %96 = call zeroext i1 @dbi_foreach_step(ptr noundef nonnull %0, ptr noundef nonnull %3, ptr noundef nonnull %4)
  %.pre271 = load i64, ptr %4, align 8, !tbaa !42
  br i1 %96, label %97, label %126

97:                                               ; preds = %95
  %98 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %99 = and i8 %98, 1
  %.not195 = icmp eq i8 %99, 0
  %.pre264 = load ptr, ptr %90, align 8, !tbaa !43
  %.phi.trans.insert267 = getelementptr inbounds i8, ptr %.pre264, i64 %.pre271
  %.pre268 = load i8, ptr %.phi.trans.insert267, align 1, !tbaa !34
  %100 = and i8 %.pre268, 9
  %.not196 = icmp eq i8 %100, 0
  %or.cond = select i1 %.not195, i1 true, i1 %.not196
  br i1 %or.cond, label %._crit_edge266, label %101, !prof !44

101:                                              ; preds = %97
  %102 = load ptr, ptr %7, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %102, ptr noundef nonnull @.str.23, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 482) #9
  unreachable

._crit_edge266:                                   ; preds = %97
  %103 = and i8 %.pre268, 4
  %.not197 = icmp eq i8 %103, 0
  br i1 %.not197, label %126, label %104

104:                                              ; preds = %._crit_edge266
  %105 = load ptr, ptr %91, align 8, !tbaa !45
  %106 = getelementptr inbounds %struct.tree, ptr %105, i64 %.pre271
  %107 = load ptr, ptr %92, align 8, !tbaa !45
  %108 = getelementptr inbounds %struct.tree, ptr %107, i64 %.pre271
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(48) %106, ptr noundef nonnull align 4 dereferenceable(48) %108, i64 48, i1 false), !tbaa.struct !46
  %109 = load ptr, ptr %90, align 8, !tbaa !43
  %110 = getelementptr inbounds i8, ptr %109, i64 %.pre271
  %111 = load i8, ptr %110, align 1, !tbaa !34
  %112 = or i8 %111, 4
  %113 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !38
  %114 = icmp ugt i8 %113, 4
  br i1 %114, label %115, label %122, !prof !19

115:                                              ; preds = %104
  %116 = load ptr, ptr %93, align 8, !tbaa !43
  %117 = getelementptr inbounds i8, ptr %116, i64 %.pre271
  %118 = load i8, ptr %117, align 1, !tbaa !34
  %119 = zext i8 %118 to i32
  %120 = zext i8 %112 to i32
  %.not198 = icmp eq i8 %118, %112
  %121 = select i1 %.not198, ptr @.str.26, ptr @.str.25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 488, ptr noundef nonnull @.str.24, i64 noundef %.pre271, ptr noundef nonnull %121, i32 noundef %119, i32 noundef %120) #8
  %.pre269 = load i64, ptr %4, align 8, !tbaa !42
  br label %122

122:                                              ; preds = %115, %104
  %123 = phi i64 [ %.pre269, %115 ], [ %.pre271, %104 ]
  %124 = load ptr, ptr %93, align 8, !tbaa !43
  %125 = getelementptr inbounds i8, ptr %124, i64 %123
  store i8 %112, ptr %125, align 1, !tbaa !34
  %.pre270 = load i64, ptr %4, align 8, !tbaa !42
  br label %126

126:                                              ; preds = %95, %122, %._crit_edge266
  %127 = phi i64 [ %.pre271, %95 ], [ %.pre270, %122 ], [ %.pre271, %._crit_edge266 ]
  %128 = add i64 %127, 1
  store i64 %128, ptr %4, align 8, !tbaa !42
  %129 = load i64, ptr %48, align 8, !tbaa !37
  %130 = icmp ult i64 %128, %129
  br i1 %130, label %95, label %._crit_edge247, !llvm.loop !48

131:                                              ; preds = %45, %41, %.thread234
  %132 = getelementptr inbounds i8, ptr %10, i64 504
  %133 = load ptr, ptr %132, align 8, !tbaa !34
  %134 = ptrtoint ptr %133 to i64
  %135 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %136 = and i8 %135, 1
  %.not199 = icmp ne i8 %136, 0
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 504
  %.pre252 = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !34
  %.pre253 = load i32, ptr %.pre252, align 4, !tbaa !40
  %.pre273 = zext i32 %.pre253 to i64
  %.not200 = icmp ugt i64 %134, %.pre273
  %or.cond278 = select i1 %.not199, i1 %.not200, i1 false
  br i1 %or.cond278, label %137, label %._crit_edge251, !prof !50

137:                                              ; preds = %131
  %138 = load ptr, ptr %7, align 8, !tbaa !5
  tail call void @mdbx_assert_fail(ptr noundef %138, ptr noundef nonnull @.str.27, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 498) #9
  unreachable

._crit_edge251:                                   ; preds = %131
  %139 = getelementptr inbounds i8, ptr %0, i64 504
  %.not201 = icmp eq i64 %.pre273, %134
  br i1 %.not201, label %144, label %140

140:                                              ; preds = %._crit_edge251
  %141 = sub i64 %.pre273, %134
  %142 = getelementptr inbounds i8, ptr %0, i64 200
  %143 = tail call i32 @pnl_need(ptr noundef nonnull %142, i64 noundef %141)
  %.not202 = icmp eq i32 %143, 0
  br i1 %.not202, label %144, label %351

144:                                              ; preds = %140, %._crit_edge251
  %145 = getelementptr inbounds i8, ptr %0, i64 536
  %146 = load ptr, ptr %145, align 8, !tbaa !34
  %.not203 = icmp eq ptr %146, null
  br i1 %.not203, label %156, label %147

147:                                              ; preds = %144
  %148 = getelementptr inbounds i8, ptr %10, i64 536
  %149 = load ptr, ptr %148, align 8, !tbaa !34
  %.not204 = icmp eq ptr %149, null
  br i1 %.not204, label %154, label %150

150:                                              ; preds = %147
  %151 = load i32, ptr %146, align 4, !tbaa !40
  %152 = zext i32 %151 to i64
  %153 = tail call i32 @pnl_need(ptr noundef nonnull %148, i64 noundef %152)
  %.not205 = icmp eq i32 %153, 0
  br i1 %.not205, label %154, label %351

154:                                              ; preds = %150, %147
  %155 = tail call ptr @spill_purge(ptr noundef nonnull %0) #8
  br label %156

156:                                              ; preds = %154, %144
  %157 = load ptr, ptr %36, align 8, !tbaa !34
  %158 = getelementptr inbounds i8, ptr %157, i64 8
  %159 = load i64, ptr %158, align 8, !tbaa !35
  %160 = getelementptr inbounds i8, ptr %10, i64 496
  %161 = load ptr, ptr %160, align 8, !tbaa !34
  %162 = getelementptr inbounds i8, ptr %161, i64 8
  %163 = load i64, ptr %162, align 8, !tbaa !35
  %164 = add i64 %163, %159
  %165 = getelementptr inbounds i8, ptr %161, i64 24
  %166 = load i64, ptr %165, align 8, !tbaa !51
  %167 = icmp ugt i64 %164, %166
  br i1 %167, label %168, label %.critedge230

168:                                              ; preds = %156
  %169 = tail call ptr @dpl_reserve(ptr noundef nonnull %10, i64 noundef %164) #8
  %.not206 = icmp eq ptr %169, null
  br i1 %.not206, label %351, label %.critedge230, !prof !19

.critedge230:                                     ; preds = %156, %168
  %170 = load ptr, ptr %139, align 8, !tbaa !34
  store ptr %170, ptr %132, align 8, !tbaa !34
  store ptr null, ptr %139, align 8, !tbaa !34
  %171 = getelementptr inbounds i8, ptr %10, i64 200
  %172 = load ptr, ptr %171, align 8, !tbaa !34
  tail call void @pnl_free(ptr noundef %172) #8
  %173 = getelementptr inbounds i8, ptr %0, i64 200
  %174 = load ptr, ptr %173, align 8, !tbaa !34
  store ptr %174, ptr %171, align 8, !tbaa !34
  store ptr null, ptr %173, align 8, !tbaa !34
  %175 = getelementptr inbounds i8, ptr %0, i64 208
  %176 = getelementptr inbounds i8, ptr %0, i64 336
  %177 = load i64, ptr %176, align 8, !tbaa !34
  %178 = getelementptr inbounds i8, ptr %10, i64 208
  %179 = getelementptr inbounds i8, ptr %10, i64 336
  store i64 %177, ptr %179, align 8, !tbaa !34
  tail call void @rkl_destructive_move(ptr noundef nonnull %175, ptr noundef nonnull %178) #8
  %180 = getelementptr inbounds i8, ptr %10, i64 40
  %181 = getelementptr inbounds i8, ptr %0, i64 40
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(20) %180, ptr noundef nonnull align 8 dereferenceable(20) %181, i64 20, i1 false), !tbaa.struct !52
  %182 = getelementptr inbounds i8, ptr %10, i64 128
  %183 = getelementptr inbounds i8, ptr %0, i64 128
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(32) %182, ptr noundef nonnull align 8 dereferenceable(32) %183, i64 32, i1 false), !tbaa.struct !53
  %184 = getelementptr inbounds i8, ptr %0, i64 4
  %185 = load i32, ptr %184, align 4, !tbaa !33
  %186 = and i32 %185, 4
  %187 = getelementptr inbounds i8, ptr %10, i64 4
  %188 = load i32, ptr %187, align 4, !tbaa !33
  %189 = or i32 %188, %186
  store i32 %189, ptr %187, align 4, !tbaa !33
  %190 = getelementptr inbounds i8, ptr %0, i64 476
  %191 = load i32, ptr %190, align 4, !tbaa !34
  %192 = getelementptr inbounds i8, ptr %10, i64 476
  store i32 %191, ptr %192, align 4, !tbaa !34
  %193 = getelementptr inbounds i8, ptr %0, i64 520
  %194 = load i64, ptr %193, align 8, !tbaa !34
  %195 = getelementptr inbounds i8, ptr %10, i64 520
  store i64 %194, ptr %195, align 8, !tbaa !34
  %196 = getelementptr inbounds i8, ptr %0, i64 512
  %197 = load ptr, ptr %196, align 8, !tbaa !34
  %198 = getelementptr inbounds i8, ptr %10, i64 512
  store ptr %197, ptr %198, align 8, !tbaa !34
  %199 = load i32, ptr %184, align 4, !tbaa !33
  %200 = and i32 %199, 256
  %.not207 = icmp eq i32 %200, 0
  br i1 %.not207, label %202, label %201

201:                                              ; preds = %.critedge230
  tail call void @txn_done_cursors(ptr noundef nonnull %0) #8
  br label %202

202:                                              ; preds = %.critedge230, %201
  %203 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %204 = and i8 %203, 1
  %.not208 = icmp eq i8 %204, 0
  br i1 %.not208, label %._crit_edge254, label %205, !prof !19

._crit_edge254:                                   ; preds = %202
  %.phi.trans.insert255 = getelementptr inbounds i8, ptr %0, i64 8
  %.pre256 = load i64, ptr %.phi.trans.insert255, align 8, !tbaa !37
  br label %211

205:                                              ; preds = %202
  %206 = getelementptr inbounds i8, ptr %10, i64 8
  %207 = load i64, ptr %206, align 8, !tbaa !37
  %208 = getelementptr inbounds i8, ptr %0, i64 8
  %209 = load i64, ptr %208, align 8, !tbaa !37
  %.not209 = icmp eq i64 %207, %209
  br i1 %.not209, label %211, label %210, !prof !20

210:                                              ; preds = %205
  tail call void @mdbx_assert_fail(ptr noundef %8, ptr noundef nonnull @.str.22, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 547) #9
  unreachable

211:                                              ; preds = %._crit_edge254, %205
  %212 = phi i64 [ %.pre256, %._crit_edge254 ], [ %207, %205 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #8
  %213 = getelementptr inbounds i8, ptr %0, i64 96
  %214 = load ptr, ptr %213, align 8, !tbaa !41
  %215 = load i32, ptr %214, align 4, !tbaa !40
  %216 = zext i32 %215 to i64
  store i64 %216, ptr %5, align 8, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #8
  %217 = getelementptr inbounds i8, ptr %0, i64 8
  store i64 0, ptr %6, align 8, !tbaa !42
  %.not248 = icmp eq i64 %212, 0
  br i1 %.not248, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %211
  %218 = getelementptr inbounds i8, ptr %0, i64 104
  %219 = getelementptr inbounds i8, ptr %10, i64 104
  %220 = getelementptr inbounds i8, ptr %10, i64 88
  %221 = getelementptr inbounds i8, ptr %0, i64 88
  br label %222

._crit_edge:                                      ; preds = %266, %211
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #8
  %.not211 = icmp eq ptr %1, null
  br i1 %.not211, label %278, label %271

222:                                              ; preds = %.lr.ph, %266
  %223 = call zeroext i1 @dbi_foreach_step(ptr noundef nonnull %0, ptr noundef nonnull %5, ptr noundef nonnull %6)
  %.pre260 = load i64, ptr %6, align 8, !tbaa !42
  br i1 %223, label %224, label %266

224:                                              ; preds = %222
  %225 = load ptr, ptr %218, align 8, !tbaa !43
  %226 = getelementptr inbounds i8, ptr %225, i64 %.pre260
  %227 = load i8, ptr %226, align 1, !tbaa !34
  %228 = zext i8 %227 to i32
  %229 = load ptr, ptr %219, align 8, !tbaa !43
  %230 = getelementptr inbounds i8, ptr %229, i64 %.pre260
  %231 = load i8, ptr %230, align 1, !tbaa !34
  %232 = and i8 %231, -14
  %233 = zext i8 %232 to i32
  %.not223 = icmp eq i8 %227, %232
  br i1 %.not223, label %266, label %234

234:                                              ; preds = %224
  %235 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %236 = and i8 %235, 1
  %.not224 = icmp eq i8 %236, 0
  br i1 %.not224, label %243, label %237, !prof !19

237:                                              ; preds = %234
  %238 = and i32 %228, 13
  %.not225 = icmp ne i32 %238, 0
  %239 = or i32 %228, 2
  %240 = icmp eq i32 %239, %233
  %241 = or i1 %.not225, %240
  br i1 %241, label %243, label %242, !prof !20

242:                                              ; preds = %237
  call void @mdbx_assert_fail(ptr noundef %8, ptr noundef nonnull @.str.28, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 552) #9
  unreachable

243:                                              ; preds = %237, %234
  %244 = load ptr, ptr %220, align 8, !tbaa !45
  %245 = getelementptr inbounds %struct.tree, ptr %244, i64 %.pre260
  %246 = load ptr, ptr %221, align 8, !tbaa !45
  %247 = getelementptr inbounds %struct.tree, ptr %246, i64 %.pre260
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(48) %245, ptr noundef nonnull align 4 dereferenceable(48) %247, i64 48, i1 false), !tbaa.struct !46
  %248 = load ptr, ptr %218, align 8, !tbaa !43
  %249 = getelementptr inbounds i8, ptr %248, i64 %.pre260
  %250 = load i8, ptr %249, align 1, !tbaa !34
  %251 = load ptr, ptr %219, align 8, !tbaa !43
  %252 = getelementptr inbounds i8, ptr %251, i64 %.pre260
  %253 = load i8, ptr %252, align 1, !tbaa !34
  %254 = and i8 %253, 13
  %255 = or i8 %254, %250
  %256 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !38
  %257 = icmp ugt i8 %256, 4
  br i1 %257, label %258, label %262, !prof !19

258:                                              ; preds = %243
  %259 = zext i8 %253 to i32
  %260 = zext i8 %255 to i32
  %.not226 = icmp eq i8 %253, %255
  %261 = select i1 %.not226, ptr @.str.26, ptr @.str.25
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 5, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 557, ptr noundef nonnull @.str.24, i64 noundef %.pre260, ptr noundef nonnull %261, i32 noundef %259, i32 noundef %260) #8
  %.pre257 = load ptr, ptr %219, align 8, !tbaa !43
  %.pre258 = load i64, ptr %6, align 8, !tbaa !42
  br label %262

262:                                              ; preds = %258, %243
  %263 = phi i64 [ %.pre258, %258 ], [ %.pre260, %243 ]
  %264 = phi ptr [ %.pre257, %258 ], [ %251, %243 ]
  %265 = getelementptr inbounds i8, ptr %264, i64 %263
  store i8 %255, ptr %265, align 1, !tbaa !34
  %.pre259 = load i64, ptr %6, align 8, !tbaa !42
  br label %266

266:                                              ; preds = %222, %262, %224
  %267 = phi i64 [ %.pre260, %222 ], [ %.pre259, %262 ], [ %.pre260, %224 ]
  %268 = add i64 %267, 1
  store i64 %268, ptr %6, align 8, !tbaa !42
  %269 = load i64, ptr %217, align 8, !tbaa !37
  %270 = icmp ult i64 %268, %269
  br i1 %270, label %222, label %._crit_edge, !llvm.loop !54

271:                                              ; preds = %._crit_edge
  %272 = call i64 @osal_monotime() #8
  %273 = getelementptr inbounds i8, ptr %1, i64 8
  store i64 %272, ptr %273, align 8, !tbaa !55
  %274 = getelementptr inbounds i8, ptr %1, i64 16
  store i64 %272, ptr %274, align 8, !tbaa !57
  %275 = getelementptr inbounds i8, ptr %1, i64 24
  store i64 %272, ptr %275, align 8, !tbaa !58
  %276 = getelementptr inbounds i8, ptr %1, i64 32
  store i64 %272, ptr %276, align 8, !tbaa !59
  %277 = getelementptr inbounds i8, ptr %1, i64 40
  store i64 %272, ptr %277, align 8, !tbaa !60
  br label %278

278:                                              ; preds = %271, %._crit_edge
  call void @txn_merge(ptr noundef %10, ptr noundef nonnull %0, i64 noundef %134)
  %279 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %280 = and i8 %279, 1
  %.not212 = icmp eq i8 %280, 0
  %281 = load i32, ptr %187, align 4, !tbaa !33
  br i1 %.not212, label %.thread238, label %285, !prof !19

.thread238:                                       ; preds = %278
  %282 = add i32 %281, -16
  store i32 %282, ptr %187, align 4, !tbaa !33
  %283 = getelementptr inbounds i8, ptr %8, i64 384
  store ptr %10, ptr %283, align 8, !tbaa !61
  %284 = getelementptr inbounds i8, ptr %10, i64 32
  store ptr null, ptr %284, align 8, !tbaa !32
  br label %298

285:                                              ; preds = %278
  %286 = and i32 %281, 16
  %.not213 = icmp eq i32 %286, 0
  br i1 %.not213, label %287, label %290, !prof !19

287:                                              ; preds = %285
  %288 = getelementptr inbounds i8, ptr %10, i64 80
  %289 = load ptr, ptr %288, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %289, ptr noundef nonnull @.str.29, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 570) #9
  unreachable

290:                                              ; preds = %285
  %291 = add nsw i32 %281, -16
  store i32 %291, ptr %187, align 4, !tbaa !33
  %292 = getelementptr inbounds i8, ptr %8, i64 384
  store ptr %10, ptr %292, align 8, !tbaa !61
  %293 = getelementptr inbounds i8, ptr %10, i64 32
  store ptr null, ptr %293, align 8, !tbaa !32
  %294 = call zeroext i1 @dpl_check(ptr noundef nonnull %10) #8
  br i1 %294, label %298, label %295, !prof !20

295:                                              ; preds = %290
  %296 = getelementptr inbounds i8, ptr %10, i64 80
  %297 = load ptr, ptr %296, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %297, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 574) #9
  unreachable

298:                                              ; preds = %.thread238, %290
  %299 = call zeroext i1 @txn_refund(ptr noundef nonnull %10) #8
  %300 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %301 = and i8 %300, 1
  %.not215 = icmp eq i8 %301, 0
  br i1 %.not215, label %343, label %.preheader, !prof !19

.preheader:                                       ; preds = %298
  %.0241 = load ptr, ptr %198, align 8, !tbaa !34
  %.not216242 = icmp eq ptr %.0241, null
  br i1 %.not216242, label %._crit_edge245, label %.lr.ph244

.lr.ph244:                                        ; preds = %.preheader
  %302 = getelementptr inbounds i8, ptr %10, i64 56
  br label %307

._crit_edge245:                                   ; preds = %._crit_edge275, %.preheader
  %303 = phi i8 [ %300, %.preheader ], [ %329, %._crit_edge275 ]
  %304 = load ptr, ptr %171, align 8, !tbaa !34
  %305 = load i32, ptr %304, align 4, !tbaa !40
  %.not217 = icmp eq i32 %305, 0
  %306 = and i8 %303, 1
  %.not218 = icmp eq i8 %306, 0
  %or.cond279 = select i1 %.not217, i1 true, i1 %.not218
  br i1 %or.cond279, label %343, label %334, !prof !62

307:                                              ; preds = %.lr.ph244, %._crit_edge275
  %308 = phi i8 [ %300, %.lr.ph244 ], [ %329, %._crit_edge275 ]
  %.0243 = phi ptr [ %.0241, %.lr.ph244 ], [ %.0, %._crit_edge275 ]
  %309 = and i8 %308, 1
  %.not222 = icmp eq i8 %309, 0
  br i1 %.not222, label %321, label %310, !prof !19

310:                                              ; preds = %307
  %311 = getelementptr inbounds i8, ptr %.0243, i64 16
  %312 = load i32, ptr %311, align 1, !tbaa !40
  %313 = load i32, ptr %192, align 4, !tbaa !34
  %314 = icmp ult i32 %312, %313
  br i1 %314, label %315, label %.critedge232, !prof !20

315:                                              ; preds = %310
  %316 = add nuw i32 %312, 1
  %317 = load i32, ptr %302, align 8, !tbaa !34
  %318 = icmp ult i32 %316, %317
  br i1 %318, label %321, label %.critedge232, !prof !20

.critedge232:                                     ; preds = %310, %315
  %319 = getelementptr inbounds i8, ptr %10, i64 80
  %320 = load ptr, ptr %319, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %320, ptr noundef nonnull @.str.30, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 581) #9
  unreachable

321:                                              ; preds = %315, %307
  %322 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 26), align 2, !tbaa !38
  %323 = icmp ugt i8 %322, 5
  br i1 %323, label %324, label %._crit_edge275, !prof !19

324:                                              ; preds = %321
  %325 = getelementptr inbounds i8, ptr %.0243, i64 20
  %326 = ptrtoint ptr %325 to i64
  %327 = add nsw i64 %326, 4
  %328 = inttoptr i64 %327 to ptr
  call void (i32, ptr, i32, ptr, ...) @debug_log(i32 noundef 6, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 582, ptr noundef nonnull @.str.3, ptr noundef %328, i64 noundef 8, i32 noundef 582) #8
  %.pre261 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  br label %._crit_edge275

._crit_edge275:                                   ; preds = %321, %324
  %329 = phi i8 [ %.pre261, %324 ], [ %308, %321 ]
  %330 = getelementptr inbounds i8, ptr %.0243, i64 20
  %331 = ptrtoint ptr %330 to i64
  %332 = add nsw i64 %331, 4
  %333 = inttoptr i64 %332 to ptr
  %.0 = load ptr, ptr %333, align 8, !tbaa !34
  %.not216 = icmp eq ptr %.0, null
  br i1 %.not216, label %._crit_edge245, label %307, !llvm.loop !63

334:                                              ; preds = %._crit_edge245
  %335 = getelementptr inbounds i8, ptr %304, i64 4
  %336 = load i32, ptr %335, align 4, !tbaa !40
  %337 = add i32 %336, 1
  %338 = getelementptr inbounds i8, ptr %10, i64 56
  %339 = load i32, ptr %338, align 8, !tbaa !34
  %.not219 = icmp ult i32 %337, %339
  br i1 %.not219, label %343, label %340, !prof !20

340:                                              ; preds = %334
  %341 = getelementptr inbounds i8, ptr %10, i64 80
  %342 = load ptr, ptr %341, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %342, ptr noundef nonnull @.str.31, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 587) #9
  unreachable

343:                                              ; preds = %._crit_edge245, %334, %298
  call void @free(ptr noundef %0) #8
  %344 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !16
  %345 = and i8 %344, 1
  %.not220 = icmp eq i8 %345, 0
  br i1 %.not220, label %351, label %346, !prof !19

346:                                              ; preds = %343
  %347 = call i32 @audit_ex(ptr noundef nonnull %10, i64 noundef 0, i1 noundef zeroext false) #8
  %.not221 = icmp eq i32 %347, 0
  br i1 %.not221, label %351, label %348, !prof !20

348:                                              ; preds = %346
  %349 = getelementptr inbounds i8, ptr %10, i64 80
  %350 = load ptr, ptr %349, align 8, !tbaa !5
  call void @mdbx_assert_fail(ptr noundef %350, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.txn_nested_join, i32 noundef 593) #9
  unreachable

351:                                              ; preds = %150, %140, %168, %346, %343, %._crit_edge247
  %.4 = phi i32 [ %94, %._crit_edge247 ], [ %153, %150 ], [ %143, %140 ], [ 12, %168 ], [ 0, %346 ], [ 0, %343 ]
  ret i32 %.4
}

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

declare i32 @txn_end(ptr noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @pnl_need(ptr noalias noundef, i64 noundef) local_unnamed_addr #6

declare ptr @dpl_reserve(ptr noundef, i64 noundef) local_unnamed_addr #1

declare void @rkl_destructive_move(ptr noundef, ptr noundef) local_unnamed_addr #1

declare void @txn_done_cursors(ptr noundef) local_unnamed_addr #1

declare i64 @osal_monotime() local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden void @txn_merge(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #5

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

; Function Attrs: nofree nounwind willreturn memory(argmem: read)
declare i32 @bcmp(ptr nocapture, ptr nocapture, i64) local_unnamed_addr #7

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !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 = !{!6, !11, i64 24}
!16 = !{!17, !8, i64 25}
!17 = !{!"libmdbx_globals", !8, i64 0, !7, i64 16, !7, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !18, i64 27, !7, i64 28, !8, i64 32, !8, i64 40, !10, i64 80, !11, i64 88}
!18 = !{!"_Bool", !8, i64 0}
!19 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!20 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!21 = !{!"branch_weights", !"expected", i32 0, i32 -2147483648}
!22 = !{!23, !11, i64 192}
!23 = !{!"MDBX_env", !8, i64 0, !7, i64 4, !7, i64 8, !24, i64 16, !7, i64 56, !7, i64 60, !24, 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, !25, 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, !26, i64 264, !28, i64 320, !18, i64 360, !11, i64 368, !11, i64 376, !11, i64 384, !29, i64 392, !8, i64 400, !7, i64 440, !7, i64 444, !11, i64 448, !30, i64 456, !8, i64 496, !8, i64 536}
!24 = !{!"osal_mmap", !8, i64 0, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!25 = !{!"", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!26 = !{!"", !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, !18, i64 36, !18, i64 37, !18, i64 38, !27, i64 40, !8, i64 48}
!27 = !{!"", !13, i64 0, !13, i64 2, !13, i64 4, !13, i64 6}
!28 = !{!"", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!29 = !{!"", !10, i64 0}
!30 = !{!"osal_ioring", !7, i64 0, !7, i64 4, !7, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!31 = !{!6, !7, i64 0}
!32 = !{!6, !11, i64 32}
!33 = !{!6, !7, i64 4}
!34 = !{!8, !8, i64 0}
!35 = !{!36, !10, i64 8}
!36 = !{!"dpl", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !8, i64 32}
!37 = !{!6, !10, i64 8}
!38 = !{!17, !8, i64 26}
!39 = !{!6, !10, i64 64}
!40 = !{!7, !7, i64 0}
!41 = !{!6, !11, i64 96}
!42 = !{!10, !10, i64 0}
!43 = !{!6, !11, i64 104}
!44 = !{!"branch_weights", i32 4002001, i32 2000}
!45 = !{!6, !11, i64 88}
!46 = !{i64 0, i64 2, !47, i64 2, i64 2, !47, i64 4, i64 4, !40, i64 8, i64 4, !40, i64 12, i64 4, !40, i64 16, i64 4, !40, i64 20, i64 4, !40, i64 24, i64 8, !42, i64 32, i64 8, !42, i64 40, i64 8, !42}
!47 = !{!13, !13, i64 0}
!48 = distinct !{!48, !49}
!49 = !{!"llvm.loop.mustprogress"}
!50 = !{!"branch_weights", i32 2000, i32 4002001}
!51 = !{!36, !10, i64 24}
!52 = !{i64 0, i64 2, !47, i64 2, i64 2, !47, i64 4, i64 4, !40, i64 8, i64 4, !40, i64 12, i64 4, !34, i64 16, i64 4, !34}
!53 = !{i64 0, i64 8, !42, i64 8, i64 8, !42, i64 16, i64 8, !42, i64 24, i64 8, !42}
!54 = distinct !{!54, !49}
!55 = !{!56, !10, i64 8}
!56 = !{!"commit_timestamp", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48}
!57 = !{!56, !10, i64 16}
!58 = !{!56, !10, i64 24}
!59 = !{!56, !10, i64 32}
!60 = !{!56, !10, i64 40}
!61 = !{!23, !11, i64 384}
!62 = !{!"branch_weights", i32 2002, i32 2000}
!63 = distinct !{!63, !49}


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