; LLVM IR from Softmotions/iowow :: src/json/iwjson.ll (jbl_visit)

; 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.binn_struct = type { i32, i32, i32, i32, ptr, i32, i32, i32, i32, ptr, i32, i32, ptr, ptr, ptr, %union.anon }
%union.anon = type { i64 }
%struct.binn_iter_struct = type { ptr, ptr, i32, i32, i32 }
%struct.jbl_vctx = type { ptr, ptr, ptr, ptr, i32, i8, i8 }

; 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(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i64 @_jbl_visit(ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3) #3 {
  %5 = alloca i64, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i64, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca %struct.binn_struct, align 8
  %15 = alloca i32, align 4
  %16 = alloca %struct.binn_iter_struct, align 8
  %17 = alloca [256 x i8], align 16
  %18 = alloca %struct.binn_iter_struct, align 8
  %19 = alloca %struct.binn_iter_struct, align 8
  %20 = alloca %struct.binn_iter_struct, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store i32 %1, ptr %7, align 4, !tbaa !9
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  store i64 0, ptr %10, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %21 = load ptr, ptr %8, align 8, !tbaa !5
  %22 = getelementptr inbounds %struct.jbl_vctx, ptr %21, i32 0, i32 0
  %23 = load ptr, ptr %22, align 8, !tbaa !13
  store ptr %23, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 88, ptr %14) #4
  %24 = load i32, ptr %7, align 4, !tbaa !9
  %25 = icmp sgt i32 %24, 999
  br i1 %25, label %26, label %27

26:                                               ; preds = %4
  store i64 76019, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %292

27:                                               ; preds = %4
  %28 = load ptr, ptr %6, align 8, !tbaa !5
  %29 = icmp ne ptr %28, null
  br i1 %29, label %55, label %30

30:                                               ; preds = %27
  call void @llvm.lifetime.start.p0(i64 32, ptr %16) #4
  %31 = load ptr, ptr %11, align 8, !tbaa !5
  %32 = getelementptr inbounds %struct.binn_struct, ptr %31, i32 0, i32 8
  %33 = load i32, ptr %32, align 4, !tbaa !16
  %34 = icmp sge i32 %33, 224
  br i1 %34, label %35, label %40

35:                                               ; preds = %30
  %36 = load ptr, ptr %11, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.binn_struct, ptr %36, i32 0, i32 8
  %38 = load i32, ptr %37, align 4, !tbaa !16
  %39 = icmp sle i32 %38, 226
  br i1 %39, label %41, label %40

40:                                               ; preds = %35, %30
  store i64 76003, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %54

41:                                               ; preds = %35
  %42 = load ptr, ptr %11, align 8, !tbaa !5
  %43 = load ptr, ptr %11, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.binn_struct, ptr %43, i32 0, i32 8
  %45 = load i32, ptr %44, align 4, !tbaa !16
  %46 = call i32 @binn_iter_init(ptr noundef %16, ptr noundef %42, i32 noundef %45)
  %47 = icmp ne i32 %46, 0
  br i1 %47, label %49, label %48

48:                                               ; preds = %41
  store i64 76003, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %54

49:                                               ; preds = %41
  %50 = load ptr, ptr %8, align 8, !tbaa !5
  %51 = load ptr, ptr %9, align 8, !tbaa !5
  %52 = call i64 @_jbl_visit(ptr noundef %16, i32 noundef 0, ptr noundef %50, ptr noundef %51)
  store i64 %52, ptr %10, align 8, !tbaa !11
  %53 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %53, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %54

54:                                               ; preds = %49, %48, %40
  call void @llvm.lifetime.end.p0(i64 32, ptr %16) #4
  br label %292

55:                                               ; preds = %27
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.binn_iter_struct, ptr %56, i32 0, i32 2
  %58 = load i32, ptr %57, align 8, !tbaa !18
  switch i32 %58, label %290 [
    i32 226, label %59
    i32 225, label %137
    i32 224, label %212
  ]

59:                                               ; preds = %55
  call void @llvm.lifetime.start.p0(i64 256, ptr %17) #4
  br label %60

60:                                               ; preds = %133, %59
  %61 = load ptr, ptr %8, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.jbl_vctx, ptr %61, i32 0, i32 5
  %63 = load i8, ptr %62, align 4, !tbaa !20, !range !21, !noundef !22
  %64 = trunc i8 %63 to i1
  br i1 %64, label %70, label %65

65:                                               ; preds = %60
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = getelementptr inbounds [256 x i8], ptr %17, i64 0, i64 0
  %68 = call i32 @binn_object_next(ptr noundef %66, ptr noundef %67, ptr noundef %14)
  %69 = icmp ne i32 %68, 0
  br label %70

70:                                               ; preds = %65, %60
  %71 = phi i1 [ false, %60 ], [ %69, %65 ]
  br i1 %71, label %72, label %134

72:                                               ; preds = %70
  %73 = load ptr, ptr %9, align 8, !tbaa !5
  %74 = load i32, ptr %7, align 4, !tbaa !9
  %75 = getelementptr inbounds [256 x i8], ptr %17, i64 0, i64 0
  %76 = load ptr, ptr %8, align 8, !tbaa !5
  %77 = call i32 %73(i32 noundef %74, ptr noundef %14, ptr noundef %75, i32 noundef -1, ptr noundef %76, ptr noundef %10)
  store i32 %77, ptr %12, align 4, !tbaa !9
  %78 = load i64, ptr %10, align 8, !tbaa !11
  %79 = icmp ne i64 %78, 0
  %80 = xor i1 %79, true
  %81 = xor i1 %80, true
  %82 = zext i1 %81 to i32
  %83 = sext i32 %82 to i64
  %84 = call i64 @llvm.expect.i64(i64 %83, i64 0)
  %85 = icmp ne i64 %84, 0
  br i1 %85, label %86, label %88

86:                                               ; preds = %72
  %87 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %87, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %135

88:                                               ; preds = %72
  %89 = load i32, ptr %12, align 4, !tbaa !9
  %90 = and i32 %89, 1
  %91 = icmp ne i32 %90, 0
  br i1 %91, label %92, label %95

92:                                               ; preds = %88
  %93 = load ptr, ptr %8, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.jbl_vctx, ptr %93, i32 0, i32 5
  store i8 1, ptr %94, align 4, !tbaa !20
  br label %134

95:                                               ; preds = %88
  %96 = load i32, ptr %12, align 4, !tbaa !9
  %97 = and i32 %96, 2
  %98 = icmp ne i32 %97, 0
  br i1 %98, label %133, label %99

99:                                               ; preds = %95
  %100 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %101 = load i32, ptr %100, align 4, !tbaa !16
  %102 = icmp sge i32 %101, 224
  br i1 %102, label %103, label %133

103:                                              ; preds = %99
  %104 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %105 = load i32, ptr %104, align 4, !tbaa !16
  %106 = icmp sle i32 %105, 226
  br i1 %106, label %107, label %133

107:                                              ; preds = %103
  call void @llvm.lifetime.start.p0(i64 32, ptr %18) #4
  %108 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %109 = load i32, ptr %108, align 4, !tbaa !16
  %110 = call i32 @binn_iter_init(ptr noundef %18, ptr noundef %14, i32 noundef %109)
  %111 = icmp ne i32 %110, 0
  br i1 %111, label %113, label %112

112:                                              ; preds = %107
  store i64 76003, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %130

113:                                              ; preds = %107
  %114 = load i32, ptr %7, align 4, !tbaa !9
  %115 = add nsw i32 %114, 1
  %116 = load ptr, ptr %8, align 8, !tbaa !5
  %117 = load ptr, ptr %9, align 8, !tbaa !5
  %118 = call i64 @_jbl_visit(ptr noundef %18, i32 noundef %115, ptr noundef %116, ptr noundef %117)
  store i64 %118, ptr %10, align 8, !tbaa !11
  %119 = load i64, ptr %10, align 8, !tbaa !11
  %120 = icmp ne i64 %119, 0
  %121 = xor i1 %120, true
  %122 = xor i1 %121, true
  %123 = zext i1 %122 to i32
  %124 = sext i32 %123 to i64
  %125 = call i64 @llvm.expect.i64(i64 %124, i64 0)
  %126 = icmp ne i64 %125, 0
  br i1 %126, label %127, label %129

127:                                              ; preds = %113
  %128 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %128, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %130

129:                                              ; preds = %113
  store i32 0, ptr %15, align 4
  br label %130

130:                                              ; preds = %129, %127, %112
  call void @llvm.lifetime.end.p0(i64 32, ptr %18) #4
  %131 = load i32, ptr %15, align 4
  switch i32 %131, label %135 [
    i32 0, label %132
  ]

132:                                              ; preds = %130
  br label %133

133:                                              ; preds = %132, %103, %99, %95
  br label %60, !llvm.loop !23

134:                                              ; preds = %92, %70
  store i32 2, ptr %15, align 4
  br label %135

135:                                              ; preds = %134, %130, %86
  call void @llvm.lifetime.end.p0(i64 256, ptr %17) #4
  %136 = load i32, ptr %15, align 4
  switch i32 %136, label %292 [
    i32 2, label %290
  ]

137:                                              ; preds = %55
  br label %138

138:                                              ; preds = %210, %137
  %139 = load ptr, ptr %8, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.jbl_vctx, ptr %139, i32 0, i32 5
  %141 = load i8, ptr %140, align 4, !tbaa !20, !range !21, !noundef !22
  %142 = trunc i8 %141 to i1
  br i1 %142, label %147, label %143

143:                                              ; preds = %138
  %144 = load ptr, ptr %6, align 8, !tbaa !5
  %145 = call i32 @binn_map_next(ptr noundef %144, ptr noundef %13, ptr noundef %14)
  %146 = icmp ne i32 %145, 0
  br label %147

147:                                              ; preds = %143, %138
  %148 = phi i1 [ false, %138 ], [ %146, %143 ]
  br i1 %148, label %149, label %211

149:                                              ; preds = %147
  %150 = load ptr, ptr %9, align 8, !tbaa !5
  %151 = load i32, ptr %7, align 4, !tbaa !9
  %152 = load i32, ptr %13, align 4, !tbaa !9
  %153 = load ptr, ptr %8, align 8, !tbaa !5
  %154 = call i32 %150(i32 noundef %151, ptr noundef %14, ptr noundef null, i32 noundef %152, ptr noundef %153, ptr noundef %10)
  store i32 %154, ptr %12, align 4, !tbaa !9
  %155 = load i64, ptr %10, align 8, !tbaa !11
  %156 = icmp ne i64 %155, 0
  %157 = xor i1 %156, true
  %158 = xor i1 %157, true
  %159 = zext i1 %158 to i32
  %160 = sext i32 %159 to i64
  %161 = call i64 @llvm.expect.i64(i64 %160, i64 0)
  %162 = icmp ne i64 %161, 0
  br i1 %162, label %163, label %165

163:                                              ; preds = %149
  %164 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %164, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %292

165:                                              ; preds = %149
  %166 = load i32, ptr %12, align 4, !tbaa !9
  %167 = and i32 %166, 1
  %168 = icmp ne i32 %167, 0
  br i1 %168, label %169, label %172

169:                                              ; preds = %165
  %170 = load ptr, ptr %8, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.jbl_vctx, ptr %170, i32 0, i32 5
  store i8 1, ptr %171, align 4, !tbaa !20
  br label %211

172:                                              ; preds = %165
  %173 = load i32, ptr %12, align 4, !tbaa !9
  %174 = and i32 %173, 2
  %175 = icmp ne i32 %174, 0
  br i1 %175, label %210, label %176

176:                                              ; preds = %172
  %177 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %178 = load i32, ptr %177, align 4, !tbaa !16
  %179 = icmp sge i32 %178, 224
  br i1 %179, label %180, label %210

180:                                              ; preds = %176
  %181 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %182 = load i32, ptr %181, align 4, !tbaa !16
  %183 = icmp sle i32 %182, 226
  br i1 %183, label %184, label %210

184:                                              ; preds = %180
  call void @llvm.lifetime.start.p0(i64 32, ptr %19) #4
  %185 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %186 = load i32, ptr %185, align 4, !tbaa !16
  %187 = call i32 @binn_iter_init(ptr noundef %19, ptr noundef %14, i32 noundef %186)
  %188 = icmp ne i32 %187, 0
  br i1 %188, label %190, label %189

189:                                              ; preds = %184
  store i64 76003, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %207

190:                                              ; preds = %184
  %191 = load i32, ptr %7, align 4, !tbaa !9
  %192 = add nsw i32 %191, 1
  %193 = load ptr, ptr %8, align 8, !tbaa !5
  %194 = load ptr, ptr %9, align 8, !tbaa !5
  %195 = call i64 @_jbl_visit(ptr noundef %19, i32 noundef %192, ptr noundef %193, ptr noundef %194)
  store i64 %195, ptr %10, align 8, !tbaa !11
  %196 = load i64, ptr %10, align 8, !tbaa !11
  %197 = icmp ne i64 %196, 0
  %198 = xor i1 %197, true
  %199 = xor i1 %198, true
  %200 = zext i1 %199 to i32
  %201 = sext i32 %200 to i64
  %202 = call i64 @llvm.expect.i64(i64 %201, i64 0)
  %203 = icmp ne i64 %202, 0
  br i1 %203, label %204, label %206

204:                                              ; preds = %190
  %205 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %205, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %207

206:                                              ; preds = %190
  store i32 0, ptr %15, align 4
  br label %207

207:                                              ; preds = %206, %204, %189
  call void @llvm.lifetime.end.p0(i64 32, ptr %19) #4
  %208 = load i32, ptr %15, align 4
  switch i32 %208, label %292 [
    i32 0, label %209
  ]

209:                                              ; preds = %207
  br label %210

210:                                              ; preds = %209, %180, %176, %172
  br label %138, !llvm.loop !25

211:                                              ; preds = %169, %147
  br label %290

212:                                              ; preds = %55
  store i32 0, ptr %13, align 4, !tbaa !9
  br label %213

213:                                              ; preds = %286, %212
  %214 = load ptr, ptr %8, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.jbl_vctx, ptr %214, i32 0, i32 5
  %216 = load i8, ptr %215, align 4, !tbaa !20, !range !21, !noundef !22
  %217 = trunc i8 %216 to i1
  br i1 %217, label %222, label %218

218:                                              ; preds = %213
  %219 = load ptr, ptr %6, align 8, !tbaa !5
  %220 = call i32 @binn_list_next(ptr noundef %219, ptr noundef %14)
  %221 = icmp ne i32 %220, 0
  br label %222

222:                                              ; preds = %218, %213
  %223 = phi i1 [ false, %213 ], [ %221, %218 ]
  br i1 %223, label %224, label %289

224:                                              ; preds = %222
  %225 = load ptr, ptr %9, align 8, !tbaa !5
  %226 = load i32, ptr %7, align 4, !tbaa !9
  %227 = load i32, ptr %13, align 4, !tbaa !9
  %228 = load ptr, ptr %8, align 8, !tbaa !5
  %229 = call i32 %225(i32 noundef %226, ptr noundef %14, ptr noundef null, i32 noundef %227, ptr noundef %228, ptr noundef %10)
  store i32 %229, ptr %12, align 4, !tbaa !9
  %230 = load i64, ptr %10, align 8, !tbaa !11
  %231 = icmp ne i64 %230, 0
  %232 = xor i1 %231, true
  %233 = xor i1 %232, true
  %234 = zext i1 %233 to i32
  %235 = sext i32 %234 to i64
  %236 = call i64 @llvm.expect.i64(i64 %235, i64 0)
  %237 = icmp ne i64 %236, 0
  br i1 %237, label %238, label %240

238:                                              ; preds = %224
  %239 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %239, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %292

240:                                              ; preds = %224
  %241 = load i32, ptr %12, align 4, !tbaa !9
  %242 = and i32 %241, 1
  %243 = icmp ne i32 %242, 0
  br i1 %243, label %244, label %247

244:                                              ; preds = %240
  %245 = load ptr, ptr %8, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.jbl_vctx, ptr %245, i32 0, i32 5
  store i8 1, ptr %246, align 4, !tbaa !20
  br label %289

247:                                              ; preds = %240
  %248 = load i32, ptr %12, align 4, !tbaa !9
  %249 = and i32 %248, 2
  %250 = icmp ne i32 %249, 0
  br i1 %250, label %285, label %251

251:                                              ; preds = %247
  %252 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %253 = load i32, ptr %252, align 4, !tbaa !16
  %254 = icmp sge i32 %253, 224
  br i1 %254, label %255, label %285

255:                                              ; preds = %251
  %256 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %257 = load i32, ptr %256, align 4, !tbaa !16
  %258 = icmp sle i32 %257, 226
  br i1 %258, label %259, label %285

259:                                              ; preds = %255
  call void @llvm.lifetime.start.p0(i64 32, ptr %20) #4
  %260 = getelementptr inbounds %struct.binn_struct, ptr %14, i32 0, i32 8
  %261 = load i32, ptr %260, align 4, !tbaa !16
  %262 = call i32 @binn_iter_init(ptr noundef %20, ptr noundef %14, i32 noundef %261)
  %263 = icmp ne i32 %262, 0
  br i1 %263, label %265, label %264

264:                                              ; preds = %259
  store i64 76003, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %282

265:                                              ; preds = %259
  %266 = load i32, ptr %7, align 4, !tbaa !9
  %267 = add nsw i32 %266, 1
  %268 = load ptr, ptr %8, align 8, !tbaa !5
  %269 = load ptr, ptr %9, align 8, !tbaa !5
  %270 = call i64 @_jbl_visit(ptr noundef %20, i32 noundef %267, ptr noundef %268, ptr noundef %269)
  store i64 %270, ptr %10, align 8, !tbaa !11
  %271 = load i64, ptr %10, align 8, !tbaa !11
  %272 = icmp ne i64 %271, 0
  %273 = xor i1 %272, true
  %274 = xor i1 %273, true
  %275 = zext i1 %274 to i32
  %276 = sext i32 %275 to i64
  %277 = call i64 @llvm.expect.i64(i64 %276, i64 0)
  %278 = icmp ne i64 %277, 0
  br i1 %278, label %279, label %281

279:                                              ; preds = %265
  %280 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %280, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %282

281:                                              ; preds = %265
  store i32 0, ptr %15, align 4
  br label %282

282:                                              ; preds = %281, %279, %264
  call void @llvm.lifetime.end.p0(i64 32, ptr %20) #4
  %283 = load i32, ptr %15, align 4
  switch i32 %283, label %292 [
    i32 0, label %284
  ]

284:                                              ; preds = %282
  br label %285

285:                                              ; preds = %284, %255, %251, %247
  br label %286

286:                                              ; preds = %285
  %287 = load i32, ptr %13, align 4, !tbaa !9
  %288 = add nsw i32 %287, 1
  store i32 %288, ptr %13, align 4, !tbaa !9
  br label %213, !llvm.loop !26

289:                                              ; preds = %244, %222
  br label %290

290:                                              ; preds = %289, %211, %135, %55
  %291 = load i64, ptr %10, align 8, !tbaa !11
  store i64 %291, ptr %5, align 8
  store i32 1, ptr %15, align 4
  br label %292

292:                                              ; preds = %290, %282, %238, %207, %163, %135, %54, %26
  call void @llvm.lifetime.end.p0(i64 88, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  %293 = load i64, ptr %5, align 8
  ret i64 %293
}

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

declare i32 @binn_map_next(ptr noundef, ptr noundef, 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 = { 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 = { 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, !6, i64 0}
!6 = !{!"any pointer", !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, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"jbl_vctx", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !10, i64 32, !15, i64 36, !15, i64 37}
!15 = !{!"_Bool", !7, i64 0}
!16 = !{!17, !10, i64 36}
!17 = !{!"binn_struct", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !6, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !6, i64 40, !10, i64 48, !10, i64 52, !6, i64 56, !6, i64 64, !6, i64 72, !7, i64 80}
!18 = !{!19, !10, i64 16}
!19 = !{!"binn_iter_struct", !6, i64 0, !6, i64 8, !10, i64 16, !10, i64 20, !10, i64 24}
!20 = !{!14, !15, i64 36}
!21 = !{i8 0, i8 2}
!22 = !{}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = distinct !{!25, !24}
!26 = distinct !{!26, !24}


; 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.binn_struct = type { i32, i32, i32, i32, ptr, i32, i32, i32, i32, ptr, i32, i32, ptr, ptr, ptr, %union.anon }
%union.anon = type { i64 }
%struct.binn_iter_struct = type { ptr, ptr, i32, i32, i32 }

; 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 @binn_iter_init(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local i64 @_jbl_visit(ptr noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3) local_unnamed_addr #2 {
  %5 = alloca i64, align 8
  %6 = alloca i32, align 4
  %7 = alloca %struct.binn_struct, align 8
  %8 = alloca %struct.binn_iter_struct, align 8
  %9 = alloca [256 x i8], align 16
  %10 = alloca %struct.binn_iter_struct, align 8
  %11 = alloca %struct.binn_iter_struct, align 8
  %12 = alloca %struct.binn_iter_struct, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  store i64 0, ptr %5, align 8, !tbaa !5
  %13 = load ptr, ptr %2, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #3
  call void @llvm.lifetime.start.p0(i64 88, ptr nonnull %7) #3
  %14 = icmp sgt i32 %1, 999
  br i1 %14, label %.loopexit, label %15

15:                                               ; preds = %4
  %.not = icmp eq ptr %0, null
  br i1 %.not, label %16, label %25

16:                                               ; preds = %15
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %8) #3
  %17 = getelementptr inbounds i8, ptr %13, i64 36
  %18 = load i32, ptr %17, align 4, !tbaa !14
  %19 = add i32 %18, -224
  %or.cond = icmp ult i32 %19, 3
  br i1 %or.cond, label %20, label %24

20:                                               ; preds = %16
  %21 = call i32 @binn_iter_init(ptr noundef nonnull %8, ptr noundef nonnull %13, i32 noundef %18) #3
  %.not84 = icmp eq i32 %21, 0
  br i1 %.not84, label %24, label %22

22:                                               ; preds = %20
  %23 = call i64 @_jbl_visit(ptr noundef nonnull %8, i32 noundef 0, ptr noundef nonnull %2, ptr noundef %3)
  br label %24

24:                                               ; preds = %20, %16, %22
  %.071 = phi i64 [ %23, %22 ], [ 76003, %16 ], [ 76003, %20 ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %8) #3
  br label %.loopexit

25:                                               ; preds = %15
  %26 = getelementptr inbounds i8, ptr %0, i64 16
  %27 = load i32, ptr %26, align 8, !tbaa !16
  switch i32 %27, label %.critedge10 [
    i32 226, label %38
    i32 225, label %.preheader
    i32 224, label %.preheader112
  ]

.preheader112:                                    ; preds = %25
  %28 = getelementptr inbounds i8, ptr %2, i64 36
  %29 = load i8, ptr %28, align 4, !tbaa !18, !range !19, !noundef !20
  %30 = trunc nuw i8 %29 to i1
  br i1 %30, label %.critedge10, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader112
  %31 = getelementptr inbounds i8, ptr %7, i64 36
  %32 = add nsw i32 %1, 1
  br label %87

.preheader:                                       ; preds = %25
  %33 = getelementptr inbounds i8, ptr %2, i64 36
  %34 = load i8, ptr %33, align 4, !tbaa !18, !range !19, !noundef !20
  %35 = trunc nuw i8 %34 to i1
  br i1 %35, label %.critedge10, label %.lr.ph126

.lr.ph126:                                        ; preds = %.preheader
  %36 = getelementptr inbounds i8, ptr %7, i64 36
  %37 = add nsw i32 %1, 1
  br label %65

38:                                               ; preds = %25
  call void @llvm.lifetime.start.p0(i64 256, ptr nonnull %9) #3
  %39 = getelementptr inbounds i8, ptr %2, i64 36
  %40 = load i8, ptr %39, align 4, !tbaa !18, !range !19, !noundef !20
  %41 = trunc nuw i8 %40 to i1
  br i1 %41, label %.critedge.thread, label %.lr.ph128

.lr.ph128:                                        ; preds = %38
  %42 = getelementptr inbounds i8, ptr %7, i64 36
  %43 = add nsw i32 %1, 1
  br label %44

44:                                               ; preds = %.lr.ph128, %62
  %45 = call i32 @binn_object_next(ptr noundef nonnull %0, ptr noundef nonnull %9, ptr noundef nonnull %7) #3
  %.not95 = icmp eq i32 %45, 0
  br i1 %.not95, label %.critedge.thread, label %46

46:                                               ; preds = %44
  %47 = call i32 %3(i32 noundef %1, ptr noundef nonnull %7, ptr noundef nonnull %9, i32 noundef -1, ptr noundef nonnull %2, ptr noundef nonnull %5) #3
  %48 = load i64, ptr %5, align 8, !tbaa !5
  %.not96 = icmp eq i64 %48, 0
  br i1 %.not96, label %49, label %.critedge, !prof !21

49:                                               ; preds = %46
  %50 = and i32 %47, 1
  %.not97 = icmp eq i32 %50, 0
  br i1 %.not97, label %52, label %51

51:                                               ; preds = %49
  store i8 1, ptr %39, align 4, !tbaa !18
  br label %.critedge.thread

52:                                               ; preds = %49
  %53 = and i32 %47, 2
  %54 = icmp eq i32 %53, 0
  %55 = load i32, ptr %42, align 4
  %56 = add i32 %55, -224
  %57 = icmp ult i32 %56, 3
  %or.cond8 = select i1 %54, i1 %57, i1 false
  br i1 %or.cond8, label %58, label %62

58:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %10) #3
  %59 = call i32 @binn_iter_init(ptr noundef nonnull %10, ptr noundef nonnull %7, i32 noundef %55) #3
  %.not98 = icmp eq i32 %59, 0
  br i1 %.not98, label %.thread, label %60

.thread:                                          ; preds = %58
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %10) #3
  br label %.critedge

60:                                               ; preds = %58
  %61 = call i64 @_jbl_visit(ptr noundef nonnull %10, i32 noundef %43, ptr noundef nonnull %2, ptr noundef %3)
  store i64 %61, ptr %5, align 8, !tbaa !5
  %.not99 = icmp eq i64 %61, 0
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %10) #3
  br i1 %.not99, label %62, label %.critedge

62:                                               ; preds = %60, %52
  %63 = load i8, ptr %39, align 4, !tbaa !18, !range !19, !noundef !20
  %64 = trunc nuw i8 %63 to i1
  br i1 %64, label %.critedge.thread, label %44, !llvm.loop !22

.critedge.thread:                                 ; preds = %44, %62, %38, %51
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %9) #3
  br label %.critedge10

.critedge:                                        ; preds = %46, %60, %.thread
  %.4 = phi i64 [ 76003, %.thread ], [ %48, %46 ], [ %61, %60 ]
  call void @llvm.lifetime.end.p0(i64 256, ptr nonnull %9) #3
  br label %.loopexit

65:                                               ; preds = %.lr.ph126, %84
  %66 = call i32 @binn_map_next(ptr noundef nonnull %0, ptr noundef nonnull %6, ptr noundef nonnull %7) #3
  %.not90 = icmp eq i32 %66, 0
  br i1 %.not90, label %.critedge10, label %67

67:                                               ; preds = %65
  %68 = load i32, ptr %6, align 4, !tbaa !24
  %69 = call i32 %3(i32 noundef %1, ptr noundef nonnull %7, ptr noundef null, i32 noundef %68, ptr noundef nonnull %2, ptr noundef nonnull %5) #3
  %70 = load i64, ptr %5, align 8, !tbaa !5
  %.not91 = icmp eq i64 %70, 0
  br i1 %.not91, label %71, label %.loopexit, !prof !21

71:                                               ; preds = %67
  %72 = and i32 %69, 1
  %.not92 = icmp eq i32 %72, 0
  br i1 %.not92, label %74, label %73

73:                                               ; preds = %71
  store i8 1, ptr %33, align 4, !tbaa !18
  br label %.critedge10

74:                                               ; preds = %71
  %75 = and i32 %69, 2
  %76 = icmp eq i32 %75, 0
  %77 = load i32, ptr %36, align 4
  %78 = add i32 %77, -224
  %79 = icmp ult i32 %78, 3
  %or.cond16 = select i1 %76, i1 %79, i1 false
  br i1 %or.cond16, label %80, label %84

80:                                               ; preds = %74
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %11) #3
  %81 = call i32 @binn_iter_init(ptr noundef nonnull %11, ptr noundef nonnull %7, i32 noundef %77) #3
  %.not93 = icmp eq i32 %81, 0
  br i1 %.not93, label %.thread106, label %82

.thread106:                                       ; preds = %80
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %11) #3
  br label %.loopexit

82:                                               ; preds = %80
  %83 = call i64 @_jbl_visit(ptr noundef nonnull %11, i32 noundef %37, ptr noundef nonnull %2, ptr noundef %3)
  store i64 %83, ptr %5, align 8, !tbaa !5
  %.not94 = icmp eq i64 %83, 0
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %11) #3
  br i1 %.not94, label %84, label %.loopexit

84:                                               ; preds = %82, %74
  %85 = load i8, ptr %33, align 4, !tbaa !18, !range !19, !noundef !20
  %86 = trunc nuw i8 %85 to i1
  br i1 %86, label %.critedge10, label %65, !llvm.loop !25

87:                                               ; preds = %.lr.ph, %106
  %88 = phi i32 [ 0, %.lr.ph ], [ %107, %106 ]
  %89 = call i32 @binn_list_next(ptr noundef nonnull %0, ptr noundef nonnull %7) #3
  %.not85 = icmp eq i32 %89, 0
  br i1 %.not85, label %.critedge10, label %90

90:                                               ; preds = %87
  %91 = call i32 %3(i32 noundef %1, ptr noundef nonnull %7, ptr noundef null, i32 noundef %88, ptr noundef nonnull %2, ptr noundef nonnull %5) #3
  %92 = load i64, ptr %5, align 8, !tbaa !5
  %.not86 = icmp eq i64 %92, 0
  br i1 %.not86, label %93, label %.loopexit, !prof !21

93:                                               ; preds = %90
  %94 = and i32 %91, 1
  %.not87 = icmp eq i32 %94, 0
  br i1 %.not87, label %96, label %95

95:                                               ; preds = %93
  store i8 1, ptr %28, align 4, !tbaa !18
  br label %.critedge10

96:                                               ; preds = %93
  %97 = and i32 %91, 2
  %98 = icmp eq i32 %97, 0
  %99 = load i32, ptr %31, align 4
  %100 = add i32 %99, -224
  %101 = icmp ult i32 %100, 3
  %or.cond24 = select i1 %98, i1 %101, i1 false
  br i1 %or.cond24, label %102, label %106

102:                                              ; preds = %96
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %12) #3
  %103 = call i32 @binn_iter_init(ptr noundef nonnull %12, ptr noundef nonnull %7, i32 noundef %99) #3
  %.not88 = icmp eq i32 %103, 0
  br i1 %.not88, label %.thread109, label %104

.thread109:                                       ; preds = %102
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %12) #3
  br label %.loopexit

104:                                              ; preds = %102
  %105 = call i64 @_jbl_visit(ptr noundef nonnull %12, i32 noundef %32, ptr noundef nonnull %2, ptr noundef %3)
  store i64 %105, ptr %5, align 8, !tbaa !5
  %.not89 = icmp eq i64 %105, 0
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %12) #3
  br i1 %.not89, label %106, label %.loopexit

106:                                              ; preds = %96, %104
  %107 = add nuw nsw i32 %88, 1
  %108 = load i8, ptr %28, align 4, !tbaa !18, !range !19, !noundef !20
  %109 = trunc nuw i8 %108 to i1
  br i1 %109, label %.critedge10, label %87, !llvm.loop !26

.critedge10:                                      ; preds = %106, %87, %84, %65, %.preheader112, %.preheader, %.critedge.thread, %95, %73, %25
  %110 = load i64, ptr %5, align 8, !tbaa !5
  br label %.loopexit

.loopexit:                                        ; preds = %90, %104, %67, %82, %.thread109, %.thread106, %.critedge, %4, %.critedge10, %24
  %.11 = phi i64 [ %110, %.critedge10 ], [ %.4, %.critedge ], [ %.071, %24 ], [ 76019, %4 ], [ 76003, %.thread106 ], [ 76003, %.thread109 ], [ %70, %67 ], [ %83, %82 ], [ %92, %90 ], [ %105, %104 ]
  call void @llvm.lifetime.end.p0(i64 88, ptr nonnull %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  ret i64 %.11
}

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

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

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 = { 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 = { 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, !6, i64 0}
!6 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"jbl_vctx", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !12, i64 32, !13, i64 36, !13, i64 37}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!"_Bool", !7, i64 0}
!14 = !{!15, !12, i64 36}
!15 = !{!"binn_struct", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !11, i64 16, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !11, i64 40, !12, i64 48, !12, i64 52, !11, i64 56, !11, i64 64, !11, i64 72, !7, i64 80}
!16 = !{!17, !12, i64 16}
!17 = !{!"binn_iter_struct", !11, i64 0, !11, i64 8, !12, i64 16, !12, i64 20, !12, i64 24}
!18 = !{!10, !13, i64 36}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!12, !12, i64 0}
!25 = distinct !{!25, !23}
!26 = distinct !{!26, !23}


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