; LLVM IR from QiaoLiuHit/LSOTB-TIR :: vlfeat-0.9.19/vl/covdet.ll (vl_covdet_check_frame_inside)

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

%union.anon = type { i64 }
%struct._VlScaleSpaceGeometry = type { i64, i64, i64, i64, i64, i64, i64, double, double }
%struct._VlFrameOrientedEllipse = type { float, float, float, float, float, float }
%struct._VlCovDet = type { ptr, ptr, i32, double, double, double, i64, i64, double, i64, ptr, i64, i64, ptr, i64, i32, [4 x %struct._VlCovDetFeatureOrientation], [4 x %struct._VlCovDetFeatureLaplacianScale], i32, [1681 x float], [1681 x float], [1681 x float], [1681 x float], [1089 x float], [10890 x float], [5 x i64] }
%struct._VlCovDetFeatureOrientation = type { double, double }
%struct._VlCovDetFeatureLaplacianScale = type { double, double }

@vl_infinity_d = external hidden constant %union.anon, align 8

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

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

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

declare void @vl_scalespace_get_geometry(ptr dead_on_unwind writable sret(%struct._VlScaleSpaceGeometry) align 8, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local i32 @_vl_covdet_check_frame_inside(ptr noundef %0, ptr noundef byval(%struct._VlFrameOrientedEllipse) align 8 %1, double noundef %2) #3 {
  %4 = alloca ptr, align 8
  %5 = alloca double, align 8
  %6 = alloca double, align 8
  %7 = alloca [4 x double], align 16
  %8 = alloca [2 x double], align 16
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca double, align 8
  %12 = alloca double, align 8
  %13 = alloca [4 x double], align 16
  %14 = alloca [4 x double], align 16
  %15 = alloca %struct._VlScaleSpaceGeometry, align 8
  %16 = alloca i32, align 4
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store double %2, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #4
  %19 = load double, ptr %5, align 8, !tbaa !9
  store double %19, ptr %6, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %7) #4
  %20 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 2
  %21 = load float, ptr %20, align 8, !tbaa !11
  %22 = fpext float %21 to double
  store double %22, ptr %7, align 8, !tbaa !9
  %23 = getelementptr inbounds double, ptr %7, i64 1
  %24 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 4
  %25 = load float, ptr %24, align 8, !tbaa !14
  %26 = fpext float %25 to double
  store double %26, ptr %23, align 8, !tbaa !9
  %27 = getelementptr inbounds double, ptr %7, i64 2
  %28 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 3
  %29 = load float, ptr %28, align 4, !tbaa !15
  %30 = fpext float %29 to double
  store double %30, ptr %27, align 8, !tbaa !9
  %31 = getelementptr inbounds double, ptr %7, i64 3
  %32 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 5
  %33 = load float, ptr %32, align 4, !tbaa !16
  %34 = fpext float %33 to double
  store double %34, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %8) #4
  %35 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 0
  %36 = load float, ptr %35, align 8, !tbaa !17
  %37 = fpext float %36 to double
  store double %37, ptr %8, align 8, !tbaa !9
  %38 = getelementptr inbounds double, ptr %8, i64 1
  %39 = getelementptr inbounds %struct._VlFrameOrientedEllipse, ptr %1, i32 0, i32 1
  %40 = load float, ptr %39, align 4, !tbaa !18
  %41 = fpext float %40 to double
  store double %41, ptr %38, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #4
  %42 = load double, ptr @vl_infinity_d, align 8, !tbaa !19
  store double %42, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  %43 = load double, ptr @vl_infinity_d, align 8, !tbaa !19
  %44 = fneg double %43
  store double %44, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %45 = load double, ptr @vl_infinity_d, align 8, !tbaa !19
  store double %45, ptr %11, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  %46 = load double, ptr @vl_infinity_d, align 8, !tbaa !19
  %47 = fneg double %46
  store double %47, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %13) #4
  %48 = load double, ptr %6, align 8, !tbaa !9
  store double %48, ptr %13, align 8, !tbaa !9
  %49 = getelementptr inbounds double, ptr %13, i64 1
  %50 = load double, ptr %6, align 8, !tbaa !9
  store double %50, ptr %49, align 8, !tbaa !9
  %51 = getelementptr inbounds double, ptr %13, i64 2
  %52 = load double, ptr %6, align 8, !tbaa !9
  %53 = fneg double %52
  store double %53, ptr %51, align 8, !tbaa !9
  %54 = getelementptr inbounds double, ptr %13, i64 3
  %55 = load double, ptr %6, align 8, !tbaa !9
  %56 = fneg double %55
  store double %56, ptr %54, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %14) #4
  %57 = load double, ptr %6, align 8, !tbaa !9
  %58 = fneg double %57
  store double %58, ptr %14, align 8, !tbaa !9
  %59 = getelementptr inbounds double, ptr %14, i64 1
  %60 = load double, ptr %6, align 8, !tbaa !9
  store double %60, ptr %59, align 8, !tbaa !9
  %61 = getelementptr inbounds double, ptr %14, i64 2
  %62 = load double, ptr %6, align 8, !tbaa !9
  store double %62, ptr %61, align 8, !tbaa !9
  %63 = getelementptr inbounds double, ptr %14, i64 3
  %64 = load double, ptr %6, align 8, !tbaa !9
  %65 = fneg double %64
  store double %65, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 72, ptr %15) #4
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct._VlCovDet, ptr %66, i32 0, i32 0
  %68 = load ptr, ptr %67, align 8, !tbaa !20
  call void @vl_scalespace_get_geometry(ptr dead_on_unwind writable sret(%struct._VlScaleSpaceGeometry) align 8 %15, ptr noundef %68)
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  store i32 0, ptr %16, align 4, !tbaa !24
  br label %69

69:                                               ; preds = %143, %3
  %70 = load i32, ptr %16, align 4, !tbaa !24
  %71 = icmp slt i32 %70, 4
  br i1 %71, label %72, label %146

72:                                               ; preds = %69
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %73 = getelementptr inbounds [4 x double], ptr %7, i64 0, i64 0
  %74 = load double, ptr %73, align 16, !tbaa !9
  %75 = load i32, ptr %16, align 4, !tbaa !24
  %76 = sext i32 %75 to i64
  %77 = getelementptr inbounds [4 x double], ptr %13, i64 0, i64 %76
  %78 = load double, ptr %77, align 8, !tbaa !9
  %79 = getelementptr inbounds [4 x double], ptr %7, i64 0, i64 2
  %80 = load double, ptr %79, align 16, !tbaa !9
  %81 = load i32, ptr %16, align 4, !tbaa !24
  %82 = sext i32 %81 to i64
  %83 = getelementptr inbounds [4 x double], ptr %14, i64 0, i64 %82
  %84 = load double, ptr %83, align 8, !tbaa !9
  %85 = fmul double %80, %84
  %86 = call double @llvm.fmuladd.f64(double %74, double %78, double %85)
  %87 = getelementptr inbounds [2 x double], ptr %8, i64 0, i64 0
  %88 = load double, ptr %87, align 16, !tbaa !9
  %89 = fadd double %86, %88
  store double %89, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %90 = getelementptr inbounds [4 x double], ptr %7, i64 0, i64 1
  %91 = load double, ptr %90, align 8, !tbaa !9
  %92 = load i32, ptr %16, align 4, !tbaa !24
  %93 = sext i32 %92 to i64
  %94 = getelementptr inbounds [4 x double], ptr %13, i64 0, i64 %93
  %95 = load double, ptr %94, align 8, !tbaa !9
  %96 = getelementptr inbounds [4 x double], ptr %7, i64 0, i64 3
  %97 = load double, ptr %96, align 8, !tbaa !9
  %98 = load i32, ptr %16, align 4, !tbaa !24
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds [4 x double], ptr %14, i64 0, i64 %99
  %101 = load double, ptr %100, align 8, !tbaa !9
  %102 = fmul double %97, %101
  %103 = call double @llvm.fmuladd.f64(double %91, double %95, double %102)
  %104 = getelementptr inbounds [2 x double], ptr %8, i64 0, i64 1
  %105 = load double, ptr %104, align 8, !tbaa !9
  %106 = fadd double %103, %105
  store double %106, ptr %18, align 8, !tbaa !9
  %107 = load double, ptr %9, align 8, !tbaa !9
  %108 = load double, ptr %17, align 8, !tbaa !9
  %109 = fcmp olt double %107, %108
  br i1 %109, label %110, label %112

110:                                              ; preds = %72
  %111 = load double, ptr %9, align 8, !tbaa !9
  br label %114

112:                                              ; preds = %72
  %113 = load double, ptr %17, align 8, !tbaa !9
  br label %114

114:                                              ; preds = %112, %110
  %115 = phi double [ %111, %110 ], [ %113, %112 ]
  store double %115, ptr %9, align 8, !tbaa !9
  %116 = load double, ptr %10, align 8, !tbaa !9
  %117 = load double, ptr %17, align 8, !tbaa !9
  %118 = fcmp ogt double %116, %117
  br i1 %118, label %119, label %121

119:                                              ; preds = %114
  %120 = load double, ptr %10, align 8, !tbaa !9
  br label %123

121:                                              ; preds = %114
  %122 = load double, ptr %17, align 8, !tbaa !9
  br label %123

123:                                              ; preds = %121, %119
  %124 = phi double [ %120, %119 ], [ %122, %121 ]
  store double %124, ptr %10, align 8, !tbaa !9
  %125 = load double, ptr %11, align 8, !tbaa !9
  %126 = load double, ptr %18, align 8, !tbaa !9
  %127 = fcmp olt double %125, %126
  br i1 %127, label %128, label %130

128:                                              ; preds = %123
  %129 = load double, ptr %11, align 8, !tbaa !9
  br label %132

130:                                              ; preds = %123
  %131 = load double, ptr %18, align 8, !tbaa !9
  br label %132

132:                                              ; preds = %130, %128
  %133 = phi double [ %129, %128 ], [ %131, %130 ]
  store double %133, ptr %11, align 8, !tbaa !9
  %134 = load double, ptr %12, align 8, !tbaa !9
  %135 = load double, ptr %18, align 8, !tbaa !9
  %136 = fcmp ogt double %134, %135
  br i1 %136, label %137, label %139

137:                                              ; preds = %132
  %138 = load double, ptr %12, align 8, !tbaa !9
  br label %141

139:                                              ; preds = %132
  %140 = load double, ptr %18, align 8, !tbaa !9
  br label %141

141:                                              ; preds = %139, %137
  %142 = phi double [ %138, %137 ], [ %140, %139 ]
  store double %142, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  br label %143

143:                                              ; preds = %141
  %144 = load i32, ptr %16, align 4, !tbaa !24
  %145 = add nsw i32 %144, 1
  store i32 %145, ptr %16, align 4, !tbaa !24
  br label %69, !llvm.loop !25

146:                                              ; preds = %69
  %147 = load double, ptr %9, align 8, !tbaa !9
  %148 = fcmp ole double 0.000000e+00, %147
  br i1 %148, label %149, label %166

149:                                              ; preds = %146
  %150 = load double, ptr %10, align 8, !tbaa !9
  %151 = getelementptr inbounds %struct._VlScaleSpaceGeometry, ptr %15, i32 0, i32 0
  %152 = load i64, ptr %151, align 8, !tbaa !27
  %153 = sub i64 %152, 1
  %154 = uitofp i64 %153 to double
  %155 = fcmp ole double %150, %154
  br i1 %155, label %156, label %166

156:                                              ; preds = %149
  %157 = load double, ptr %11, align 8, !tbaa !9
  %158 = fcmp ole double 0.000000e+00, %157
  br i1 %158, label %159, label %166

159:                                              ; preds = %156
  %160 = load double, ptr %12, align 8, !tbaa !9
  %161 = getelementptr inbounds %struct._VlScaleSpaceGeometry, ptr %15, i32 0, i32 1
  %162 = load i64, ptr %161, align 8, !tbaa !29
  %163 = sub i64 %162, 1
  %164 = uitofp i64 %163 to double
  %165 = fcmp ole double %160, %164
  br label %166

166:                                              ; preds = %159, %156, %149, %146
  %167 = phi i1 [ false, %156 ], [ false, %149 ], [ false, %146 ], [ %165, %159 ]
  %168 = zext i1 %167 to i32
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 72, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 32, ptr %7) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #4
  ret i32 %168
}

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12, !13, i64 8}
!12 = !{!"_VlFrameOrientedEllipse", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20}
!13 = !{!"float", !7, i64 0}
!14 = !{!12, !13, i64 16}
!15 = !{!12, !13, i64 12}
!16 = !{!12, !13, i64 20}
!17 = !{!12, !13, i64 0}
!18 = !{!12, !13, i64 4}
!19 = !{!7, !7, i64 0}
!20 = !{!21, !6, i64 0}
!21 = !{!"_VlCovDet", !6, i64 0, !6, i64 8, !22, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !23, i64 48, !23, i64 56, !10, i64 64, !23, i64 72, !6, i64 80, !23, i64 88, !23, i64 96, !6, i64 104, !23, i64 112, !22, i64 120, !7, i64 128, !7, i64 192, !22, i64 256, !7, i64 260, !7, i64 6984, !7, i64 13708, !7, i64 20432, !7, i64 27156, !7, i64 31512, !7, i64 75072}
!22 = !{!"int", !7, i64 0}
!23 = !{!"long long", !7, i64 0}
!24 = !{!22, !22, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!28, !23, i64 0}
!28 = !{!"_VlScaleSpaceGeometry", !23, i64 0, !23, i64 8, !23, i64 16, !23, i64 24, !23, i64 32, !23, i64 40, !23, i64 48, !10, i64 56, !10, i64 64}
!29 = !{!28, !23, i64 8}


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

%union.anon = type { i64 }
%struct._VlScaleSpaceGeometry = type { i64, i64, i64, i64, i64, i64, i64, double, double }
%struct._VlFrameOrientedEllipse = type { float, float, float, float, float, float }

@vl_infinity_d = external hidden local_unnamed_addr constant %union.anon, align 8

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

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

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

declare void @vl_scalespace_get_geometry(ptr dead_on_unwind writable sret(%struct._VlScaleSpaceGeometry) align 8, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @_vl_covdet_check_frame_inside(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly byval(%struct._VlFrameOrientedEllipse) align 8 %1, double noundef %2) local_unnamed_addr #3 {
  %4 = alloca %struct._VlScaleSpaceGeometry, align 8
  %5 = getelementptr inbounds i8, ptr %1, i64 8
  %6 = load float, ptr %5, align 8, !tbaa !5
  %7 = fpext float %6 to double
  %8 = getelementptr inbounds i8, ptr %1, i64 16
  %9 = load float, ptr %8, align 8, !tbaa !10
  %10 = fpext float %9 to double
  %11 = getelementptr inbounds i8, ptr %1, i64 12
  %12 = load float, ptr %11, align 4, !tbaa !11
  %13 = fpext float %12 to double
  %14 = getelementptr inbounds i8, ptr %1, i64 20
  %15 = load float, ptr %14, align 4, !tbaa !12
  %16 = fpext float %15 to double
  %17 = load float, ptr %1, align 8, !tbaa !13
  %18 = fpext float %17 to double
  %19 = getelementptr inbounds i8, ptr %1, i64 4
  %20 = load float, ptr %19, align 4, !tbaa !14
  %21 = fpext float %20 to double
  %22 = load double, ptr @vl_infinity_d, align 8, !tbaa !15
  %23 = fneg double %22
  %24 = fneg double %2
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %4) #4
  %25 = load ptr, ptr %0, align 8, !tbaa !16
  call void @vl_scalespace_get_geometry(ptr dead_on_unwind nonnull writable sret(%struct._VlScaleSpaceGeometry) align 8 %4, ptr noundef %25) #4
  %26 = fmul double %24, %13
  %27 = call double @llvm.fmuladd.f64(double %7, double %2, double %26)
  %28 = fadd double %27, %18
  %29 = fmul double %24, %16
  %30 = call double @llvm.fmuladd.f64(double %10, double %2, double %29)
  %31 = fadd double %30, %21
  %32 = fcmp olt double %22, %28
  %33 = select i1 %32, double %22, double %28
  %34 = fcmp olt double %31, %23
  %35 = select i1 %34, double %23, double %31
  %36 = fmul double %13, %2
  %37 = call double @llvm.fmuladd.f64(double %7, double %2, double %36)
  %38 = fadd double %37, %18
  %39 = fmul double %16, %2
  %40 = call double @llvm.fmuladd.f64(double %10, double %2, double %39)
  %41 = fadd double %40, %21
  %42 = fcmp olt double %33, %38
  %43 = select i1 %42, double %33, double %38
  %44 = fcmp ogt double %35, %41
  %45 = select i1 %44, double %35, double %41
  %46 = call double @llvm.fmuladd.f64(double %7, double %24, double %36)
  %47 = fadd double %46, %18
  %48 = call double @llvm.fmuladd.f64(double %10, double %24, double %39)
  %49 = fadd double %48, %21
  %50 = fcmp olt double %43, %47
  %51 = select i1 %50, double %43, double %47
  %52 = fcmp ogt double %45, %49
  %53 = select i1 %52, double %45, double %49
  %54 = call double @llvm.fmuladd.f64(double %7, double %24, double %26)
  %55 = fadd double %54, %18
  %56 = call double @llvm.fmuladd.f64(double %10, double %24, double %29)
  %57 = fadd double %56, %21
  %58 = fcmp olt double %51, %55
  %59 = select i1 %58, double %51, double %55
  %60 = fcmp ogt double %53, %57
  %61 = select i1 %60, double %53, double %57
  %62 = fcmp ult double %59, 0.000000e+00
  br i1 %62, label %92, label %63

63:                                               ; preds = %3
  %64 = fcmp olt double %22, %31
  %65 = select i1 %64, double %22, double %31
  %66 = fcmp olt double %65, %41
  %67 = select i1 %66, double %65, double %41
  %68 = fcmp olt double %67, %49
  %69 = select i1 %68, double %67, double %49
  %70 = fcmp olt double %69, %57
  %71 = select i1 %70, double %69, double %57
  %72 = fcmp olt double %28, %23
  %73 = select i1 %72, double %23, double %28
  %74 = fcmp ogt double %73, %38
  %75 = select i1 %74, double %73, double %38
  %76 = fcmp ogt double %75, %47
  %77 = select i1 %76, double %75, double %47
  %78 = fcmp ogt double %77, %55
  %79 = select i1 %78, double %77, double %55
  %80 = load i64, ptr %4, align 8, !tbaa !22
  %81 = add i64 %80, -1
  %82 = uitofp i64 %81 to double
  %83 = fcmp ole double %79, %82
  %84 = fcmp oge double %71, 0.000000e+00
  %or.cond = select i1 %83, i1 %84, i1 false
  br i1 %or.cond, label %85, label %92

85:                                               ; preds = %63
  %86 = getelementptr inbounds i8, ptr %4, i64 8
  %87 = load i64, ptr %86, align 8, !tbaa !24
  %88 = add i64 %87, -1
  %89 = uitofp i64 %88 to double
  %90 = fcmp ole double %61, %89
  %91 = zext i1 %90 to i32
  br label %92

92:                                               ; preds = %85, %63, %3
  %93 = phi i32 [ 0, %63 ], [ 0, %3 ], [ %91, %85 ]
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %4) #4
  ret i32 %93
}

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 8}
!6 = !{!"_VlFrameOrientedEllipse", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!6, !7, i64 16}
!11 = !{!6, !7, i64 12}
!12 = !{!6, !7, i64 20}
!13 = !{!6, !7, i64 0}
!14 = !{!6, !7, i64 4}
!15 = !{!8, !8, i64 0}
!16 = !{!17, !18, i64 0}
!17 = !{!"_VlCovDet", !18, i64 0, !18, i64 8, !19, i64 16, !20, i64 24, !20, i64 32, !20, i64 40, !21, i64 48, !21, i64 56, !20, i64 64, !21, i64 72, !18, i64 80, !21, i64 88, !21, i64 96, !18, i64 104, !21, i64 112, !19, i64 120, !8, i64 128, !8, i64 192, !19, i64 256, !8, i64 260, !8, i64 6984, !8, i64 13708, !8, i64 20432, !8, i64 27156, !8, i64 31512, !8, i64 75072}
!18 = !{!"any pointer", !8, i64 0}
!19 = !{!"int", !8, i64 0}
!20 = !{!"double", !8, i64 0}
!21 = !{!"long long", !8, i64 0}
!22 = !{!23, !21, i64 0}
!23 = !{!"_VlScaleSpaceGeometry", !21, i64 0, !21, i64 8, !21, i64 16, !21, i64 24, !21, i64 32, !21, i64 40, !21, i64 48, !20, i64 56, !20, i64 64}
!24 = !{!23, !21, i64 8}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LCSSAPass,LoopRotatePass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass