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

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }

@globals = external global %struct.libmdbx_globals, align 8
@.str.1 = external hidden unnamed_addr constant [28 x i8], align 1
@__func__.troika_verify_fsm = external hidden unnamed_addr constant [18 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [21 x i8], align 1
@troika_fsm_map = external hidden constant [216 x i8], align 16
@.str.6 = external hidden unnamed_addr constant [37 x i8], align 1

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

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

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

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

; Function Attrs: cold nounwind optsize uwtable
define dso_local zeroext i1 @troika_verify_fsm() #3 {
  %1 = alloca i8, align 1
  %2 = alloca i64, align 8
  %3 = alloca i8, align 1
  %4 = alloca i8, align 1
  %5 = alloca i8, align 1
  %6 = alloca i8, align 1
  %7 = alloca i8, align 1
  %8 = alloca i8, align 1
  %9 = alloca i8, align 1
  %10 = alloca %struct.troika, align 8
  %11 = alloca i8, align 1
  %12 = alloca i8, align 1
  %13 = alloca i8, align 1
  %14 = alloca i8, align 1
  %15 = alloca i8, align 1
  %16 = alloca i8, align 1
  %17 = alloca i8, align 1
  %18 = alloca i8, align 1
  call void @llvm.lifetime.start.p0(i64 1, ptr %1) #6
  store i8 1, ptr %1, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %2) #6
  store i64 0, ptr %2, align 8, !tbaa !9
  br label %19

19:                                               ; preds = %520, %0
  %20 = load i64, ptr %2, align 8, !tbaa !9
  %21 = icmp ult i64 %20, 216
  br i1 %21, label %23, label %22

22:                                               ; preds = %19
  call void @llvm.lifetime.end.p0(i64 8, ptr %2) #6
  br label %523

23:                                               ; preds = %19
  call void @llvm.lifetime.start.p0(i64 1, ptr %3) #6
  %24 = load i64, ptr %2, align 8, !tbaa !9
  %25 = lshr i64 %24, 0
  %26 = and i64 %25, 1
  %27 = icmp ne i64 %26, 0
  %28 = zext i1 %27 to i8
  store i8 %28, ptr %3, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %4) #6
  %29 = load i64, ptr %2, align 8, !tbaa !9
  %30 = lshr i64 %29, 1
  %31 = and i64 %30, 1
  %32 = icmp ne i64 %31, 0
  %33 = zext i1 %32 to i8
  store i8 %33, ptr %4, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %5) #6
  %34 = load i64, ptr %2, align 8, !tbaa !9
  %35 = lshr i64 %34, 2
  %36 = and i64 %35, 1
  %37 = icmp ne i64 %36, 0
  %38 = zext i1 %37 to i8
  store i8 %38, ptr %5, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %6) #6
  %39 = load i64, ptr %2, align 8, !tbaa !9
  %40 = udiv i64 %39, 8
  %41 = urem i64 %40, 3
  %42 = trunc i64 %41 to i8
  store i8 %42, ptr %6, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #6
  %43 = load i64, ptr %2, align 8, !tbaa !9
  %44 = udiv i64 %43, 24
  %45 = urem i64 %44, 3
  %46 = trunc i64 %45 to i8
  store i8 %46, ptr %7, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %8) #6
  %47 = load i64, ptr %2, align 8, !tbaa !9
  %48 = udiv i64 %47, 72
  %49 = urem i64 %48, 3
  %50 = trunc i64 %49 to i8
  store i8 %50, ptr %8, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %9) #6
  %51 = load i8, ptr %6, align 1, !tbaa !11
  %52 = load i8, ptr %7, align 1, !tbaa !11
  %53 = load i8, ptr %8, align 1, !tbaa !11
  %54 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %55 = trunc i8 %54 to i1
  %56 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %57 = trunc i8 %56 to i1
  %58 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %59 = trunc i8 %58 to i1
  %60 = call zeroext i8 @meta_cmp2pack(i8 noundef zeroext %51, i8 noundef zeroext %52, i8 noundef zeroext %53, i1 noundef zeroext %55, i1 noundef zeroext %57, i1 noundef zeroext %59)
  store i8 %60, ptr %9, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 32, ptr %10) #6
  %61 = load i64, ptr %2, align 8, !tbaa !9
  %62 = trunc i64 %61 to i8
  %63 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 0
  store i8 %62, ptr %63, align 8, !tbaa !14
  %64 = load i8, ptr %9, align 1, !tbaa !11
  call void @meta_troika_unpack(ptr noundef %10, i8 noundef zeroext %64)
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #6
  %65 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 3
  %66 = load i8, ptr %65, align 1, !tbaa !17
  %67 = zext i8 %66 to i32
  %68 = and i32 %67, 3
  %69 = trunc i32 %68 to i8
  store i8 %69, ptr %11, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %12) #6
  %70 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 3
  %71 = load i8, ptr %70, align 1, !tbaa !17
  %72 = zext i8 %71 to i32
  %73 = and i32 %72, 64
  %74 = icmp ne i32 %73, 0
  %75 = zext i1 %74 to i8
  store i8 %75, ptr %12, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #6
  %76 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 3
  %77 = load i8, ptr %76, align 1, !tbaa !17
  %78 = zext i8 %77 to i32
  %79 = and i32 %78, 128
  %80 = icmp ne i32 %79, 0
  %81 = zext i1 %80 to i8
  store i8 %81, ptr %13, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %14) #6
  %82 = load i8, ptr %6, align 1, !tbaa !11
  %83 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %84 = trunc i8 %83 to i1
  %85 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %86 = trunc i8 %85 to i1
  %87 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %82, i1 noundef zeroext %84, i1 noundef zeroext %86)
  %88 = zext i8 %87 to i32
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %90, label %101

90:                                               ; preds = %23
  %91 = load i8, ptr %7, align 1, !tbaa !11
  %92 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %93 = trunc i8 %92 to i1
  %94 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %95 = trunc i8 %94 to i1
  %96 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %91, i1 noundef zeroext %93, i1 noundef zeroext %95)
  %97 = zext i8 %96 to i32
  %98 = icmp ne i32 %97, 0
  %99 = zext i1 %98 to i64
  %100 = select i1 %98, i32 0, i32 2
  br label %112

101:                                              ; preds = %23
  %102 = load i8, ptr %8, align 1, !tbaa !11
  %103 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %104 = trunc i8 %103 to i1
  %105 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %106 = trunc i8 %105 to i1
  %107 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %102, i1 noundef zeroext %104, i1 noundef zeroext %106)
  %108 = zext i8 %107 to i32
  %109 = icmp ne i32 %108, 0
  %110 = zext i1 %109 to i64
  %111 = select i1 %109, i32 1, i32 2
  br label %112

112:                                              ; preds = %101, %90
  %113 = phi i32 [ %100, %90 ], [ %111, %101 ]
  %114 = trunc i32 %113 to i8
  store i8 %114, ptr %14, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %15) #6
  %115 = load i8, ptr %6, align 1, !tbaa !11
  %116 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %117 = trunc i8 %116 to i1
  %118 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %119 = trunc i8 %118 to i1
  %120 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %115, i1 noundef zeroext %117, i1 noundef zeroext %119)
  %121 = zext i8 %120 to i32
  %122 = icmp ne i32 %121, 0
  br i1 %122, label %123, label %134

123:                                              ; preds = %112
  %124 = load i8, ptr %7, align 1, !tbaa !11
  %125 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %126 = trunc i8 %125 to i1
  %127 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %128 = trunc i8 %127 to i1
  %129 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %124, i1 noundef zeroext %126, i1 noundef zeroext %128)
  %130 = zext i8 %129 to i32
  %131 = icmp ne i32 %130, 0
  %132 = zext i1 %131 to i64
  %133 = select i1 %131, i32 0, i32 2
  br label %145

134:                                              ; preds = %112
  %135 = load i8, ptr %8, align 1, !tbaa !11
  %136 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %137 = trunc i8 %136 to i1
  %138 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %139 = trunc i8 %138 to i1
  %140 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %135, i1 noundef zeroext %137, i1 noundef zeroext %139)
  %141 = zext i8 %140 to i32
  %142 = icmp ne i32 %141, 0
  %143 = zext i1 %142 to i64
  %144 = select i1 %142, i32 1, i32 2
  br label %145

145:                                              ; preds = %134, %123
  %146 = phi i32 [ %133, %123 ], [ %144, %134 ]
  %147 = trunc i32 %146 to i8
  store i8 %147, ptr %15, align 1, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #6
  %148 = load i8, ptr %14, align 1, !tbaa !11
  %149 = zext i8 %148 to i32
  %150 = icmp eq i32 %149, 0
  br i1 %150, label %151, label %163

151:                                              ; preds = %145
  %152 = load i8, ptr %8, align 1, !tbaa !11
  %153 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %154 = trunc i8 %153 to i1
  %155 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %156 = trunc i8 %155 to i1
  %157 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %152, i1 noundef zeroext %154, i1 noundef zeroext %156)
  %158 = zext i8 %157 to i32
  %159 = icmp ne i32 %158, 0
  %160 = zext i1 %159 to i64
  %161 = select i1 %159, i32 2, i32 1
  %162 = trunc i32 %161 to i8
  store i8 %162, ptr %16, align 1, !tbaa !11
  br label %192

163:                                              ; preds = %145
  %164 = load i8, ptr %14, align 1, !tbaa !11
  %165 = zext i8 %164 to i32
  %166 = icmp eq i32 %165, 1
  br i1 %166, label %167, label %179

167:                                              ; preds = %163
  %168 = load i8, ptr %7, align 1, !tbaa !11
  %169 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %170 = trunc i8 %169 to i1
  %171 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %172 = trunc i8 %171 to i1
  %173 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %168, i1 noundef zeroext %170, i1 noundef zeroext %172)
  %174 = zext i8 %173 to i32
  %175 = icmp ne i32 %174, 0
  %176 = zext i1 %175 to i64
  %177 = select i1 %175, i32 2, i32 0
  %178 = trunc i32 %177 to i8
  store i8 %178, ptr %16, align 1, !tbaa !11
  br label %191

179:                                              ; preds = %163
  %180 = load i8, ptr %6, align 1, !tbaa !11
  %181 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %182 = trunc i8 %181 to i1
  %183 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %184 = trunc i8 %183 to i1
  %185 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %180, i1 noundef zeroext %182, i1 noundef zeroext %184)
  %186 = zext i8 %185 to i32
  %187 = icmp ne i32 %186, 0
  %188 = zext i1 %187 to i64
  %189 = select i1 %187, i32 1, i32 0
  %190 = trunc i32 %189 to i8
  store i8 %190, ptr %16, align 1, !tbaa !11
  br label %191

191:                                              ; preds = %179, %167
  br label %192

192:                                              ; preds = %191, %151
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #6
  %193 = load i8, ptr %6, align 1, !tbaa !11
  %194 = zext i8 %193 to i32
  %195 = icmp ne i32 %194, 1
  br i1 %195, label %228, label %196

196:                                              ; preds = %192
  %197 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %198 = trunc i8 %197 to i1
  %199 = zext i1 %198 to i32
  %200 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %201 = trunc i8 %200 to i1
  %202 = zext i1 %201 to i32
  %203 = icmp ne i32 %199, %202
  br i1 %203, label %228, label %204

204:                                              ; preds = %196
  %205 = load i8, ptr %7, align 1, !tbaa !11
  %206 = zext i8 %205 to i32
  %207 = icmp ne i32 %206, 1
  br i1 %207, label %228, label %208

208:                                              ; preds = %204
  %209 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %210 = trunc i8 %209 to i1
  %211 = zext i1 %210 to i32
  %212 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %213 = trunc i8 %212 to i1
  %214 = zext i1 %213 to i32
  %215 = icmp ne i32 %211, %214
  br i1 %215, label %228, label %216

216:                                              ; preds = %208
  %217 = load i8, ptr %8, align 1, !tbaa !11
  %218 = zext i8 %217 to i32
  %219 = icmp ne i32 %218, 1
  br i1 %219, label %228, label %220

220:                                              ; preds = %216
  %221 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %222 = trunc i8 %221 to i1
  %223 = zext i1 %222 to i32
  %224 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %225 = trunc i8 %224 to i1
  %226 = zext i1 %225 to i32
  %227 = icmp ne i32 %223, %226
  br label %228

228:                                              ; preds = %220, %216, %208, %204, %196, %192
  %229 = phi i1 [ true, %216 ], [ true, %208 ], [ true, %204 ], [ true, %196 ], [ true, %192 ], [ %227, %220 ]
  %230 = zext i1 %229 to i8
  store i8 %230, ptr %17, align 1, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 1, ptr %18) #6
  %231 = load i8, ptr %6, align 1, !tbaa !11
  %232 = zext i8 %231 to i32
  %233 = icmp ne i32 %232, 1
  br i1 %233, label %242, label %234

234:                                              ; preds = %228
  %235 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %236 = trunc i8 %235 to i1
  %237 = zext i1 %236 to i32
  %238 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %239 = trunc i8 %238 to i1
  %240 = zext i1 %239 to i32
  %241 = icmp ne i32 %237, %240
  br i1 %241, label %242, label %268

242:                                              ; preds = %234, %228
  %243 = load i8, ptr %7, align 1, !tbaa !11
  %244 = zext i8 %243 to i32
  %245 = icmp ne i32 %244, 1
  br i1 %245, label %254, label %246

246:                                              ; preds = %242
  %247 = load i8, ptr %3, align 1, !tbaa !5, !range !12, !noundef !13
  %248 = trunc i8 %247 to i1
  %249 = zext i1 %248 to i32
  %250 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %251 = trunc i8 %250 to i1
  %252 = zext i1 %251 to i32
  %253 = icmp ne i32 %249, %252
  br i1 %253, label %254, label %268

254:                                              ; preds = %246, %242
  %255 = load i8, ptr %8, align 1, !tbaa !11
  %256 = zext i8 %255 to i32
  %257 = icmp ne i32 %256, 1
  br i1 %257, label %266, label %258

258:                                              ; preds = %254
  %259 = load i8, ptr %4, align 1, !tbaa !5, !range !12, !noundef !13
  %260 = trunc i8 %259 to i1
  %261 = zext i1 %260 to i32
  %262 = load i8, ptr %5, align 1, !tbaa !5, !range !12, !noundef !13
  %263 = trunc i8 %262 to i1
  %264 = zext i1 %263 to i32
  %265 = icmp ne i32 %261, %264
  br label %266

266:                                              ; preds = %258, %254
  %267 = phi i1 [ true, %254 ], [ %265, %258 ]
  br label %268

268:                                              ; preds = %266, %246, %234
  %269 = phi i1 [ false, %246 ], [ false, %234 ], [ %267, %266 ]
  %270 = zext i1 %269 to i8
  store i8 %270, ptr %18, align 1, !tbaa !5
  br label %271

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

282:                                              ; preds = %271
  br label %283

283:                                              ; preds = %282
  %284 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 1
  %285 = load i8, ptr %284, align 1, !tbaa !21
  %286 = zext i8 %285 to i32
  %287 = load i8, ptr %14, align 1, !tbaa !11
  %288 = zext i8 %287 to i32
  %289 = icmp eq i32 %286, %288
  %290 = xor i1 %289, true
  %291 = xor i1 %290, true
  %292 = xor i1 %291, true
  %293 = zext i1 %292 to i32
  %294 = sext i32 %293 to i64
  %295 = call i64 @llvm.expect.i64(i64 %294, i64 0)
  %296 = icmp ne i64 %295, 0
  br i1 %296, label %297, label %298

297:                                              ; preds = %283
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.troika_verify_fsm, i32 noundef 119) #7
  unreachable

298:                                              ; preds = %283
  br label %299

299:                                              ; preds = %298
  br label %300

300:                                              ; preds = %299
  br label %301

301:                                              ; preds = %300, %271
  br label %302

302:                                              ; preds = %301
  br label %303

303:                                              ; preds = %302
  br label %304

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

315:                                              ; preds = %304
  br label %316

316:                                              ; preds = %315
  %317 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 2
  %318 = load i8, ptr %317, align 2, !tbaa !22
  %319 = zext i8 %318 to i32
  %320 = load i8, ptr %15, align 1, !tbaa !11
  %321 = zext i8 %320 to i32
  %322 = icmp eq i32 %319, %321
  %323 = xor i1 %322, true
  %324 = xor i1 %323, true
  %325 = xor i1 %324, true
  %326 = zext i1 %325 to i32
  %327 = sext i32 %326 to i64
  %328 = call i64 @llvm.expect.i64(i64 %327, i64 0)
  %329 = icmp ne i64 %328, 0
  br i1 %329, label %330, label %331

330:                                              ; preds = %316
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.2, ptr noundef @__func__.troika_verify_fsm, i32 noundef 120) #7
  unreachable

331:                                              ; preds = %316
  br label %332

332:                                              ; preds = %331
  br label %333

333:                                              ; preds = %332
  br label %334

334:                                              ; preds = %333, %304
  br label %335

335:                                              ; preds = %334
  br label %336

336:                                              ; preds = %335
  br label %337

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

348:                                              ; preds = %337
  br label %349

349:                                              ; preds = %348
  %350 = load i8, ptr %11, align 1, !tbaa !11
  %351 = zext i8 %350 to i32
  %352 = load i8, ptr %16, align 1, !tbaa !11
  %353 = zext i8 %352 to i32
  %354 = icmp eq i32 %351, %353
  %355 = xor i1 %354, true
  %356 = xor i1 %355, true
  %357 = xor i1 %356, true
  %358 = zext i1 %357 to i32
  %359 = sext i32 %358 to i64
  %360 = call i64 @llvm.expect.i64(i64 %359, i64 0)
  %361 = icmp ne i64 %360, 0
  br i1 %361, label %362, label %363

362:                                              ; preds = %349
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.3, ptr noundef @__func__.troika_verify_fsm, i32 noundef 121) #7
  unreachable

363:                                              ; preds = %349
  br label %364

364:                                              ; preds = %363
  br label %365

365:                                              ; preds = %364
  br label %366

366:                                              ; preds = %365, %337
  br label %367

367:                                              ; preds = %366
  br label %368

368:                                              ; preds = %367
  br label %369

369:                                              ; preds = %368
  %370 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !18
  %371 = zext i8 %370 to i32
  %372 = and i32 %371, 1
  %373 = icmp ne i32 %372, 0
  %374 = xor i1 %373, true
  %375 = xor i1 %374, true
  %376 = zext i1 %375 to i32
  %377 = sext i32 %376 to i64
  %378 = call i64 @llvm.expect.i64(i64 %377, i64 1)
  %379 = icmp ne i64 %378, 0
  br i1 %379, label %380, label %400

380:                                              ; preds = %369
  br label %381

381:                                              ; preds = %380
  %382 = load i8, ptr %13, align 1, !tbaa !5, !range !12, !noundef !13
  %383 = trunc i8 %382 to i1
  %384 = zext i1 %383 to i32
  %385 = load i8, ptr %17, align 1, !tbaa !5, !range !12, !noundef !13
  %386 = trunc i8 %385 to i1
  %387 = zext i1 %386 to i32
  %388 = icmp eq i32 %384, %387
  %389 = xor i1 %388, true
  %390 = xor i1 %389, true
  %391 = xor i1 %390, true
  %392 = zext i1 %391 to i32
  %393 = sext i32 %392 to i64
  %394 = call i64 @llvm.expect.i64(i64 %393, i64 0)
  %395 = icmp ne i64 %394, 0
  br i1 %395, label %396, label %397

396:                                              ; preds = %381
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.4, ptr noundef @__func__.troika_verify_fsm, i32 noundef 122) #7
  unreachable

397:                                              ; preds = %381
  br label %398

398:                                              ; preds = %397
  br label %399

399:                                              ; preds = %398
  br label %400

400:                                              ; preds = %399, %369
  br label %401

401:                                              ; preds = %400
  br label %402

402:                                              ; preds = %401
  br label %403

403:                                              ; preds = %402
  %404 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !18
  %405 = zext i8 %404 to i32
  %406 = and i32 %405, 1
  %407 = icmp ne i32 %406, 0
  %408 = xor i1 %407, true
  %409 = xor i1 %408, true
  %410 = zext i1 %409 to i32
  %411 = sext i32 %410 to i64
  %412 = call i64 @llvm.expect.i64(i64 %411, i64 1)
  %413 = icmp ne i64 %412, 0
  br i1 %413, label %414, label %434

414:                                              ; preds = %403
  br label %415

415:                                              ; preds = %414
  %416 = load i8, ptr %12, align 1, !tbaa !5, !range !12, !noundef !13
  %417 = trunc i8 %416 to i1
  %418 = zext i1 %417 to i32
  %419 = load i8, ptr %18, align 1, !tbaa !5, !range !12, !noundef !13
  %420 = trunc i8 %419 to i1
  %421 = zext i1 %420 to i32
  %422 = icmp eq i32 %418, %421
  %423 = xor i1 %422, true
  %424 = xor i1 %423, true
  %425 = xor i1 %424, true
  %426 = zext i1 %425 to i32
  %427 = sext i32 %426 to i64
  %428 = call i64 @llvm.expect.i64(i64 %427, i64 0)
  %429 = icmp ne i64 %428, 0
  br i1 %429, label %430, label %431

430:                                              ; preds = %415
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.5, ptr noundef @__func__.troika_verify_fsm, i32 noundef 123) #7
  unreachable

431:                                              ; preds = %415
  br label %432

432:                                              ; preds = %431
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433, %403
  br label %435

435:                                              ; preds = %434
  br label %436

436:                                              ; preds = %435
  br label %437

437:                                              ; preds = %436
  %438 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !18
  %439 = zext i8 %438 to i32
  %440 = and i32 %439, 1
  %441 = icmp ne i32 %440, 0
  %442 = xor i1 %441, true
  %443 = xor i1 %442, true
  %444 = zext i1 %443 to i32
  %445 = sext i32 %444 to i64
  %446 = call i64 @llvm.expect.i64(i64 %445, i64 1)
  %447 = icmp ne i64 %446, 0
  br i1 %447, label %448, label %470

448:                                              ; preds = %437
  br label %449

449:                                              ; preds = %448
  %450 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 0
  %451 = load i8, ptr %450, align 8, !tbaa !14
  %452 = zext i8 %451 to i64
  %453 = getelementptr inbounds [216 x i8], ptr @troika_fsm_map, i64 0, i64 %452
  %454 = load i8, ptr %453, align 1, !tbaa !11
  %455 = zext i8 %454 to i32
  %456 = load i8, ptr %9, align 1, !tbaa !11
  %457 = zext i8 %456 to i32
  %458 = icmp eq i32 %455, %457
  %459 = xor i1 %458, true
  %460 = xor i1 %459, true
  %461 = xor i1 %460, true
  %462 = zext i1 %461 to i32
  %463 = sext i32 %462 to i64
  %464 = call i64 @llvm.expect.i64(i64 %463, i64 0)
  %465 = icmp ne i64 %464, 0
  br i1 %465, label %466, label %467

466:                                              ; preds = %449
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.6, ptr noundef @__func__.troika_verify_fsm, i32 noundef 124) #7
  unreachable

467:                                              ; preds = %449
  br label %468

468:                                              ; preds = %467
  br label %469

469:                                              ; preds = %468
  br label %470

470:                                              ; preds = %469, %437
  br label %471

471:                                              ; preds = %470
  br label %472

472:                                              ; preds = %471
  %473 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 1
  %474 = load i8, ptr %473, align 1, !tbaa !21
  %475 = zext i8 %474 to i32
  %476 = load i8, ptr %14, align 1, !tbaa !11
  %477 = zext i8 %476 to i32
  %478 = icmp ne i32 %475, %477
  br i1 %478, label %518, label %479

479:                                              ; preds = %472
  %480 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 2
  %481 = load i8, ptr %480, align 2, !tbaa !22
  %482 = zext i8 %481 to i32
  %483 = load i8, ptr %15, align 1, !tbaa !11
  %484 = zext i8 %483 to i32
  %485 = icmp ne i32 %482, %484
  br i1 %485, label %518, label %486

486:                                              ; preds = %479
  %487 = load i8, ptr %11, align 1, !tbaa !11
  %488 = zext i8 %487 to i32
  %489 = load i8, ptr %16, align 1, !tbaa !11
  %490 = zext i8 %489 to i32
  %491 = icmp ne i32 %488, %490
  br i1 %491, label %518, label %492

492:                                              ; preds = %486
  %493 = load i8, ptr %13, align 1, !tbaa !5, !range !12, !noundef !13
  %494 = trunc i8 %493 to i1
  %495 = zext i1 %494 to i32
  %496 = load i8, ptr %17, align 1, !tbaa !5, !range !12, !noundef !13
  %497 = trunc i8 %496 to i1
  %498 = zext i1 %497 to i32
  %499 = icmp ne i32 %495, %498
  br i1 %499, label %518, label %500

500:                                              ; preds = %492
  %501 = load i8, ptr %12, align 1, !tbaa !5, !range !12, !noundef !13
  %502 = trunc i8 %501 to i1
  %503 = zext i1 %502 to i32
  %504 = load i8, ptr %18, align 1, !tbaa !5, !range !12, !noundef !13
  %505 = trunc i8 %504 to i1
  %506 = zext i1 %505 to i32
  %507 = icmp ne i32 %503, %506
  br i1 %507, label %518, label %508

508:                                              ; preds = %500
  %509 = getelementptr inbounds %struct.troika, ptr %10, i32 0, i32 0
  %510 = load i8, ptr %509, align 8, !tbaa !14
  %511 = zext i8 %510 to i64
  %512 = getelementptr inbounds [216 x i8], ptr @troika_fsm_map, i64 0, i64 %511
  %513 = load i8, ptr %512, align 1, !tbaa !11
  %514 = zext i8 %513 to i32
  %515 = load i8, ptr %9, align 1, !tbaa !11
  %516 = zext i8 %515 to i32
  %517 = icmp ne i32 %514, %516
  br i1 %517, label %518, label %519

518:                                              ; preds = %508, %500, %492, %486, %479, %472
  store i8 0, ptr %1, align 1, !tbaa !5
  br label %519

519:                                              ; preds = %518, %508
  call void @llvm.lifetime.end.p0(i64 1, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %6) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %5) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %4) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %3) #6
  br label %520

520:                                              ; preds = %519
  %521 = load i64, ptr %2, align 8, !tbaa !9
  %522 = add i64 %521, 1
  store i64 %522, ptr %2, align 8, !tbaa !9
  br label %19, !llvm.loop !23

523:                                              ; preds = %22
  %524 = load i8, ptr %1, align 1, !tbaa !5, !range !12, !noundef !13
  %525 = trunc i8 %524 to i1
  call void @llvm.lifetime.end.p0(i64 1, ptr %1) #6
  ret i1 %525
}

; Function Attrs: nounwind uwtable
declare hidden zeroext i8 @meta_cmp2pack(i8 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_troika_unpack(ptr noundef, i8 noundef zeroext) #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i8 @meta_cmp2recent(i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i8 @meta_cmp2steady(i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #5

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

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

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


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.libmdbx_globals = type { %union.bin128, i32, i32, i8, i8, i8, i8, i32, %union.logger_union, %union.pthread_mutex_t, i64, ptr }
%union.bin128 = type { %struct.anon }
%struct.anon = type { i64, i64 }
%union.logger_union = type { ptr }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%struct.troika = type { i8, i8, i8, i8, i32, [3 x i64] }

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str.1 = external hidden unnamed_addr constant [28 x i8], align 1
@__func__.troika_verify_fsm = external hidden unnamed_addr constant [18 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [21 x i8], align 1
@troika_fsm_map = external hidden local_unnamed_addr constant [216 x i8], align 16
@.str.6 = external hidden unnamed_addr constant [37 x i8], align 1

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

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

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

; Function Attrs: cold nounwind optsize uwtable
define dso_local zeroext i1 @troika_verify_fsm() local_unnamed_addr #2 {
  %1 = alloca %struct.troika, align 8
  %2 = getelementptr inbounds i8, ptr %1, i64 3
  %3 = getelementptr inbounds i8, ptr %1, i64 1
  %4 = getelementptr inbounds i8, ptr %1, i64 2
  br label %6

5:                                                ; preds = %95
  ret i1 %.1

6:                                                ; preds = %0, %95
  %.0166 = phi i1 [ true, %0 ], [ %.1, %95 ]
  %.087165 = phi i64 [ 0, %0 ], [ %96, %95 ]
  %7 = and i64 %.087165, 1
  %8 = icmp ne i64 %7, 0
  %9 = and i64 %.087165, 2
  %10 = icmp ne i64 %9, 0
  %11 = and i64 %.087165, 4
  %12 = icmp ne i64 %11, 0
  %13 = lshr i64 %.087165, 3
  %.lhs.trunc = trunc nuw i64 %13 to i8
  %14 = urem i8 %.lhs.trunc, 3
  %.lhs.trunc152 = trunc nuw i64 %.087165 to i8
  %15 = udiv i8 %.lhs.trunc152, 24
  %16 = urem i8 %15, 3
  %17 = udiv i8 %.lhs.trunc152, 72
  %18 = call zeroext i8 @meta_cmp2pack(i8 noundef zeroext %14, i8 noundef zeroext %16, i8 noundef zeroext %17, i1 noundef zeroext %8, i1 noundef zeroext %10, i1 noundef zeroext %12)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %1) #5
  store i8 %.lhs.trunc152, ptr %1, align 8, !tbaa !5
  call void @meta_troika_unpack(ptr noundef nonnull %1, i8 noundef zeroext %18)
  %19 = load i8, ptr %2, align 1, !tbaa !10
  %20 = and i8 %19, 3
  %21 = and i8 %19, 64
  %22 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %14, i1 noundef zeroext %8, i1 noundef zeroext %10)
  %.not = icmp eq i8 %22, 0
  br i1 %.not, label %25, label %23

23:                                               ; preds = %6
  %24 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %16, i1 noundef zeroext %8, i1 noundef zeroext %12)
  br label %27

25:                                               ; preds = %6
  %26 = call zeroext i8 @meta_cmp2recent(i8 noundef zeroext %17, i1 noundef zeroext %10, i1 noundef zeroext %12)
  br label %27

27:                                               ; preds = %25, %23
  %.sink167 = phi i8 [ %26, %25 ], [ %24, %23 ]
  %.sink = phi i32 [ 1, %25 ], [ 0, %23 ]
  %.not93 = icmp eq i8 %.sink167, 0
  %28 = select i1 %.not93, i32 2, i32 %.sink
  %29 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %14, i1 noundef zeroext %8, i1 noundef zeroext %10)
  %.not95 = icmp eq i8 %29, 0
  br i1 %.not95, label %32, label %30

30:                                               ; preds = %27
  %31 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %16, i1 noundef zeroext %8, i1 noundef zeroext %12)
  br label %34

32:                                               ; preds = %27
  %33 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %17, i1 noundef zeroext %10, i1 noundef zeroext %12)
  br label %34

34:                                               ; preds = %32, %30
  %.sink169 = phi i8 [ %33, %32 ], [ %31, %30 ]
  %.sink168 = phi i8 [ 1, %32 ], [ 0, %30 ]
  %.not96 = icmp eq i8 %.sink169, 0
  %35 = select i1 %.not96, i8 2, i8 %.sink168
  switch i32 %28, label %42 [
    i32 0, label %36
    i32 1, label %39
  ]

36:                                               ; preds = %34
  %37 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %17, i1 noundef zeroext %10, i1 noundef zeroext %12)
  %.not100 = icmp eq i8 %37, 0
  %38 = select i1 %.not100, i8 1, i8 2
  br label %45

39:                                               ; preds = %34
  %40 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %16, i1 noundef zeroext %8, i1 noundef zeroext %12)
  %.not99 = icmp eq i8 %40, 0
  %41 = select i1 %.not99, i8 0, i8 2
  br label %45

42:                                               ; preds = %34
  %43 = call zeroext i8 @meta_cmp2steady(i8 noundef zeroext %14, i1 noundef zeroext %8, i1 noundef zeroext %10)
  %.not98 = icmp ne i8 %43, 0
  %44 = zext i1 %.not98 to i8
  br label %45

45:                                               ; preds = %39, %42, %36
  %.088 = phi i8 [ %38, %36 ], [ %41, %39 ], [ %44, %42 ]
  %.not101 = icmp eq i8 %14, 1
  %.lobit = lshr exact i64 %9, 1
  br i1 %.not101, label %46, label %.thread

46:                                               ; preds = %45
  %47 = icmp ne i64 %7, %.lobit
  %48 = icmp ne i8 %16, 1
  %or.cond = or i1 %47, %48
  br i1 %or.cond, label %53, label %49

49:                                               ; preds = %46
  %.lobit102 = lshr exact i64 %11, 2
  %50 = add i8 %.lhs.trunc152, 112
  %51 = icmp ult i8 %50, -72
  %52 = icmp ne i64 %7, %.lobit102
  %spec.select = or i1 %52, %51
  br label %53

53:                                               ; preds = %49, %46
  %54 = phi i1 [ true, %46 ], [ %spec.select, %49 ]
  %.not104 = icmp eq i64 %7, %.lobit
  br i1 %.not104, label %59, label %.thread

.thread:                                          ; preds = %45, %53
  %55 = phi i1 [ %54, %53 ], [ true, %45 ]
  %.not105 = icmp eq i8 %16, 1
  %.lobit106 = lshr exact i64 %11, 2
  %.not107 = icmp eq i64 %7, %.lobit106
  %or.cond134 = select i1 %.not105, i1 %.not107, i1 false
  br i1 %or.cond134, label %59, label %56

56:                                               ; preds = %.thread
  %57 = add i8 %.lhs.trunc152, 112
  %.not108 = icmp ult i8 %57, -72
  %58 = icmp ne i64 %.lobit, %.lobit106
  %spec.select158 = select i1 %.not108, i1 true, i1 %58
  br label %59

59:                                               ; preds = %56, %.thread, %53
  %60 = phi i1 [ %54, %53 ], [ %55, %.thread ], [ %55, %56 ]
  %61 = phi i1 [ false, %53 ], [ false, %.thread ], [ %spec.select158, %56 ]
  %62 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !11
  %63 = and i8 %62, 1
  %.not111 = icmp eq i8 %63, 0
  %64 = load i8, ptr %3, align 1
  %65 = zext i8 %64 to i32
  %.not112 = icmp eq i32 %28, %65
  %or.cond137 = select i1 %.not111, i1 true, i1 %.not112
  br i1 %or.cond137, label %67, label %66, !prof !16

66:                                               ; preds = %59
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 119) #6
  unreachable

67:                                               ; preds = %59
  %68 = load i8, ptr %4, align 2
  %.not114 = icmp eq i8 %68, %35
  %or.cond139 = select i1 %.not111, i1 true, i1 %.not114
  br i1 %or.cond139, label %70, label %69, !prof !16

69:                                               ; preds = %67
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 120) #6
  unreachable

70:                                               ; preds = %67
  %.not116 = icmp eq i8 %20, %.088
  %or.cond140 = select i1 %.not111, i1 true, i1 %.not116
  br i1 %or.cond140, label %72, label %71, !prof !16

71:                                               ; preds = %70
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 121) #6
  unreachable

72:                                               ; preds = %70
  %.not117 = icmp ne i8 %63, 0
  %73 = icmp slt i8 %19, 0
  %74 = xor i1 %73, %60
  %or.cond142 = select i1 %.not117, i1 %74, i1 false
  br i1 %or.cond142, label %75, label %76, !prof !17

75:                                               ; preds = %72
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.4, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 122) #6
  unreachable

76:                                               ; preds = %72
  br i1 %.not111, label %.thread151, label %77, !prof !18

77:                                               ; preds = %76
  %.lobit120 = lshr exact i8 %21, 6
  %78 = zext i1 %61 to i8
  %.not121 = icmp eq i8 %.lobit120, %78
  br i1 %.not121, label %80, label %79, !prof !19

79:                                               ; preds = %77
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.5, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 123) #6
  unreachable

80:                                               ; preds = %77
  %81 = load i8, ptr %1, align 8, !tbaa !5
  %82 = zext i8 %81 to i64
  %83 = getelementptr inbounds [216 x i8], ptr @troika_fsm_map, i64 0, i64 %82
  %84 = load i8, ptr %83, align 1, !tbaa !20
  %.not123 = icmp eq i8 %84, %18
  br i1 %.not123, label %.thread151, label %85, !prof !19

85:                                               ; preds = %80
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.6, ptr noundef nonnull @__func__.troika_verify_fsm, i32 noundef 124) #6
  unreachable

.thread151:                                       ; preds = %76, %80
  %or.cond144 = select i1 %.not112, i1 %.not114, i1 false
  %or.cond145 = select i1 %or.cond144, i1 %.not116, i1 false
  %86 = icmp sgt i8 %19, -1
  %.not128129 = xor i1 %86, %60
  %or.cond146 = select i1 %or.cond145, i1 %.not128129, i1 false
  br i1 %or.cond146, label %87, label %94

87:                                               ; preds = %.thread151
  %.lobit130 = lshr exact i8 %21, 6
  %88 = zext i1 %61 to i8
  %.not131 = icmp eq i8 %.lobit130, %88
  br i1 %.not131, label %89, label %94

89:                                               ; preds = %87
  %90 = load i8, ptr %1, align 8, !tbaa !5
  %91 = zext i8 %90 to i64
  %92 = getelementptr inbounds [216 x i8], ptr @troika_fsm_map, i64 0, i64 %91
  %93 = load i8, ptr %92, align 1, !tbaa !20
  %.not132 = icmp eq i8 %93, %18
  br i1 %.not132, label %95, label %94

94:                                               ; preds = %89, %87, %.thread151
  br label %95

95:                                               ; preds = %94, %89
  %.1 = phi i1 [ false, %94 ], [ %.0166, %89 ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %1) #5
  %96 = add nuw nsw i64 %.087165, 1
  %exitcond.not = icmp eq i64 %96, 216
  br i1 %exitcond.not, label %5, label %6, !llvm.loop !21
}

; Function Attrs: nounwind uwtable
declare hidden zeroext i8 @meta_cmp2pack(i8 noundef zeroext, i8 noundef zeroext, i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @meta_troika_unpack(ptr noundef, i8 noundef zeroext) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i8 @meta_cmp2recent(i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden zeroext i8 @meta_cmp2steady(i8 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #4

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

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

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


; Effective O3 passes: AggressiveInstCombinePass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopUnrollPass,LowerExpectIntrinsicPass,SROAPass,SimplifyCFGPass