; LLVM IR from jgaeddert/liquid-dsp :: src/optim/src (qnsearch)

; 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.qnsearch_s = type { ptr, i32, float, float, float, float, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, float, ptr, i32 }

; 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: nounwind uwtable
define dso_local i32 @qnsearch_compute_Hessian(ptr noundef %0) #1 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca float, align 4
  %7 = alloca float, align 4
  %8 = alloca float, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca float, align 4
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca float, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #3
  %16 = load ptr, ptr %2, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.qnsearch_s, ptr %16, i32 0, i32 1
  %18 = load i32, ptr %17, align 8, !tbaa !9
  store i32 %18, ptr %5, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  store float 0x3F847AE140000000, ptr %15, align 4, !tbaa !14
  %19 = load ptr, ptr %2, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.qnsearch_s, ptr %19, i32 0, i32 6
  %21 = load ptr, ptr %20, align 8, !tbaa !15
  %22 = load ptr, ptr %2, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.qnsearch_s, ptr %22, i32 0, i32 0
  %24 = load ptr, ptr %23, align 8, !tbaa !16
  %25 = load ptr, ptr %2, align 8, !tbaa !5
  %26 = getelementptr inbounds %struct.qnsearch_s, ptr %25, i32 0, i32 1
  %27 = load i32, ptr %26, align 8, !tbaa !9
  %28 = zext i32 %27 to i64
  %29 = mul i64 %28, 4
  call void @llvm.memmove.p0.p0.i64(ptr align 4 %21, ptr align 4 %24, i64 %29, i1 false)
  store i32 0, ptr %3, align 4, !tbaa !13
  br label %30

30:                                               ; preds = %375, %1
  %31 = load i32, ptr %3, align 4, !tbaa !13
  %32 = load ptr, ptr %2, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.qnsearch_s, ptr %32, i32 0, i32 1
  %34 = load i32, ptr %33, align 8, !tbaa !9
  %35 = icmp ult i32 %31, %34
  br i1 %35, label %36, label %378

36:                                               ; preds = %30
  store i32 0, ptr %4, align 4, !tbaa !13
  br label %37

37:                                               ; preds = %371, %36
  %38 = load i32, ptr %4, align 4, !tbaa !13
  %39 = load i32, ptr %3, align 4, !tbaa !13
  %40 = icmp ule i32 %38, %39
  br i1 %40, label %41, label %374

41:                                               ; preds = %37
  %42 = load i32, ptr %3, align 4, !tbaa !13
  %43 = load i32, ptr %4, align 4, !tbaa !13
  %44 = icmp eq i32 %42, %43
  br i1 %44, label %45, label %153

45:                                               ; preds = %41
  %46 = load ptr, ptr %2, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.qnsearch_s, ptr %46, i32 0, i32 0
  %48 = load ptr, ptr %47, align 8, !tbaa !16
  %49 = load i32, ptr %3, align 4, !tbaa !13
  %50 = zext i32 %49 to i64
  %51 = getelementptr inbounds float, ptr %48, i64 %50
  %52 = load float, ptr %51, align 4, !tbaa !14
  %53 = load float, ptr %15, align 4, !tbaa !14
  %54 = fsub float %52, %53
  %55 = load ptr, ptr %2, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.qnsearch_s, ptr %55, i32 0, i32 6
  %57 = load ptr, ptr %56, align 8, !tbaa !15
  %58 = load i32, ptr %3, align 4, !tbaa !13
  %59 = zext i32 %58 to i64
  %60 = getelementptr inbounds float, ptr %57, i64 %59
  store float %54, ptr %60, align 4, !tbaa !14
  %61 = load ptr, ptr %2, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.qnsearch_s, ptr %61, i32 0, i32 13
  %63 = load ptr, ptr %62, align 8, !tbaa !17
  %64 = load ptr, ptr %2, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.qnsearch_s, ptr %64, i32 0, i32 15
  %66 = load ptr, ptr %65, align 8, !tbaa !18
  %67 = load ptr, ptr %2, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct.qnsearch_s, ptr %67, i32 0, i32 6
  %69 = load ptr, ptr %68, align 8, !tbaa !15
  %70 = load ptr, ptr %2, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.qnsearch_s, ptr %70, i32 0, i32 1
  %72 = load i32, ptr %71, align 8, !tbaa !9
  %73 = call float %63(ptr noundef %66, ptr noundef %69, i32 noundef %72)
  store float %73, ptr %10, align 4, !tbaa !14
  %74 = load ptr, ptr %2, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.qnsearch_s, ptr %74, i32 0, i32 0
  %76 = load ptr, ptr %75, align 8, !tbaa !16
  %77 = load i32, ptr %3, align 4, !tbaa !13
  %78 = zext i32 %77 to i64
  %79 = getelementptr inbounds float, ptr %76, i64 %78
  %80 = load float, ptr %79, align 4, !tbaa !14
  %81 = load ptr, ptr %2, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.qnsearch_s, ptr %81, i32 0, i32 6
  %83 = load ptr, ptr %82, align 8, !tbaa !15
  %84 = load i32, ptr %3, align 4, !tbaa !13
  %85 = zext i32 %84 to i64
  %86 = getelementptr inbounds float, ptr %83, i64 %85
  store float %80, ptr %86, align 4, !tbaa !14
  %87 = load ptr, ptr %2, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.qnsearch_s, ptr %87, i32 0, i32 13
  %89 = load ptr, ptr %88, align 8, !tbaa !17
  %90 = load ptr, ptr %2, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.qnsearch_s, ptr %90, i32 0, i32 15
  %92 = load ptr, ptr %91, align 8, !tbaa !18
  %93 = load ptr, ptr %2, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.qnsearch_s, ptr %93, i32 0, i32 6
  %95 = load ptr, ptr %94, align 8, !tbaa !15
  %96 = load ptr, ptr %2, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.qnsearch_s, ptr %96, i32 0, i32 1
  %98 = load i32, ptr %97, align 8, !tbaa !9
  %99 = call float %89(ptr noundef %92, ptr noundef %95, i32 noundef %98)
  store float %99, ptr %11, align 4, !tbaa !14
  %100 = load ptr, ptr %2, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.qnsearch_s, ptr %100, i32 0, i32 0
  %102 = load ptr, ptr %101, align 8, !tbaa !16
  %103 = load i32, ptr %3, align 4, !tbaa !13
  %104 = zext i32 %103 to i64
  %105 = getelementptr inbounds float, ptr %102, i64 %104
  %106 = load float, ptr %105, align 4, !tbaa !14
  %107 = load float, ptr %15, align 4, !tbaa !14
  %108 = fadd float %106, %107
  %109 = load ptr, ptr %2, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.qnsearch_s, ptr %109, i32 0, i32 6
  %111 = load ptr, ptr %110, align 8, !tbaa !15
  %112 = load i32, ptr %3, align 4, !tbaa !13
  %113 = zext i32 %112 to i64
  %114 = getelementptr inbounds float, ptr %111, i64 %113
  store float %108, ptr %114, align 4, !tbaa !14
  %115 = load ptr, ptr %2, align 8, !tbaa !5
  %116 = getelementptr inbounds %struct.qnsearch_s, ptr %115, i32 0, i32 13
  %117 = load ptr, ptr %116, align 8, !tbaa !17
  %118 = load ptr, ptr %2, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.qnsearch_s, ptr %118, i32 0, i32 15
  %120 = load ptr, ptr %119, align 8, !tbaa !18
  %121 = load ptr, ptr %2, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.qnsearch_s, ptr %121, i32 0, i32 6
  %123 = load ptr, ptr %122, align 8, !tbaa !15
  %124 = load ptr, ptr %2, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.qnsearch_s, ptr %124, i32 0, i32 1
  %126 = load i32, ptr %125, align 8, !tbaa !9
  %127 = call float %117(ptr noundef %120, ptr noundef %123, i32 noundef %126)
  store float %127, ptr %12, align 4, !tbaa !14
  %128 = load float, ptr %11, align 4, !tbaa !14
  %129 = load float, ptr %10, align 4, !tbaa !14
  %130 = fsub float %128, %129
  %131 = load float, ptr %15, align 4, !tbaa !14
  %132 = fdiv float %130, %131
  store float %132, ptr %13, align 4, !tbaa !14
  %133 = load float, ptr %12, align 4, !tbaa !14
  %134 = load float, ptr %11, align 4, !tbaa !14
  %135 = fsub float %133, %134
  %136 = load float, ptr %15, align 4, !tbaa !14
  %137 = fdiv float %135, %136
  store float %137, ptr %14, align 4, !tbaa !14
  %138 = load float, ptr %14, align 4, !tbaa !14
  %139 = load float, ptr %13, align 4, !tbaa !14
  %140 = fsub float %138, %139
  %141 = load float, ptr %15, align 4, !tbaa !14
  %142 = fdiv float %140, %141
  %143 = load ptr, ptr %2, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.qnsearch_s, ptr %143, i32 0, i32 9
  %145 = load ptr, ptr %144, align 8, !tbaa !19
  %146 = load i32, ptr %3, align 4, !tbaa !13
  %147 = load i32, ptr %5, align 4, !tbaa !13
  %148 = mul i32 %146, %147
  %149 = load i32, ptr %4, align 4, !tbaa !13
  %150 = add i32 %148, %149
  %151 = zext i32 %150 to i64
  %152 = getelementptr inbounds float, ptr %145, i64 %151
  store float %142, ptr %152, align 4, !tbaa !14
  br label %370

153:                                              ; preds = %41
  %154 = load ptr, ptr %2, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.qnsearch_s, ptr %154, i32 0, i32 0
  %156 = load ptr, ptr %155, align 8, !tbaa !16
  %157 = load i32, ptr %3, align 4, !tbaa !13
  %158 = zext i32 %157 to i64
  %159 = getelementptr inbounds float, ptr %156, i64 %158
  %160 = load float, ptr %159, align 4, !tbaa !14
  %161 = load float, ptr %15, align 4, !tbaa !14
  %162 = fsub float %160, %161
  %163 = load ptr, ptr %2, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.qnsearch_s, ptr %163, i32 0, i32 6
  %165 = load ptr, ptr %164, align 8, !tbaa !15
  %166 = load i32, ptr %3, align 4, !tbaa !13
  %167 = zext i32 %166 to i64
  %168 = getelementptr inbounds float, ptr %165, i64 %167
  store float %162, ptr %168, align 4, !tbaa !14
  %169 = load ptr, ptr %2, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.qnsearch_s, ptr %169, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !16
  %172 = load i32, ptr %4, align 4, !tbaa !13
  %173 = zext i32 %172 to i64
  %174 = getelementptr inbounds float, ptr %171, i64 %173
  %175 = load float, ptr %174, align 4, !tbaa !14
  %176 = load float, ptr %15, align 4, !tbaa !14
  %177 = fsub float %175, %176
  %178 = load ptr, ptr %2, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.qnsearch_s, ptr %178, i32 0, i32 6
  %180 = load ptr, ptr %179, align 8, !tbaa !15
  %181 = load i32, ptr %4, align 4, !tbaa !13
  %182 = zext i32 %181 to i64
  %183 = getelementptr inbounds float, ptr %180, i64 %182
  store float %177, ptr %183, align 4, !tbaa !14
  %184 = load ptr, ptr %2, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.qnsearch_s, ptr %184, i32 0, i32 13
  %186 = load ptr, ptr %185, align 8, !tbaa !17
  %187 = load ptr, ptr %2, align 8, !tbaa !5
  %188 = getelementptr inbounds %struct.qnsearch_s, ptr %187, i32 0, i32 15
  %189 = load ptr, ptr %188, align 8, !tbaa !18
  %190 = load ptr, ptr %2, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.qnsearch_s, ptr %190, i32 0, i32 6
  %192 = load ptr, ptr %191, align 8, !tbaa !15
  %193 = load ptr, ptr %2, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.qnsearch_s, ptr %193, i32 0, i32 1
  %195 = load i32, ptr %194, align 8, !tbaa !9
  %196 = call float %186(ptr noundef %189, ptr noundef %192, i32 noundef %195)
  store float %196, ptr %6, align 4, !tbaa !14
  %197 = load ptr, ptr %2, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.qnsearch_s, ptr %197, i32 0, i32 0
  %199 = load ptr, ptr %198, align 8, !tbaa !16
  %200 = load i32, ptr %3, align 4, !tbaa !13
  %201 = zext i32 %200 to i64
  %202 = getelementptr inbounds float, ptr %199, i64 %201
  %203 = load float, ptr %202, align 4, !tbaa !14
  %204 = load float, ptr %15, align 4, !tbaa !14
  %205 = fsub float %203, %204
  %206 = load ptr, ptr %2, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.qnsearch_s, ptr %206, i32 0, i32 6
  %208 = load ptr, ptr %207, align 8, !tbaa !15
  %209 = load i32, ptr %3, align 4, !tbaa !13
  %210 = zext i32 %209 to i64
  %211 = getelementptr inbounds float, ptr %208, i64 %210
  store float %205, ptr %211, align 4, !tbaa !14
  %212 = load ptr, ptr %2, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.qnsearch_s, ptr %212, i32 0, i32 0
  %214 = load ptr, ptr %213, align 8, !tbaa !16
  %215 = load i32, ptr %4, align 4, !tbaa !13
  %216 = zext i32 %215 to i64
  %217 = getelementptr inbounds float, ptr %214, i64 %216
  %218 = load float, ptr %217, align 4, !tbaa !14
  %219 = load float, ptr %15, align 4, !tbaa !14
  %220 = fadd float %218, %219
  %221 = load ptr, ptr %2, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.qnsearch_s, ptr %221, i32 0, i32 6
  %223 = load ptr, ptr %222, align 8, !tbaa !15
  %224 = load i32, ptr %4, align 4, !tbaa !13
  %225 = zext i32 %224 to i64
  %226 = getelementptr inbounds float, ptr %223, i64 %225
  store float %220, ptr %226, align 4, !tbaa !14
  %227 = load ptr, ptr %2, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.qnsearch_s, ptr %227, i32 0, i32 13
  %229 = load ptr, ptr %228, align 8, !tbaa !17
  %230 = load ptr, ptr %2, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.qnsearch_s, ptr %230, i32 0, i32 15
  %232 = load ptr, ptr %231, align 8, !tbaa !18
  %233 = load ptr, ptr %2, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.qnsearch_s, ptr %233, i32 0, i32 6
  %235 = load ptr, ptr %234, align 8, !tbaa !15
  %236 = load ptr, ptr %2, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.qnsearch_s, ptr %236, i32 0, i32 1
  %238 = load i32, ptr %237, align 8, !tbaa !9
  %239 = call float %229(ptr noundef %232, ptr noundef %235, i32 noundef %238)
  store float %239, ptr %7, align 4, !tbaa !14
  %240 = load ptr, ptr %2, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.qnsearch_s, ptr %240, i32 0, i32 0
  %242 = load ptr, ptr %241, align 8, !tbaa !16
  %243 = load i32, ptr %3, align 4, !tbaa !13
  %244 = zext i32 %243 to i64
  %245 = getelementptr inbounds float, ptr %242, i64 %244
  %246 = load float, ptr %245, align 4, !tbaa !14
  %247 = load float, ptr %15, align 4, !tbaa !14
  %248 = fadd float %246, %247
  %249 = load ptr, ptr %2, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.qnsearch_s, ptr %249, i32 0, i32 6
  %251 = load ptr, ptr %250, align 8, !tbaa !15
  %252 = load i32, ptr %3, align 4, !tbaa !13
  %253 = zext i32 %252 to i64
  %254 = getelementptr inbounds float, ptr %251, i64 %253
  store float %248, ptr %254, align 4, !tbaa !14
  %255 = load ptr, ptr %2, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.qnsearch_s, ptr %255, i32 0, i32 0
  %257 = load ptr, ptr %256, align 8, !tbaa !16
  %258 = load i32, ptr %4, align 4, !tbaa !13
  %259 = zext i32 %258 to i64
  %260 = getelementptr inbounds float, ptr %257, i64 %259
  %261 = load float, ptr %260, align 4, !tbaa !14
  %262 = load float, ptr %15, align 4, !tbaa !14
  %263 = fsub float %261, %262
  %264 = load ptr, ptr %2, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.qnsearch_s, ptr %264, i32 0, i32 6
  %266 = load ptr, ptr %265, align 8, !tbaa !15
  %267 = load i32, ptr %4, align 4, !tbaa !13
  %268 = zext i32 %267 to i64
  %269 = getelementptr inbounds float, ptr %266, i64 %268
  store float %263, ptr %269, align 4, !tbaa !14
  %270 = load ptr, ptr %2, align 8, !tbaa !5
  %271 = getelementptr inbounds %struct.qnsearch_s, ptr %270, i32 0, i32 13
  %272 = load ptr, ptr %271, align 8, !tbaa !17
  %273 = load ptr, ptr %2, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.qnsearch_s, ptr %273, i32 0, i32 15
  %275 = load ptr, ptr %274, align 8, !tbaa !18
  %276 = load ptr, ptr %2, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.qnsearch_s, ptr %276, i32 0, i32 6
  %278 = load ptr, ptr %277, align 8, !tbaa !15
  %279 = load ptr, ptr %2, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.qnsearch_s, ptr %279, i32 0, i32 1
  %281 = load i32, ptr %280, align 8, !tbaa !9
  %282 = call float %272(ptr noundef %275, ptr noundef %278, i32 noundef %281)
  store float %282, ptr %8, align 4, !tbaa !14
  %283 = load ptr, ptr %2, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.qnsearch_s, ptr %283, i32 0, i32 0
  %285 = load ptr, ptr %284, align 8, !tbaa !16
  %286 = load i32, ptr %3, align 4, !tbaa !13
  %287 = zext i32 %286 to i64
  %288 = getelementptr inbounds float, ptr %285, i64 %287
  %289 = load float, ptr %288, align 4, !tbaa !14
  %290 = load float, ptr %15, align 4, !tbaa !14
  %291 = fadd float %289, %290
  %292 = load ptr, ptr %2, align 8, !tbaa !5
  %293 = getelementptr inbounds %struct.qnsearch_s, ptr %292, i32 0, i32 6
  %294 = load ptr, ptr %293, align 8, !tbaa !15
  %295 = load i32, ptr %3, align 4, !tbaa !13
  %296 = zext i32 %295 to i64
  %297 = getelementptr inbounds float, ptr %294, i64 %296
  store float %291, ptr %297, align 4, !tbaa !14
  %298 = load ptr, ptr %2, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.qnsearch_s, ptr %298, i32 0, i32 0
  %300 = load ptr, ptr %299, align 8, !tbaa !16
  %301 = load i32, ptr %4, align 4, !tbaa !13
  %302 = zext i32 %301 to i64
  %303 = getelementptr inbounds float, ptr %300, i64 %302
  %304 = load float, ptr %303, align 4, !tbaa !14
  %305 = load float, ptr %15, align 4, !tbaa !14
  %306 = fadd float %304, %305
  %307 = load ptr, ptr %2, align 8, !tbaa !5
  %308 = getelementptr inbounds %struct.qnsearch_s, ptr %307, i32 0, i32 6
  %309 = load ptr, ptr %308, align 8, !tbaa !15
  %310 = load i32, ptr %4, align 4, !tbaa !13
  %311 = zext i32 %310 to i64
  %312 = getelementptr inbounds float, ptr %309, i64 %311
  store float %306, ptr %312, align 4, !tbaa !14
  %313 = load ptr, ptr %2, align 8, !tbaa !5
  %314 = getelementptr inbounds %struct.qnsearch_s, ptr %313, i32 0, i32 13
  %315 = load ptr, ptr %314, align 8, !tbaa !17
  %316 = load ptr, ptr %2, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.qnsearch_s, ptr %316, i32 0, i32 15
  %318 = load ptr, ptr %317, align 8, !tbaa !18
  %319 = load ptr, ptr %2, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.qnsearch_s, ptr %319, i32 0, i32 6
  %321 = load ptr, ptr %320, align 8, !tbaa !15
  %322 = load ptr, ptr %2, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.qnsearch_s, ptr %322, i32 0, i32 1
  %324 = load i32, ptr %323, align 8, !tbaa !9
  %325 = call float %315(ptr noundef %318, ptr noundef %321, i32 noundef %324)
  store float %325, ptr %9, align 4, !tbaa !14
  %326 = load float, ptr %7, align 4, !tbaa !14
  %327 = load float, ptr %6, align 4, !tbaa !14
  %328 = fsub float %326, %327
  %329 = load float, ptr %15, align 4, !tbaa !14
  %330 = fmul float 2.000000e+00, %329
  %331 = fdiv float %328, %330
  store float %331, ptr %13, align 4, !tbaa !14
  %332 = load float, ptr %9, align 4, !tbaa !14
  %333 = load float, ptr %8, align 4, !tbaa !14
  %334 = fsub float %332, %333
  %335 = load float, ptr %15, align 4, !tbaa !14
  %336 = fmul float 2.000000e+00, %335
  %337 = fdiv float %334, %336
  store float %337, ptr %14, align 4, !tbaa !14
  %338 = load float, ptr %14, align 4, !tbaa !14
  %339 = load float, ptr %13, align 4, !tbaa !14
  %340 = fsub float %338, %339
  %341 = load float, ptr %15, align 4, !tbaa !14
  %342 = fmul float 2.000000e+00, %341
  %343 = fdiv float %340, %342
  %344 = load ptr, ptr %2, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.qnsearch_s, ptr %344, i32 0, i32 9
  %346 = load ptr, ptr %345, align 8, !tbaa !19
  %347 = load i32, ptr %3, align 4, !tbaa !13
  %348 = load i32, ptr %5, align 4, !tbaa !13
  %349 = mul i32 %347, %348
  %350 = load i32, ptr %4, align 4, !tbaa !13
  %351 = add i32 %349, %350
  %352 = zext i32 %351 to i64
  %353 = getelementptr inbounds float, ptr %346, i64 %352
  store float %343, ptr %353, align 4, !tbaa !14
  %354 = load float, ptr %14, align 4, !tbaa !14
  %355 = load float, ptr %13, align 4, !tbaa !14
  %356 = fsub float %354, %355
  %357 = load float, ptr %15, align 4, !tbaa !14
  %358 = fmul float 2.000000e+00, %357
  %359 = fdiv float %356, %358
  %360 = load ptr, ptr %2, align 8, !tbaa !5
  %361 = getelementptr inbounds %struct.qnsearch_s, ptr %360, i32 0, i32 9
  %362 = load ptr, ptr %361, align 8, !tbaa !19
  %363 = load i32, ptr %4, align 4, !tbaa !13
  %364 = load i32, ptr %5, align 4, !tbaa !13
  %365 = mul i32 %363, %364
  %366 = load i32, ptr %3, align 4, !tbaa !13
  %367 = add i32 %365, %366
  %368 = zext i32 %367 to i64
  %369 = getelementptr inbounds float, ptr %362, i64 %368
  store float %359, ptr %369, align 4, !tbaa !14
  br label %370

370:                                              ; preds = %153, %45
  br label %371

371:                                              ; preds = %370
  %372 = load i32, ptr %4, align 4, !tbaa !13
  %373 = add i32 %372, 1
  store i32 %373, ptr %4, align 4, !tbaa !13
  br label %37, !llvm.loop !20

374:                                              ; preds = %37
  br label %375

375:                                              ; preds = %374
  %376 = load i32, ptr %3, align 4, !tbaa !13
  %377 = add i32 %376, 1
  store i32 %377, ptr %3, align 4, !tbaa !13
  br label %30, !llvm.loop !22

378:                                              ; preds = %30
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #3
  ret i32 0
}

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 8}
!10 = !{!"qnsearch_s", !6, i64 0, !11, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !12, i64 96, !6, i64 104, !11, i64 112}
!11 = !{!"int", !7, i64 0}
!12 = !{!"float", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!12, !12, i64 0}
!15 = !{!10, !6, i64 32}
!16 = !{!10, !6, i64 0}
!17 = !{!10, !6, i64 88}
!18 = !{!10, !6, i64 104}
!19 = !{!10, !6, i64 56}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = distinct !{!22, !21}


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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @qnsearch_compute_Hessian(ptr nocapture noundef readonly %0) local_unnamed_addr #0 {
  %2 = getelementptr inbounds i8, ptr %0, i64 8
  %3 = load i32, ptr %2, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %0, i64 32
  %5 = load ptr, ptr %4, align 8, !tbaa !12
  %6 = load ptr, ptr %0, align 8, !tbaa !13
  %7 = zext i32 %3 to i64
  %8 = shl nuw nsw i64 %7, 2
  tail call void @llvm.memmove.p0.p0.i64(ptr align 4 %5, ptr align 4 %6, i64 %8, i1 false)
  %9 = load i32, ptr %2, align 8, !tbaa !5
  %.not129 = icmp eq i32 %9, 0
  br i1 %.not129, label %._crit_edge, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %1
  %10 = getelementptr inbounds i8, ptr %0, i64 88
  %11 = getelementptr inbounds i8, ptr %0, i64 104
  %12 = getelementptr inbounds i8, ptr %0, i64 56
  br label %.preheader

.preheader:                                       ; preds = %.preheader.lr.ph, %127
  %indvars.iv135 = phi i64 [ 0, %.preheader.lr.ph ], [ %indvars.iv.next136, %127 ]
  %indvars.iv133 = phi i64 [ 1, %.preheader.lr.ph ], [ %indvars.iv.next134, %127 ]
  %13 = trunc nuw i64 %indvars.iv135 to i32
  %14 = mul i32 %3, %13
  %15 = add i32 %14, %13
  %16 = zext i32 %15 to i64
  br label %17

17:                                               ; preds = %.preheader, %126
  %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %126 ]
  %18 = icmp eq i64 %indvars.iv135, %indvars.iv
  %19 = load ptr, ptr %0, align 8, !tbaa !13
  %20 = getelementptr inbounds float, ptr %19, i64 %indvars.iv135
  %21 = load float, ptr %20, align 4, !tbaa !14
  %22 = fadd float %21, 0xBF847AE140000000
  %23 = load ptr, ptr %4, align 8, !tbaa !12
  %24 = getelementptr inbounds float, ptr %23, i64 %indvars.iv135
  store float %22, ptr %24, align 4, !tbaa !14
  br i1 %18, label %25, label %60

25:                                               ; preds = %17
  %26 = load ptr, ptr %10, align 8, !tbaa !15
  %27 = load ptr, ptr %11, align 8, !tbaa !16
  %28 = load i32, ptr %2, align 8, !tbaa !5
  %29 = tail call float %26(ptr noundef %27, ptr noundef %23, i32 noundef %28) #2
  %30 = load ptr, ptr %0, align 8, !tbaa !13
  %31 = getelementptr inbounds float, ptr %30, i64 %indvars.iv135
  %32 = load float, ptr %31, align 4, !tbaa !14
  %33 = load ptr, ptr %4, align 8, !tbaa !12
  %34 = getelementptr inbounds float, ptr %33, i64 %indvars.iv135
  store float %32, ptr %34, align 4, !tbaa !14
  %35 = load ptr, ptr %10, align 8, !tbaa !15
  %36 = load ptr, ptr %11, align 8, !tbaa !16
  %37 = load i32, ptr %2, align 8, !tbaa !5
  %38 = tail call float %35(ptr noundef %36, ptr noundef %33, i32 noundef %37) #2
  %39 = load ptr, ptr %0, align 8, !tbaa !13
  %40 = getelementptr inbounds float, ptr %39, i64 %indvars.iv135
  %41 = load float, ptr %40, align 4, !tbaa !14
  %42 = fadd float %41, 0x3F847AE140000000
  %43 = load ptr, ptr %4, align 8, !tbaa !12
  %44 = getelementptr inbounds float, ptr %43, i64 %indvars.iv135
  store float %42, ptr %44, align 4, !tbaa !14
  %45 = load ptr, ptr %10, align 8, !tbaa !15
  %46 = load ptr, ptr %11, align 8, !tbaa !16
  %47 = load i32, ptr %2, align 8, !tbaa !5
  %48 = tail call float %45(ptr noundef %46, ptr noundef %43, i32 noundef %47) #2
  %49 = insertelement <2 x float> poison, float %48, i64 0
  %50 = insertelement <2 x float> %49, float %38, i64 1
  %51 = insertelement <2 x float> poison, float %38, i64 0
  %52 = insertelement <2 x float> %51, float %29, i64 1
  %53 = fsub <2 x float> %50, %52
  %54 = fdiv <2 x float> %53, <float 0x3F847AE140000000, float 0x3F847AE140000000>
  %shift = shufflevector <2 x float> %54, <2 x float> poison, <2 x i32> <i32 1, i32 poison>
  %55 = fsub <2 x float> %54, %shift
  %56 = extractelement <2 x float> %55, i64 0
  %57 = fdiv float %56, 0x3F847AE140000000
  %58 = load ptr, ptr %12, align 8, !tbaa !17
  %59 = getelementptr inbounds float, ptr %58, i64 %16
  store float %57, ptr %59, align 4, !tbaa !14
  br label %126

60:                                               ; preds = %17
  %61 = getelementptr inbounds float, ptr %19, i64 %indvars.iv
  %62 = load float, ptr %61, align 4, !tbaa !14
  %63 = fadd float %62, 0xBF847AE140000000
  %64 = getelementptr inbounds float, ptr %23, i64 %indvars.iv
  store float %63, ptr %64, align 4, !tbaa !14
  %65 = load ptr, ptr %10, align 8, !tbaa !15
  %66 = load ptr, ptr %11, align 8, !tbaa !16
  %67 = load i32, ptr %2, align 8, !tbaa !5
  %68 = tail call float %65(ptr noundef %66, ptr noundef %23, i32 noundef %67) #2
  %69 = load ptr, ptr %0, align 8, !tbaa !13
  %70 = getelementptr inbounds float, ptr %69, i64 %indvars.iv135
  %71 = load float, ptr %70, align 4, !tbaa !14
  %72 = fadd float %71, 0xBF847AE140000000
  %73 = load ptr, ptr %4, align 8, !tbaa !12
  %74 = getelementptr inbounds float, ptr %73, i64 %indvars.iv135
  store float %72, ptr %74, align 4, !tbaa !14
  %75 = getelementptr inbounds float, ptr %69, i64 %indvars.iv
  %76 = load float, ptr %75, align 4, !tbaa !14
  %77 = fadd float %76, 0x3F847AE140000000
  %78 = getelementptr inbounds float, ptr %73, i64 %indvars.iv
  store float %77, ptr %78, align 4, !tbaa !14
  %79 = load ptr, ptr %10, align 8, !tbaa !15
  %80 = load ptr, ptr %11, align 8, !tbaa !16
  %81 = load i32, ptr %2, align 8, !tbaa !5
  %82 = tail call float %79(ptr noundef %80, ptr noundef %73, i32 noundef %81) #2
  %83 = load ptr, ptr %0, align 8, !tbaa !13
  %84 = getelementptr inbounds float, ptr %83, i64 %indvars.iv135
  %85 = load float, ptr %84, align 4, !tbaa !14
  %86 = fadd float %85, 0x3F847AE140000000
  %87 = load ptr, ptr %4, align 8, !tbaa !12
  %88 = getelementptr inbounds float, ptr %87, i64 %indvars.iv135
  store float %86, ptr %88, align 4, !tbaa !14
  %89 = getelementptr inbounds float, ptr %83, i64 %indvars.iv
  %90 = load float, ptr %89, align 4, !tbaa !14
  %91 = fadd float %90, 0xBF847AE140000000
  %92 = getelementptr inbounds float, ptr %87, i64 %indvars.iv
  store float %91, ptr %92, align 4, !tbaa !14
  %93 = load ptr, ptr %10, align 8, !tbaa !15
  %94 = load ptr, ptr %11, align 8, !tbaa !16
  %95 = load i32, ptr %2, align 8, !tbaa !5
  %96 = tail call float %93(ptr noundef %94, ptr noundef %87, i32 noundef %95) #2
  %97 = load ptr, ptr %0, align 8, !tbaa !13
  %98 = getelementptr inbounds float, ptr %97, i64 %indvars.iv135
  %99 = load float, ptr %98, align 4, !tbaa !14
  %100 = fadd float %99, 0x3F847AE140000000
  %101 = load ptr, ptr %4, align 8, !tbaa !12
  %102 = getelementptr inbounds float, ptr %101, i64 %indvars.iv135
  store float %100, ptr %102, align 4, !tbaa !14
  %103 = getelementptr inbounds float, ptr %97, i64 %indvars.iv
  %104 = load float, ptr %103, align 4, !tbaa !14
  %105 = fadd float %104, 0x3F847AE140000000
  %106 = getelementptr inbounds float, ptr %101, i64 %indvars.iv
  store float %105, ptr %106, align 4, !tbaa !14
  %107 = load ptr, ptr %10, align 8, !tbaa !15
  %108 = load ptr, ptr %11, align 8, !tbaa !16
  %109 = load i32, ptr %2, align 8, !tbaa !5
  %110 = tail call float %107(ptr noundef %108, ptr noundef %101, i32 noundef %109) #2
  %111 = fsub float %82, %68
  %112 = fdiv float %111, 0x3F947AE140000000
  %113 = fsub float %110, %96
  %114 = fdiv float %113, 0x3F947AE140000000
  %115 = fsub float %114, %112
  %116 = fdiv float %115, 0x3F947AE140000000
  %117 = load ptr, ptr %12, align 8, !tbaa !17
  %118 = trunc nuw i64 %indvars.iv to i32
  %119 = add i32 %14, %118
  %120 = zext i32 %119 to i64
  %121 = getelementptr inbounds float, ptr %117, i64 %120
  store float %116, ptr %121, align 4, !tbaa !14
  %122 = mul i32 %3, %118
  %123 = add i32 %122, %13
  %124 = zext i32 %123 to i64
  %125 = getelementptr inbounds float, ptr %117, i64 %124
  store float %116, ptr %125, align 4, !tbaa !14
  br label %126

126:                                              ; preds = %25, %60
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond = icmp eq i64 %indvars.iv.next, %indvars.iv133
  br i1 %exitcond, label %127, label %17, !llvm.loop !18

127:                                              ; preds = %126
  %indvars.iv.next136 = add nuw nsw i64 %indvars.iv135, 1
  %128 = load i32, ptr %2, align 8, !tbaa !5
  %129 = zext i32 %128 to i64
  %130 = icmp ult i64 %indvars.iv.next136, %129
  %indvars.iv.next134 = add nuw nsw i64 %indvars.iv133, 1
  br i1 %130, label %.preheader, label %._crit_edge, !llvm.loop !20

._crit_edge:                                      ; preds = %127, %1
  ret i32 0
}

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) #1

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { 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, !10, i64 8}
!6 = !{!"qnsearch_s", !7, i64 0, !10, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !11, i64 96, !7, i64 104, !10, i64 112}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"float", !8, i64 0}
!12 = !{!6, !7, i64 32}
!13 = !{!6, !7, i64 0}
!14 = !{!11, !11, i64 0}
!15 = !{!6, !7, i64 88}
!16 = !{!6, !7, i64 104}
!17 = !{!6, !7, i64 56}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass,VectorCombinePass