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

; 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.VlDsiftFilter_ = type { i32, i32, i32, i32, i32, i32, i32, i32, %struct.VlDsiftDescriptorGeometry_, i32, double, i32, i32, ptr, ptr, i32, i32, i32, ptr, ptr, ptr }
%struct.VlDsiftDescriptorGeometry_ = type { i32, i32, i32, i32, i32 }
%struct.VlDsiftKeypoint_ = type { double, double, double, double }

; 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 speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #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 void @vl_dsift_process(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i32, 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 i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca float, align 4
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  %26 = alloca float, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  %27 = load ptr, ptr %3, align 8, !tbaa !5
  call void @_vl_dsift_alloc_buffers(ptr noundef %27)
  store i32 0, ptr %5, align 4, !tbaa !9
  br label %28

28:                                               ; preds = %53, %2
  %29 = load i32, ptr %5, align 4, !tbaa !9
  %30 = load ptr, ptr %3, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %30, i32 0, i32 8
  %32 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %31, i32 0, i32 0
  %33 = load i32, ptr %32, align 8, !tbaa !11
  %34 = icmp slt i32 %29, %33
  br i1 %34, label %35, label %56

35:                                               ; preds = %28
  %36 = load ptr, ptr %3, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %36, i32 0, i32 18
  %38 = load ptr, ptr %37, align 8, !tbaa !15
  %39 = load i32, ptr %5, align 4, !tbaa !9
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds ptr, ptr %38, i64 %40
  %42 = load ptr, ptr %41, align 8, !tbaa !5
  %43 = load ptr, ptr %3, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %43, i32 0, i32 0
  %45 = load i32, ptr %44, align 8, !tbaa !16
  %46 = sext i32 %45 to i64
  %47 = mul i64 4, %46
  %48 = load ptr, ptr %3, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %48, i32 0, i32 1
  %50 = load i32, ptr %49, align 4, !tbaa !17
  %51 = sext i32 %50 to i64
  %52 = mul i64 %47, %51
  call void @llvm.memset.p0.i64(ptr align 4 %42, i8 0, i64 %52, i1 false)
  br label %53

53:                                               ; preds = %35
  %54 = load i32, ptr %5, align 4, !tbaa !9
  %55 = add nsw i32 %54, 1
  store i32 %55, ptr %5, align 4, !tbaa !9
  br label %28, !llvm.loop !18

56:                                               ; preds = %28
  store i32 0, ptr %7, align 4, !tbaa !9
  br label %57

57:                                               ; preds = %329, %56
  %58 = load i32, ptr %7, align 4, !tbaa !9
  %59 = load ptr, ptr %3, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %59, i32 0, i32 1
  %61 = load i32, ptr %60, align 4, !tbaa !17
  %62 = icmp slt i32 %58, %61
  br i1 %62, label %63, label %332

63:                                               ; preds = %57
  store i32 0, ptr %6, align 4, !tbaa !9
  br label %64

64:                                               ; preds = %325, %63
  %65 = load i32, ptr %6, align 4, !tbaa !9
  %66 = load ptr, ptr %3, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %66, i32 0, i32 0
  %68 = load i32, ptr %67, align 8, !tbaa !16
  %69 = icmp slt i32 %65, %68
  br i1 %69, label %70, label %328

70:                                               ; preds = %64
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %71 = load i32, ptr %7, align 4, !tbaa !9
  %72 = icmp eq i32 %71, 0
  br i1 %72, label %73, label %98

73:                                               ; preds = %70
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = load i32, ptr %7, align 4, !tbaa !9
  %76 = add nsw i32 %75, 1
  %77 = load ptr, ptr %3, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %77, i32 0, i32 0
  %79 = load i32, ptr %78, align 8, !tbaa !16
  %80 = mul nsw i32 %76, %79
  %81 = load i32, ptr %6, align 4, !tbaa !9
  %82 = add nsw i32 %80, %81
  %83 = sext i32 %82 to i64
  %84 = getelementptr inbounds float, ptr %74, i64 %83
  %85 = load float, ptr %84, align 4, !tbaa !20
  %86 = load ptr, ptr %4, align 8, !tbaa !5
  %87 = load i32, ptr %7, align 4, !tbaa !9
  %88 = load ptr, ptr %3, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %88, i32 0, i32 0
  %90 = load i32, ptr %89, align 8, !tbaa !16
  %91 = mul nsw i32 %87, %90
  %92 = load i32, ptr %6, align 4, !tbaa !9
  %93 = add nsw i32 %91, %92
  %94 = sext i32 %93 to i64
  %95 = getelementptr inbounds float, ptr %86, i64 %94
  %96 = load float, ptr %95, align 4, !tbaa !20
  %97 = fsub float %85, %96
  store float %97, ptr %9, align 4, !tbaa !20
  br label %158

98:                                               ; preds = %70
  %99 = load i32, ptr %7, align 4, !tbaa !9
  %100 = load ptr, ptr %3, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %100, i32 0, i32 1
  %102 = load i32, ptr %101, align 4, !tbaa !17
  %103 = sub nsw i32 %102, 1
  %104 = icmp eq i32 %99, %103
  br i1 %104, label %105, label %130

105:                                              ; preds = %98
  %106 = load ptr, ptr %4, align 8, !tbaa !5
  %107 = load i32, ptr %7, align 4, !tbaa !9
  %108 = load ptr, ptr %3, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %108, i32 0, i32 0
  %110 = load i32, ptr %109, align 8, !tbaa !16
  %111 = mul nsw i32 %107, %110
  %112 = load i32, ptr %6, align 4, !tbaa !9
  %113 = add nsw i32 %111, %112
  %114 = sext i32 %113 to i64
  %115 = getelementptr inbounds float, ptr %106, i64 %114
  %116 = load float, ptr %115, align 4, !tbaa !20
  %117 = load ptr, ptr %4, align 8, !tbaa !5
  %118 = load i32, ptr %7, align 4, !tbaa !9
  %119 = sub nsw i32 %118, 1
  %120 = load ptr, ptr %3, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %120, i32 0, i32 0
  %122 = load i32, ptr %121, align 8, !tbaa !16
  %123 = mul nsw i32 %119, %122
  %124 = load i32, ptr %6, align 4, !tbaa !9
  %125 = add nsw i32 %123, %124
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds float, ptr %117, i64 %126
  %128 = load float, ptr %127, align 4, !tbaa !20
  %129 = fsub float %116, %128
  store float %129, ptr %9, align 4, !tbaa !20
  br label %157

130:                                              ; preds = %98
  %131 = load ptr, ptr %4, align 8, !tbaa !5
  %132 = load i32, ptr %7, align 4, !tbaa !9
  %133 = add nsw i32 %132, 1
  %134 = load ptr, ptr %3, align 8, !tbaa !5
  %135 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %134, i32 0, i32 0
  %136 = load i32, ptr %135, align 8, !tbaa !16
  %137 = mul nsw i32 %133, %136
  %138 = load i32, ptr %6, align 4, !tbaa !9
  %139 = add nsw i32 %137, %138
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds float, ptr %131, i64 %140
  %142 = load float, ptr %141, align 4, !tbaa !20
  %143 = load ptr, ptr %4, align 8, !tbaa !5
  %144 = load i32, ptr %7, align 4, !tbaa !9
  %145 = sub nsw i32 %144, 1
  %146 = load ptr, ptr %3, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %146, i32 0, i32 0
  %148 = load i32, ptr %147, align 8, !tbaa !16
  %149 = mul nsw i32 %145, %148
  %150 = load i32, ptr %6, align 4, !tbaa !9
  %151 = add nsw i32 %149, %150
  %152 = sext i32 %151 to i64
  %153 = getelementptr inbounds float, ptr %143, i64 %152
  %154 = load float, ptr %153, align 4, !tbaa !20
  %155 = fsub float %142, %154
  %156 = fmul float 5.000000e-01, %155
  store float %156, ptr %9, align 4, !tbaa !20
  br label %157

157:                                              ; preds = %130, %105
  br label %158

158:                                              ; preds = %157, %73
  %159 = load i32, ptr %6, align 4, !tbaa !9
  %160 = icmp eq i32 %159, 0
  br i1 %160, label %161, label %186

161:                                              ; preds = %158
  %162 = load ptr, ptr %4, align 8, !tbaa !5
  %163 = load i32, ptr %7, align 4, !tbaa !9
  %164 = load ptr, ptr %3, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %164, i32 0, i32 0
  %166 = load i32, ptr %165, align 8, !tbaa !16
  %167 = mul nsw i32 %163, %166
  %168 = load i32, ptr %6, align 4, !tbaa !9
  %169 = add nsw i32 %168, 1
  %170 = add nsw i32 %167, %169
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds float, ptr %162, i64 %171
  %173 = load float, ptr %172, align 4, !tbaa !20
  %174 = load ptr, ptr %4, align 8, !tbaa !5
  %175 = load i32, ptr %7, align 4, !tbaa !9
  %176 = load ptr, ptr %3, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %176, i32 0, i32 0
  %178 = load i32, ptr %177, align 8, !tbaa !16
  %179 = mul nsw i32 %175, %178
  %180 = load i32, ptr %6, align 4, !tbaa !9
  %181 = add nsw i32 %179, %180
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds float, ptr %174, i64 %182
  %184 = load float, ptr %183, align 4, !tbaa !20
  %185 = fsub float %173, %184
  store float %185, ptr %8, align 4, !tbaa !20
  br label %246

186:                                              ; preds = %158
  %187 = load i32, ptr %6, align 4, !tbaa !9
  %188 = load ptr, ptr %3, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %188, i32 0, i32 0
  %190 = load i32, ptr %189, align 8, !tbaa !16
  %191 = sub nsw i32 %190, 1
  %192 = icmp eq i32 %187, %191
  br i1 %192, label %193, label %218

193:                                              ; preds = %186
  %194 = load ptr, ptr %4, align 8, !tbaa !5
  %195 = load i32, ptr %7, align 4, !tbaa !9
  %196 = load ptr, ptr %3, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %196, i32 0, i32 0
  %198 = load i32, ptr %197, align 8, !tbaa !16
  %199 = mul nsw i32 %195, %198
  %200 = load i32, ptr %6, align 4, !tbaa !9
  %201 = add nsw i32 %199, %200
  %202 = sext i32 %201 to i64
  %203 = getelementptr inbounds float, ptr %194, i64 %202
  %204 = load float, ptr %203, align 4, !tbaa !20
  %205 = load ptr, ptr %4, align 8, !tbaa !5
  %206 = load i32, ptr %7, align 4, !tbaa !9
  %207 = load ptr, ptr %3, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %207, i32 0, i32 0
  %209 = load i32, ptr %208, align 8, !tbaa !16
  %210 = mul nsw i32 %206, %209
  %211 = load i32, ptr %6, align 4, !tbaa !9
  %212 = sub nsw i32 %211, 1
  %213 = add nsw i32 %210, %212
  %214 = sext i32 %213 to i64
  %215 = getelementptr inbounds float, ptr %205, i64 %214
  %216 = load float, ptr %215, align 4, !tbaa !20
  %217 = fsub float %204, %216
  store float %217, ptr %8, align 4, !tbaa !20
  br label %245

218:                                              ; preds = %186
  %219 = load ptr, ptr %4, align 8, !tbaa !5
  %220 = load i32, ptr %7, align 4, !tbaa !9
  %221 = load ptr, ptr %3, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %221, i32 0, i32 0
  %223 = load i32, ptr %222, align 8, !tbaa !16
  %224 = mul nsw i32 %220, %223
  %225 = load i32, ptr %6, align 4, !tbaa !9
  %226 = add nsw i32 %225, 1
  %227 = add nsw i32 %224, %226
  %228 = sext i32 %227 to i64
  %229 = getelementptr inbounds float, ptr %219, i64 %228
  %230 = load float, ptr %229, align 4, !tbaa !20
  %231 = load ptr, ptr %4, align 8, !tbaa !5
  %232 = load i32, ptr %7, align 4, !tbaa !9
  %233 = load ptr, ptr %3, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %233, i32 0, i32 0
  %235 = load i32, ptr %234, align 8, !tbaa !16
  %236 = mul nsw i32 %232, %235
  %237 = load i32, ptr %6, align 4, !tbaa !9
  %238 = sub nsw i32 %237, 1
  %239 = add nsw i32 %236, %238
  %240 = sext i32 %239 to i64
  %241 = getelementptr inbounds float, ptr %231, i64 %240
  %242 = load float, ptr %241, align 4, !tbaa !20
  %243 = fsub float %230, %242
  %244 = fmul float 5.000000e-01, %243
  store float %244, ptr %8, align 4, !tbaa !20
  br label %245

245:                                              ; preds = %218, %193
  br label %246

246:                                              ; preds = %245, %161
  %247 = load float, ptr %9, align 4, !tbaa !20
  %248 = load float, ptr %8, align 4, !tbaa !20
  %249 = call float @vl_fast_atan2_f(float noundef %247, float noundef %248)
  store float %249, ptr %10, align 4, !tbaa !20
  %250 = load float, ptr %8, align 4, !tbaa !20
  %251 = load float, ptr %8, align 4, !tbaa !20
  %252 = load float, ptr %9, align 4, !tbaa !20
  %253 = load float, ptr %9, align 4, !tbaa !20
  %254 = fmul float %252, %253
  %255 = call float @llvm.fmuladd.f32(float %250, float %251, float %254)
  %256 = call float @vl_fast_sqrt_f(float noundef %255)
  store float %256, ptr %11, align 4, !tbaa !20
  %257 = load float, ptr %10, align 4, !tbaa !20
  %258 = call float @vl_mod_2pi_f(float noundef %257)
  %259 = fpext float %258 to double
  %260 = load ptr, ptr %3, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %260, i32 0, i32 8
  %262 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %261, i32 0, i32 0
  %263 = load i32, ptr %262, align 8, !tbaa !11
  %264 = sitofp i32 %263 to double
  %265 = fdiv double %264, 0x401921FB54442D18
  %266 = fmul double %259, %265
  %267 = fptrunc double %266 to float
  store float %267, ptr %12, align 4, !tbaa !20
  %268 = load float, ptr %12, align 4, !tbaa !20
  %269 = call i64 @vl_floor_f(float noundef %268)
  %270 = trunc i64 %269 to i32
  store i32 %270, ptr %14, align 4, !tbaa !9
  %271 = load float, ptr %12, align 4, !tbaa !20
  %272 = load i32, ptr %14, align 4, !tbaa !9
  %273 = sitofp i32 %272 to float
  %274 = fsub float %271, %273
  store float %274, ptr %13, align 4, !tbaa !20
  %275 = load float, ptr %13, align 4, !tbaa !20
  %276 = fsub float 1.000000e+00, %275
  %277 = load float, ptr %11, align 4, !tbaa !20
  %278 = fmul float %276, %277
  %279 = load ptr, ptr %3, align 8, !tbaa !5
  %280 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %279, i32 0, i32 18
  %281 = load ptr, ptr %280, align 8, !tbaa !15
  %282 = load i32, ptr %14, align 4, !tbaa !9
  %283 = load ptr, ptr %3, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %283, i32 0, i32 8
  %285 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %284, i32 0, i32 0
  %286 = load i32, ptr %285, align 8, !tbaa !11
  %287 = srem i32 %282, %286
  %288 = sext i32 %287 to i64
  %289 = getelementptr inbounds ptr, ptr %281, i64 %288
  %290 = load ptr, ptr %289, align 8, !tbaa !5
  %291 = load i32, ptr %6, align 4, !tbaa !9
  %292 = load i32, ptr %7, align 4, !tbaa !9
  %293 = load ptr, ptr %3, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %293, i32 0, i32 0
  %295 = load i32, ptr %294, align 8, !tbaa !16
  %296 = mul nsw i32 %292, %295
  %297 = add nsw i32 %291, %296
  %298 = sext i32 %297 to i64
  %299 = getelementptr inbounds float, ptr %290, i64 %298
  store float %278, ptr %299, align 4, !tbaa !20
  %300 = load float, ptr %13, align 4, !tbaa !20
  %301 = load float, ptr %11, align 4, !tbaa !20
  %302 = fmul float %300, %301
  %303 = load ptr, ptr %3, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %303, i32 0, i32 18
  %305 = load ptr, ptr %304, align 8, !tbaa !15
  %306 = load i32, ptr %14, align 4, !tbaa !9
  %307 = add nsw i32 %306, 1
  %308 = load ptr, ptr %3, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %308, i32 0, i32 8
  %310 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %309, i32 0, i32 0
  %311 = load i32, ptr %310, align 8, !tbaa !11
  %312 = srem i32 %307, %311
  %313 = sext i32 %312 to i64
  %314 = getelementptr inbounds ptr, ptr %305, i64 %313
  %315 = load ptr, ptr %314, align 8, !tbaa !5
  %316 = load i32, ptr %6, align 4, !tbaa !9
  %317 = load i32, ptr %7, align 4, !tbaa !9
  %318 = load ptr, ptr %3, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %318, i32 0, i32 0
  %320 = load i32, ptr %319, align 8, !tbaa !16
  %321 = mul nsw i32 %317, %320
  %322 = add nsw i32 %316, %321
  %323 = sext i32 %322 to i64
  %324 = getelementptr inbounds float, ptr %315, i64 %323
  store float %302, ptr %324, align 4, !tbaa !20
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  br label %325

325:                                              ; preds = %246
  %326 = load i32, ptr %6, align 4, !tbaa !9
  %327 = add nsw i32 %326, 1
  store i32 %327, ptr %6, align 4, !tbaa !9
  br label %64, !llvm.loop !22

328:                                              ; preds = %64
  br label %329

329:                                              ; preds = %328
  %330 = load i32, ptr %7, align 4, !tbaa !9
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %7, align 4, !tbaa !9
  br label %57, !llvm.loop !23

332:                                              ; preds = %57
  %333 = load ptr, ptr %3, align 8, !tbaa !5
  %334 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %333, i32 0, i32 9
  %335 = load i32, ptr %334, align 4, !tbaa !24
  %336 = icmp ne i32 %335, 0
  br i1 %336, label %337, label %339

337:                                              ; preds = %332
  %338 = load ptr, ptr %3, align 8, !tbaa !5
  call void @_vl_dsift_with_flat_window(ptr noundef %338)
  br label %341

339:                                              ; preds = %332
  %340 = load ptr, ptr %3, align 8, !tbaa !5
  call void @_vl_dsift_with_gaussian_window(ptr noundef %340)
  br label %341

341:                                              ; preds = %339, %337
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %342 = load ptr, ptr %3, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %342, i32 0, i32 13
  %344 = load ptr, ptr %343, align 8, !tbaa !25
  store ptr %344, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  %345 = load ptr, ptr %3, align 8, !tbaa !5
  %346 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %345, i32 0, i32 14
  %347 = load ptr, ptr %346, align 8, !tbaa !26
  store ptr %347, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  %348 = load ptr, ptr %3, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %348, i32 0, i32 8
  %350 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %349, i32 0, i32 3
  %351 = load i32, ptr %350, align 4, !tbaa !27
  %352 = load ptr, ptr %3, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %352, i32 0, i32 8
  %354 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %353, i32 0, i32 1
  %355 = load i32, ptr %354, align 4, !tbaa !28
  %356 = sub nsw i32 %355, 1
  %357 = mul nsw i32 %351, %356
  %358 = add nsw i32 %357, 1
  store i32 %358, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %359 = load ptr, ptr %3, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %359, i32 0, i32 8
  %361 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %360, i32 0, i32 4
  %362 = load i32, ptr %361, align 8, !tbaa !29
  %363 = load ptr, ptr %3, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %363, i32 0, i32 8
  %365 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %364, i32 0, i32 2
  %366 = load i32, ptr %365, align 8, !tbaa !30
  %367 = sub nsw i32 %366, 1
  %368 = mul nsw i32 %362, %367
  %369 = add nsw i32 %368, 1
  store i32 %369, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  %370 = load ptr, ptr %3, align 8, !tbaa !5
  %371 = call i32 @vl_dsift_get_descriptor_size(ptr noundef %370)
  store i32 %371, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #5
  %372 = load ptr, ptr %3, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %372, i32 0, i32 8
  %374 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %373, i32 0, i32 3
  %375 = load i32, ptr %374, align 4, !tbaa !27
  %376 = sitofp i32 %375 to float
  %377 = fmul float 5.000000e-01, %376
  %378 = load ptr, ptr %3, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %378, i32 0, i32 8
  %380 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %379, i32 0, i32 1
  %381 = load i32, ptr %380, align 4, !tbaa !28
  %382 = sub nsw i32 %381, 1
  %383 = sitofp i32 %382 to float
  %384 = fmul float %377, %383
  store float %384, ptr %23, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #5
  %385 = load ptr, ptr %3, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %385, i32 0, i32 8
  %387 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %386, i32 0, i32 4
  %388 = load i32, ptr %387, align 8, !tbaa !29
  %389 = sitofp i32 %388 to float
  %390 = fmul float 5.000000e-01, %389
  %391 = load ptr, ptr %3, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %391, i32 0, i32 8
  %393 = getelementptr inbounds %struct.VlDsiftDescriptorGeometry_, ptr %392, i32 0, i32 2
  %394 = load i32, ptr %393, align 8, !tbaa !30
  %395 = sub nsw i32 %394, 1
  %396 = sitofp i32 %395 to float
  %397 = fmul float %390, %396
  store float %397, ptr %24, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #5
  %398 = load i32, ptr %20, align 4, !tbaa !9
  %399 = load i32, ptr %21, align 4, !tbaa !9
  %400 = mul nsw i32 %398, %399
  %401 = sitofp i32 %400 to float
  store float %401, ptr %25, align 4, !tbaa !20
  %402 = load ptr, ptr %3, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %402, i32 0, i32 5
  %404 = load i32, ptr %403, align 4, !tbaa !31
  store i32 %404, ptr %18, align 4, !tbaa !9
  br label %405

405:                                              ; preds = %511, %341
  %406 = load i32, ptr %18, align 4, !tbaa !9
  %407 = load ptr, ptr %3, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %407, i32 0, i32 7
  %409 = load i32, ptr %408, align 4, !tbaa !32
  %410 = load i32, ptr %21, align 4, !tbaa !9
  %411 = sub nsw i32 %409, %410
  %412 = add nsw i32 %411, 1
  %413 = icmp sle i32 %406, %412
  br i1 %413, label %414, label %517

414:                                              ; preds = %405
  %415 = load ptr, ptr %3, align 8, !tbaa !5
  %416 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %415, i32 0, i32 4
  %417 = load i32, ptr %416, align 8, !tbaa !33
  store i32 %417, ptr %17, align 4, !tbaa !9
  br label %418

418:                                              ; preds = %504, %414
  %419 = load i32, ptr %17, align 4, !tbaa !9
  %420 = load ptr, ptr %3, align 8, !tbaa !5
  %421 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %420, i32 0, i32 6
  %422 = load i32, ptr %421, align 8, !tbaa !34
  %423 = load i32, ptr %20, align 4, !tbaa !9
  %424 = sub nsw i32 %422, %423
  %425 = add nsw i32 %424, 1
  %426 = icmp sle i32 %419, %425
  br i1 %426, label %427, label %510

427:                                              ; preds = %418
  %428 = load i32, ptr %17, align 4, !tbaa !9
  %429 = sitofp i32 %428 to float
  %430 = load float, ptr %23, align 4, !tbaa !20
  %431 = fadd float %429, %430
  %432 = fpext float %431 to double
  %433 = load ptr, ptr %15, align 8, !tbaa !5
  %434 = getelementptr inbounds %struct.VlDsiftKeypoint_, ptr %433, i32 0, i32 0
  store double %432, ptr %434, align 8, !tbaa !35
  %435 = load i32, ptr %18, align 4, !tbaa !9
  %436 = sitofp i32 %435 to float
  %437 = load float, ptr %24, align 4, !tbaa !20
  %438 = fadd float %436, %437
  %439 = fpext float %438 to double
  %440 = load ptr, ptr %15, align 8, !tbaa !5
  %441 = getelementptr inbounds %struct.VlDsiftKeypoint_, ptr %440, i32 0, i32 1
  store double %439, ptr %441, align 8, !tbaa !37
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #5
  store float 0.000000e+00, ptr %26, align 4, !tbaa !20
  store i32 0, ptr %19, align 4, !tbaa !9
  br label %442

442:                                              ; preds = %454, %427
  %443 = load i32, ptr %19, align 4, !tbaa !9
  %444 = load i32, ptr %22, align 4, !tbaa !9
  %445 = icmp slt i32 %443, %444
  br i1 %445, label %446, label %457

446:                                              ; preds = %442
  %447 = load ptr, ptr %16, align 8, !tbaa !5
  %448 = load i32, ptr %19, align 4, !tbaa !9
  %449 = sext i32 %448 to i64
  %450 = getelementptr inbounds float, ptr %447, i64 %449
  %451 = load float, ptr %450, align 4, !tbaa !20
  %452 = load float, ptr %26, align 4, !tbaa !20
  %453 = fadd float %452, %451
  store float %453, ptr %26, align 4, !tbaa !20
  br label %454

454:                                              ; preds = %446
  %455 = load i32, ptr %19, align 4, !tbaa !9
  %456 = add nsw i32 %455, 1
  store i32 %456, ptr %19, align 4, !tbaa !9
  br label %442, !llvm.loop !38

457:                                              ; preds = %442
  %458 = load float, ptr %25, align 4, !tbaa !20
  %459 = load float, ptr %26, align 4, !tbaa !20
  %460 = fdiv float %459, %458
  store float %460, ptr %26, align 4, !tbaa !20
  %461 = load float, ptr %26, align 4, !tbaa !20
  %462 = fpext float %461 to double
  %463 = load ptr, ptr %15, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.VlDsiftKeypoint_, ptr %463, i32 0, i32 3
  store double %462, ptr %464, align 8, !tbaa !39
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #5
  %465 = load ptr, ptr %16, align 8, !tbaa !5
  %466 = load ptr, ptr %16, align 8, !tbaa !5
  %467 = load i32, ptr %22, align 4, !tbaa !9
  %468 = sext i32 %467 to i64
  %469 = getelementptr inbounds float, ptr %466, i64 %468
  %470 = call float @_vl_dsift_normalize_histogram(ptr noundef %465, ptr noundef %469)
  store i32 0, ptr %19, align 4, !tbaa !9
  br label %471

471:                                              ; preds = %488, %457
  %472 = load i32, ptr %19, align 4, !tbaa !9
  %473 = load i32, ptr %22, align 4, !tbaa !9
  %474 = icmp slt i32 %472, %473
  br i1 %474, label %475, label %491

475:                                              ; preds = %471
  %476 = load ptr, ptr %16, align 8, !tbaa !5
  %477 = load i32, ptr %19, align 4, !tbaa !9
  %478 = sext i32 %477 to i64
  %479 = getelementptr inbounds float, ptr %476, i64 %478
  %480 = load float, ptr %479, align 4, !tbaa !20
  %481 = fcmp ogt float %480, 0x3FC99999A0000000
  br i1 %481, label %482, label %487

482:                                              ; preds = %475
  %483 = load ptr, ptr %16, align 8, !tbaa !5
  %484 = load i32, ptr %19, align 4, !tbaa !9
  %485 = sext i32 %484 to i64
  %486 = getelementptr inbounds float, ptr %483, i64 %485
  store float 0x3FC99999A0000000, ptr %486, align 4, !tbaa !20
  br label %487

487:                                              ; preds = %482, %475
  br label %488

488:                                              ; preds = %487
  %489 = load i32, ptr %19, align 4, !tbaa !9
  %490 = add nsw i32 %489, 1
  store i32 %490, ptr %19, align 4, !tbaa !9
  br label %471, !llvm.loop !40

491:                                              ; preds = %471
  %492 = load ptr, ptr %16, align 8, !tbaa !5
  %493 = load ptr, ptr %16, align 8, !tbaa !5
  %494 = load i32, ptr %22, align 4, !tbaa !9
  %495 = sext i32 %494 to i64
  %496 = getelementptr inbounds float, ptr %493, i64 %495
  %497 = call float @_vl_dsift_normalize_histogram(ptr noundef %492, ptr noundef %496)
  %498 = load ptr, ptr %15, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.VlDsiftKeypoint_, ptr %498, i32 1
  store ptr %499, ptr %15, align 8, !tbaa !5
  %500 = load i32, ptr %22, align 4, !tbaa !9
  %501 = load ptr, ptr %16, align 8, !tbaa !5
  %502 = sext i32 %500 to i64
  %503 = getelementptr inbounds float, ptr %501, i64 %502
  store ptr %503, ptr %16, align 8, !tbaa !5
  br label %504

504:                                              ; preds = %491
  %505 = load ptr, ptr %3, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %505, i32 0, i32 2
  %507 = load i32, ptr %506, align 8, !tbaa !41
  %508 = load i32, ptr %17, align 4, !tbaa !9
  %509 = add nsw i32 %508, %507
  store i32 %509, ptr %17, align 4, !tbaa !9
  br label %418, !llvm.loop !42

510:                                              ; preds = %418
  br label %511

511:                                              ; preds = %510
  %512 = load ptr, ptr %3, align 8, !tbaa !5
  %513 = getelementptr inbounds %struct.VlDsiftFilter_, ptr %512, i32 0, i32 3
  %514 = load i32, ptr %513, align 4, !tbaa !43
  %515 = load i32, ptr %18, align 4, !tbaa !9
  %516 = add nsw i32 %515, %514
  store i32 %516, ptr %18, align 4, !tbaa !9
  br label %405, !llvm.loop !44

517:                                              ; preds = %405
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #5
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden void @_vl_dsift_alloc_buffers(ptr noundef) #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_fast_atan2_f(float noundef, float noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_fast_sqrt_f(float noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_mod_2pi_f(float noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @vl_floor_f(float noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @_vl_dsift_with_flat_window(ptr noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @_vl_dsift_with_gaussian_window(ptr noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @vl_dsift_get_descriptor_size(ptr noundef) #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @_vl_dsift_normalize_histogram(ptr noundef, ptr noundef) #4

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

!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, !10, i64 32}
!12 = !{!"VlDsiftFilter_", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !13, i64 32, !10, i64 52, !14, i64 56, !10, i64 64, !10, i64 68, !6, i64 72, !6, i64 80, !10, i64 88, !10, i64 92, !10, i64 96, !6, i64 104, !6, i64 112, !6, i64 120}
!13 = !{!"VlDsiftDescriptorGeometry_", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16}
!14 = !{!"double", !7, i64 0}
!15 = !{!12, !6, i64 104}
!16 = !{!12, !10, i64 0}
!17 = !{!12, !10, i64 4}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = !{!21, !21, i64 0}
!21 = !{!"float", !7, i64 0}
!22 = distinct !{!22, !19}
!23 = distinct !{!23, !19}
!24 = !{!12, !10, i64 52}
!25 = !{!12, !6, i64 72}
!26 = !{!12, !6, i64 80}
!27 = !{!12, !10, i64 44}
!28 = !{!12, !10, i64 36}
!29 = !{!12, !10, i64 48}
!30 = !{!12, !10, i64 40}
!31 = !{!12, !10, i64 20}
!32 = !{!12, !10, i64 28}
!33 = !{!12, !10, i64 16}
!34 = !{!12, !10, i64 24}
!35 = !{!36, !14, i64 0}
!36 = !{!"VlDsiftKeypoint_", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24}
!37 = !{!36, !14, i64 8}
!38 = distinct !{!38, !19}
!39 = !{!36, !14, i64 24}
!40 = distinct !{!40, !19}
!41 = !{!12, !10, i64 8}
!42 = distinct !{!42, !19}
!43 = !{!12, !10, i64 12}
!44 = distinct !{!44, !19}


; 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: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #0

; Function Attrs: nounwind uwtable
define dso_local void @vl_dsift_process(ptr noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #1 {
  tail call void @_vl_dsift_alloc_buffers(ptr noundef %0)
  %3 = getelementptr inbounds i8, ptr %0, i64 32
  %4 = load i32, ptr %3, align 8, !tbaa !5
  %5 = icmp sgt i32 %4, 0
  br i1 %5, label %.lr.ph, label %.preheader171

.lr.ph:                                           ; preds = %2
  %6 = getelementptr inbounds i8, ptr %0, i64 104
  %7 = getelementptr inbounds i8, ptr %0, i64 4
  br label %14

.preheader171:                                    ; preds = %14, %2
  %8 = getelementptr inbounds i8, ptr %0, i64 4
  %9 = load i32, ptr %8, align 4, !tbaa !13
  %10 = icmp sgt i32 %9, 0
  br i1 %10, label %.preheader.lr.ph, label %._crit_edge176

.preheader.lr.ph:                                 ; preds = %.preheader171
  %11 = getelementptr inbounds i8, ptr %0, i64 104
  %12 = load i32, ptr %0, align 8, !tbaa !14
  %13 = icmp sgt i32 %12, 0
  br i1 %13, label %.preheader.preheader, label %._crit_edge176

.preheader.preheader:                             ; preds = %.preheader.lr.ph
  %invariant.gep = getelementptr i8, ptr %1, i64 -4
  %invariant.gep278 = getelementptr i8, ptr %1, i64 -4
  br label %.preheader

14:                                               ; preds = %.lr.ph, %14
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %14 ]
  %15 = load ptr, ptr %6, align 8, !tbaa !15
  %16 = getelementptr inbounds ptr, ptr %15, i64 %indvars.iv
  %17 = load ptr, ptr %16, align 8, !tbaa !16
  %18 = load i32, ptr %0, align 8, !tbaa !14
  %19 = sext i32 %18 to i64
  %20 = shl nsw i64 %19, 2
  %21 = load i32, ptr %7, align 4, !tbaa !13
  %22 = sext i32 %21 to i64
  %23 = mul i64 %20, %22
  tail call void @llvm.memset.p0.i64(ptr align 4 %17, i8 0, i64 %23, i1 false)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %24 = load i32, ptr %3, align 8, !tbaa !5
  %25 = sext i32 %24 to i64
  %26 = icmp slt i64 %indvars.iv.next, %25
  br i1 %26, label %14, label %.preheader171, !llvm.loop !17

.preheader:                                       ; preds = %.preheader.preheader, %._crit_edge
  %27 = phi i32 [ %203, %._crit_edge ], [ %9, %.preheader.preheader ]
  %28 = phi i32 [ %204, %._crit_edge ], [ %12, %.preheader.preheader ]
  %.0156175 = phi i32 [ %.pre-phi, %._crit_edge ], [ 0, %.preheader.preheader ]
  %29 = icmp sgt i32 %28, 0
  br i1 %29, label %.lr.ph174, label %.preheader.._crit_edge_crit_edge

.preheader.._crit_edge_crit_edge:                 ; preds = %.preheader
  %.pre269 = add nuw nsw i32 %.0156175, 1
  br label %._crit_edge

.lr.ph174:                                        ; preds = %.preheader
  %30 = icmp eq i32 %.0156175, 0
  %31 = add nuw nsw i32 %.0156175, 1
  %32 = add nsw i32 %.0156175, -1
  br i1 %30, label %53, label %33

33:                                               ; preds = %.lr.ph174
  %34 = add nsw i32 %27, -1
  %35 = icmp eq i32 %.0156175, %34
  %36 = mul nsw i32 %28, %32
  %37 = sext i32 %36 to i64
  %38 = getelementptr inbounds float, ptr %1, i64 %37
  %39 = load float, ptr %38, align 4, !tbaa !19
  br i1 %35, label %47, label %40

40:                                               ; preds = %33
  %41 = mul nsw i32 %28, %31
  %42 = sext i32 %41 to i64
  %43 = getelementptr inbounds float, ptr %1, i64 %42
  %44 = load float, ptr %43, align 4, !tbaa !19
  %45 = fsub float %44, %39
  %46 = fmul float %45, 5.000000e-01
  br label %59

47:                                               ; preds = %33
  %48 = mul nsw i32 %28, %.0156175
  %49 = sext i32 %48 to i64
  %50 = getelementptr inbounds float, ptr %1, i64 %49
  %51 = load float, ptr %50, align 4, !tbaa !19
  %52 = fsub float %51, %39
  br label %59

53:                                               ; preds = %.lr.ph174
  %54 = zext nneg i32 %28 to i64
  %55 = getelementptr inbounds float, ptr %1, i64 %54
  %56 = load float, ptr %55, align 4, !tbaa !19
  %57 = load float, ptr %1, align 4, !tbaa !19
  %58 = fsub float %56, %57
  br label %59

59:                                               ; preds = %53, %47, %40
  %.0158.peel = phi float [ %58, %53 ], [ %52, %47 ], [ %46, %40 ]
  %60 = mul nsw i32 %28, %.0156175
  %61 = sext i32 %60 to i64
  %62 = getelementptr float, ptr %1, i64 %61
  %63 = getelementptr i8, ptr %62, i64 4
  %64 = load float, ptr %63, align 4, !tbaa !19
  %65 = load float, ptr %62, align 4, !tbaa !19
  %66 = fsub float %64, %65
  %67 = tail call float @vl_fast_atan2_f(float noundef %.0158.peel, float noundef %66)
  %68 = fmul float %.0158.peel, %.0158.peel
  %69 = tail call float @llvm.fmuladd.f32(float %66, float %66, float %68)
  %70 = tail call float @vl_fast_sqrt_f(float noundef %69)
  %71 = tail call float @vl_mod_2pi_f(float noundef %67)
  %72 = fpext float %71 to double
  %73 = load i32, ptr %3, align 8, !tbaa !5
  %74 = sitofp i32 %73 to double
  %75 = fdiv double %74, 0x401921FB54442D18
  %76 = fmul double %75, %72
  %77 = fptrunc double %76 to float
  %78 = tail call i64 @vl_floor_f(float noundef %77)
  %79 = trunc i64 %78 to i32
  %80 = sitofp i32 %79 to float
  %81 = fsub float %77, %80
  %82 = fsub float 1.000000e+00, %81
  %83 = fmul float %70, %82
  %84 = load ptr, ptr %11, align 8, !tbaa !15
  %85 = load i32, ptr %3, align 8, !tbaa !5
  %86 = srem i32 %79, %85
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds ptr, ptr %84, i64 %87
  %89 = load ptr, ptr %88, align 8, !tbaa !16
  %90 = load i32, ptr %0, align 8, !tbaa !14
  %91 = mul nsw i32 %90, %.0156175
  %92 = sext i32 %91 to i64
  %93 = getelementptr inbounds float, ptr %89, i64 %92
  store float %83, ptr %93, align 4, !tbaa !19
  %94 = fmul float %70, %81
  %95 = add nsw i32 %79, 1
  %96 = srem i32 %95, %85
  %97 = sext i32 %96 to i64
  %98 = getelementptr inbounds ptr, ptr %84, i64 %97
  %99 = load ptr, ptr %98, align 8, !tbaa !16
  %100 = getelementptr inbounds float, ptr %99, i64 %92
  store float %94, ptr %100, align 4, !tbaa !19
  %101 = icmp sgt i32 %90, 1
  br i1 %101, label %.peel.next, label %._crit_edge.loopexit

.peel.next:                                       ; preds = %59, %163
  %indvars.iv243 = phi i64 [ %indvars.iv.next244, %163 ], [ 1, %59 ]
  %102 = phi i32 [ %187, %163 ], [ %90, %59 ]
  br i1 %30, label %103, label %112

103:                                              ; preds = %.peel.next
  %104 = trunc nuw nsw i64 %indvars.iv243 to i32
  %105 = add nsw i32 %102, %104
  %106 = sext i32 %105 to i64
  %107 = getelementptr inbounds float, ptr %1, i64 %106
  %108 = load float, ptr %107, align 4, !tbaa !19
  %109 = getelementptr inbounds float, ptr %1, i64 %indvars.iv243
  %110 = load float, ptr %109, align 4, !tbaa !19
  %111 = fsub float %108, %110
  br label %137

112:                                              ; preds = %.peel.next
  %113 = load i32, ptr %8, align 4, !tbaa !13
  %114 = add nsw i32 %113, -1
  %115 = icmp eq i32 %.0156175, %114
  %116 = trunc nuw nsw i64 %indvars.iv243 to i32
  %117 = mul nsw i32 %102, %32
  %118 = add nsw i32 %117, %116
  %119 = sext i32 %118 to i64
  %120 = getelementptr inbounds float, ptr %1, i64 %119
  %121 = load float, ptr %120, align 4, !tbaa !19
  br i1 %115, label %122, label %129

122:                                              ; preds = %112
  %123 = mul nsw i32 %102, %.0156175
  %124 = add nsw i32 %123, %116
  %125 = sext i32 %124 to i64
  %126 = getelementptr inbounds float, ptr %1, i64 %125
  %127 = load float, ptr %126, align 4, !tbaa !19
  %128 = fsub float %127, %121
  br label %137

129:                                              ; preds = %112
  %130 = mul nsw i32 %102, %31
  %131 = add nsw i32 %130, %116
  %132 = sext i32 %131 to i64
  %133 = getelementptr inbounds float, ptr %1, i64 %132
  %134 = load float, ptr %133, align 4, !tbaa !19
  %135 = fsub float %134, %121
  %136 = fmul float %135, 5.000000e-01
  br label %137

137:                                              ; preds = %103, %129, %122
  %.0158 = phi float [ %111, %103 ], [ %128, %122 ], [ %136, %129 ]
  %138 = add nsw i32 %102, -1
  %139 = zext i32 %138 to i64
  %140 = icmp eq i64 %indvars.iv243, %139
  %141 = mul nsw i32 %102, %.0156175
  %142 = trunc i64 %indvars.iv243 to i32
  br i1 %140, label %143, label %152

143:                                              ; preds = %137
  %144 = add nsw i32 %141, %142
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds float, ptr %1, i64 %145
  %147 = load float, ptr %146, align 4, !tbaa !19
  %148 = sext i32 %141 to i64
  %gep279 = getelementptr float, ptr %invariant.gep278, i64 %indvars.iv243
  %149 = getelementptr float, ptr %gep279, i64 %148
  %150 = load float, ptr %149, align 4, !tbaa !19
  %151 = fsub float %147, %150
  br label %163

152:                                              ; preds = %137
  %153 = add i32 %142, 1
  %154 = add nsw i32 %153, %141
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds float, ptr %1, i64 %155
  %157 = load float, ptr %156, align 4, !tbaa !19
  %158 = sext i32 %141 to i64
  %gep = getelementptr float, ptr %invariant.gep, i64 %indvars.iv243
  %159 = getelementptr float, ptr %gep, i64 %158
  %160 = load float, ptr %159, align 4, !tbaa !19
  %161 = fsub float %157, %160
  %162 = fmul float %161, 5.000000e-01
  br label %163

163:                                              ; preds = %143, %152
  %.0157 = phi float [ %151, %143 ], [ %162, %152 ]
  %164 = tail call float @vl_fast_atan2_f(float noundef %.0158, float noundef %.0157)
  %165 = fmul float %.0158, %.0158
  %166 = tail call float @llvm.fmuladd.f32(float %.0157, float %.0157, float %165)
  %167 = tail call float @vl_fast_sqrt_f(float noundef %166)
  %168 = tail call float @vl_mod_2pi_f(float noundef %164)
  %169 = fpext float %168 to double
  %170 = load i32, ptr %3, align 8, !tbaa !5
  %171 = sitofp i32 %170 to double
  %172 = fdiv double %171, 0x401921FB54442D18
  %173 = fmul double %172, %169
  %174 = fptrunc double %173 to float
  %175 = tail call i64 @vl_floor_f(float noundef %174)
  %176 = trunc i64 %175 to i32
  %177 = sitofp i32 %176 to float
  %178 = fsub float %174, %177
  %179 = fsub float 1.000000e+00, %178
  %180 = fmul float %167, %179
  %181 = load ptr, ptr %11, align 8, !tbaa !15
  %182 = load i32, ptr %3, align 8, !tbaa !5
  %183 = srem i32 %176, %182
  %184 = sext i32 %183 to i64
  %185 = getelementptr inbounds ptr, ptr %181, i64 %184
  %186 = load ptr, ptr %185, align 8, !tbaa !16
  %187 = load i32, ptr %0, align 8, !tbaa !14
  %188 = mul nsw i32 %187, %.0156175
  %189 = trunc nuw nsw i64 %indvars.iv243 to i32
  %190 = add nsw i32 %188, %189
  %191 = sext i32 %190 to i64
  %192 = getelementptr inbounds float, ptr %186, i64 %191
  store float %180, ptr %192, align 4, !tbaa !19
  %193 = fmul float %167, %178
  %194 = add nsw i32 %176, 1
  %195 = srem i32 %194, %182
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds ptr, ptr %181, i64 %196
  %198 = load ptr, ptr %197, align 8, !tbaa !16
  %199 = getelementptr inbounds float, ptr %198, i64 %191
  store float %193, ptr %199, align 4, !tbaa !19
  %indvars.iv.next244 = add nuw nsw i64 %indvars.iv243, 1
  %200 = sext i32 %187 to i64
  %201 = icmp slt i64 %indvars.iv.next244, %200
  br i1 %201, label %.peel.next, label %._crit_edge.loopexit, !llvm.loop !21

._crit_edge.loopexit:                             ; preds = %163, %59
  %202 = phi i32 [ %90, %59 ], [ %187, %163 ]
  %.pre = load i32, ptr %8, align 4, !tbaa !13
  br label %._crit_edge

._crit_edge:                                      ; preds = %.preheader.._crit_edge_crit_edge, %._crit_edge.loopexit
  %.pre-phi = phi i32 [ %.pre269, %.preheader.._crit_edge_crit_edge ], [ %31, %._crit_edge.loopexit ]
  %203 = phi i32 [ %27, %.preheader.._crit_edge_crit_edge ], [ %.pre, %._crit_edge.loopexit ]
  %204 = phi i32 [ %28, %.preheader.._crit_edge_crit_edge ], [ %202, %._crit_edge.loopexit ]
  %205 = icmp slt i32 %.pre-phi, %203
  br i1 %205, label %.preheader, label %._crit_edge176, !llvm.loop !23

._crit_edge176:                                   ; preds = %._crit_edge, %.preheader.lr.ph, %.preheader171
  %206 = getelementptr inbounds i8, ptr %0, i64 52
  %207 = load i32, ptr %206, align 4, !tbaa !25
  %.not = icmp eq i32 %207, 0
  br i1 %.not, label %209, label %208

208:                                              ; preds = %._crit_edge176
  tail call void @_vl_dsift_with_flat_window(ptr noundef nonnull %0)
  br label %210

209:                                              ; preds = %._crit_edge176
  tail call void @_vl_dsift_with_gaussian_window(ptr noundef nonnull %0)
  br label %210

210:                                              ; preds = %209, %208
  %211 = getelementptr inbounds i8, ptr %0, i64 72
  %212 = load ptr, ptr %211, align 8, !tbaa !26
  %213 = getelementptr inbounds i8, ptr %0, i64 80
  %214 = load ptr, ptr %213, align 8, !tbaa !27
  %215 = getelementptr inbounds i8, ptr %0, i64 44
  %216 = load i32, ptr %215, align 4, !tbaa !28
  %217 = getelementptr inbounds i8, ptr %0, i64 36
  %218 = load i32, ptr %217, align 4, !tbaa !29
  %219 = add nsw i32 %218, -1
  %220 = mul nsw i32 %219, %216
  %221 = add nsw i32 %220, 1
  %222 = getelementptr inbounds i8, ptr %0, i64 48
  %223 = load i32, ptr %222, align 8, !tbaa !30
  %224 = getelementptr inbounds i8, ptr %0, i64 40
  %225 = load i32, ptr %224, align 8, !tbaa !31
  %226 = add nsw i32 %225, -1
  %227 = mul nsw i32 %226, %223
  %228 = add nsw i32 %227, 1
  %229 = tail call i32 @vl_dsift_get_descriptor_size(ptr noundef nonnull %0)
  %.fr228 = freeze i32 %229
  %230 = load i32, ptr %215, align 4, !tbaa !28
  %231 = sitofp i32 %230 to float
  %232 = fmul float %231, 5.000000e-01
  %233 = load i32, ptr %217, align 4, !tbaa !29
  %234 = add nsw i32 %233, -1
  %235 = sitofp i32 %234 to float
  %236 = fmul float %232, %235
  %237 = load i32, ptr %222, align 8, !tbaa !30
  %238 = sitofp i32 %237 to float
  %239 = fmul float %238, 5.000000e-01
  %240 = load i32, ptr %224, align 8, !tbaa !31
  %241 = add nsw i32 %240, -1
  %242 = sitofp i32 %241 to float
  %243 = fmul float %239, %242
  %244 = mul nsw i32 %228, %221
  %245 = sitofp i32 %244 to float
  %246 = getelementptr inbounds i8, ptr %0, i64 20
  %247 = load i32, ptr %246, align 4, !tbaa !32
  %248 = getelementptr inbounds i8, ptr %0, i64 28
  %249 = load i32, ptr %248, align 4, !tbaa !33
  %250 = sub i32 %249, %227
  %.not168210 = icmp sgt i32 %247, %250
  br i1 %.not168210, label %._crit_edge216, label %.lr.ph215

.lr.ph215:                                        ; preds = %210
  %251 = getelementptr inbounds i8, ptr %0, i64 16
  %252 = getelementptr inbounds i8, ptr %0, i64 24
  %253 = icmp sgt i32 %.fr228, 0
  %254 = sext i32 %.fr228 to i64
  %255 = getelementptr inbounds i8, ptr %0, i64 8
  %256 = fdiv float 0.000000e+00, %245
  %257 = fpext float %256 to double
  %258 = getelementptr inbounds i8, ptr %0, i64 12
  %.pre267 = load i32, ptr %252, align 8, !tbaa !34
  br i1 %253, label %.lr.ph215.split.us.split.us.preheader, label %.lr.ph215.split.split

.lr.ph215.split.us.split.us.preheader:            ; preds = %.lr.ph215
  %wide.trip.count258 = zext nneg i32 %.fr228 to i64
  %xtraiter = and i64 %wide.trip.count258, 7
  %259 = icmp ult i32 %.fr228, 8
  %unroll_iter = and i64 %wide.trip.count258, 2147483640
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %min.iters.check = icmp ult i32 %.fr228, 8
  %n.vec = and i64 %wide.trip.count258, 2147483640
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count258
  br label %.lr.ph215.split.us.split.us

.lr.ph215.split.us.split.us:                      ; preds = %.lr.ph215.split.us.split.us.preheader, %._crit_edge192.split.us.us.split.us.us
  %260 = phi i32 [ %264, %._crit_edge192.split.us.us.split.us.us ], [ %249, %.lr.ph215.split.us.split.us.preheader ]
  %261 = phi i32 [ %265, %._crit_edge192.split.us.us.split.us.us ], [ %.pre267, %.lr.ph215.split.us.split.us.preheader ]
  %.0159213.us.us = phi ptr [ %.1.lcssa.us.us, %._crit_edge192.split.us.us.split.us.us ], [ %212, %.lr.ph215.split.us.split.us.preheader ]
  %.0162212.us.us = phi i32 [ %267, %._crit_edge192.split.us.us.split.us.us ], [ %247, %.lr.ph215.split.us.split.us.preheader ]
  %.0164211.us.us = phi ptr [ %.1165.lcssa.us.us, %._crit_edge192.split.us.us.split.us.us ], [ %214, %.lr.ph215.split.us.split.us.preheader ]
  %262 = load i32, ptr %251, align 8, !tbaa !35
  %263 = sub i32 %261, %220
  %.not169186.us.us = icmp sgt i32 %262, %263
  br i1 %.not169186.us.us, label %._crit_edge192.split.us.us.split.us.us, label %.lr.ph191.us.us

._crit_edge192.split.us.us.split.us.us.loopexit:  ; preds = %._crit_edge185.us.us.us.us
  %.pre268 = load i32, ptr %248, align 4, !tbaa !33
  br label %._crit_edge192.split.us.us.split.us.us

._crit_edge192.split.us.us.split.us.us:           ; preds = %._crit_edge192.split.us.us.split.us.us.loopexit, %.lr.ph215.split.us.split.us
  %264 = phi i32 [ %260, %.lr.ph215.split.us.split.us ], [ %.pre268, %._crit_edge192.split.us.us.split.us.us.loopexit ]
  %265 = phi i32 [ %261, %.lr.ph215.split.us.split.us ], [ %345, %._crit_edge192.split.us.us.split.us.us.loopexit ]
  %.1165.lcssa.us.us = phi ptr [ %.0164211.us.us, %.lr.ph215.split.us.split.us ], [ %311, %._crit_edge192.split.us.us.split.us.us.loopexit ]
  %.1.lcssa.us.us = phi ptr [ %.0159213.us.us, %.lr.ph215.split.us.split.us ], [ %342, %._crit_edge192.split.us.us.split.us.us.loopexit ]
  %266 = load i32, ptr %258, align 4, !tbaa !36
  %267 = add nsw i32 %266, %.0162212.us.us
  %268 = sub i32 %264, %227
  %.not168.us.us = icmp sgt i32 %267, %268
  br i1 %.not168.us.us, label %._crit_edge216, label %.lr.ph215.split.us.split.us, !llvm.loop !37

.lr.ph191.us.us:                                  ; preds = %.lr.ph215.split.us.split.us
  %269 = sitofp i32 %.0162212.us.us to float
  %270 = fadd float %243, %269
  %271 = fpext float %270 to double
  br label %.lr.ph180.us.us.us.us

.lr.ph180.us.us.us.us:                            ; preds = %._crit_edge185.us.us.us.us, %.lr.ph191.us.us
  %.1189.us.us.us.us = phi ptr [ %.0159213.us.us, %.lr.ph191.us.us ], [ %342, %._crit_edge185.us.us.us.us ]
  %.0163188.us.us.us.us = phi i32 [ %262, %.lr.ph191.us.us ], [ %344, %._crit_edge185.us.us.us.us ]
  %.1165187.us.us.us.us = phi ptr [ %.0164211.us.us, %.lr.ph191.us.us ], [ %311, %._crit_edge185.us.us.us.us ]
  %272 = sitofp i32 %.0163188.us.us.us.us to float
  %273 = fadd float %236, %272
  %274 = fpext float %273 to double
  store double %274, ptr %.1189.us.us.us.us, align 8, !tbaa !38
  %275 = getelementptr inbounds i8, ptr %.1189.us.us.us.us, i64 8
  store double %271, ptr %275, align 8, !tbaa !40
  br i1 %259, label %._crit_edge181.us.us.us.us.unr-lcssa, label %.lr.ph180.us.us.us.us.new

scalar.ph:                                        ; preds = %scalar.ph.preheader, %280
  %indvars.iv260 = phi i64 [ %indvars.iv.next261, %280 ], [ %indvars.iv260.ph, %scalar.ph.preheader ]
  %276 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv260
  %277 = load float, ptr %276, align 4, !tbaa !19
  %278 = fcmp ogt float %277, 0x3FC99999A0000000
  br i1 %278, label %279, label %280

279:                                              ; preds = %scalar.ph
  store float 0x3FC99999A0000000, ptr %276, align 4, !tbaa !19
  br label %280

280:                                              ; preds = %279, %scalar.ph
  %indvars.iv.next261 = add nuw nsw i64 %indvars.iv260, 1
  %exitcond264.not = icmp eq i64 %indvars.iv.next261, %wide.trip.count258
  br i1 %exitcond264.not, label %._crit_edge185.us.us.us.us, label %scalar.ph, !llvm.loop !41

.lr.ph180.us.us.us.us.new:                        ; preds = %.lr.ph180.us.us.us.us, %.lr.ph180.us.us.us.us.new
  %indvars.iv255 = phi i64 [ %indvars.iv.next256.7, %.lr.ph180.us.us.us.us.new ], [ 0, %.lr.ph180.us.us.us.us ]
  %.0178.us.us.us.us = phi float [ %304, %.lr.ph180.us.us.us.us.new ], [ 0.000000e+00, %.lr.ph180.us.us.us.us ]
  %niter = phi i64 [ %niter.next.7, %.lr.ph180.us.us.us.us.new ], [ 0, %.lr.ph180.us.us.us.us ]
  %281 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv255
  %282 = load float, ptr %281, align 4, !tbaa !19
  %283 = fadd float %.0178.us.us.us.us, %282
  %indvars.iv.next256 = or disjoint i64 %indvars.iv255, 1
  %284 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256
  %285 = load float, ptr %284, align 4, !tbaa !19
  %286 = fadd float %283, %285
  %indvars.iv.next256.1 = or disjoint i64 %indvars.iv255, 2
  %287 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.1
  %288 = load float, ptr %287, align 4, !tbaa !19
  %289 = fadd float %286, %288
  %indvars.iv.next256.2 = or disjoint i64 %indvars.iv255, 3
  %290 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.2
  %291 = load float, ptr %290, align 4, !tbaa !19
  %292 = fadd float %289, %291
  %indvars.iv.next256.3 = or disjoint i64 %indvars.iv255, 4
  %293 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.3
  %294 = load float, ptr %293, align 4, !tbaa !19
  %295 = fadd float %292, %294
  %indvars.iv.next256.4 = or disjoint i64 %indvars.iv255, 5
  %296 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.4
  %297 = load float, ptr %296, align 4, !tbaa !19
  %298 = fadd float %295, %297
  %indvars.iv.next256.5 = or disjoint i64 %indvars.iv255, 6
  %299 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.5
  %300 = load float, ptr %299, align 4, !tbaa !19
  %301 = fadd float %298, %300
  %indvars.iv.next256.6 = or disjoint i64 %indvars.iv255, 7
  %302 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv.next256.6
  %303 = load float, ptr %302, align 4, !tbaa !19
  %304 = fadd float %301, %303
  %indvars.iv.next256.7 = add nuw nsw i64 %indvars.iv255, 8
  %niter.next.7 = add i64 %niter, 8
  %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
  br i1 %niter.ncmp.7, label %._crit_edge181.us.us.us.us.unr-lcssa, label %.lr.ph180.us.us.us.us.new, !llvm.loop !44

._crit_edge181.us.us.us.us.unr-lcssa:             ; preds = %.lr.ph180.us.us.us.us.new, %.lr.ph180.us.us.us.us
  %.lcssa.ph = phi float [ poison, %.lr.ph180.us.us.us.us ], [ %304, %.lr.ph180.us.us.us.us.new ]
  %indvars.iv255.unr = phi i64 [ 0, %.lr.ph180.us.us.us.us ], [ %indvars.iv.next256.7, %.lr.ph180.us.us.us.us.new ]
  %.0178.us.us.us.us.unr = phi float [ 0.000000e+00, %.lr.ph180.us.us.us.us ], [ %304, %.lr.ph180.us.us.us.us.new ]
  br i1 %lcmp.mod.not, label %._crit_edge181.us.us.us.us, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge181.us.us.us.us.unr-lcssa, %.epil.preheader
  %indvars.iv255.epil = phi i64 [ %indvars.iv.next256.epil, %.epil.preheader ], [ %indvars.iv255.unr, %._crit_edge181.us.us.us.us.unr-lcssa ]
  %.0178.us.us.us.us.epil = phi float [ %307, %.epil.preheader ], [ %.0178.us.us.us.us.unr, %._crit_edge181.us.us.us.us.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge181.us.us.us.us.unr-lcssa ]
  %305 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %indvars.iv255.epil
  %306 = load float, ptr %305, align 4, !tbaa !19
  %307 = fadd float %.0178.us.us.us.us.epil, %306
  %indvars.iv.next256.epil = add nuw nsw i64 %indvars.iv255.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge181.us.us.us.us, label %.epil.preheader, !llvm.loop !45

._crit_edge181.us.us.us.us:                       ; preds = %.epil.preheader, %._crit_edge181.us.us.us.us.unr-lcssa
  %.lcssa = phi float [ %.lcssa.ph, %._crit_edge181.us.us.us.us.unr-lcssa ], [ %307, %.epil.preheader ]
  %308 = fdiv float %.lcssa, %245
  %309 = fpext float %308 to double
  %310 = getelementptr inbounds i8, ptr %.1189.us.us.us.us, i64 24
  store double %309, ptr %310, align 8, !tbaa !47
  %311 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %254
  %312 = tail call float @_vl_dsift_normalize_histogram(ptr noundef nonnull %.1165187.us.us.us.us, ptr noundef nonnull %311)
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.body

scalar.ph.preheader:                              ; preds = %middle.block, %._crit_edge181.us.us.us.us
  %indvars.iv260.ph = phi i64 [ 0, %._crit_edge181.us.us.us.us ], [ %n.vec, %middle.block ]
  br label %scalar.ph

vector.body:                                      ; preds = %._crit_edge181.us.us.us.us, %pred.store.continue302
  %index = phi i64 [ %index.next, %pred.store.continue302 ], [ 0, %._crit_edge181.us.us.us.us ]
  %313 = or disjoint i64 %index, 4
  %314 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %index
  %315 = getelementptr inbounds i8, ptr %314, i64 16
  %wide.load = load <4 x float>, ptr %314, align 4, !tbaa !19
  %wide.load288 = load <4 x float>, ptr %315, align 4, !tbaa !19
  %316 = fcmp ogt <4 x float> %wide.load, <float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000>
  %317 = fcmp ogt <4 x float> %wide.load288, <float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000, float 0x3FC99999A0000000>
  %318 = extractelement <4 x i1> %316, i64 0
  br i1 %318, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body
  %319 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %index
  store float 0x3FC99999A0000000, ptr %319, align 4, !tbaa !19
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body
  %320 = extractelement <4 x i1> %316, i64 1
  br i1 %320, label %pred.store.if289, label %pred.store.continue290

pred.store.if289:                                 ; preds = %pred.store.continue
  %321 = or disjoint i64 %index, 1
  %322 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %321
  store float 0x3FC99999A0000000, ptr %322, align 4, !tbaa !19
  br label %pred.store.continue290

pred.store.continue290:                           ; preds = %pred.store.if289, %pred.store.continue
  %323 = extractelement <4 x i1> %316, i64 2
  br i1 %323, label %pred.store.if291, label %pred.store.continue292

pred.store.if291:                                 ; preds = %pred.store.continue290
  %324 = or disjoint i64 %index, 2
  %325 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %324
  store float 0x3FC99999A0000000, ptr %325, align 4, !tbaa !19
  br label %pred.store.continue292

pred.store.continue292:                           ; preds = %pred.store.if291, %pred.store.continue290
  %326 = extractelement <4 x i1> %316, i64 3
  br i1 %326, label %pred.store.if293, label %pred.store.continue294

pred.store.if293:                                 ; preds = %pred.store.continue292
  %327 = or disjoint i64 %index, 3
  %328 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %327
  store float 0x3FC99999A0000000, ptr %328, align 4, !tbaa !19
  br label %pred.store.continue294

pred.store.continue294:                           ; preds = %pred.store.if293, %pred.store.continue292
  %329 = extractelement <4 x i1> %317, i64 0
  br i1 %329, label %pred.store.if295, label %pred.store.continue296

pred.store.if295:                                 ; preds = %pred.store.continue294
  %330 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %313
  store float 0x3FC99999A0000000, ptr %330, align 4, !tbaa !19
  br label %pred.store.continue296

pred.store.continue296:                           ; preds = %pred.store.if295, %pred.store.continue294
  %331 = extractelement <4 x i1> %317, i64 1
  br i1 %331, label %pred.store.if297, label %pred.store.continue298

pred.store.if297:                                 ; preds = %pred.store.continue296
  %332 = or disjoint i64 %index, 5
  %333 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %332
  store float 0x3FC99999A0000000, ptr %333, align 4, !tbaa !19
  br label %pred.store.continue298

pred.store.continue298:                           ; preds = %pred.store.if297, %pred.store.continue296
  %334 = extractelement <4 x i1> %317, i64 2
  br i1 %334, label %pred.store.if299, label %pred.store.continue300

pred.store.if299:                                 ; preds = %pred.store.continue298
  %335 = or disjoint i64 %index, 6
  %336 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %335
  store float 0x3FC99999A0000000, ptr %336, align 4, !tbaa !19
  br label %pred.store.continue300

pred.store.continue300:                           ; preds = %pred.store.if299, %pred.store.continue298
  %337 = extractelement <4 x i1> %317, i64 3
  br i1 %337, label %pred.store.if301, label %pred.store.continue302

pred.store.if301:                                 ; preds = %pred.store.continue300
  %338 = or disjoint i64 %index, 7
  %339 = getelementptr inbounds float, ptr %.1165187.us.us.us.us, i64 %338
  store float 0x3FC99999A0000000, ptr %339, align 4, !tbaa !19
  br label %pred.store.continue302

pred.store.continue302:                           ; preds = %pred.store.if301, %pred.store.continue300
  %index.next = add nuw i64 %index, 8
  %340 = icmp eq i64 %index.next, %n.vec
  br i1 %340, label %middle.block, label %vector.body, !llvm.loop !48

middle.block:                                     ; preds = %pred.store.continue302
  br i1 %cmp.n, label %._crit_edge185.us.us.us.us, label %scalar.ph.preheader

._crit_edge185.us.us.us.us:                       ; preds = %280, %middle.block
  %341 = tail call float @_vl_dsift_normalize_histogram(ptr noundef nonnull %.1165187.us.us.us.us, ptr noundef nonnull %311)
  %342 = getelementptr inbounds i8, ptr %.1189.us.us.us.us, i64 32
  %343 = load i32, ptr %255, align 8, !tbaa !49
  %344 = add nsw i32 %343, %.0163188.us.us.us.us
  %345 = load i32, ptr %252, align 8, !tbaa !34
  %346 = sub i32 %345, %220
  %.not169.us.us.us.us = icmp sgt i32 %344, %346
  br i1 %.not169.us.us.us.us, label %._crit_edge192.split.us.us.split.us.us.loopexit, label %.lr.ph180.us.us.us.us, !llvm.loop !50

.lr.ph215.split.split:                            ; preds = %.lr.ph215, %._crit_edge192.split.split
  %347 = phi i32 [ %368, %._crit_edge192.split.split ], [ %249, %.lr.ph215 ]
  %348 = phi i32 [ %369, %._crit_edge192.split.split ], [ %.pre267, %.lr.ph215 ]
  %.0159213 = phi ptr [ %.1.lcssa, %._crit_edge192.split.split ], [ %212, %.lr.ph215 ]
  %.0162212 = phi i32 [ %371, %._crit_edge192.split.split ], [ %247, %.lr.ph215 ]
  %.0164211 = phi ptr [ %.1165.lcssa, %._crit_edge192.split.split ], [ %214, %.lr.ph215 ]
  %349 = load i32, ptr %251, align 8, !tbaa !35
  %350 = sub i32 %348, %220
  %.not169186 = icmp sgt i32 %349, %350
  br i1 %.not169186, label %._crit_edge192.split.split, label %.lr.ph191

.lr.ph191:                                        ; preds = %.lr.ph215.split.split
  %351 = sitofp i32 %.0162212 to float
  %352 = fadd float %243, %351
  %353 = fpext float %352 to double
  br label %354

354:                                              ; preds = %.lr.ph191, %354
  %.1189 = phi ptr [ %.0159213, %.lr.ph191 ], [ %363, %354 ]
  %.0163188 = phi i32 [ %349, %.lr.ph191 ], [ %365, %354 ]
  %.1165187 = phi ptr [ %.0164211, %.lr.ph191 ], [ %360, %354 ]
  %355 = sitofp i32 %.0163188 to float
  %356 = fadd float %236, %355
  %357 = fpext float %356 to double
  store double %357, ptr %.1189, align 8, !tbaa !38
  %358 = getelementptr inbounds i8, ptr %.1189, i64 8
  store double %353, ptr %358, align 8, !tbaa !40
  %359 = getelementptr inbounds i8, ptr %.1189, i64 24
  store double %257, ptr %359, align 8, !tbaa !47
  %360 = getelementptr inbounds float, ptr %.1165187, i64 %254
  %361 = tail call float @_vl_dsift_normalize_histogram(ptr noundef %.1165187, ptr noundef %360)
  %362 = tail call float @_vl_dsift_normalize_histogram(ptr noundef %.1165187, ptr noundef %360)
  %363 = getelementptr inbounds i8, ptr %.1189, i64 32
  %364 = load i32, ptr %255, align 8, !tbaa !49
  %365 = add nsw i32 %364, %.0163188
  %366 = load i32, ptr %252, align 8, !tbaa !34
  %367 = sub i32 %366, %220
  %.not169 = icmp sgt i32 %365, %367
  br i1 %.not169, label %._crit_edge192.split.split.loopexit, label %354, !llvm.loop !50

._crit_edge192.split.split.loopexit:              ; preds = %354
  %.pre266 = load i32, ptr %248, align 4, !tbaa !33
  br label %._crit_edge192.split.split

._crit_edge192.split.split:                       ; preds = %._crit_edge192.split.split.loopexit, %.lr.ph215.split.split
  %368 = phi i32 [ %347, %.lr.ph215.split.split ], [ %.pre266, %._crit_edge192.split.split.loopexit ]
  %369 = phi i32 [ %348, %.lr.ph215.split.split ], [ %366, %._crit_edge192.split.split.loopexit ]
  %.1165.lcssa = phi ptr [ %.0164211, %.lr.ph215.split.split ], [ %360, %._crit_edge192.split.split.loopexit ]
  %.1.lcssa = phi ptr [ %.0159213, %.lr.ph215.split.split ], [ %363, %._crit_edge192.split.split.loopexit ]
  %370 = load i32, ptr %258, align 4, !tbaa !36
  %371 = add nsw i32 %370, %.0162212
  %372 = sub i32 %368, %227
  %.not168 = icmp sgt i32 %371, %372
  br i1 %.not168, label %._crit_edge216, label %.lr.ph215.split.split, !llvm.loop !37

._crit_edge216:                                   ; preds = %._crit_edge192.split.split, %._crit_edge192.split.us.us.split.us.us, %210
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden void @_vl_dsift_alloc_buffers(ptr noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_fast_atan2_f(float noundef, float noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_fast_sqrt_f(float noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_mod_2pi_f(float noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden i64 @vl_floor_f(float noundef) local_unnamed_addr #3

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden i32 @vl_dsift_get_descriptor_size(ptr noundef) local_unnamed_addr #3

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @_vl_dsift_normalize_histogram(ptr noundef, ptr noundef) local_unnamed_addr #3

attributes #0 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
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" }

!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 32}
!6 = !{!"VlDsiftFilter_", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !10, i64 32, !7, i64 52, !11, i64 56, !7, i64 64, !7, i64 68, !12, i64 72, !12, i64 80, !7, i64 88, !7, i64 92, !7, i64 96, !12, i64 104, !12, i64 112, !12, i64 120}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"VlDsiftDescriptorGeometry_", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16}
!11 = !{!"double", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!6, !7, i64 4}
!14 = !{!6, !7, i64 0}
!15 = !{!6, !12, i64 104}
!16 = !{!12, !12, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!20, !20, i64 0}
!20 = !{!"float", !8, i64 0}
!21 = distinct !{!21, !18, !22}
!22 = !{!"llvm.loop.peeled.count", i32 1}
!23 = distinct !{!23, !18, !24}
!24 = !{!"llvm.loop.unswitch.partial.disable"}
!25 = !{!6, !7, i64 52}
!26 = !{!6, !12, i64 72}
!27 = !{!6, !12, i64 80}
!28 = !{!6, !7, i64 44}
!29 = !{!6, !7, i64 36}
!30 = !{!6, !7, i64 48}
!31 = !{!6, !7, i64 40}
!32 = !{!6, !7, i64 20}
!33 = !{!6, !7, i64 28}
!34 = !{!6, !7, i64 24}
!35 = !{!6, !7, i64 16}
!36 = !{!6, !7, i64 12}
!37 = distinct !{!37, !18}
!38 = !{!39, !11, i64 0}
!39 = !{!"VlDsiftKeypoint_", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24}
!40 = !{!39, !11, i64 8}
!41 = distinct !{!41, !18, !42, !43}
!42 = !{!"llvm.loop.unroll.runtime.disable"}
!43 = !{!"llvm.loop.isvectorized", i32 1}
!44 = distinct !{!44, !18}
!45 = distinct !{!45, !46}
!46 = !{!"llvm.loop.unroll.disable"}
!47 = !{!39, !11, i64 24}
!48 = distinct !{!48, !18, !43, !42}
!49 = !{!6, !7, i64 8}
!50 = distinct !{!50, !18}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopFullUnrollPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimpleLoopUnswitchPass,SimplifyCFGPass,TailCallElimPass