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

; 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._VlSiftFilt = type { double, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, i32, i32, ptr, double, i64, ptr, i32, i32, double, double, double, double, double, ptr, i32 }
%struct._VlSiftKeypoint = type { i32, i32, i32, i32, float, float, float, float }

; 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 double @llvm.floor.f64(double) #1

; Function Attrs: nounwind
declare double @pow(double noundef, double noundef) #2

; Function Attrs: nounwind
declare double @sqrt(double noundef) #2

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

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

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

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden double @fast_expn(double noundef) #5

; Function Attrs: nounwind
declare double @sin(double noundef) #2

; Function Attrs: nounwind
declare double @cos(double noundef) #2

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #1

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

; Function Attrs: inlinehint nounwind uwtable
declare hidden float @vl_abs_f(float noundef) #5

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

; Function Attrs: nounwind uwtable
define dso_local void @vl_sift_calc_keypoint_descriptor(ptr noundef %0, ptr noundef %1, ptr noundef %2, double noundef %3) #3 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca float, align 4
  %36 = alloca float, align 4
  %37 = alloca float, align 4
  %38 = alloca float, align 4
  %39 = alloca float, align 4
  %40 = alloca float, align 4
  %41 = alloca float, align 4
  %42 = alloca float, align 4
  %43 = alloca float, align 4
  %44 = alloca float, align 4
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca i32, align 4
  %48 = alloca float, align 4
  %49 = alloca float, align 4
  %50 = alloca float, align 4
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca float, align 4
  %55 = alloca float, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store double %3, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  %56 = load ptr, ptr %5, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct._VlSiftFilt, ptr %56, i32 0, i32 26
  %58 = load double, ptr %57, align 8, !tbaa !11
  store double %58, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  %59 = load ptr, ptr %5, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct._VlSiftFilt, ptr %59, i32 0, i32 11
  %61 = load i32, ptr %60, align 4, !tbaa !15
  %62 = sitofp i32 %61 to double
  %63 = call double @pow(double noundef 2.000000e+00, double noundef %62) #6
  store double %63, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #6
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct._VlSiftFilt, ptr %64, i32 0, i32 15
  %66 = load i32, ptr %65, align 8, !tbaa !16
  store i32 %66, ptr %11, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  %67 = load ptr, ptr %5, align 8, !tbaa !5
  %68 = getelementptr inbounds %struct._VlSiftFilt, ptr %67, i32 0, i32 16
  %69 = load i32, ptr %68, align 4, !tbaa !18
  store i32 %69, ptr %12, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #6
  store i32 2, ptr %13, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  %70 = load i32, ptr %11, align 4, !tbaa !17
  %71 = mul nsw i32 2, %70
  store i32 %71, ptr %14, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #6
  %72 = load i32, ptr %11, align 4, !tbaa !17
  %73 = mul nsw i32 2, %72
  %74 = load i32, ptr %12, align 4, !tbaa !17
  %75 = mul nsw i32 %73, %74
  store i32 %75, ptr %15, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  %76 = load ptr, ptr %7, align 8, !tbaa !5
  %77 = getelementptr inbounds %struct._VlSiftKeypoint, ptr %76, i32 0, i32 4
  %78 = load float, ptr %77, align 4, !tbaa !19
  %79 = fpext float %78 to double
  %80 = load double, ptr %10, align 8, !tbaa !9
  %81 = fdiv double %79, %80
  store double %81, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %82 = load ptr, ptr %7, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct._VlSiftKeypoint, ptr %82, i32 0, i32 5
  %84 = load float, ptr %83, align 4, !tbaa !22
  %85 = fpext float %84 to double
  %86 = load double, ptr %10, align 8, !tbaa !9
  %87 = fdiv double %85, %86
  store double %87, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  %88 = load ptr, ptr %7, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct._VlSiftKeypoint, ptr %88, i32 0, i32 7
  %90 = load float, ptr %89, align 4, !tbaa !23
  %91 = fpext float %90 to double
  %92 = load double, ptr %10, align 8, !tbaa !9
  %93 = fdiv double %91, %92
  store double %93, ptr %18, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  %94 = load double, ptr %16, align 8, !tbaa !9
  %95 = fadd double %94, 5.000000e-01
  %96 = fptosi double %95 to i32
  store i32 %96, ptr %19, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  %97 = load double, ptr %17, align 8, !tbaa !9
  %98 = fadd double %97, 5.000000e-01
  %99 = fptosi double %98 to i32
  store i32 %99, ptr %20, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  %100 = load ptr, ptr %7, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct._VlSiftKeypoint, ptr %100, i32 0, i32 3
  %102 = load i32, ptr %101, align 4, !tbaa !24
  store i32 %102, ptr %21, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  %103 = load double, ptr %8, align 8, !tbaa !9
  %104 = call double @sin(double noundef %103) #6
  store double %104, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  %105 = load double, ptr %8, align 8, !tbaa !9
  %106 = call double @cos(double noundef %105) #6
  store double %106, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %107 = load double, ptr %9, align 8, !tbaa !9
  %108 = load double, ptr %18, align 8, !tbaa !9
  %109 = call double @llvm.fmuladd.f64(double %107, double %108, double 0x3CB0000000000000)
  store double %109, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %110 = call double @sqrt(double noundef 2.000000e+00) #6
  %111 = load double, ptr %24, align 8, !tbaa !9
  %112 = fmul double %110, %111
  %113 = fmul double %112, 5.000000e+00
  %114 = fdiv double %113, 2.000000e+00
  %115 = fadd double %114, 5.000000e-01
  %116 = call double @llvm.floor.f64(double %115)
  %117 = fptosi double %116 to i32
  store i32 %117, ptr %25, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #6
  store i32 1, ptr %26, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  store i32 32, ptr %27, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #6
  store i32 8, ptr %28, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #6
  %118 = load ptr, ptr %7, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct._VlSiftKeypoint, ptr %118, i32 0, i32 0
  %120 = load i32, ptr %119, align 4, !tbaa !25
  %121 = load ptr, ptr %5, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct._VlSiftFilt, ptr %121, i32 0, i32 11
  %123 = load i32, ptr %122, align 4, !tbaa !15
  %124 = icmp ne i32 %120, %123
  br i1 %124, label %154, label %125

125:                                              ; preds = %4
  %126 = load i32, ptr %19, align 4, !tbaa !17
  %127 = icmp slt i32 %126, 0
  br i1 %127, label %154, label %128

128:                                              ; preds = %125
  %129 = load i32, ptr %19, align 4, !tbaa !17
  %130 = load i32, ptr %11, align 4, !tbaa !17
  %131 = icmp sge i32 %129, %130
  br i1 %131, label %154, label %132

132:                                              ; preds = %128
  %133 = load i32, ptr %20, align 4, !tbaa !17
  %134 = icmp slt i32 %133, 0
  br i1 %134, label %154, label %135

135:                                              ; preds = %132
  %136 = load i32, ptr %20, align 4, !tbaa !17
  %137 = load i32, ptr %12, align 4, !tbaa !17
  %138 = sub nsw i32 %137, 1
  %139 = icmp sge i32 %136, %138
  br i1 %139, label %154, label %140

140:                                              ; preds = %135
  %141 = load i32, ptr %21, align 4, !tbaa !17
  %142 = load ptr, ptr %5, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct._VlSiftFilt, ptr %142, i32 0, i32 9
  %144 = load i32, ptr %143, align 4, !tbaa !26
  %145 = add nsw i32 %144, 1
  %146 = icmp slt i32 %141, %145
  br i1 %146, label %154, label %147

147:                                              ; preds = %140
  %148 = load i32, ptr %21, align 4, !tbaa !17
  %149 = load ptr, ptr %5, align 8, !tbaa !5
  %150 = getelementptr inbounds %struct._VlSiftFilt, ptr %149, i32 0, i32 10
  %151 = load i32, ptr %150, align 8, !tbaa !27
  %152 = sub nsw i32 %151, 2
  %153 = icmp sgt i32 %148, %152
  br i1 %153, label %154, label %155

154:                                              ; preds = %147, %140, %135, %132, %128, %125, %4
  store i32 1, ptr %34, align 4
  br label %527

155:                                              ; preds = %147
  %156 = load ptr, ptr %5, align 8, !tbaa !5
  call void @update_gradient(ptr noundef %156)
  %157 = load ptr, ptr %6, align 8, !tbaa !5
  call void @llvm.memset.p0.i64(ptr align 4 %157, i8 0, i64 512, i1 false)
  %158 = load ptr, ptr %5, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct._VlSiftFilt, ptr %158, i32 0, i32 28
  %160 = load ptr, ptr %159, align 8, !tbaa !28
  %161 = load i32, ptr %19, align 4, !tbaa !17
  %162 = mul nsw i32 %161, 2
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds float, ptr %160, i64 %163
  %165 = load i32, ptr %20, align 4, !tbaa !17
  %166 = load i32, ptr %14, align 4, !tbaa !17
  %167 = mul nsw i32 %165, %166
  %168 = sext i32 %167 to i64
  %169 = getelementptr inbounds float, ptr %164, i64 %168
  %170 = load i32, ptr %21, align 4, !tbaa !17
  %171 = load ptr, ptr %5, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct._VlSiftFilt, ptr %171, i32 0, i32 9
  %173 = load i32, ptr %172, align 4, !tbaa !26
  %174 = sub nsw i32 %170, %173
  %175 = sub nsw i32 %174, 1
  %176 = load i32, ptr %15, align 4, !tbaa !17
  %177 = mul nsw i32 %175, %176
  %178 = sext i32 %177 to i64
  %179 = getelementptr inbounds float, ptr %169, i64 %178
  store ptr %179, ptr %32, align 8, !tbaa !5
  %180 = load ptr, ptr %6, align 8, !tbaa !5
  %181 = getelementptr inbounds float, ptr %180, i64 64
  %182 = getelementptr inbounds float, ptr %181, i64 16
  store ptr %182, ptr %33, align 8, !tbaa !5
  %183 = load i32, ptr %25, align 4, !tbaa !17
  %184 = sub nsw i32 0, %183
  %185 = load i32, ptr %20, align 4, !tbaa !17
  %186 = sub nsw i32 1, %185
  %187 = icmp sgt i32 %184, %186
  br i1 %187, label %188, label %191

188:                                              ; preds = %155
  %189 = load i32, ptr %25, align 4, !tbaa !17
  %190 = sub nsw i32 0, %189
  br label %194

191:                                              ; preds = %155
  %192 = load i32, ptr %20, align 4, !tbaa !17
  %193 = sub nsw i32 1, %192
  br label %194

194:                                              ; preds = %191, %188
  %195 = phi i32 [ %190, %188 ], [ %193, %191 ]
  store i32 %195, ptr %31, align 4, !tbaa !17
  br label %196

196:                                              ; preds = %468, %194
  %197 = load i32, ptr %31, align 4, !tbaa !17
  %198 = load i32, ptr %25, align 4, !tbaa !17
  %199 = load i32, ptr %12, align 4, !tbaa !17
  %200 = load i32, ptr %20, align 4, !tbaa !17
  %201 = sub nsw i32 %199, %200
  %202 = sub nsw i32 %201, 2
  %203 = icmp slt i32 %198, %202
  br i1 %203, label %204, label %206

204:                                              ; preds = %196
  %205 = load i32, ptr %25, align 4, !tbaa !17
  br label %211

206:                                              ; preds = %196
  %207 = load i32, ptr %12, align 4, !tbaa !17
  %208 = load i32, ptr %20, align 4, !tbaa !17
  %209 = sub nsw i32 %207, %208
  %210 = sub nsw i32 %209, 2
  br label %211

211:                                              ; preds = %206, %204
  %212 = phi i32 [ %205, %204 ], [ %210, %206 ]
  %213 = icmp sle i32 %197, %212
  br i1 %213, label %214, label %471

214:                                              ; preds = %211
  %215 = load i32, ptr %25, align 4, !tbaa !17
  %216 = sub nsw i32 0, %215
  %217 = load i32, ptr %19, align 4, !tbaa !17
  %218 = sub nsw i32 1, %217
  %219 = icmp sgt i32 %216, %218
  br i1 %219, label %220, label %223

220:                                              ; preds = %214
  %221 = load i32, ptr %25, align 4, !tbaa !17
  %222 = sub nsw i32 0, %221
  br label %226

223:                                              ; preds = %214
  %224 = load i32, ptr %19, align 4, !tbaa !17
  %225 = sub nsw i32 1, %224
  br label %226

226:                                              ; preds = %223, %220
  %227 = phi i32 [ %222, %220 ], [ %225, %223 ]
  store i32 %227, ptr %30, align 4, !tbaa !17
  br label %228

228:                                              ; preds = %464, %226
  %229 = load i32, ptr %30, align 4, !tbaa !17
  %230 = load i32, ptr %25, align 4, !tbaa !17
  %231 = load i32, ptr %11, align 4, !tbaa !17
  %232 = load i32, ptr %19, align 4, !tbaa !17
  %233 = sub nsw i32 %231, %232
  %234 = sub nsw i32 %233, 2
  %235 = icmp slt i32 %230, %234
  br i1 %235, label %236, label %238

236:                                              ; preds = %228
  %237 = load i32, ptr %25, align 4, !tbaa !17
  br label %243

238:                                              ; preds = %228
  %239 = load i32, ptr %11, align 4, !tbaa !17
  %240 = load i32, ptr %19, align 4, !tbaa !17
  %241 = sub nsw i32 %239, %240
  %242 = sub nsw i32 %241, 2
  br label %243

243:                                              ; preds = %238, %236
  %244 = phi i32 [ %237, %236 ], [ %242, %238 ]
  %245 = icmp sle i32 %229, %244
  br i1 %245, label %246, label %467

246:                                              ; preds = %243
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  %247 = load ptr, ptr %32, align 8, !tbaa !5
  %248 = load i32, ptr %30, align 4, !tbaa !17
  %249 = mul nsw i32 %248, 2
  %250 = sext i32 %249 to i64
  %251 = getelementptr inbounds float, ptr %247, i64 %250
  %252 = load i32, ptr %31, align 4, !tbaa !17
  %253 = load i32, ptr %14, align 4, !tbaa !17
  %254 = mul nsw i32 %252, %253
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds float, ptr %251, i64 %255
  %257 = getelementptr inbounds float, ptr %256, i64 0
  %258 = load float, ptr %257, align 4, !tbaa !29
  store float %258, ptr %35, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  %259 = load ptr, ptr %32, align 8, !tbaa !5
  %260 = load i32, ptr %30, align 4, !tbaa !17
  %261 = mul nsw i32 %260, 2
  %262 = sext i32 %261 to i64
  %263 = getelementptr inbounds float, ptr %259, i64 %262
  %264 = load i32, ptr %31, align 4, !tbaa !17
  %265 = load i32, ptr %14, align 4, !tbaa !17
  %266 = mul nsw i32 %264, %265
  %267 = sext i32 %266 to i64
  %268 = getelementptr inbounds float, ptr %263, i64 %267
  %269 = getelementptr inbounds float, ptr %268, i64 1
  %270 = load float, ptr %269, align 4, !tbaa !29
  store float %270, ptr %36, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #6
  %271 = load float, ptr %36, align 4, !tbaa !29
  %272 = fpext float %271 to double
  %273 = load double, ptr %8, align 8, !tbaa !9
  %274 = fsub double %272, %273
  %275 = fptrunc double %274 to float
  %276 = call float @vl_mod_2pi_f(float noundef %275)
  store float %276, ptr %37, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  %277 = load i32, ptr %19, align 4, !tbaa !17
  %278 = load i32, ptr %30, align 4, !tbaa !17
  %279 = add nsw i32 %277, %278
  %280 = sitofp i32 %279 to double
  %281 = load double, ptr %16, align 8, !tbaa !9
  %282 = fsub double %280, %281
  %283 = fptrunc double %282 to float
  store float %283, ptr %38, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #6
  %284 = load i32, ptr %20, align 4, !tbaa !17
  %285 = load i32, ptr %31, align 4, !tbaa !17
  %286 = add nsw i32 %284, %285
  %287 = sitofp i32 %286 to double
  %288 = load double, ptr %17, align 8, !tbaa !9
  %289 = fsub double %287, %288
  %290 = fptrunc double %289 to float
  store float %290, ptr %39, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #6
  %291 = load double, ptr %23, align 8, !tbaa !9
  %292 = load float, ptr %38, align 4, !tbaa !29
  %293 = fpext float %292 to double
  %294 = load double, ptr %22, align 8, !tbaa !9
  %295 = load float, ptr %39, align 4, !tbaa !29
  %296 = fpext float %295 to double
  %297 = fmul double %294, %296
  %298 = call double @llvm.fmuladd.f64(double %291, double %293, double %297)
  %299 = load double, ptr %24, align 8, !tbaa !9
  %300 = fdiv double %298, %299
  %301 = fptrunc double %300 to float
  store float %301, ptr %40, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #6
  %302 = load double, ptr %22, align 8, !tbaa !9
  %303 = fneg double %302
  %304 = load float, ptr %38, align 4, !tbaa !29
  %305 = fpext float %304 to double
  %306 = load double, ptr %23, align 8, !tbaa !9
  %307 = load float, ptr %39, align 4, !tbaa !29
  %308 = fpext float %307 to double
  %309 = fmul double %306, %308
  %310 = call double @llvm.fmuladd.f64(double %303, double %305, double %309)
  %311 = load double, ptr %24, align 8, !tbaa !9
  %312 = fdiv double %310, %311
  %313 = fptrunc double %312 to float
  store float %313, ptr %41, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #6
  %314 = load float, ptr %37, align 4, !tbaa !29
  %315 = fmul float 8.000000e+00, %314
  %316 = fpext float %315 to double
  %317 = fdiv double %316, 0x401921FB54442D18
  %318 = fptrunc double %317 to float
  store float %318, ptr %42, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #6
  %319 = load ptr, ptr %5, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct._VlSiftFilt, ptr %319, i32 0, i32 27
  %321 = load double, ptr %320, align 8, !tbaa !30
  %322 = fptrunc double %321 to float
  store float %322, ptr %43, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #6
  %323 = load float, ptr %40, align 4, !tbaa !29
  %324 = load float, ptr %40, align 4, !tbaa !29
  %325 = load float, ptr %41, align 4, !tbaa !29
  %326 = load float, ptr %41, align 4, !tbaa !29
  %327 = fmul float %325, %326
  %328 = call float @llvm.fmuladd.f32(float %323, float %324, float %327)
  %329 = fpext float %328 to double
  %330 = load float, ptr %43, align 4, !tbaa !29
  %331 = fpext float %330 to double
  %332 = fmul double 2.000000e+00, %331
  %333 = load float, ptr %43, align 4, !tbaa !29
  %334 = fpext float %333 to double
  %335 = fmul double %332, %334
  %336 = fdiv double %329, %335
  %337 = call double @fast_expn(double noundef %336)
  %338 = fptrunc double %337 to float
  store float %338, ptr %44, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #6
  %339 = load float, ptr %40, align 4, !tbaa !29
  %340 = fpext float %339 to double
  %341 = fsub double %340, 5.000000e-01
  %342 = fptrunc double %341 to float
  %343 = call i64 @vl_floor_f(float noundef %342)
  %344 = trunc i64 %343 to i32
  store i32 %344, ptr %45, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #6
  %345 = load float, ptr %41, align 4, !tbaa !29
  %346 = fpext float %345 to double
  %347 = fsub double %346, 5.000000e-01
  %348 = fptrunc double %347 to float
  %349 = call i64 @vl_floor_f(float noundef %348)
  %350 = trunc i64 %349 to i32
  store i32 %350, ptr %46, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #6
  %351 = load float, ptr %42, align 4, !tbaa !29
  %352 = call i64 @vl_floor_f(float noundef %351)
  %353 = trunc i64 %352 to i32
  store i32 %353, ptr %47, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #6
  %354 = load float, ptr %40, align 4, !tbaa !29
  %355 = fpext float %354 to double
  %356 = load i32, ptr %45, align 4, !tbaa !17
  %357 = sitofp i32 %356 to double
  %358 = fadd double %357, 5.000000e-01
  %359 = fsub double %355, %358
  %360 = fptrunc double %359 to float
  store float %360, ptr %48, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #6
  %361 = load float, ptr %41, align 4, !tbaa !29
  %362 = fpext float %361 to double
  %363 = load i32, ptr %46, align 4, !tbaa !17
  %364 = sitofp i32 %363 to double
  %365 = fadd double %364, 5.000000e-01
  %366 = fsub double %362, %365
  %367 = fptrunc double %366 to float
  store float %367, ptr %49, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #6
  %368 = load float, ptr %42, align 4, !tbaa !29
  %369 = load i32, ptr %47, align 4, !tbaa !17
  %370 = sitofp i32 %369 to float
  %371 = fsub float %368, %370
  store float %371, ptr %50, align 4, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #6
  store i32 0, ptr %51, align 4, !tbaa !17
  br label %372

372:                                              ; preds = %460, %246
  %373 = load i32, ptr %51, align 4, !tbaa !17
  %374 = icmp slt i32 %373, 2
  br i1 %374, label %375, label %463

375:                                              ; preds = %372
  store i32 0, ptr %52, align 4, !tbaa !17
  br label %376

376:                                              ; preds = %456, %375
  %377 = load i32, ptr %52, align 4, !tbaa !17
  %378 = icmp slt i32 %377, 2
  br i1 %378, label %379, label %459

379:                                              ; preds = %376
  store i32 0, ptr %53, align 4, !tbaa !17
  br label %380

380:                                              ; preds = %452, %379
  %381 = load i32, ptr %53, align 4, !tbaa !17
  %382 = icmp slt i32 %381, 2
  br i1 %382, label %383, label %455

383:                                              ; preds = %380
  %384 = load i32, ptr %45, align 4, !tbaa !17
  %385 = load i32, ptr %51, align 4, !tbaa !17
  %386 = add nsw i32 %384, %385
  %387 = icmp sge i32 %386, -2
  br i1 %387, label %388, label %451

388:                                              ; preds = %383
  %389 = load i32, ptr %45, align 4, !tbaa !17
  %390 = load i32, ptr %51, align 4, !tbaa !17
  %391 = add nsw i32 %389, %390
  %392 = icmp slt i32 %391, 2
  br i1 %392, label %393, label %451

393:                                              ; preds = %388
  %394 = load i32, ptr %46, align 4, !tbaa !17
  %395 = load i32, ptr %52, align 4, !tbaa !17
  %396 = add nsw i32 %394, %395
  %397 = icmp sge i32 %396, -2
  br i1 %397, label %398, label %451

398:                                              ; preds = %393
  %399 = load i32, ptr %46, align 4, !tbaa !17
  %400 = load i32, ptr %52, align 4, !tbaa !17
  %401 = add nsw i32 %399, %400
  %402 = icmp slt i32 %401, 2
  br i1 %402, label %403, label %451

403:                                              ; preds = %398
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #6
  %404 = load float, ptr %44, align 4, !tbaa !29
  %405 = load float, ptr %35, align 4, !tbaa !29
  %406 = fmul float %404, %405
  %407 = load i32, ptr %51, align 4, !tbaa !17
  %408 = sub nsw i32 1, %407
  %409 = sitofp i32 %408 to float
  %410 = load float, ptr %48, align 4, !tbaa !29
  %411 = fsub float %409, %410
  %412 = call float @vl_abs_f(float noundef %411)
  %413 = fmul float %406, %412
  %414 = load i32, ptr %52, align 4, !tbaa !17
  %415 = sub nsw i32 1, %414
  %416 = sitofp i32 %415 to float
  %417 = load float, ptr %49, align 4, !tbaa !29
  %418 = fsub float %416, %417
  %419 = call float @vl_abs_f(float noundef %418)
  %420 = fmul float %413, %419
  %421 = load i32, ptr %53, align 4, !tbaa !17
  %422 = sub nsw i32 1, %421
  %423 = sitofp i32 %422 to float
  %424 = load float, ptr %50, align 4, !tbaa !29
  %425 = fsub float %423, %424
  %426 = call float @vl_abs_f(float noundef %425)
  %427 = fmul float %420, %426
  store float %427, ptr %54, align 4, !tbaa !29
  %428 = load float, ptr %54, align 4, !tbaa !29
  %429 = load ptr, ptr %33, align 8, !tbaa !5
  %430 = load i32, ptr %47, align 4, !tbaa !17
  %431 = load i32, ptr %53, align 4, !tbaa !17
  %432 = add nsw i32 %430, %431
  %433 = srem i32 %432, 8
  %434 = mul nsw i32 %433, 1
  %435 = sext i32 %434 to i64
  %436 = getelementptr inbounds float, ptr %429, i64 %435
  %437 = load i32, ptr %46, align 4, !tbaa !17
  %438 = load i32, ptr %52, align 4, !tbaa !17
  %439 = add nsw i32 %437, %438
  %440 = mul nsw i32 %439, 32
  %441 = sext i32 %440 to i64
  %442 = getelementptr inbounds float, ptr %436, i64 %441
  %443 = load i32, ptr %45, align 4, !tbaa !17
  %444 = load i32, ptr %51, align 4, !tbaa !17
  %445 = add nsw i32 %443, %444
  %446 = mul nsw i32 %445, 8
  %447 = sext i32 %446 to i64
  %448 = getelementptr inbounds float, ptr %442, i64 %447
  %449 = load float, ptr %448, align 4, !tbaa !29
  %450 = fadd float %449, %428
  store float %450, ptr %448, align 4, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #6
  br label %451

451:                                              ; preds = %403, %398, %393, %388, %383
  br label %452

452:                                              ; preds = %451
  %453 = load i32, ptr %53, align 4, !tbaa !17
  %454 = add nsw i32 %453, 1
  store i32 %454, ptr %53, align 4, !tbaa !17
  br label %380, !llvm.loop !31

455:                                              ; preds = %380
  br label %456

456:                                              ; preds = %455
  %457 = load i32, ptr %52, align 4, !tbaa !17
  %458 = add nsw i32 %457, 1
  store i32 %458, ptr %52, align 4, !tbaa !17
  br label %376, !llvm.loop !33

459:                                              ; preds = %376
  br label %460

460:                                              ; preds = %459
  %461 = load i32, ptr %51, align 4, !tbaa !17
  %462 = add nsw i32 %461, 1
  store i32 %462, ptr %51, align 4, !tbaa !17
  br label %372, !llvm.loop !34

463:                                              ; preds = %372
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  br label %464

464:                                              ; preds = %463
  %465 = load i32, ptr %30, align 4, !tbaa !17
  %466 = add nsw i32 %465, 1
  store i32 %466, ptr %30, align 4, !tbaa !17
  br label %228, !llvm.loop !35

467:                                              ; preds = %243
  br label %468

468:                                              ; preds = %467
  %469 = load i32, ptr %31, align 4, !tbaa !17
  %470 = add nsw i32 %469, 1
  store i32 %470, ptr %31, align 4, !tbaa !17
  br label %196, !llvm.loop !36

471:                                              ; preds = %211
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #6
  %472 = load ptr, ptr %6, align 8, !tbaa !5
  %473 = load ptr, ptr %6, align 8, !tbaa !5
  %474 = getelementptr inbounds float, ptr %473, i64 128
  %475 = call float @normalize_histogram(ptr noundef %472, ptr noundef %474)
  store float %475, ptr %55, align 4, !tbaa !29
  %476 = load ptr, ptr %5, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct._VlSiftFilt, ptr %476, i32 0, i32 25
  %478 = load double, ptr %477, align 8, !tbaa !37
  %479 = fcmp une double %478, 0.000000e+00
  br i1 %479, label %480, label %500

480:                                              ; preds = %471
  %481 = load float, ptr %55, align 4, !tbaa !29
  %482 = fpext float %481 to double
  %483 = load ptr, ptr %5, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct._VlSiftFilt, ptr %483, i32 0, i32 25
  %485 = load double, ptr %484, align 8, !tbaa !37
  %486 = fcmp olt double %482, %485
  br i1 %486, label %487, label %500

487:                                              ; preds = %480
  store i32 0, ptr %29, align 4, !tbaa !17
  br label %488

488:                                              ; preds = %496, %487
  %489 = load i32, ptr %29, align 4, !tbaa !17
  %490 = icmp slt i32 %489, 128
  br i1 %490, label %491, label %499

491:                                              ; preds = %488
  %492 = load ptr, ptr %6, align 8, !tbaa !5
  %493 = load i32, ptr %29, align 4, !tbaa !17
  %494 = sext i32 %493 to i64
  %495 = getelementptr inbounds float, ptr %492, i64 %494
  store float 0.000000e+00, ptr %495, align 4, !tbaa !29
  br label %496

496:                                              ; preds = %491
  %497 = load i32, ptr %29, align 4, !tbaa !17
  %498 = add nsw i32 %497, 1
  store i32 %498, ptr %29, align 4, !tbaa !17
  br label %488, !llvm.loop !38

499:                                              ; preds = %488
  br label %526

500:                                              ; preds = %480, %471
  store i32 0, ptr %29, align 4, !tbaa !17
  br label %501

501:                                              ; preds = %518, %500
  %502 = load i32, ptr %29, align 4, !tbaa !17
  %503 = icmp slt i32 %502, 128
  br i1 %503, label %504, label %521

504:                                              ; preds = %501
  %505 = load ptr, ptr %6, align 8, !tbaa !5
  %506 = load i32, ptr %29, align 4, !tbaa !17
  %507 = sext i32 %506 to i64
  %508 = getelementptr inbounds float, ptr %505, i64 %507
  %509 = load float, ptr %508, align 4, !tbaa !29
  %510 = fpext float %509 to double
  %511 = fcmp ogt double %510, 2.000000e-01
  br i1 %511, label %512, label %517

512:                                              ; preds = %504
  %513 = load ptr, ptr %6, align 8, !tbaa !5
  %514 = load i32, ptr %29, align 4, !tbaa !17
  %515 = sext i32 %514 to i64
  %516 = getelementptr inbounds float, ptr %513, i64 %515
  store float 0x3FC99999A0000000, ptr %516, align 4, !tbaa !29
  br label %517

517:                                              ; preds = %512, %504
  br label %518

518:                                              ; preds = %517
  %519 = load i32, ptr %29, align 4, !tbaa !17
  %520 = add nsw i32 %519, 1
  store i32 %520, ptr %29, align 4, !tbaa !17
  br label %501, !llvm.loop !39

521:                                              ; preds = %501
  %522 = load ptr, ptr %6, align 8, !tbaa !5
  %523 = load ptr, ptr %6, align 8, !tbaa !5
  %524 = getelementptr inbounds float, ptr %523, i64 128
  %525 = call float @normalize_histogram(ptr noundef %522, ptr noundef %524)
  br label %526

526:                                              ; preds = %521, %499
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #6
  store i32 0, ptr %34, align 4
  br label %527

527:                                              ; preds = %526, %154
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  %528 = load i32, ptr %34, align 4
  switch i32 %528, label %530 [
    i32 0, label %529
    i32 1, label %529
  ]

529:                                              ; preds = %527, %527
  ret void

530:                                              ; preds = %527
  unreachable
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { 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 #6 = { 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 = !{!"double", !7, i64 0}
!11 = !{!12, !10, i64 160}
!12 = !{!"_VlSiftFilt", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !6, i64 64, !6, i64 72, !6, i64 80, !13, i64 88, !13, i64 92, !6, i64 96, !10, i64 104, !14, i64 112, !6, i64 120, !13, i64 128, !13, i64 132, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !6, i64 176, !13, i64 184}
!13 = !{!"int", !7, i64 0}
!14 = !{!"long long", !7, i64 0}
!15 = !{!12, !13, i64 60}
!16 = !{!12, !13, i64 88}
!17 = !{!13, !13, i64 0}
!18 = !{!12, !13, i64 92}
!19 = !{!20, !21, i64 16}
!20 = !{!"_VlSiftKeypoint", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !21, i64 16, !21, i64 20, !21, i64 24, !21, i64 28}
!21 = !{!"float", !7, i64 0}
!22 = !{!20, !21, i64 20}
!23 = !{!20, !21, i64 28}
!24 = !{!20, !13, i64 12}
!25 = !{!20, !13, i64 0}
!26 = !{!12, !13, i64 52}
!27 = !{!12, !13, i64 56}
!28 = !{!12, !6, i64 176}
!29 = !{!21, !21, i64 0}
!30 = !{!12, !10, i64 168}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = distinct !{!33, !32}
!34 = distinct !{!34, !32}
!35 = distinct !{!35, !32}
!36 = distinct !{!36, !32}
!37 = !{!12, !10, i64 152}
!38 = distinct !{!38, !32}
!39 = distinct !{!39, !32}


; 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 double @llvm.floor.f64(double) #0

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

; Function Attrs: nounwind uwtable
declare hidden void @update_gradient(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 double @fast_expn(double noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sin(double noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @cos(double noundef) local_unnamed_addr #4

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #0

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

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

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

; Function Attrs: nounwind uwtable
define dso_local void @vl_sift_calc_keypoint_descriptor(ptr noundef %0, ptr noundef %1, ptr nocapture noundef readonly %2, double noundef %3) local_unnamed_addr #1 {
  %5 = getelementptr inbounds i8, ptr %0, i64 160
  %6 = load double, ptr %5, align 8, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %0, i64 60
  %8 = load i32, ptr %7, align 4, !tbaa !13
  %ldexp = tail call double @ldexp(double 1.000000e+00, i32 %8) #7
  %9 = getelementptr inbounds i8, ptr %0, i64 88
  %10 = load i32, ptr %9, align 8, !tbaa !14
  %11 = getelementptr inbounds i8, ptr %0, i64 92
  %12 = load i32, ptr %11, align 4, !tbaa !15
  %13 = shl nsw i32 %10, 1
  %14 = mul nsw i32 %13, %12
  %15 = getelementptr inbounds i8, ptr %2, i64 16
  %16 = load float, ptr %15, align 4, !tbaa !16
  %17 = fpext float %16 to double
  %18 = fdiv double %17, %ldexp
  %19 = getelementptr inbounds i8, ptr %2, i64 20
  %20 = load float, ptr %19, align 4, !tbaa !19
  %21 = fpext float %20 to double
  %22 = fdiv double %21, %ldexp
  %23 = getelementptr inbounds i8, ptr %2, i64 28
  %24 = load float, ptr %23, align 4, !tbaa !20
  %25 = fpext float %24 to double
  %26 = fdiv double %25, %ldexp
  %27 = fadd double %18, 5.000000e-01
  %28 = fptosi double %27 to i32
  %29 = fadd double %22, 5.000000e-01
  %30 = fptosi double %29 to i32
  %31 = getelementptr inbounds i8, ptr %2, i64 12
  %32 = load i32, ptr %31, align 4, !tbaa !21
  %33 = tail call double @sin(double noundef %3) #7
  %34 = tail call double @cos(double noundef %3) #7
  %35 = tail call double @llvm.fmuladd.f64(double %6, double %26, double 0x3CB0000000000000)
  %36 = fmul double %35, 0x3FF6A09E667F3BCD
  %37 = fmul double %36, 5.000000e+00
  %38 = fmul double %37, 5.000000e-01
  %39 = fadd double %38, 5.000000e-01
  %40 = tail call double @llvm.floor.f64(double %39)
  %41 = fptosi double %40 to i32
  %42 = load i32, ptr %2, align 4, !tbaa !22
  %43 = load i32, ptr %7, align 4, !tbaa !13
  %44 = icmp ne i32 %42, %43
  %45 = icmp slt i32 %28, 0
  %or.cond = select i1 %44, i1 true, i1 %45
  br i1 %or.cond, label %.loopexit, label %46

46:                                               ; preds = %4
  %47 = icmp sgt i32 %10, %28
  %48 = icmp sgt i32 %30, -1
  %or.cond3.not186 = select i1 %47, i1 %48, i1 false
  %49 = add nsw i32 %12, -1
  %.not = icmp sgt i32 %49, %30
  %or.cond178 = select i1 %or.cond3.not186, i1 %.not, i1 false
  br i1 %or.cond178, label %50, label %.loopexit

50:                                               ; preds = %46
  %51 = getelementptr inbounds i8, ptr %0, i64 52
  %52 = load i32, ptr %51, align 4, !tbaa !23
  %.not175 = icmp sgt i32 %32, %52
  br i1 %.not175, label %53, label %.loopexit

53:                                               ; preds = %50
  %54 = getelementptr inbounds i8, ptr %0, i64 56
  %55 = load i32, ptr %54, align 8, !tbaa !24
  %56 = add nsw i32 %55, -2
  %57 = icmp sgt i32 %32, %56
  br i1 %57, label %.loopexit, label %58

58:                                               ; preds = %53
  tail call void @update_gradient(ptr noundef nonnull %0)
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(512) %1, i8 0, i64 512, i1 false)
  %59 = getelementptr inbounds i8, ptr %0, i64 176
  %60 = load ptr, ptr %59, align 8, !tbaa !25
  %61 = shl nuw nsw i32 %28, 1
  %62 = zext nneg i32 %61 to i64
  %63 = getelementptr inbounds float, ptr %60, i64 %62
  %64 = mul nsw i32 %13, %30
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds float, ptr %63, i64 %65
  %67 = load i32, ptr %51, align 4, !tbaa !23
  %68 = xor i32 %67, -1
  %69 = add i32 %32, %68
  %70 = mul nsw i32 %14, %69
  %71 = sext i32 %70 to i64
  %72 = getelementptr inbounds float, ptr %66, i64 %71
  %73 = getelementptr inbounds i8, ptr %1, i64 320
  %74 = sub nsw i32 0, %41
  %75 = sub nsw i32 1, %30
  %76 = tail call i32 @llvm.smax.i32(i32 %75, i32 %74)
  %77 = add i32 %12, -2
  %78 = sub i32 %77, %30
  %. = tail call i32 @llvm.smin.i32(i32 %78, i32 %41)
  %.not176204 = icmp sgt i32 %76, %.
  br i1 %.not176204, label %._crit_edge208, label %.lr.ph207

.lr.ph207:                                        ; preds = %58
  %79 = sub nsw i32 1, %28
  %80 = tail call i32 @llvm.smax.i32(i32 %79, i32 %74)
  %81 = add nsw i32 %10, -2
  %82 = sub nsw i32 %81, %28
  %.179 = tail call i32 @llvm.smin.i32(i32 %82, i32 %41)
  %.not177202 = icmp sgt i32 %80, %.179
  %83 = fneg double %33
  %84 = getelementptr inbounds i8, ptr %0, i64 168
  br i1 %.not177202, label %._crit_edge208, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.lr.ph207
  %85 = tail call i32 @llvm.smax.i32(i32 %74, i32 %79)
  %smax = sext i32 %85 to i64
  %86 = add i32 %.179, %85
  %87 = add i32 %86, 1
  %88 = sub i32 %87, %80
  %89 = tail call i32 @llvm.smax.i32(i32 %74, i32 %75)
  %smax226 = sext i32 %89 to i64
  %90 = sext i32 %13 to i64
  %91 = add i32 %., %89
  %92 = add i32 %91, 1
  %93 = sub i32 %92, %76
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %._crit_edge
  %indvars.iv227 = phi i64 [ %smax226, %.lr.ph.preheader ], [ %indvars.iv.next228, %._crit_edge ]
  %94 = mul nsw i64 %indvars.iv227, %90
  %invariant.gep = getelementptr float, ptr %72, i64 %94
  %95 = trunc i64 %indvars.iv227 to i32
  %96 = add i32 %95, %30
  %97 = sitofp i32 %96 to double
  %98 = fsub double %97, %22
  %99 = fptrunc double %98 to float
  %100 = fpext float %99 to double
  %101 = fmul double %33, %100
  %102 = fmul double %34, %100
  br label %.preheader190

.preheader190:                                    ; preds = %.lr.ph, %.split200.us.1
  %indvars.iv = phi i64 [ %smax, %.lr.ph ], [ %indvars.iv.next, %.split200.us.1 ]
  %gep.idx = shl i64 %indvars.iv, 3
  %gep = getelementptr i8, ptr %invariant.gep, i64 %gep.idx
  %103 = load float, ptr %gep, align 4, !tbaa !26
  %104 = getelementptr inbounds i8, ptr %gep, i64 4
  %105 = load float, ptr %104, align 4, !tbaa !26
  %106 = fpext float %105 to double
  %107 = fsub double %106, %3
  %108 = fptrunc double %107 to float
  %109 = tail call float @vl_mod_2pi_f(float noundef %108)
  %110 = trunc i64 %indvars.iv to i32
  %111 = add i32 %110, %28
  %112 = sitofp i32 %111 to double
  %113 = fsub double %112, %18
  %114 = fptrunc double %113 to float
  %115 = fpext float %114 to double
  %116 = tail call double @llvm.fmuladd.f64(double %34, double %115, double %101)
  %117 = fdiv double %116, %35
  %118 = fptrunc double %117 to float
  %119 = tail call double @llvm.fmuladd.f64(double %83, double %115, double %102)
  %120 = fdiv double %119, %35
  %121 = fptrunc double %120 to float
  %122 = fmul float %109, 8.000000e+00
  %123 = fpext float %122 to double
  %124 = fdiv double %123, 0x401921FB54442D18
  %125 = fptrunc double %124 to float
  %126 = load double, ptr %84, align 8, !tbaa !27
  %127 = fptrunc double %126 to float
  %128 = fmul float %121, %121
  %129 = tail call float @llvm.fmuladd.f32(float %118, float %118, float %128)
  %130 = fpext float %129 to double
  %131 = fpext float %127 to double
  %132 = fmul double %131, 2.000000e+00
  %133 = fmul double %132, %131
  %134 = fdiv double %130, %133
  %135 = tail call double @fast_expn(double noundef %134)
  %136 = fptrunc double %135 to float
  %137 = fpext float %118 to double
  %138 = fadd float %118, -5.000000e-01
  %139 = tail call i64 @vl_floor_f(float noundef %138)
  %140 = trunc i64 %139 to i32
  %141 = fpext float %121 to double
  %142 = fadd float %121, -5.000000e-01
  %143 = tail call i64 @vl_floor_f(float noundef %142)
  %144 = trunc i64 %143 to i32
  %145 = tail call i64 @vl_floor_f(float noundef %125)
  %146 = trunc i64 %145 to i32
  %147 = sitofp i32 %140 to double
  %148 = fadd double %147, 5.000000e-01
  %149 = fsub double %137, %148
  %150 = fptrunc double %149 to float
  %151 = sitofp i32 %144 to double
  %152 = fadd double %151, 5.000000e-01
  %153 = fsub double %141, %152
  %154 = fptrunc double %153 to float
  %155 = sitofp i32 %146 to float
  %156 = fmul float %103, %136
  %157 = fsub float %155, %125
  %sext = shl i64 %143, 32
  %158 = ashr exact i64 %sext, 32
  %sext238 = shl i64 %139, 32
  %159 = ashr exact i64 %sext238, 32
  %160 = add i32 %140, 2
  %or.cond180 = icmp ult i32 %160, 4
  %161 = fsub float 1.000000e+00, %150
  %162 = ashr exact i64 %sext238, 27
  %invariant.gep194 = getelementptr i8, ptr %73, i64 %162
  br i1 %or.cond180, label %.preheader189.us.preheader, label %.split200.us

.preheader189.us.preheader:                       ; preds = %.preheader190
  %163 = add i32 %144, 2
  %or.cond181.us = icmp ult i32 %163, 4
  br i1 %or.cond181.us, label %.preheader189.split.us.split.us.us.preheader, label %.split.us.us

.preheader189.split.us.split.us.us.preheader:     ; preds = %.preheader189.us.preheader
  %164 = ashr exact i64 %sext, 25
  %gep.us = getelementptr i8, ptr %invariant.gep194, i64 %164
  %165 = fsub float 1.000000e+00, %154
  %166 = tail call float @vl_abs_f(float noundef %161)
  %167 = fmul float %156, %166
  %168 = tail call float @vl_abs_f(float noundef %165)
  %169 = fmul float %167, %168
  %170 = fadd float %157, 1.000000e+00
  %171 = tail call float @vl_abs_f(float noundef %170)
  %172 = fmul float %169, %171
  %173 = srem i32 %146, 8
  %174 = sext i32 %173 to i64
  %gep193.us.us.us = getelementptr float, ptr %gep.us, i64 %174
  %175 = load float, ptr %gep193.us.us.us, align 4, !tbaa !26
  %176 = fadd float %175, %172
  store float %176, ptr %gep193.us.us.us, align 4, !tbaa !26
  %177 = tail call float @vl_abs_f(float noundef %161)
  %178 = fmul float %156, %177
  %179 = tail call float @vl_abs_f(float noundef %165)
  %180 = fmul float %178, %179
  %181 = tail call float @vl_abs_f(float noundef %157)
  %182 = fmul float %180, %181
  %183 = add nsw i32 %146, 1
  %184 = srem i32 %183, 8
  %185 = sext i32 %184 to i64
  %gep193.us.us.us.1 = getelementptr float, ptr %gep.us, i64 %185
  %186 = load float, ptr %gep193.us.us.us.1, align 4, !tbaa !26
  %187 = fadd float %186, %182
  store float %187, ptr %gep193.us.us.us.1, align 4, !tbaa !26
  br label %.split.us.us

.split.us.us:                                     ; preds = %.preheader189.us.preheader, %.preheader189.split.us.split.us.us.preheader
  %188 = add nsw i64 %158, 1
  %189 = trunc nsw i64 %188 to i32
  %190 = add i32 %189, 2
  %or.cond181.us.1 = icmp ult i32 %190, 4
  br i1 %or.cond181.us.1, label %.preheader189.split.us.split.us.us.preheader.1, label %.split200.us

.preheader189.split.us.split.us.us.preheader.1:   ; preds = %.split.us.us
  %gep.us.1.idx = shl nsw i64 %188, 7
  %gep.us.1 = getelementptr i8, ptr %invariant.gep194, i64 %gep.us.1.idx
  %191 = fsub float 0.000000e+00, %154
  %192 = tail call float @vl_abs_f(float noundef %161)
  %193 = fmul float %156, %192
  %194 = tail call float @vl_abs_f(float noundef %191)
  %195 = fmul float %193, %194
  %196 = fadd float %157, 1.000000e+00
  %197 = tail call float @vl_abs_f(float noundef %196)
  %198 = fmul float %195, %197
  %199 = srem i32 %146, 8
  %200 = sext i32 %199 to i64
  %gep193.us.us.us.1215 = getelementptr float, ptr %gep.us.1, i64 %200
  %201 = load float, ptr %gep193.us.us.us.1215, align 4, !tbaa !26
  %202 = fadd float %201, %198
  store float %202, ptr %gep193.us.us.us.1215, align 4, !tbaa !26
  %203 = tail call float @vl_abs_f(float noundef %161)
  %204 = fmul float %156, %203
  %205 = tail call float @vl_abs_f(float noundef %191)
  %206 = fmul float %204, %205
  %207 = tail call float @vl_abs_f(float noundef %157)
  %208 = fmul float %206, %207
  %209 = add nsw i32 %146, 1
  %210 = srem i32 %209, 8
  %211 = sext i32 %210 to i64
  %gep193.us.us.us.1.1 = getelementptr float, ptr %gep.us.1, i64 %211
  %212 = load float, ptr %gep193.us.us.us.1.1, align 4, !tbaa !26
  %213 = fadd float %212, %208
  store float %213, ptr %gep193.us.us.us.1.1, align 4, !tbaa !26
  br label %.split200.us

.split200.us:                                     ; preds = %.preheader189.split.us.split.us.us.preheader.1, %.split.us.us, %.preheader190
  %214 = add nsw i64 %159, 1
  %215 = trunc nsw i64 %214 to i32
  %216 = add i32 %215, 2
  %or.cond180.1 = icmp ult i32 %216, 4
  %217 = fsub float 0.000000e+00, %150
  %invariant.gep194.1.idx = shl nsw i64 %214, 5
  %invariant.gep194.1 = getelementptr i8, ptr %73, i64 %invariant.gep194.1.idx
  br i1 %or.cond180.1, label %.preheader189.us.preheader.1, label %.split200.us.1

.preheader189.us.preheader.1:                     ; preds = %.split200.us
  %218 = add i32 %144, 2
  %or.cond181.us.1217 = icmp ult i32 %218, 4
  br i1 %or.cond181.us.1217, label %.preheader189.split.us.split.us.us.preheader.1221, label %.split.us.us.1225

.preheader189.split.us.split.us.us.preheader.1221: ; preds = %.preheader189.us.preheader.1
  %219 = ashr exact i64 %sext, 25
  %gep.us.1218 = getelementptr i8, ptr %invariant.gep194.1, i64 %219
  %220 = fsub float 1.000000e+00, %154
  %221 = tail call float @vl_abs_f(float noundef %217)
  %222 = fmul float %156, %221
  %223 = tail call float @vl_abs_f(float noundef %220)
  %224 = fmul float %222, %223
  %225 = fadd float %157, 1.000000e+00
  %226 = tail call float @vl_abs_f(float noundef %225)
  %227 = fmul float %224, %226
  %228 = srem i32 %146, 8
  %229 = sext i32 %228 to i64
  %gep193.us.us.us.1222 = getelementptr float, ptr %gep.us.1218, i64 %229
  %230 = load float, ptr %gep193.us.us.us.1222, align 4, !tbaa !26
  %231 = fadd float %230, %227
  store float %231, ptr %gep193.us.us.us.1222, align 4, !tbaa !26
  %232 = tail call float @vl_abs_f(float noundef %217)
  %233 = fmul float %156, %232
  %234 = tail call float @vl_abs_f(float noundef %220)
  %235 = fmul float %233, %234
  %236 = tail call float @vl_abs_f(float noundef %157)
  %237 = fmul float %235, %236
  %238 = add nsw i32 %146, 1
  %239 = srem i32 %238, 8
  %240 = sext i32 %239 to i64
  %gep193.us.us.us.1.1223 = getelementptr float, ptr %gep.us.1218, i64 %240
  %241 = load float, ptr %gep193.us.us.us.1.1223, align 4, !tbaa !26
  %242 = fadd float %241, %237
  store float %242, ptr %gep193.us.us.us.1.1223, align 4, !tbaa !26
  br label %.split.us.us.1225

.split.us.us.1225:                                ; preds = %.preheader189.us.preheader.1, %.preheader189.split.us.split.us.us.preheader.1221
  %243 = add nsw i64 %158, 1
  %244 = trunc nsw i64 %243 to i32
  %245 = add i32 %244, 2
  %or.cond181.us.1.1 = icmp ult i32 %245, 4
  br i1 %or.cond181.us.1.1, label %.preheader189.split.us.split.us.us.preheader.1.1, label %.split200.us.1

.preheader189.split.us.split.us.us.preheader.1.1: ; preds = %.split.us.us.1225
  %gep.us.1.1.idx = shl nsw i64 %243, 7
  %gep.us.1.1 = getelementptr i8, ptr %invariant.gep194.1, i64 %gep.us.1.1.idx
  %246 = fsub float 0.000000e+00, %154
  %247 = tail call float @vl_abs_f(float noundef %217)
  %248 = fmul float %156, %247
  %249 = tail call float @vl_abs_f(float noundef %246)
  %250 = fmul float %248, %249
  %251 = fadd float %157, 1.000000e+00
  %252 = tail call float @vl_abs_f(float noundef %251)
  %253 = fmul float %250, %252
  %254 = srem i32 %146, 8
  %255 = sext i32 %254 to i64
  %gep193.us.us.us.1215.1 = getelementptr float, ptr %gep.us.1.1, i64 %255
  %256 = load float, ptr %gep193.us.us.us.1215.1, align 4, !tbaa !26
  %257 = fadd float %256, %253
  store float %257, ptr %gep193.us.us.us.1215.1, align 4, !tbaa !26
  %258 = tail call float @vl_abs_f(float noundef %217)
  %259 = fmul float %156, %258
  %260 = tail call float @vl_abs_f(float noundef %246)
  %261 = fmul float %259, %260
  %262 = tail call float @vl_abs_f(float noundef %157)
  %263 = fmul float %261, %262
  %264 = add nsw i32 %146, 1
  %265 = srem i32 %264, 8
  %266 = sext i32 %265 to i64
  %gep193.us.us.us.1.1.1 = getelementptr float, ptr %gep.us.1.1, i64 %266
  %267 = load float, ptr %gep193.us.us.us.1.1.1, align 4, !tbaa !26
  %268 = fadd float %267, %263
  store float %268, ptr %gep193.us.us.us.1.1.1, align 4, !tbaa !26
  br label %.split200.us.1

.split200.us.1:                                   ; preds = %.preheader189.split.us.split.us.us.preheader.1.1, %.split.us.us.1225, %.split200.us
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  %exitcond.not = icmp eq i32 %88, %lftr.wideiv
  br i1 %exitcond.not, label %._crit_edge, label %.preheader190, !llvm.loop !28

._crit_edge:                                      ; preds = %.split200.us.1
  %indvars.iv.next228 = add nsw i64 %indvars.iv227, 1
  %lftr.wideiv229 = trunc i64 %indvars.iv.next228 to i32
  %exitcond230.not = icmp eq i32 %93, %lftr.wideiv229
  br i1 %exitcond230.not, label %._crit_edge208, label %.lr.ph, !llvm.loop !30

._crit_edge208:                                   ; preds = %._crit_edge, %.lr.ph207, %58
  %269 = getelementptr inbounds i8, ptr %1, i64 512
  %270 = tail call float @normalize_histogram(ptr noundef %1, ptr noundef nonnull %269)
  %271 = getelementptr inbounds i8, ptr %0, i64 152
  %272 = load double, ptr %271, align 8, !tbaa !31
  %273 = fcmp une double %272, 0.000000e+00
  %274 = fpext float %270 to double
  %275 = fcmp ogt double %272, %274
  %or.cond183 = select i1 %273, i1 %275, i1 false
  br i1 %or.cond183, label %.preheader.preheader, label %vector.body

vector.body:                                      ; preds = %._crit_edge208, %pred.store.continue253
  %index = phi i64 [ %index.next, %pred.store.continue253 ], [ 0, %._crit_edge208 ]
  %276 = or disjoint i64 %index, 4
  %277 = getelementptr inbounds float, ptr %1, i64 %index
  %278 = getelementptr inbounds i8, ptr %277, i64 16
  %wide.load = load <4 x float>, ptr %277, align 4, !tbaa !26
  %wide.load239 = load <4 x float>, ptr %278, align 4, !tbaa !26
  %279 = fpext <4 x float> %wide.load to <4 x double>
  %280 = fpext <4 x float> %wide.load239 to <4 x double>
  %281 = fcmp ogt <4 x double> %279, <double 2.000000e-01, double 2.000000e-01, double 2.000000e-01, double 2.000000e-01>
  %282 = fcmp ogt <4 x double> %280, <double 2.000000e-01, double 2.000000e-01, double 2.000000e-01, double 2.000000e-01>
  %283 = extractelement <4 x i1> %281, i64 0
  br i1 %283, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body
  %284 = getelementptr inbounds float, ptr %1, i64 %index
  store float 0x3FC99999A0000000, ptr %284, align 4, !tbaa !26
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body
  %285 = extractelement <4 x i1> %281, i64 1
  br i1 %285, label %pred.store.if240, label %pred.store.continue241

pred.store.if240:                                 ; preds = %pred.store.continue
  %286 = or disjoint i64 %index, 1
  %287 = getelementptr inbounds float, ptr %1, i64 %286
  store float 0x3FC99999A0000000, ptr %287, align 4, !tbaa !26
  br label %pred.store.continue241

pred.store.continue241:                           ; preds = %pred.store.if240, %pred.store.continue
  %288 = extractelement <4 x i1> %281, i64 2
  br i1 %288, label %pred.store.if242, label %pred.store.continue243

pred.store.if242:                                 ; preds = %pred.store.continue241
  %289 = or disjoint i64 %index, 2
  %290 = getelementptr inbounds float, ptr %1, i64 %289
  store float 0x3FC99999A0000000, ptr %290, align 4, !tbaa !26
  br label %pred.store.continue243

pred.store.continue243:                           ; preds = %pred.store.if242, %pred.store.continue241
  %291 = extractelement <4 x i1> %281, i64 3
  br i1 %291, label %pred.store.if244, label %pred.store.continue245

pred.store.if244:                                 ; preds = %pred.store.continue243
  %292 = or disjoint i64 %index, 3
  %293 = getelementptr inbounds float, ptr %1, i64 %292
  store float 0x3FC99999A0000000, ptr %293, align 4, !tbaa !26
  br label %pred.store.continue245

pred.store.continue245:                           ; preds = %pred.store.if244, %pred.store.continue243
  %294 = extractelement <4 x i1> %282, i64 0
  br i1 %294, label %pred.store.if246, label %pred.store.continue247

pred.store.if246:                                 ; preds = %pred.store.continue245
  %295 = getelementptr inbounds float, ptr %1, i64 %276
  store float 0x3FC99999A0000000, ptr %295, align 4, !tbaa !26
  br label %pred.store.continue247

pred.store.continue247:                           ; preds = %pred.store.if246, %pred.store.continue245
  %296 = extractelement <4 x i1> %282, i64 1
  br i1 %296, label %pred.store.if248, label %pred.store.continue249

pred.store.if248:                                 ; preds = %pred.store.continue247
  %297 = or disjoint i64 %index, 5
  %298 = getelementptr inbounds float, ptr %1, i64 %297
  store float 0x3FC99999A0000000, ptr %298, align 4, !tbaa !26
  br label %pred.store.continue249

pred.store.continue249:                           ; preds = %pred.store.if248, %pred.store.continue247
  %299 = extractelement <4 x i1> %282, i64 2
  br i1 %299, label %pred.store.if250, label %pred.store.continue251

pred.store.if250:                                 ; preds = %pred.store.continue249
  %300 = or disjoint i64 %index, 6
  %301 = getelementptr inbounds float, ptr %1, i64 %300
  store float 0x3FC99999A0000000, ptr %301, align 4, !tbaa !26
  br label %pred.store.continue251

pred.store.continue251:                           ; preds = %pred.store.if250, %pred.store.continue249
  %302 = extractelement <4 x i1> %282, i64 3
  br i1 %302, label %pred.store.if252, label %pred.store.continue253

pred.store.if252:                                 ; preds = %pred.store.continue251
  %303 = or disjoint i64 %index, 7
  %304 = getelementptr inbounds float, ptr %1, i64 %303
  store float 0x3FC99999A0000000, ptr %304, align 4, !tbaa !26
  br label %pred.store.continue253

pred.store.continue253:                           ; preds = %pred.store.if252, %pred.store.continue251
  %index.next = add nuw i64 %index, 8
  %305 = icmp eq i64 %index.next, 128
  br i1 %305, label %middle.block, label %vector.body, !llvm.loop !32

.preheader.preheader:                             ; preds = %._crit_edge208
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(512) %1, i8 0, i64 512, i1 false), !tbaa !26
  br label %.loopexit

middle.block:                                     ; preds = %pred.store.continue253
  %306 = tail call float @normalize_histogram(ptr noundef nonnull %1, ptr noundef nonnull %269)
  br label %.loopexit

.loopexit:                                        ; preds = %.preheader.preheader, %middle.block, %4, %46, %50, %53
  ret void
}

; Function Attrs: nofree willreturn
declare double @ldexp(double, i32) local_unnamed_addr #5

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #6

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #6

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

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 160}
!6 = !{!"_VlSiftFilt", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !11, i64 64, !11, i64 72, !11, i64 80, !10, i64 88, !10, i64 92, !11, i64 96, !7, i64 104, !12, i64 112, !11, i64 120, !10, i64 128, !10, i64 132, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !11, i64 176, !10, i64 184}
!7 = !{!"double", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"long long", !8, i64 0}
!13 = !{!6, !10, i64 60}
!14 = !{!6, !10, i64 88}
!15 = !{!6, !10, i64 92}
!16 = !{!17, !18, i64 16}
!17 = !{!"_VlSiftKeypoint", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !18, i64 16, !18, i64 20, !18, i64 24, !18, i64 28}
!18 = !{!"float", !8, i64 0}
!19 = !{!17, !18, i64 20}
!20 = !{!17, !18, i64 28}
!21 = !{!17, !10, i64 12}
!22 = !{!17, !10, i64 0}
!23 = !{!6, !10, i64 52}
!24 = !{!6, !10, i64 56}
!25 = !{!6, !11, i64 176}
!26 = !{!18, !18, i64 0}
!27 = !{!6, !7, i64 168}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = distinct !{!30, !29}
!31 = !{!6, !7, i64 152}
!32 = distinct !{!32, !29, !33, !34}
!33 = !{!"llvm.loop.isvectorized", i32 1}
!34 = !{!"llvm.loop.unroll.runtime.disable"}


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