; LLVM IR from erthink/libmdbx :: src (api-key-transform)

; 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 }

@globals = external global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [69 x i8], align 1
@__func__.mdbx_key_from_jsonInteger = external hidden unnamed_addr constant [26 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [50 x i8], align 1

; Function Attrs: nounwind willreturn memory(none) uwtable
declare dso_local i64 @mdbx_key_from_double(double noundef) #0

; Function Attrs: nounwind willreturn memory(none) uwtable
define dso_local i64 @mdbx_key_from_jsonInteger(i64 noundef %0) #0 {
  %2 = alloca i64, align 8
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = alloca i32, align 4
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i32, align 4
  %11 = alloca i64, align 8
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i64, align 8
  %15 = alloca i64, align 8
  store i64 %0, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  store i64 -9223372036854775808, ptr %4, align 8, !tbaa !5
  %16 = load i64, ptr %3, align 8, !tbaa !5
  %17 = icmp sgt i64 %16, 0
  br i1 %17, label %18, label %158

18:                                               ; preds = %1
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #5
  %19 = load i64, ptr %3, align 8, !tbaa !5
  store i64 %19, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  %20 = load i64, ptr %5, align 8, !tbaa !5
  %21 = call i32 @clz64(i64 noundef %20)
  %22 = sub nsw i32 %21, 11
  store i32 %22, ptr %6, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  %23 = load i64, ptr %5, align 8, !tbaa !5
  %24 = load i32, ptr %6, align 4, !tbaa !9
  %25 = zext i32 %24 to i64
  %26 = shl i64 %23, %25
  store i64 %26, ptr %7, align 8, !tbaa !5
  %27 = load i32, ptr %6, align 4, !tbaa !9
  %28 = icmp slt i32 %27, 0
  %29 = xor i1 %28, true
  %30 = xor i1 %29, true
  %31 = zext i1 %30 to i32
  %32 = sext i32 %31 to i64
  %33 = call i64 @llvm.expect.i64(i64 %32, i64 0)
  %34 = icmp ne i64 %33, 0
  br i1 %34, label %35, label %47

35:                                               ; preds = %18
  %36 = load i64, ptr %5, align 8, !tbaa !5
  %37 = load i32, ptr %6, align 4, !tbaa !9
  %38 = call i64 @round_mantissa(i64 noundef %36, i32 noundef %37)
  store i64 %38, ptr %7, align 8, !tbaa !5
  %39 = load i64, ptr %7, align 8, !tbaa !5
  %40 = icmp ugt i64 %39, 9007199254740991
  br i1 %40, label %41, label %46

41:                                               ; preds = %35
  %42 = load i64, ptr %5, align 8, !tbaa !5
  %43 = load i32, ptr %6, align 4, !tbaa !9
  %44 = add nsw i32 %43, -1
  store i32 %44, ptr %6, align 4, !tbaa !9
  %45 = call i64 @round_mantissa(i64 noundef %42, i32 noundef %44)
  store i64 %45, ptr %7, align 8, !tbaa !5
  br label %46

46:                                               ; preds = %41, %35
  br label %47

47:                                               ; preds = %46, %18
  br label %48

48:                                               ; preds = %47
  %49 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %50 = zext i8 %49 to i32
  %51 = and i32 %50, 1
  %52 = icmp ne i32 %51, 0
  %53 = xor i1 %52, true
  %54 = xor i1 %53, true
  %55 = zext i1 %54 to i32
  %56 = sext i32 %55 to i64
  %57 = call i64 @llvm.expect.i64(i64 %56, i64 1)
  %58 = icmp ne i64 %57, 0
  br i1 %58, label %59, label %79

59:                                               ; preds = %48
  br label %60

60:                                               ; preds = %59
  %61 = load i64, ptr %7, align 8, !tbaa !5
  %62 = icmp uge i64 %61, 4503599627370496
  br i1 %62, label %63, label %66

63:                                               ; preds = %60
  %64 = load i64, ptr %7, align 8, !tbaa !5
  %65 = icmp ule i64 %64, 9007199254740991
  br label %66

66:                                               ; preds = %63, %60
  %67 = phi i1 [ false, %60 ], [ %65, %63 ]
  %68 = xor i1 %67, true
  %69 = xor i1 %68, true
  %70 = xor i1 %69, true
  %71 = zext i1 %70 to i32
  %72 = sext i32 %71 to i64
  %73 = call i64 @llvm.expect.i64(i64 %72, i64 0)
  %74 = icmp ne i64 %73, 0
  br i1 %74, label %75, label %76

75:                                               ; preds = %66
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 123) #6
  unreachable

76:                                               ; preds = %66
  br label %77

77:                                               ; preds = %76
  br label %78

78:                                               ; preds = %77
  br label %79

79:                                               ; preds = %78, %48
  br label %80

80:                                               ; preds = %79
  br label %81

81:                                               ; preds = %80
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %82 = load i32, ptr %6, align 4, !tbaa !9
  %83 = sext i32 %82 to i64
  %84 = sub i64 1075, %83
  store i64 %84, ptr %8, align 8, !tbaa !5
  br label %85

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

96:                                               ; preds = %85
  br label %97

97:                                               ; preds = %96
  %98 = load i64, ptr %8, align 8, !tbaa !5
  %99 = icmp ugt i64 %98, 0
  br i1 %99, label %100, label %103

100:                                              ; preds = %97
  %101 = load i64, ptr %8, align 8, !tbaa !5
  %102 = icmp ule i64 %101, 2047
  br label %103

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

112:                                              ; preds = %103
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 125) #6
  unreachable

113:                                              ; preds = %103
  br label %114

114:                                              ; preds = %113
  br label %115

115:                                              ; preds = %114
  br label %116

116:                                              ; preds = %115, %85
  br label %117

117:                                              ; preds = %116
  br label %118

118:                                              ; preds = %117
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  %119 = load i64, ptr %8, align 8, !tbaa !5
  %120 = shl i64 %119, 52
  %121 = add i64 -9223372036854775808, %120
  %122 = load i64, ptr %7, align 8, !tbaa !5
  %123 = sub i64 %122, 4503599627370496
  %124 = add i64 %121, %123
  store i64 %124, ptr %9, align 8, !tbaa !5
  br label %125

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

136:                                              ; preds = %125
  br label %137

137:                                              ; preds = %136
  %138 = load i64, ptr %9, align 8, !tbaa !5
  %139 = load i64, ptr %3, align 8, !tbaa !5
  %140 = sitofp i64 %139 to double
  %141 = call i64 @mdbx_key_from_double(double noundef %140) #7
  %142 = icmp eq i64 %138, %141
  %143 = xor i1 %142, true
  %144 = xor i1 %143, true
  %145 = xor i1 %144, true
  %146 = zext i1 %145 to i32
  %147 = sext i32 %146 to i64
  %148 = call i64 @llvm.expect.i64(i64 %147, i64 0)
  %149 = icmp ne i64 %148, 0
  br i1 %149, label %150, label %151

150:                                              ; preds = %137
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.2, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 129) #6
  unreachable

151:                                              ; preds = %137
  br label %152

152:                                              ; preds = %151
  br label %153

153:                                              ; preds = %152
  br label %154

154:                                              ; preds = %153, %125
  br label %155

155:                                              ; preds = %154
  br label %156

156:                                              ; preds = %155
  %157 = load i64, ptr %9, align 8, !tbaa !5
  store i64 %157, ptr %2, align 8
  store i32 1, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #5
  br label %303

158:                                              ; preds = %1
  %159 = load i64, ptr %3, align 8, !tbaa !5
  %160 = icmp slt i64 %159, 0
  br i1 %160, label %161, label %302

161:                                              ; preds = %158
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %162 = load i64, ptr %3, align 8, !tbaa !5
  %163 = sub nsw i64 0, %162
  store i64 %163, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  %164 = load i64, ptr %11, align 8, !tbaa !5
  %165 = call i32 @clz64(i64 noundef %164)
  %166 = sub nsw i32 %165, 11
  store i32 %166, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %167 = load i64, ptr %11, align 8, !tbaa !5
  %168 = load i32, ptr %12, align 4, !tbaa !9
  %169 = zext i32 %168 to i64
  %170 = shl i64 %167, %169
  store i64 %170, ptr %13, align 8, !tbaa !5
  %171 = load i32, ptr %12, align 4, !tbaa !9
  %172 = icmp slt i32 %171, 0
  %173 = xor i1 %172, true
  %174 = xor i1 %173, true
  %175 = zext i1 %174 to i32
  %176 = sext i32 %175 to i64
  %177 = call i64 @llvm.expect.i64(i64 %176, i64 0)
  %178 = icmp ne i64 %177, 0
  br i1 %178, label %179, label %191

179:                                              ; preds = %161
  %180 = load i64, ptr %11, align 8, !tbaa !5
  %181 = load i32, ptr %12, align 4, !tbaa !9
  %182 = call i64 @round_mantissa(i64 noundef %180, i32 noundef %181)
  store i64 %182, ptr %13, align 8, !tbaa !5
  %183 = load i64, ptr %13, align 8, !tbaa !5
  %184 = icmp ugt i64 %183, 9007199254740991
  br i1 %184, label %185, label %190

185:                                              ; preds = %179
  %186 = load i64, ptr %11, align 8, !tbaa !5
  %187 = load i32, ptr %12, align 4, !tbaa !9
  %188 = add nsw i32 %187, -1
  store i32 %188, ptr %12, align 4, !tbaa !9
  %189 = call i64 @round_mantissa(i64 noundef %186, i32 noundef %188)
  store i64 %189, ptr %13, align 8, !tbaa !5
  br label %190

190:                                              ; preds = %185, %179
  br label %191

191:                                              ; preds = %190, %161
  br label %192

192:                                              ; preds = %191
  %193 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %194 = zext i8 %193 to i32
  %195 = and i32 %194, 1
  %196 = icmp ne i32 %195, 0
  %197 = xor i1 %196, true
  %198 = xor i1 %197, true
  %199 = zext i1 %198 to i32
  %200 = sext i32 %199 to i64
  %201 = call i64 @llvm.expect.i64(i64 %200, i64 1)
  %202 = icmp ne i64 %201, 0
  br i1 %202, label %203, label %223

203:                                              ; preds = %192
  br label %204

204:                                              ; preds = %203
  %205 = load i64, ptr %13, align 8, !tbaa !5
  %206 = icmp uge i64 %205, 4503599627370496
  br i1 %206, label %207, label %210

207:                                              ; preds = %204
  %208 = load i64, ptr %13, align 8, !tbaa !5
  %209 = icmp ule i64 %208, 9007199254740991
  br label %210

210:                                              ; preds = %207, %204
  %211 = phi i1 [ false, %204 ], [ %209, %207 ]
  %212 = xor i1 %211, true
  %213 = xor i1 %212, true
  %214 = xor i1 %213, true
  %215 = zext i1 %214 to i32
  %216 = sext i32 %215 to i64
  %217 = call i64 @llvm.expect.i64(i64 %216, i64 0)
  %218 = icmp ne i64 %217, 0
  br i1 %218, label %219, label %220

219:                                              ; preds = %210
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 144) #6
  unreachable

220:                                              ; preds = %210
  br label %221

221:                                              ; preds = %220
  br label %222

222:                                              ; preds = %221
  br label %223

223:                                              ; preds = %222, %192
  br label %224

224:                                              ; preds = %223
  br label %225

225:                                              ; preds = %224
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  %226 = load i32, ptr %12, align 4, !tbaa !9
  %227 = sext i32 %226 to i64
  %228 = sub i64 1075, %227
  store i64 %228, ptr %14, align 8, !tbaa !5
  br label %229

229:                                              ; preds = %225
  %230 = load i8, ptr getelementptr inbounds (%struct.libmdbx_globals, ptr @globals, i32 0, i32 4), align 1, !tbaa !11
  %231 = zext i8 %230 to i32
  %232 = and i32 %231, 1
  %233 = icmp ne i32 %232, 0
  %234 = xor i1 %233, true
  %235 = xor i1 %234, true
  %236 = zext i1 %235 to i32
  %237 = sext i32 %236 to i64
  %238 = call i64 @llvm.expect.i64(i64 %237, i64 1)
  %239 = icmp ne i64 %238, 0
  br i1 %239, label %240, label %260

240:                                              ; preds = %229
  br label %241

241:                                              ; preds = %240
  %242 = load i64, ptr %14, align 8, !tbaa !5
  %243 = icmp ugt i64 %242, 0
  br i1 %243, label %244, label %247

244:                                              ; preds = %241
  %245 = load i64, ptr %14, align 8, !tbaa !5
  %246 = icmp ule i64 %245, 2047
  br label %247

247:                                              ; preds = %244, %241
  %248 = phi i1 [ false, %241 ], [ %246, %244 ]
  %249 = xor i1 %248, true
  %250 = xor i1 %249, true
  %251 = xor i1 %250, true
  %252 = zext i1 %251 to i32
  %253 = sext i32 %252 to i64
  %254 = call i64 @llvm.expect.i64(i64 %253, i64 0)
  %255 = icmp ne i64 %254, 0
  br i1 %255, label %256, label %257

256:                                              ; preds = %247
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.1, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 146) #6
  unreachable

257:                                              ; preds = %247
  br label %258

258:                                              ; preds = %257
  br label %259

259:                                              ; preds = %258
  br label %260

260:                                              ; preds = %259, %229
  br label %261

261:                                              ; preds = %260
  br label %262

262:                                              ; preds = %261
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %263 = load i64, ptr %14, align 8, !tbaa !5
  %264 = shl i64 %263, 52
  %265 = sub i64 9223372036854775807, %264
  %266 = load i64, ptr %13, align 8, !tbaa !5
  %267 = sub i64 %266, 4503599627370496
  %268 = sub i64 %265, %267
  store i64 %268, ptr %15, align 8, !tbaa !5
  br label %269

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

280:                                              ; preds = %269
  br label %281

281:                                              ; preds = %280
  %282 = load i64, ptr %15, align 8, !tbaa !5
  %283 = load i64, ptr %3, align 8, !tbaa !5
  %284 = sitofp i64 %283 to double
  %285 = call i64 @mdbx_key_from_double(double noundef %284) #7
  %286 = icmp eq i64 %282, %285
  %287 = xor i1 %286, true
  %288 = xor i1 %287, true
  %289 = xor i1 %288, true
  %290 = zext i1 %289 to i32
  %291 = sext i32 %290 to i64
  %292 = call i64 @llvm.expect.i64(i64 %291, i64 0)
  %293 = icmp ne i64 %292, 0
  br i1 %293, label %294, label %295

294:                                              ; preds = %281
  call void @mdbx_assert_fail(ptr noundef null, ptr noundef @.str.2, ptr noundef @__func__.mdbx_key_from_jsonInteger, i32 noundef 151) #6
  unreachable

295:                                              ; preds = %281
  br label %296

296:                                              ; preds = %295
  br label %297

297:                                              ; preds = %296
  br label %298

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

299:                                              ; preds = %298
  br label %300

300:                                              ; preds = %299
  %301 = load i64, ptr %15, align 8, !tbaa !5
  store i64 %301, ptr %2, align 8
  store i32 1, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  br label %303

302:                                              ; preds = %158
  store i64 -9223372036854775808, ptr %2, align 8
  store i32 1, ptr %10, align 4
  br label %303

303:                                              ; preds = %302, %300, %156
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #5
  %304 = load i64, ptr %2, align 8
  ret i64 %304
}

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @clz64(i64 noundef) #2

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @round_mantissa(i64 noundef, i32 noundef) #2

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

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

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

!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 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !7, i64 25}
!12 = !{!"libmdbx_globals", !7, i64 0, !10, i64 16, !10, i64 20, !7, i64 24, !7, i64 25, !7, i64 26, !13, i64 27, !10, i64 28, !7, i64 32, !7, i64 40, !6, i64 80, !14, i64 88}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!"any pointer", !7, i64 0}


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

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

@globals = external local_unnamed_addr global %struct.libmdbx_globals, align 8
@.str = external hidden unnamed_addr constant [69 x i8], align 1
@__func__.mdbx_key_from_jsonInteger = external hidden unnamed_addr constant [26 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [50 x i8], align 1

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) uwtable
declare dso_local i64 @mdbx_key_from_double(double noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) uwtable
define dso_local i64 @mdbx_key_from_jsonInteger(i64 noundef %0) local_unnamed_addr #0 {
  %2 = icmp sgt i64 %0, 0
  br i1 %2, label %3, label %38

3:                                                ; preds = %1
  %4 = tail call i32 @clz64(i64 noundef %0)
  %5 = add nsw i32 %4, -11
  %6 = zext nneg i32 %5 to i64
  %7 = shl i64 %0, %6
  %8 = icmp slt i32 %4, 11
  br i1 %8, label %9, label %15, !prof !5

9:                                                ; preds = %3
  %10 = tail call i64 @round_mantissa(i64 noundef %0, i32 noundef %5)
  %11 = icmp ugt i64 %10, 9007199254740991
  br i1 %11, label %12, label %15

12:                                               ; preds = %9
  %13 = add nsw i32 %4, -12
  %14 = tail call i64 @round_mantissa(i64 noundef %0, i32 noundef %13)
  br label %15

15:                                               ; preds = %3, %12, %9
  %.046 = phi i64 [ %14, %12 ], [ %10, %9 ], [ %7, %3 ]
  %.043 = phi i32 [ %13, %12 ], [ %5, %9 ], [ %5, %3 ]
  %16 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !6
  %17 = and i8 %16, 1
  %.not61 = icmp eq i8 %17, 0
  %18 = and i64 %.046, -4503599627370496
  %.not62 = icmp eq i64 %18, 4503599627370496
  %or.cond = select i1 %.not61, i1 true, i1 %.not62
  br i1 %or.cond, label %20, label %19, !prof !14

19:                                               ; preds = %15
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 123) #3
  unreachable

20:                                               ; preds = %15
  %21 = sext i32 %.043 to i64
  %22 = sub nsw i64 1075, %21
  br i1 %.not61, label %.thread, label %27, !prof !5

.thread:                                          ; preds = %20
  %23 = shl i64 %22, 52
  %24 = xor i64 %23, -9223372036854775808
  %25 = add i64 %.046, -4503599627370496
  %26 = add i64 %25, %24
  br label %71

27:                                               ; preds = %20
  %28 = icmp eq i32 %.043, 1075
  %29 = icmp ugt i64 %22, 2047
  %.not66 = select i1 %28, i1 true, i1 %29
  br i1 %.not66, label %30, label %31, !prof !5

30:                                               ; preds = %27
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 125) #3
  unreachable

31:                                               ; preds = %27
  %32 = shl nuw nsw i64 %22, 52
  %33 = add i64 %.046, 9218868437227405312
  %34 = add i64 %33, %32
  %35 = uitofp nneg i64 %0 to double
  %36 = tail call i64 @mdbx_key_from_double(double noundef %35) #4
  %.not68 = icmp eq i64 %34, %36
  br i1 %.not68, label %71, label %37, !prof !15

37:                                               ; preds = %31
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 129) #3
  unreachable

38:                                               ; preds = %1
  %39 = icmp slt i64 %0, 0
  br i1 %39, label %40, label %71

40:                                               ; preds = %38
  %41 = sub nsw i64 0, %0
  %42 = tail call i32 @clz64(i64 noundef %41)
  %43 = add nsw i32 %42, -11
  %44 = zext nneg i32 %43 to i64
  %45 = shl i64 %41, %44
  %46 = icmp slt i32 %42, 11
  br i1 %46, label %47, label %53, !prof !5

47:                                               ; preds = %40
  %48 = tail call i64 @round_mantissa(i64 noundef %41, i32 noundef %43)
  %49 = icmp ugt i64 %48, 9007199254740991
  br i1 %49, label %50, label %53

50:                                               ; preds = %47
  %51 = add nsw i32 %42, -12
  %52 = tail call i64 @round_mantissa(i64 noundef %41, i32 noundef %51)
  br label %53

53:                                               ; preds = %40, %50, %47
  %.045 = phi i32 [ %51, %50 ], [ %43, %47 ], [ %43, %40 ]
  %.044 = phi i64 [ %52, %50 ], [ %48, %47 ], [ %45, %40 ]
  %54 = load i8, ptr getelementptr inbounds (i8, ptr @globals, i64 25), align 1, !tbaa !6
  %55 = and i8 %54, 1
  %.not = icmp eq i8 %55, 0
  %56 = and i64 %.044, -4503599627370496
  %.not54 = icmp eq i64 %56, 4503599627370496
  %or.cond69 = select i1 %.not, i1 true, i1 %.not54
  br i1 %or.cond69, label %58, label %57, !prof !14

57:                                               ; preds = %53
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 144) #3
  unreachable

58:                                               ; preds = %53
  %59 = sext i32 %.045 to i64
  %60 = sub nsw i64 1075, %59
  br i1 %.not, label %.thread70, label %62, !prof !5

.thread70:                                        ; preds = %58
  %.neg73 = mul i64 %60, -4503599627370496
  %reass.sub75 = sub i64 %.neg73, %.044
  %61 = add i64 %reass.sub75, -9218868437227405313
  br label %71

62:                                               ; preds = %58
  %63 = icmp eq i32 %.045, 1075
  %64 = icmp ugt i64 %60, 2047
  %.not58 = select i1 %63, i1 true, i1 %64
  br i1 %.not58, label %65, label %66, !prof !5

65:                                               ; preds = %62
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.1, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 146) #3
  unreachable

66:                                               ; preds = %62
  %.neg71 = mul nsw i64 %60, -4503599627370496
  %reass.sub = sub i64 %.neg71, %.044
  %67 = add i64 %reass.sub, -9218868437227405313
  %68 = sitofp i64 %0 to double
  %69 = tail call i64 @mdbx_key_from_double(double noundef %68) #4
  %.not60 = icmp eq i64 %67, %69
  br i1 %.not60, label %71, label %70, !prof !15

70:                                               ; preds = %66
  tail call void @mdbx_assert_fail(ptr noundef null, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.mdbx_key_from_jsonInteger, i32 noundef 151) #3
  unreachable

71:                                               ; preds = %.thread70, %.thread, %38, %66, %31
  %.0 = phi i64 [ %34, %31 ], [ %67, %66 ], [ -9223372036854775808, %38 ], [ %26, %.thread ], [ %61, %.thread70 ]
  ret i64 %.0
}

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @clz64(i64 noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @round_mantissa(i64 noundef, i32 noundef) local_unnamed_addr #1

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

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

!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 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!6 = !{!7, !8, i64 25}
!7 = !{!"libmdbx_globals", !8, i64 0, !10, i64 16, !10, i64 20, !8, i64 24, !8, i64 25, !8, i64 26, !11, i64 27, !10, i64 28, !8, i64 32, !8, i64 40, !12, i64 80, !13, i64 88}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"_Bool", !8, i64 0}
!12 = !{!"long", !8, i64 0}
!13 = !{!"any pointer", !8, i64 0}
!14 = !{!"branch_weights", i32 4002001, i32 2000}
!15 = !{!"branch_weights", !"expected", i32 2000, i32 1}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LowerExpectIntrinsicPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass