; LLVM IR from QiaoLiuHit/LSOTB-TIR :: vlfeat-0.9.19/vl (kdtree)

; 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._VlKDTree = type { ptr, i64, i64, ptr, i32 }
%struct._VlKDTreeNode = type { i64, i64, i64, i32, double, double, double }
%struct._VlKDForestSearcher = type { ptr, ptr, ptr, ptr, ptr, i64, i64, i64, i64, i64 }
%struct._VlKDForest = type { i64, ptr, i32, ptr, i64, i32, ptr, ptr, i64, i32, [5 x %struct._VlKDTreeSplitDimension], i64, i64, i64, i64, i64, ptr }
%struct._VlKDTreeSplitDimension = type { i32, double, double }
%struct._VlKDTreeDataIndexEntry = type { i64, double }
%struct._VlKDForestNeighbor = type { double, i64 }
%struct._VlKDForestSearchState = type { ptr, i64, double }

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

; Function Attrs: noreturn nounwind
declare void @abort() #1

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

; Function Attrs: nounwind uwtable
define dso_local i64 @vl_kdforest_query_recursively(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3, i64 noundef %4, ptr noundef %5, double noundef %6, ptr noundef %7) #2 {
  %9 = alloca i64, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i64, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i64, align 8
  %15 = alloca ptr, align 8
  %16 = alloca double, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca ptr, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca i64, align 8
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  store ptr %0, ptr %10, align 8, !tbaa !5
  store ptr %1, ptr %11, align 8, !tbaa !5
  store i64 %2, ptr %12, align 8, !tbaa !9
  store ptr %3, ptr %13, align 8, !tbaa !5
  store i64 %4, ptr %14, align 8, !tbaa !9
  store ptr %5, ptr %15, align 8, !tbaa !5
  store double %6, ptr %16, align 8, !tbaa !11
  store ptr %7, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %36 = load ptr, ptr %11, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct._VlKDTree, ptr %36, i32 0, i32 0
  %38 = load ptr, ptr %37, align 8, !tbaa !13
  %39 = load i64, ptr %12, align 8, !tbaa !9
  %40 = getelementptr inbounds %struct._VlKDTreeNode, ptr %38, i64 %39
  store ptr %40, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  %41 = load ptr, ptr %18, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct._VlKDTreeNode, ptr %41, i32 0, i32 3
  %43 = load i32, ptr %42, align 8, !tbaa !16
  %44 = zext i32 %43 to i64
  store i64 %44, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  %45 = load ptr, ptr %18, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct._VlKDTreeNode, ptr %45, i32 0, i32 5
  %47 = load double, ptr %46, align 8, !tbaa !18
  store double %47, ptr %25, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  %48 = load ptr, ptr %18, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct._VlKDTreeNode, ptr %48, i32 0, i32 4
  %50 = load double, ptr %49, align 8, !tbaa !19
  store double %50, ptr %26, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  %51 = load ptr, ptr %18, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct._VlKDTreeNode, ptr %51, i32 0, i32 6
  %53 = load double, ptr %52, align 8, !tbaa !20
  store double %53, ptr %27, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  %54 = load ptr, ptr %10, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %54, i32 0, i32 6
  %56 = load i64, ptr %55, align 8, !tbaa !21
  %57 = add i64 %56, 1
  store i64 %57, ptr %55, align 8, !tbaa !21
  %58 = load ptr, ptr %10, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %58, i32 0, i32 4
  %60 = load ptr, ptr %59, align 8, !tbaa !23
  %61 = getelementptr inbounds %struct._VlKDForest, ptr %60, i32 0, i32 2
  %62 = load i32, ptr %61, align 8, !tbaa !24
  switch i32 %62, label %74 [
    i32 1, label %63
    i32 2, label %69
  ]

63:                                               ; preds = %8
  %64 = load ptr, ptr %17, align 8, !tbaa !5
  %65 = load i64, ptr %19, align 8, !tbaa !9
  %66 = getelementptr inbounds float, ptr %64, i64 %65
  %67 = load float, ptr %66, align 4, !tbaa !26
  %68 = fpext float %67 to double
  store double %68, ptr %24, align 8, !tbaa !11
  br label %75

69:                                               ; preds = %8
  %70 = load ptr, ptr %17, align 8, !tbaa !5
  %71 = load i64, ptr %19, align 8, !tbaa !9
  %72 = getelementptr inbounds double, ptr %70, i64 %71
  %73 = load double, ptr %72, align 8, !tbaa !11
  store double %73, ptr %24, align 8, !tbaa !11
  br label %75

74:                                               ; preds = %8
  call void @abort() #6
  unreachable

75:                                               ; preds = %69, %63
  %76 = load ptr, ptr %18, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct._VlKDTreeNode, ptr %76, i32 0, i32 1
  %78 = load i64, ptr %77, align 8, !tbaa !28
  %79 = icmp slt i64 %78, 0
  br i1 %79, label %80, label %254

80:                                               ; preds = %75
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  %81 = load ptr, ptr %18, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct._VlKDTreeNode, ptr %81, i32 0, i32 1
  %83 = load i64, ptr %82, align 8, !tbaa !28
  %84 = sub nsw i64 0, %83
  %85 = sub nsw i64 %84, 1
  store i64 %85, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  %86 = load ptr, ptr %18, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct._VlKDTreeNode, ptr %86, i32 0, i32 2
  %88 = load i64, ptr %87, align 8, !tbaa !29
  %89 = sub nsw i64 0, %88
  %90 = sub nsw i64 %89, 1
  store i64 %90, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  %91 = load i64, ptr %29, align 8, !tbaa !9
  store i64 %91, ptr %31, align 8, !tbaa !9
  br label %92

92:                                               ; preds = %249, %80
  %93 = load i64, ptr %31, align 8, !tbaa !9
  %94 = load i64, ptr %30, align 8, !tbaa !9
  %95 = icmp slt i64 %93, %94
  br i1 %95, label %96, label %115

96:                                               ; preds = %92
  %97 = load ptr, ptr %10, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %97, i32 0, i32 4
  %99 = load ptr, ptr %98, align 8, !tbaa !23
  %100 = getelementptr inbounds %struct._VlKDForest, ptr %99, i32 0, i32 14
  %101 = load i64, ptr %100, align 8, !tbaa !30
  %102 = icmp eq i64 %101, 0
  br i1 %102, label %113, label %103

103:                                              ; preds = %96
  %104 = load ptr, ptr %10, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %104, i32 0, i32 5
  %106 = load i64, ptr %105, align 8, !tbaa !31
  %107 = load ptr, ptr %10, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %107, i32 0, i32 4
  %109 = load ptr, ptr %108, align 8, !tbaa !23
  %110 = getelementptr inbounds %struct._VlKDForest, ptr %109, i32 0, i32 14
  %111 = load i64, ptr %110, align 8, !tbaa !30
  %112 = icmp ult i64 %106, %111
  br label %113

113:                                              ; preds = %103, %96
  %114 = phi i1 [ true, %96 ], [ %112, %103 ]
  br label %115

115:                                              ; preds = %113, %92
  %116 = phi i1 [ false, %92 ], [ %114, %113 ]
  br i1 %116, label %117, label %252

117:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  %118 = load ptr, ptr %11, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct._VlKDTree, ptr %118, i32 0, i32 3
  %120 = load ptr, ptr %119, align 8, !tbaa !32
  %121 = load i64, ptr %31, align 8, !tbaa !9
  %122 = getelementptr inbounds %struct._VlKDTreeDataIndexEntry, ptr %120, i64 %121
  %123 = getelementptr inbounds %struct._VlKDTreeDataIndexEntry, ptr %122, i32 0, i32 0
  %124 = load i64, ptr %123, align 8, !tbaa !33
  store i64 %124, ptr %32, align 8, !tbaa !9
  %125 = load ptr, ptr %10, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %125, i32 0, i32 2
  %127 = load ptr, ptr %126, align 8, !tbaa !35
  %128 = load i64, ptr %32, align 8, !tbaa !9
  %129 = getelementptr inbounds i64, ptr %127, i64 %128
  %130 = load i64, ptr %129, align 8, !tbaa !9
  %131 = load ptr, ptr %10, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %131, i32 0, i32 9
  %133 = load i64, ptr %132, align 8, !tbaa !36
  %134 = icmp eq i64 %130, %133
  br i1 %134, label %135, label %136

135:                                              ; preds = %117
  store i32 5, ptr %33, align 4
  br label %246

136:                                              ; preds = %117
  %137 = load ptr, ptr %10, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %137, i32 0, i32 9
  %139 = load i64, ptr %138, align 8, !tbaa !36
  %140 = load ptr, ptr %10, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %140, i32 0, i32 2
  %142 = load ptr, ptr %141, align 8, !tbaa !35
  %143 = load i64, ptr %32, align 8, !tbaa !9
  %144 = getelementptr inbounds i64, ptr %142, i64 %143
  store i64 %139, ptr %144, align 8, !tbaa !9
  %145 = load ptr, ptr %10, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %145, i32 0, i32 4
  %147 = load ptr, ptr %146, align 8, !tbaa !23
  %148 = getelementptr inbounds %struct._VlKDForest, ptr %147, i32 0, i32 2
  %149 = load i32, ptr %148, align 8, !tbaa !24
  switch i32 %149, label %203 [
    i32 1, label %150
    i32 2, label %177
  ]

150:                                              ; preds = %136
  %151 = load ptr, ptr %10, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %151, i32 0, i32 4
  %153 = load ptr, ptr %152, align 8, !tbaa !23
  %154 = getelementptr inbounds %struct._VlKDForest, ptr %153, i32 0, i32 6
  %155 = load ptr, ptr %154, align 8, !tbaa !37
  %156 = load ptr, ptr %10, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %156, i32 0, i32 4
  %158 = load ptr, ptr %157, align 8, !tbaa !23
  %159 = getelementptr inbounds %struct._VlKDForest, ptr %158, i32 0, i32 0
  %160 = load i64, ptr %159, align 8, !tbaa !38
  %161 = load ptr, ptr %17, align 8, !tbaa !5
  %162 = load ptr, ptr %10, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %162, i32 0, i32 4
  %164 = load ptr, ptr %163, align 8, !tbaa !23
  %165 = getelementptr inbounds %struct._VlKDForest, ptr %164, i32 0, i32 3
  %166 = load ptr, ptr %165, align 8, !tbaa !39
  %167 = load i64, ptr %32, align 8, !tbaa !9
  %168 = load ptr, ptr %10, align 8, !tbaa !5
  %169 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %168, i32 0, i32 4
  %170 = load ptr, ptr %169, align 8, !tbaa !23
  %171 = getelementptr inbounds %struct._VlKDForest, ptr %170, i32 0, i32 0
  %172 = load i64, ptr %171, align 8, !tbaa !38
  %173 = mul i64 %167, %172
  %174 = getelementptr inbounds float, ptr %166, i64 %173
  %175 = call float %155(i64 noundef %160, ptr noundef %161, ptr noundef %174)
  %176 = fpext float %175 to double
  store double %176, ptr %16, align 8, !tbaa !11
  br label %204

177:                                              ; preds = %136
  %178 = load ptr, ptr %10, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %178, i32 0, i32 4
  %180 = load ptr, ptr %179, align 8, !tbaa !23
  %181 = getelementptr inbounds %struct._VlKDForest, ptr %180, i32 0, i32 6
  %182 = load ptr, ptr %181, align 8, !tbaa !37
  %183 = load ptr, ptr %10, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %183, i32 0, i32 4
  %185 = load ptr, ptr %184, align 8, !tbaa !23
  %186 = getelementptr inbounds %struct._VlKDForest, ptr %185, i32 0, i32 0
  %187 = load i64, ptr %186, align 8, !tbaa !38
  %188 = load ptr, ptr %17, align 8, !tbaa !5
  %189 = load ptr, ptr %10, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %189, i32 0, i32 4
  %191 = load ptr, ptr %190, align 8, !tbaa !23
  %192 = getelementptr inbounds %struct._VlKDForest, ptr %191, i32 0, i32 3
  %193 = load ptr, ptr %192, align 8, !tbaa !39
  %194 = load i64, ptr %32, align 8, !tbaa !9
  %195 = load ptr, ptr %10, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %195, i32 0, i32 4
  %197 = load ptr, ptr %196, align 8, !tbaa !23
  %198 = getelementptr inbounds %struct._VlKDForest, ptr %197, i32 0, i32 0
  %199 = load i64, ptr %198, align 8, !tbaa !38
  %200 = mul i64 %194, %199
  %201 = getelementptr inbounds double, ptr %193, i64 %200
  %202 = call double %182(i64 noundef %187, ptr noundef %188, ptr noundef %201)
  store double %202, ptr %16, align 8, !tbaa !11
  br label %204

203:                                              ; preds = %136
  call void @abort() #6
  unreachable

204:                                              ; preds = %177, %150
  %205 = load ptr, ptr %10, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %205, i32 0, i32 5
  %207 = load i64, ptr %206, align 8, !tbaa !31
  %208 = add i64 %207, 1
  store i64 %208, ptr %206, align 8, !tbaa !31
  %209 = load ptr, ptr %15, align 8, !tbaa !5
  %210 = load i64, ptr %209, align 8, !tbaa !9
  %211 = load i64, ptr %14, align 8, !tbaa !9
  %212 = icmp ult i64 %210, %211
  br i1 %212, label %213, label %226

213:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  %214 = load ptr, ptr %13, align 8, !tbaa !5
  %215 = load ptr, ptr %15, align 8, !tbaa !5
  %216 = load i64, ptr %215, align 8, !tbaa !9
  %217 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %214, i64 %216
  store ptr %217, ptr %34, align 8, !tbaa !5
  %218 = load i64, ptr %32, align 8, !tbaa !9
  %219 = load ptr, ptr %34, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %219, i32 0, i32 1
  store i64 %218, ptr %220, align 8, !tbaa !40
  %221 = load double, ptr %16, align 8, !tbaa !11
  %222 = load ptr, ptr %34, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %222, i32 0, i32 0
  store double %221, ptr %223, align 8, !tbaa !42
  %224 = load ptr, ptr %13, align 8, !tbaa !5
  %225 = load ptr, ptr %15, align 8, !tbaa !5
  call void @vl_kdforest_neighbor_heap_push(ptr noundef %224, ptr noundef %225)
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  br label %245

226:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  %227 = load ptr, ptr %13, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %227, i64 0
  store ptr %228, ptr %35, align 8, !tbaa !5
  %229 = load ptr, ptr %35, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %229, i32 0, i32 0
  %231 = load double, ptr %230, align 8, !tbaa !42
  %232 = load double, ptr %16, align 8, !tbaa !11
  %233 = fcmp ogt double %231, %232
  br i1 %233, label %234, label %244

234:                                              ; preds = %226
  %235 = load i64, ptr %32, align 8, !tbaa !9
  %236 = load ptr, ptr %35, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %236, i32 0, i32 1
  store i64 %235, ptr %237, align 8, !tbaa !40
  %238 = load double, ptr %16, align 8, !tbaa !11
  %239 = load ptr, ptr %35, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %239, i32 0, i32 0
  store double %238, ptr %240, align 8, !tbaa !42
  %241 = load ptr, ptr %13, align 8, !tbaa !5
  %242 = load ptr, ptr %15, align 8, !tbaa !5
  %243 = load i64, ptr %242, align 8, !tbaa !9
  call void @vl_kdforest_neighbor_heap_update(ptr noundef %241, i64 noundef %243, i64 noundef 0)
  br label %244

244:                                              ; preds = %234, %226
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  br label %245

245:                                              ; preds = %244, %213
  store i32 0, ptr %33, align 4
  br label %246

246:                                              ; preds = %245, %135
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  %247 = load i32, ptr %33, align 4
  switch i32 %247, label %351 [
    i32 0, label %248
    i32 5, label %249
  ]

248:                                              ; preds = %246
  br label %249

249:                                              ; preds = %248, %246
  %250 = load i64, ptr %31, align 8, !tbaa !9
  %251 = add nsw i64 %250, 1
  store i64 %251, ptr %31, align 8, !tbaa !9
  br label %92, !llvm.loop !43

252:                                              ; preds = %115
  %253 = load i64, ptr %12, align 8, !tbaa !9
  store i64 %253, ptr %9, align 8
  store i32 1, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  br label %349

254:                                              ; preds = %75
  %255 = load double, ptr %24, align 8, !tbaa !11
  %256 = load double, ptr %26, align 8, !tbaa !11
  %257 = fsub double %255, %256
  store double %257, ptr %22, align 8, !tbaa !11
  %258 = load double, ptr %16, align 8, !tbaa !11
  %259 = load double, ptr %22, align 8, !tbaa !11
  %260 = load double, ptr %22, align 8, !tbaa !11
  %261 = call double @llvm.fmuladd.f64(double %259, double %260, double %258)
  store double %261, ptr %23, align 8, !tbaa !11
  %262 = load double, ptr %24, align 8, !tbaa !11
  %263 = load double, ptr %26, align 8, !tbaa !11
  %264 = fcmp ole double %262, %263
  br i1 %264, label %265, label %285

265:                                              ; preds = %254
  %266 = load ptr, ptr %18, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct._VlKDTreeNode, ptr %266, i32 0, i32 1
  %268 = load i64, ptr %267, align 8, !tbaa !28
  store i64 %268, ptr %20, align 8, !tbaa !9
  %269 = load ptr, ptr %18, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct._VlKDTreeNode, ptr %269, i32 0, i32 2
  %271 = load i64, ptr %270, align 8, !tbaa !29
  store i64 %271, ptr %21, align 8, !tbaa !9
  %272 = load double, ptr %24, align 8, !tbaa !11
  %273 = load double, ptr %25, align 8, !tbaa !11
  %274 = fcmp ole double %272, %273
  br i1 %274, label %275, label %284

275:                                              ; preds = %265
  %276 = load double, ptr %24, align 8, !tbaa !11
  %277 = load double, ptr %25, align 8, !tbaa !11
  %278 = fsub double %276, %277
  store double %278, ptr %22, align 8, !tbaa !11
  %279 = load double, ptr %22, align 8, !tbaa !11
  %280 = load double, ptr %22, align 8, !tbaa !11
  %281 = load double, ptr %23, align 8, !tbaa !11
  %282 = fneg double %279
  %283 = call double @llvm.fmuladd.f64(double %282, double %280, double %281)
  store double %283, ptr %23, align 8, !tbaa !11
  br label %284

284:                                              ; preds = %275, %265
  br label %305

285:                                              ; preds = %254
  %286 = load ptr, ptr %18, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct._VlKDTreeNode, ptr %286, i32 0, i32 2
  %288 = load i64, ptr %287, align 8, !tbaa !29
  store i64 %288, ptr %20, align 8, !tbaa !9
  %289 = load ptr, ptr %18, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct._VlKDTreeNode, ptr %289, i32 0, i32 1
  %291 = load i64, ptr %290, align 8, !tbaa !28
  store i64 %291, ptr %21, align 8, !tbaa !9
  %292 = load double, ptr %24, align 8, !tbaa !11
  %293 = load double, ptr %27, align 8, !tbaa !11
  %294 = fcmp ogt double %292, %293
  br i1 %294, label %295, label %304

295:                                              ; preds = %285
  %296 = load double, ptr %24, align 8, !tbaa !11
  %297 = load double, ptr %27, align 8, !tbaa !11
  %298 = fsub double %296, %297
  store double %298, ptr %22, align 8, !tbaa !11
  %299 = load double, ptr %22, align 8, !tbaa !11
  %300 = load double, ptr %22, align 8, !tbaa !11
  %301 = load double, ptr %23, align 8, !tbaa !11
  %302 = fneg double %299
  %303 = call double @llvm.fmuladd.f64(double %302, double %300, double %301)
  store double %303, ptr %23, align 8, !tbaa !11
  br label %304

304:                                              ; preds = %295, %285
  br label %305

305:                                              ; preds = %304, %284
  %306 = load ptr, ptr %15, align 8, !tbaa !5
  %307 = load i64, ptr %306, align 8, !tbaa !9
  %308 = load i64, ptr %14, align 8, !tbaa !9
  %309 = icmp ult i64 %307, %308
  br i1 %309, label %317, label %310

310:                                              ; preds = %305
  %311 = load ptr, ptr %13, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %311, i64 0
  %313 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %312, i32 0, i32 0
  %314 = load double, ptr %313, align 8, !tbaa !42
  %315 = load double, ptr %23, align 8, !tbaa !11
  %316 = fcmp ogt double %314, %315
  br i1 %316, label %317, label %339

317:                                              ; preds = %310, %305
  %318 = load ptr, ptr %10, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %318, i32 0, i32 3
  %320 = load ptr, ptr %319, align 8, !tbaa !45
  %321 = load ptr, ptr %10, align 8, !tbaa !5
  %322 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %321, i32 0, i32 8
  %323 = load i64, ptr %322, align 8, !tbaa !46
  %324 = getelementptr inbounds %struct._VlKDForestSearchState, ptr %320, i64 %323
  store ptr %324, ptr %28, align 8, !tbaa !5
  %325 = load ptr, ptr %11, align 8, !tbaa !5
  %326 = load ptr, ptr %28, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct._VlKDForestSearchState, ptr %326, i32 0, i32 0
  store ptr %325, ptr %327, align 8, !tbaa !47
  %328 = load i64, ptr %21, align 8, !tbaa !9
  %329 = load ptr, ptr %28, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct._VlKDForestSearchState, ptr %329, i32 0, i32 1
  store i64 %328, ptr %330, align 8, !tbaa !49
  %331 = load double, ptr %23, align 8, !tbaa !11
  %332 = load ptr, ptr %28, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct._VlKDForestSearchState, ptr %332, i32 0, i32 2
  store double %331, ptr %333, align 8, !tbaa !50
  %334 = load ptr, ptr %10, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %334, i32 0, i32 3
  %336 = load ptr, ptr %335, align 8, !tbaa !45
  %337 = load ptr, ptr %10, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct._VlKDForestSearcher, ptr %337, i32 0, i32 8
  call void @vl_kdforest_search_heap_push(ptr noundef %336, ptr noundef %338)
  br label %339

339:                                              ; preds = %317, %310
  %340 = load ptr, ptr %10, align 8, !tbaa !5
  %341 = load ptr, ptr %11, align 8, !tbaa !5
  %342 = load i64, ptr %20, align 8, !tbaa !9
  %343 = load ptr, ptr %13, align 8, !tbaa !5
  %344 = load i64, ptr %14, align 8, !tbaa !9
  %345 = load ptr, ptr %15, align 8, !tbaa !5
  %346 = load double, ptr %16, align 8, !tbaa !11
  %347 = load ptr, ptr %17, align 8, !tbaa !5
  %348 = call i64 @vl_kdforest_query_recursively(ptr noundef %340, ptr noundef %341, i64 noundef %342, ptr noundef %343, i64 noundef %344, ptr noundef %345, double noundef %346, ptr noundef %347)
  store i64 %348, ptr %9, align 8
  store i32 1, ptr %33, align 4
  br label %349

349:                                              ; preds = %339, %252
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  %350 = load i64, ptr %9, align 8
  ret i64 %350

351:                                              ; preds = %246
  unreachable
}

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #4

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !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 = !{!"long long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"_VlKDTree", !6, i64 0, !10, i64 8, !10, i64 16, !6, i64 24, !15, i64 32}
!15 = !{!"int", !7, i64 0}
!16 = !{!17, !15, i64 24}
!17 = !{!"_VlKDTreeNode", !10, i64 0, !10, i64 8, !10, i64 16, !15, i64 24, !12, i64 32, !12, i64 40, !12, i64 48}
!18 = !{!17, !12, i64 40}
!19 = !{!17, !12, i64 32}
!20 = !{!17, !12, i64 48}
!21 = !{!22, !10, i64 48}
!22 = !{!"_VlKDForestSearcher", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72}
!23 = !{!22, !6, i64 32}
!24 = !{!25, !15, i64 16}
!25 = !{!"_VlKDForest", !10, i64 0, !6, i64 8, !15, i64 16, !6, i64 24, !10, i64 32, !15, i64 40, !6, i64 48, !6, i64 56, !10, i64 64, !15, i64 72, !7, i64 80, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !6, i64 240}
!26 = !{!27, !27, i64 0}
!27 = !{!"float", !7, i64 0}
!28 = !{!17, !10, i64 8}
!29 = !{!17, !10, i64 16}
!30 = !{!25, !10, i64 224}
!31 = !{!22, !10, i64 40}
!32 = !{!14, !6, i64 24}
!33 = !{!34, !10, i64 0}
!34 = !{!"_VlKDTreeDataIndexEntry", !10, i64 0, !12, i64 8}
!35 = !{!22, !6, i64 16}
!36 = !{!22, !10, i64 72}
!37 = !{!25, !6, i64 48}
!38 = !{!25, !10, i64 0}
!39 = !{!25, !6, i64 24}
!40 = !{!41, !10, i64 8}
!41 = !{!"_VlKDForestNeighbor", !12, i64 0, !10, i64 8}
!42 = !{!41, !12, i64 0}
!43 = distinct !{!43, !44}
!44 = !{!"llvm.loop.mustprogress"}
!45 = !{!22, !6, i64 24}
!46 = !{!22, !10, i64 64}
!47 = !{!48, !6, i64 0}
!48 = !{!"_VlKDForestSearchState", !6, i64 0, !10, i64 8, !12, i64 16}
!49 = !{!48, !10, i64 8}
!50 = !{!48, !12, i64 16}


; 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._VlKDTreeNode = type { i64, i64, i64, i32, double, double, double }
%struct._VlKDTreeDataIndexEntry = type { i64, double }
%struct._VlKDForestNeighbor = type { double, i64 }
%struct._VlKDForestSearchState = type { ptr, i64, double }

; Function Attrs: noreturn nounwind
declare void @abort() local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local i64 @vl_kdforest_query_recursively(ptr noundef %0, ptr noundef %1, i64 noundef %2, ptr noundef %3, i64 noundef %4, ptr noundef %5, double noundef %6, ptr noundef %7) local_unnamed_addr #1 {
  %9 = getelementptr inbounds i8, ptr %0, i64 48
  %10 = getelementptr inbounds i8, ptr %0, i64 32
  %11 = getelementptr inbounds i8, ptr %0, i64 24
  %12 = getelementptr inbounds i8, ptr %0, i64 64
  br label %tailrecurse

tailrecurse:                                      ; preds = %tailrecurse.backedge, %8
  %.tr126 = phi i64 [ %2, %8 ], [ %.0114, %tailrecurse.backedge ]
  %13 = load ptr, ptr %1, align 8, !tbaa !5
  %14 = getelementptr inbounds %struct._VlKDTreeNode, ptr %13, i64 %.tr126
  %15 = getelementptr inbounds i8, ptr %14, i64 24
  %16 = load i32, ptr %15, align 8, !tbaa !12
  %17 = zext i32 %16 to i64
  %18 = getelementptr inbounds i8, ptr %14, i64 40
  %19 = load double, ptr %18, align 8, !tbaa !15
  %20 = getelementptr inbounds i8, ptr %14, i64 32
  %21 = load double, ptr %20, align 8, !tbaa !16
  %22 = getelementptr inbounds i8, ptr %14, i64 48
  %23 = load double, ptr %22, align 8, !tbaa !17
  %24 = load i64, ptr %9, align 8, !tbaa !18
  %25 = add i64 %24, 1
  store i64 %25, ptr %9, align 8, !tbaa !18
  %26 = load ptr, ptr %10, align 8, !tbaa !20
  %27 = getelementptr inbounds i8, ptr %26, i64 16
  %28 = load i32, ptr %27, align 8, !tbaa !21
  switch i32 %28, label %36 [
    i32 1, label %29
    i32 2, label %33
  ]

29:                                               ; preds = %tailrecurse
  %30 = getelementptr inbounds float, ptr %7, i64 %17
  %31 = load float, ptr %30, align 4, !tbaa !23
  %32 = fpext float %31 to double
  br label %37

33:                                               ; preds = %tailrecurse
  %34 = getelementptr inbounds double, ptr %7, i64 %17
  %35 = load double, ptr %34, align 8, !tbaa !25
  br label %37

36:                                               ; preds = %tailrecurse
  tail call void @abort() #4
  unreachable

37:                                               ; preds = %33, %29
  %.0118 = phi double [ %35, %33 ], [ %32, %29 ]
  %38 = getelementptr inbounds i8, ptr %14, i64 8
  %39 = load i64, ptr %38, align 8, !tbaa !26
  %40 = icmp slt i64 %39, 0
  br i1 %40, label %41, label %107

41:                                               ; preds = %37
  %42 = getelementptr inbounds i8, ptr %14, i64 16
  %43 = load i64, ptr %42, align 8, !tbaa !27
  %44 = xor i64 %43, -1
  %45 = icmp sgt i64 %39, %43
  br i1 %45, label %.lr.ph, label %.critedge

.lr.ph:                                           ; preds = %41
  %46 = xor i64 %39, -1
  %47 = getelementptr inbounds i8, ptr %0, i64 40
  %48 = getelementptr inbounds i8, ptr %1, i64 24
  %49 = getelementptr inbounds i8, ptr %0, i64 16
  %50 = getelementptr inbounds i8, ptr %0, i64 72
  %51 = getelementptr inbounds i8, ptr %3, i64 8
  br label %52

52:                                               ; preds = %.lr.ph, %104
  %.0115137 = phi i64 [ %46, %.lr.ph ], [ %105, %104 ]
  %53 = load ptr, ptr %10, align 8, !tbaa !20
  %54 = getelementptr inbounds i8, ptr %53, i64 224
  %55 = load i64, ptr %54, align 8, !tbaa !28
  %56 = icmp eq i64 %55, 0
  br i1 %56, label %.critedge2, label %57

57:                                               ; preds = %52
  %58 = load i64, ptr %47, align 8, !tbaa !29
  %59 = icmp ult i64 %58, %55
  br i1 %59, label %.critedge2, label %.critedge

.critedge2:                                       ; preds = %52, %57
  %60 = load ptr, ptr %48, align 8, !tbaa !30
  %61 = getelementptr inbounds %struct._VlKDTreeDataIndexEntry, ptr %60, i64 %.0115137
  %62 = load i64, ptr %61, align 8, !tbaa !31
  %63 = load ptr, ptr %49, align 8, !tbaa !33
  %64 = getelementptr inbounds i64, ptr %63, i64 %62
  %65 = load i64, ptr %64, align 8, !tbaa !34
  %66 = load i64, ptr %50, align 8, !tbaa !35
  %67 = icmp eq i64 %65, %66
  br i1 %67, label %104, label %68

68:                                               ; preds = %.critedge2
  store i64 %66, ptr %64, align 8, !tbaa !34
  %69 = getelementptr inbounds i8, ptr %53, i64 16
  %70 = load i32, ptr %69, align 8, !tbaa !21
  switch i32 %70, label %90 [
    i32 1, label %71
    i32 2, label %81
  ]

71:                                               ; preds = %68
  %72 = getelementptr inbounds i8, ptr %53, i64 48
  %73 = load ptr, ptr %72, align 8, !tbaa !36
  %74 = load i64, ptr %53, align 8, !tbaa !37
  %75 = getelementptr inbounds i8, ptr %53, i64 24
  %76 = load ptr, ptr %75, align 8, !tbaa !38
  %77 = mul i64 %74, %62
  %78 = getelementptr inbounds float, ptr %76, i64 %77
  %79 = tail call float %73(i64 noundef %74, ptr noundef %7, ptr noundef %78) #5
  %80 = fpext float %79 to double
  br label %91

81:                                               ; preds = %68
  %82 = getelementptr inbounds i8, ptr %53, i64 48
  %83 = load ptr, ptr %82, align 8, !tbaa !36
  %84 = load i64, ptr %53, align 8, !tbaa !37
  %85 = getelementptr inbounds i8, ptr %53, i64 24
  %86 = load ptr, ptr %85, align 8, !tbaa !38
  %87 = mul i64 %84, %62
  %88 = getelementptr inbounds double, ptr %86, i64 %87
  %89 = tail call double %83(i64 noundef %84, ptr noundef %7, ptr noundef %88) #5
  br label %91

90:                                               ; preds = %68
  tail call void @abort() #4
  unreachable

91:                                               ; preds = %81, %71
  %.0113 = phi double [ %89, %81 ], [ %80, %71 ]
  %92 = load i64, ptr %47, align 8, !tbaa !29
  %93 = add i64 %92, 1
  store i64 %93, ptr %47, align 8, !tbaa !29
  %94 = load i64, ptr %5, align 8, !tbaa !34
  %95 = icmp ult i64 %94, %4
  br i1 %95, label %96, label %99

96:                                               ; preds = %91
  %97 = getelementptr inbounds %struct._VlKDForestNeighbor, ptr %3, i64 %94
  %98 = getelementptr inbounds i8, ptr %97, i64 8
  store i64 %62, ptr %98, align 8, !tbaa !39
  store double %.0113, ptr %97, align 8, !tbaa !41
  tail call void @vl_kdforest_neighbor_heap_push(ptr noundef %3, ptr noundef nonnull %5)
  br label %104

99:                                               ; preds = %91
  %100 = load double, ptr %3, align 8, !tbaa !41
  %101 = fcmp ogt double %100, %.0113
  br i1 %101, label %102, label %104

102:                                              ; preds = %99
  store i64 %62, ptr %51, align 8, !tbaa !39
  store double %.0113, ptr %3, align 8, !tbaa !41
  %103 = load i64, ptr %5, align 8, !tbaa !34
  tail call void @vl_kdforest_neighbor_heap_update(ptr noundef nonnull %3, i64 noundef %103, i64 noundef 0)
  br label %104

104:                                              ; preds = %96, %102, %99, %.critedge2
  %105 = add nuw nsw i64 %.0115137, 1
  %106 = icmp slt i64 %105, %44
  br i1 %106, label %52, label %.critedge, !llvm.loop !42

107:                                              ; preds = %37
  %108 = fsub double %.0118, %21
  %109 = tail call double @llvm.fmuladd.f64(double %108, double %108, double %6)
  %110 = fcmp ugt double %.0118, %21
  %111 = getelementptr inbounds i8, ptr %14, i64 16
  %112 = load i64, ptr %111, align 8, !tbaa !27
  br i1 %110, label %119, label %113

113:                                              ; preds = %107
  %114 = fcmp ugt double %.0118, %19
  br i1 %114, label %125, label %115

115:                                              ; preds = %113
  %116 = fsub double %.0118, %19
  %117 = fneg double %116
  %118 = tail call double @llvm.fmuladd.f64(double %117, double %116, double %109)
  br label %125

119:                                              ; preds = %107
  %120 = fcmp ogt double %.0118, %23
  br i1 %120, label %121, label %125

121:                                              ; preds = %119
  %122 = fsub double %.0118, %23
  %123 = fneg double %122
  %124 = tail call double @llvm.fmuladd.f64(double %123, double %122, double %109)
  br label %125

125:                                              ; preds = %119, %121, %113, %115
  %.0117 = phi double [ %118, %115 ], [ %109, %113 ], [ %124, %121 ], [ %109, %119 ]
  %.0116 = phi i64 [ %112, %115 ], [ %112, %113 ], [ %39, %121 ], [ %39, %119 ]
  %.0114 = phi i64 [ %39, %115 ], [ %39, %113 ], [ %112, %121 ], [ %112, %119 ]
  %126 = load i64, ptr %5, align 8, !tbaa !34
  %127 = icmp ult i64 %126, %4
  br i1 %127, label %131, label %128

128:                                              ; preds = %125
  %129 = load double, ptr %3, align 8, !tbaa !41
  %130 = fcmp ogt double %129, %.0117
  br i1 %130, label %131, label %tailrecurse.backedge

131:                                              ; preds = %128, %125
  %132 = load ptr, ptr %11, align 8, !tbaa !44
  %133 = load i64, ptr %12, align 8, !tbaa !45
  %134 = getelementptr inbounds %struct._VlKDForestSearchState, ptr %132, i64 %133
  store ptr %1, ptr %134, align 8, !tbaa !46
  %135 = getelementptr inbounds i8, ptr %134, i64 8
  store i64 %.0116, ptr %135, align 8, !tbaa !48
  %136 = getelementptr inbounds i8, ptr %134, i64 16
  store double %.0117, ptr %136, align 8, !tbaa !49
  tail call void @vl_kdforest_search_heap_push(ptr noundef %132, ptr noundef nonnull %12)
  br label %tailrecurse.backedge

tailrecurse.backedge:                             ; preds = %131, %128
  br label %tailrecurse

.critedge:                                        ; preds = %104, %57, %41
  ret i64 %.tr126
}

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #3

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

attributes #0 = { noreturn nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { 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 = { 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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { noreturn nounwind }
attributes #5 = { 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 = !{!"_VlKDTree", !7, i64 0, !10, i64 8, !10, i64 16, !7, i64 24, !11, i64 32}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"long long", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!13, !11, i64 24}
!13 = !{!"_VlKDTreeNode", !10, i64 0, !10, i64 8, !10, i64 16, !11, i64 24, !14, i64 32, !14, i64 40, !14, i64 48}
!14 = !{!"double", !8, i64 0}
!15 = !{!13, !14, i64 40}
!16 = !{!13, !14, i64 32}
!17 = !{!13, !14, i64 48}
!18 = !{!19, !10, i64 48}
!19 = !{!"_VlKDForestSearcher", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72}
!20 = !{!19, !7, i64 32}
!21 = !{!22, !11, i64 16}
!22 = !{!"_VlKDForest", !10, i64 0, !7, i64 8, !11, i64 16, !7, i64 24, !10, i64 32, !11, i64 40, !7, i64 48, !7, i64 56, !10, i64 64, !11, i64 72, !8, i64 80, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !7, i64 240}
!23 = !{!24, !24, i64 0}
!24 = !{!"float", !8, i64 0}
!25 = !{!14, !14, i64 0}
!26 = !{!13, !10, i64 8}
!27 = !{!13, !10, i64 16}
!28 = !{!22, !10, i64 224}
!29 = !{!19, !10, i64 40}
!30 = !{!6, !7, i64 24}
!31 = !{!32, !10, i64 0}
!32 = !{!"_VlKDTreeDataIndexEntry", !10, i64 0, !14, i64 8}
!33 = !{!19, !7, i64 16}
!34 = !{!10, !10, i64 0}
!35 = !{!19, !10, i64 72}
!36 = !{!22, !7, i64 48}
!37 = !{!22, !10, i64 0}
!38 = !{!22, !7, i64 24}
!39 = !{!40, !10, i64 8}
!40 = !{!"_VlKDForestNeighbor", !14, i64 0, !10, i64 8}
!41 = !{!40, !14, i64 0}
!42 = distinct !{!42, !43}
!43 = !{!"llvm.loop.mustprogress"}
!44 = !{!19, !7, i64 24}
!45 = !{!19, !10, i64 64}
!46 = !{!47, !7, i64 0}
!47 = !{!"_VlKDForestSearchState", !7, i64 0, !10, i64 8, !14, i64 16}
!48 = !{!47, !10, i64 8}
!49 = !{!47, !14, i64 16}


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