; LLVM IR from awawa-dev/HyperHDR :: sources/effects/Animation_Fade.ll (ZN14Animation_Fade4InitER10HyperImagei)

; 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.anon = type { double, double, double }
%struct.Point3d = type { i8, i8, i8 }
%class.Animation_Fade = type <{ %class.AnimationBase.base, [3 x i8], i32, %struct.Point3d, i8, i32, [4 x i8], double, i32, [4 x i8], double, i32, [4 x i8], double, %"class.std::vector", double, double, %struct.Point3d, %struct.Point3d, [2 x i8], double, double, i32, i8, [3 x i8], double, i32, [4 x i8], double, i32, [4 x i8], double, i32, [4 x i8] }>
%class.AnimationBase.base = type <{ ptr, i32, i8 }>
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<Point3d, std::allocator<Point3d>>::_Vector_impl" }
%"struct.std::_Vector_base<Point3d, std::allocator<Point3d>>::_Vector_impl" = type { %"struct.std::_Vector_base<Point3d, std::allocator<Point3d>>::_Vector_impl_data" }
%"struct.std::_Vector_base<Point3d, std::allocator<Point3d>>::_Vector_impl_data" = type { ptr, ptr, ptr }

; 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 nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14Animation_Fade4InitER10HyperImagei(ptr noundef nonnull align 8 dereferenceable(188) %0, ptr noundef nonnull align 8 dereferenceable(27) %1, i32 noundef %2) unnamed_addr #2 align 2 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca %struct.anon, align 8
  %11 = alloca %struct.anon, align 8
  %12 = alloca i32, align 4
  %13 = alloca %struct.Point3d, align 1
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %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 i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca double, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca double, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store i32 %2, ptr %6, align 4, !tbaa !9
  %29 = load ptr, ptr %4, align 8
  %30 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 15
  %31 = load double, ptr %30, align 8, !tbaa !11
  %32 = fdiv double %31, 1.000000e+03
  store double %32, ptr %30, align 8, !tbaa !11
  %33 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 16
  %34 = load double, ptr %33, align 8, !tbaa !21
  %35 = fdiv double %34, 1.000000e+03
  store double %35, ptr %33, align 8, !tbaa !21
  %36 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 20
  %37 = load double, ptr %36, align 8, !tbaa !22
  %38 = fdiv double %37, 1.000000e+03
  store double %38, ptr %36, align 8, !tbaa !22
  %39 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 21
  %40 = load double, ptr %39, align 8, !tbaa !23
  %41 = fdiv double %40, 1.000000e+03
  store double %41, ptr %39, align 8, !tbaa !23
  %42 = load i32, ptr %6, align 4, !tbaa !9
  %43 = sitofp i32 %42 to float
  %44 = fpext float %43 to double
  %45 = fdiv double %44, 1.000000e+03
  %46 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 25
  store double %45, ptr %46, align 8, !tbaa !24
  %47 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 25
  %48 = load double, ptr %47, align 8, !tbaa !24
  %49 = fcmp olt double %48, 1.200000e-02
  br i1 %49, label %50, label %52

50:                                               ; preds = %3
  %51 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 25
  store double 1.200000e-02, ptr %51, align 8, !tbaa !24
  br label %52

52:                                               ; preds = %50, %3
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #7
  %53 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %54 = getelementptr inbounds %struct.Point3d, ptr %53, i32 0, i32 0
  %55 = load i8, ptr %54, align 1, !tbaa !25
  %56 = zext i8 %55 to i32
  %57 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %58 = getelementptr inbounds %struct.Point3d, ptr %57, i32 0, i32 0
  %59 = load i8, ptr %58, align 8, !tbaa !26
  %60 = zext i8 %59 to i32
  %61 = sub nsw i32 %56, %60
  %62 = call i32 @llvm.abs.i32(i32 %61, i1 true)
  store i32 %62, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #7
  %63 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %64 = getelementptr inbounds %struct.Point3d, ptr %63, i32 0, i32 1
  %65 = load i8, ptr %64, align 1, !tbaa !27
  %66 = zext i8 %65 to i32
  %67 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %68 = getelementptr inbounds %struct.Point3d, ptr %67, i32 0, i32 1
  %69 = load i8, ptr %68, align 1, !tbaa !28
  %70 = zext i8 %69 to i32
  %71 = sub nsw i32 %66, %70
  %72 = call i32 @llvm.abs.i32(i32 %71, i1 true)
  store i32 %72, ptr %8, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  %73 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %74 = getelementptr inbounds %struct.Point3d, ptr %73, i32 0, i32 2
  %75 = load i8, ptr %74, align 1, !tbaa !29
  %76 = zext i8 %75 to i32
  %77 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %78 = getelementptr inbounds %struct.Point3d, ptr %77, i32 0, i32 2
  %79 = load i8, ptr %78, align 2, !tbaa !30
  %80 = zext i8 %79 to i32
  %81 = sub nsw i32 %76, %80
  %82 = call i32 @llvm.abs.i32(i32 %81, i1 true)
  store i32 %82, ptr %9, align 4, !tbaa !9
  %83 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %8, ptr noundef nonnull align 4 dereferenceable(4) %9)
  %84 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 4 dereferenceable(4) %83)
  %85 = load i32, ptr %84, align 4, !tbaa !9
  %86 = sitofp i32 %85 to double
  %87 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  store double %86, ptr %87, align 8, !tbaa !31
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #7
  call void @llvm.lifetime.start.p0(i64 24, ptr %10) #7
  call void @llvm.memset.p0.i64(ptr align 8 %10, i8 0, i64 24, i1 false)
  %88 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %89 = load double, ptr %88, align 8, !tbaa !31
  %90 = fcmp oeq double %89, 0.000000e+00
  br i1 %90, label %91, label %93

91:                                               ; preds = %52
  %92 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  store double 1.000000e+00, ptr %92, align 8, !tbaa !31
  br label %136

93:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 24, ptr %11) #7
  %94 = getelementptr inbounds %struct.anon, ptr %11, i32 0, i32 0
  %95 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %96 = getelementptr inbounds %struct.Point3d, ptr %95, i32 0, i32 0
  %97 = load i8, ptr %96, align 1, !tbaa !25
  %98 = zext i8 %97 to i32
  %99 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %100 = getelementptr inbounds %struct.Point3d, ptr %99, i32 0, i32 0
  %101 = load i8, ptr %100, align 8, !tbaa !26
  %102 = zext i8 %101 to i32
  %103 = sub nsw i32 %98, %102
  %104 = sitofp i32 %103 to double
  %105 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %106 = load double, ptr %105, align 8, !tbaa !31
  %107 = fdiv double %104, %106
  store double %107, ptr %94, align 8, !tbaa !32
  %108 = getelementptr inbounds %struct.anon, ptr %11, i32 0, i32 1
  %109 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %110 = getelementptr inbounds %struct.Point3d, ptr %109, i32 0, i32 1
  %111 = load i8, ptr %110, align 1, !tbaa !27
  %112 = zext i8 %111 to i32
  %113 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %114 = getelementptr inbounds %struct.Point3d, ptr %113, i32 0, i32 1
  %115 = load i8, ptr %114, align 1, !tbaa !28
  %116 = zext i8 %115 to i32
  %117 = sub nsw i32 %112, %116
  %118 = sitofp i32 %117 to double
  %119 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %120 = load double, ptr %119, align 8, !tbaa !31
  %121 = fdiv double %118, %120
  store double %121, ptr %108, align 8, !tbaa !34
  %122 = getelementptr inbounds %struct.anon, ptr %11, i32 0, i32 2
  %123 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %124 = getelementptr inbounds %struct.Point3d, ptr %123, i32 0, i32 2
  %125 = load i8, ptr %124, align 1, !tbaa !29
  %126 = zext i8 %125 to i32
  %127 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %128 = getelementptr inbounds %struct.Point3d, ptr %127, i32 0, i32 2
  %129 = load i8, ptr %128, align 2, !tbaa !30
  %130 = zext i8 %129 to i32
  %131 = sub nsw i32 %126, %130
  %132 = sitofp i32 %131 to double
  %133 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %134 = load double, ptr %133, align 8, !tbaa !31
  %135 = fdiv double %132, %134
  store double %135, ptr %122, align 8, !tbaa !35
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %10, ptr align 8 %11, i64 24, i1 false), !tbaa.struct !36
  call void @llvm.lifetime.end.p0(i64 24, ptr %11) #7
  br label %136

136:                                              ; preds = %93, %91
  %137 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 14
  call void @_ZNSt6vectorI7Point3dSaIS0_EE5clearEv(ptr noundef nonnull align 8 dereferenceable(24) %137) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #7
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %138

138:                                              ; preds = %259, %136
  %139 = load i32, ptr %12, align 4, !tbaa !9
  %140 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %141 = load double, ptr %140, align 8, !tbaa !31
  %142 = fptosi double %141 to i32
  %143 = add nsw i32 %142, 1
  %144 = icmp slt i32 %139, %143
  br i1 %144, label %146, label %145

145:                                              ; preds = %138
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #7
  br label %262

146:                                              ; preds = %138
  %147 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 14
  call void @llvm.lifetime.start.p0(i64 3, ptr %13) #7
  %148 = getelementptr inbounds %struct.Point3d, ptr %13, i32 0, i32 0
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %149 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %150 = getelementptr inbounds %struct.Point3d, ptr %149, i32 0, i32 0
  %151 = load i8, ptr %150, align 8, !tbaa !26
  %152 = zext i8 %151 to i32
  %153 = sitofp i32 %152 to double
  %154 = getelementptr inbounds %struct.anon, ptr %10, i32 0, i32 0
  %155 = load double, ptr %154, align 8, !tbaa !32
  %156 = load i32, ptr %12, align 4, !tbaa !9
  %157 = sitofp i32 %156 to double
  %158 = call double @llvm.fmuladd.f64(double %155, double %157, double %153)
  %159 = call double @llvm.round.f64(double %158)
  %160 = fptosi double %159 to i32
  store i32 %160, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  store i32 0, ptr %15, align 4, !tbaa !9
  %161 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %14, ptr noundef nonnull align 4 dereferenceable(4) %15)
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  %162 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %163 = getelementptr inbounds %struct.Point3d, ptr %162, i32 0, i32 0
  %164 = load i8, ptr %163, align 8, !tbaa !26
  %165 = zext i8 %164 to i32
  %166 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %167 = getelementptr inbounds %struct.Point3d, ptr %166, i32 0, i32 0
  %168 = load i8, ptr %167, align 1, !tbaa !25
  %169 = zext i8 %168 to i32
  %170 = icmp slt i32 %165, %169
  br i1 %170, label %171, label %175

171:                                              ; preds = %146
  %172 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %173 = getelementptr inbounds %struct.Point3d, ptr %172, i32 0, i32 0
  %174 = load i8, ptr %173, align 1, !tbaa !25
  br label %179

175:                                              ; preds = %146
  %176 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %177 = getelementptr inbounds %struct.Point3d, ptr %176, i32 0, i32 0
  %178 = load i8, ptr %177, align 8, !tbaa !26
  br label %179

179:                                              ; preds = %175, %171
  %180 = phi i8 [ %174, %171 ], [ %178, %175 ]
  %181 = zext i8 %180 to i32
  store i32 %181, ptr %16, align 4, !tbaa !9
  %182 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %161, ptr noundef nonnull align 4 dereferenceable(4) %16)
  %183 = load i32, ptr %182, align 4, !tbaa !9
  %184 = trunc i32 %183 to i8
  store i8 %184, ptr %148, align 1, !tbaa !38
  %185 = getelementptr inbounds %struct.Point3d, ptr %13, i32 0, i32 1
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  %186 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %187 = getelementptr inbounds %struct.Point3d, ptr %186, i32 0, i32 1
  %188 = load i8, ptr %187, align 1, !tbaa !28
  %189 = zext i8 %188 to i32
  %190 = sitofp i32 %189 to double
  %191 = getelementptr inbounds %struct.anon, ptr %10, i32 0, i32 1
  %192 = load double, ptr %191, align 8, !tbaa !34
  %193 = load i32, ptr %12, align 4, !tbaa !9
  %194 = sitofp i32 %193 to double
  %195 = call double @llvm.fmuladd.f64(double %192, double %194, double %190)
  %196 = call double @llvm.round.f64(double %195)
  %197 = fptosi double %196 to i32
  store i32 %197, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #7
  store i32 0, ptr %18, align 4, !tbaa !9
  %198 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %17, ptr noundef nonnull align 4 dereferenceable(4) %18)
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  %199 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %200 = getelementptr inbounds %struct.Point3d, ptr %199, i32 0, i32 1
  %201 = load i8, ptr %200, align 1, !tbaa !28
  %202 = zext i8 %201 to i32
  %203 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %204 = getelementptr inbounds %struct.Point3d, ptr %203, i32 0, i32 1
  %205 = load i8, ptr %204, align 1, !tbaa !27
  %206 = zext i8 %205 to i32
  %207 = icmp slt i32 %202, %206
  br i1 %207, label %208, label %212

208:                                              ; preds = %179
  %209 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %210 = getelementptr inbounds %struct.Point3d, ptr %209, i32 0, i32 1
  %211 = load i8, ptr %210, align 1, !tbaa !27
  br label %216

212:                                              ; preds = %179
  %213 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %214 = getelementptr inbounds %struct.Point3d, ptr %213, i32 0, i32 1
  %215 = load i8, ptr %214, align 1, !tbaa !28
  br label %216

216:                                              ; preds = %212, %208
  %217 = phi i8 [ %211, %208 ], [ %215, %212 ]
  %218 = zext i8 %217 to i32
  store i32 %218, ptr %19, align 4, !tbaa !9
  %219 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %198, ptr noundef nonnull align 4 dereferenceable(4) %19)
  %220 = load i32, ptr %219, align 4, !tbaa !9
  %221 = trunc i32 %220 to i8
  store i8 %221, ptr %185, align 1, !tbaa !39
  %222 = getelementptr inbounds %struct.Point3d, ptr %13, i32 0, i32 2
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  %223 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %224 = getelementptr inbounds %struct.Point3d, ptr %223, i32 0, i32 2
  %225 = load i8, ptr %224, align 2, !tbaa !30
  %226 = zext i8 %225 to i32
  %227 = sitofp i32 %226 to double
  %228 = getelementptr inbounds %struct.anon, ptr %10, i32 0, i32 2
  %229 = load double, ptr %228, align 8, !tbaa !35
  %230 = load i32, ptr %12, align 4, !tbaa !9
  %231 = sitofp i32 %230 to double
  %232 = call double @llvm.fmuladd.f64(double %229, double %231, double %227)
  %233 = call double @llvm.round.f64(double %232)
  %234 = fptosi double %233 to i32
  store i32 %234, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  store i32 0, ptr %21, align 4, !tbaa !9
  %235 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %20, ptr noundef nonnull align 4 dereferenceable(4) %21)
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  %236 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %237 = getelementptr inbounds %struct.Point3d, ptr %236, i32 0, i32 2
  %238 = load i8, ptr %237, align 2, !tbaa !30
  %239 = zext i8 %238 to i32
  %240 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %241 = getelementptr inbounds %struct.Point3d, ptr %240, i32 0, i32 2
  %242 = load i8, ptr %241, align 1, !tbaa !29
  %243 = zext i8 %242 to i32
  %244 = icmp slt i32 %239, %243
  br i1 %244, label %245, label %249

245:                                              ; preds = %216
  %246 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 18
  %247 = getelementptr inbounds %struct.Point3d, ptr %246, i32 0, i32 2
  %248 = load i8, ptr %247, align 1, !tbaa !29
  br label %253

249:                                              ; preds = %216
  %250 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 17
  %251 = getelementptr inbounds %struct.Point3d, ptr %250, i32 0, i32 2
  %252 = load i8, ptr %251, align 2, !tbaa !30
  br label %253

253:                                              ; preds = %249, %245
  %254 = phi i8 [ %248, %245 ], [ %252, %249 ]
  %255 = zext i8 %254 to i32
  store i32 %255, ptr %22, align 4, !tbaa !9
  %256 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %235, ptr noundef nonnull align 4 dereferenceable(4) %22)
  %257 = load i32, ptr %256, align 4, !tbaa !9
  %258 = trunc i32 %257 to i8
  store i8 %258, ptr %222, align 1, !tbaa !40
  call void @_ZNSt6vectorI7Point3dSaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %147, ptr noundef nonnull align 1 dereferenceable(3) %13)
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 3, ptr %13) #7
  br label %259

259:                                              ; preds = %253
  %260 = load i32, ptr %12, align 4, !tbaa !9
  %261 = add nsw i32 %260, 1
  store i32 %261, ptr %12, align 4, !tbaa !9
  br label %138, !llvm.loop !41

262:                                              ; preds = %145
  %263 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 15
  %264 = load double, ptr %263, align 8, !tbaa !11
  %265 = fcmp ogt double %264, 0.000000e+00
  br i1 %265, label %266, label %309

266:                                              ; preds = %262
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  store i32 1, ptr %23, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  %267 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %268 = load double, ptr %267, align 8, !tbaa !31
  %269 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 15
  %270 = load double, ptr %269, align 8, !tbaa !11
  %271 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 25
  %272 = load double, ptr %271, align 8, !tbaa !24
  %273 = fdiv double %270, %272
  %274 = fdiv double %268, %273
  %275 = call double @llvm.round.f64(double %274)
  %276 = fptosi double %275 to i32
  store i32 %276, ptr %24, align 4, !tbaa !9
  %277 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %23, ptr noundef nonnull align 4 dereferenceable(4) %24)
  %278 = load i32, ptr %277, align 4, !tbaa !9
  %279 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 5
  store i32 %278, ptr %279, align 8, !tbaa !43
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %280 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 15
  %281 = load double, ptr %280, align 8, !tbaa !11
  %282 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %283 = load double, ptr %282, align 8, !tbaa !31
  %284 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 5
  %285 = load i32, ptr %284, align 8, !tbaa !43
  %286 = sitofp i32 %285 to double
  %287 = fdiv double %283, %286
  %288 = fdiv double %281, %287
  store double %288, ptr %25, align 8, !tbaa !37
  %289 = load double, ptr %25, align 8, !tbaa !37
  %290 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 7
  store double %289, ptr %290, align 8, !tbaa !44
  br label %291

291:                                              ; preds = %300, %266
  %292 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 7
  %293 = load double, ptr %292, align 8, !tbaa !44
  %294 = fcmp olt double %293, 1.500000e-02
  br i1 %294, label %295, label %298

295:                                              ; preds = %291
  %296 = load double, ptr %25, align 8, !tbaa !37
  %297 = fcmp ogt double %296, 1.000000e-04
  br label %298

298:                                              ; preds = %295, %291
  %299 = phi i1 [ false, %291 ], [ %297, %295 ]
  br i1 %299, label %300, label %308

300:                                              ; preds = %298
  %301 = load double, ptr %25, align 8, !tbaa !37
  %302 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 7
  %303 = load double, ptr %302, align 8, !tbaa !44
  %304 = fadd double %303, %301
  store double %304, ptr %302, align 8, !tbaa !44
  %305 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 5
  %306 = load i32, ptr %305, align 8, !tbaa !43
  %307 = add nsw i32 %306, 1
  store i32 %307, ptr %305, align 8, !tbaa !43
  br label %291, !llvm.loop !45

308:                                              ; preds = %298
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  br label %312

309:                                              ; preds = %262
  %310 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 7
  store double 1.000000e+00, ptr %310, align 8, !tbaa !44
  %311 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 5
  store i32 1, ptr %311, align 8, !tbaa !43
  br label %312

312:                                              ; preds = %309, %308
  %313 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 16
  %314 = load double, ptr %313, align 8, !tbaa !21
  %315 = fcmp ogt double %314, 0.000000e+00
  br i1 %315, label %316, label %359

316:                                              ; preds = %312
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  store i32 1, ptr %26, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %317 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %318 = load double, ptr %317, align 8, !tbaa !31
  %319 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 16
  %320 = load double, ptr %319, align 8, !tbaa !21
  %321 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 25
  %322 = load double, ptr %321, align 8, !tbaa !24
  %323 = fdiv double %320, %322
  %324 = fdiv double %318, %323
  %325 = call double @llvm.round.f64(double %324)
  %326 = fptosi double %325 to i32
  store i32 %326, ptr %27, align 4, !tbaa !9
  %327 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %26, ptr noundef nonnull align 4 dereferenceable(4) %27)
  %328 = load i32, ptr %327, align 4, !tbaa !9
  %329 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 8
  store i32 %328, ptr %329, align 8, !tbaa !46
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #7
  %330 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 16
  %331 = load double, ptr %330, align 8, !tbaa !21
  %332 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 13
  %333 = load double, ptr %332, align 8, !tbaa !31
  %334 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 8
  %335 = load i32, ptr %334, align 8, !tbaa !46
  %336 = sitofp i32 %335 to double
  %337 = fdiv double %333, %336
  %338 = fdiv double %331, %337
  store double %338, ptr %28, align 8, !tbaa !37
  %339 = load double, ptr %28, align 8, !tbaa !37
  %340 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 10
  store double %339, ptr %340, align 8, !tbaa !47
  br label %341

341:                                              ; preds = %350, %316
  %342 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 10
  %343 = load double, ptr %342, align 8, !tbaa !47
  %344 = fcmp olt double %343, 1.500000e-02
  br i1 %344, label %345, label %348

345:                                              ; preds = %341
  %346 = load double, ptr %28, align 8, !tbaa !37
  %347 = fcmp ogt double %346, 1.000000e-04
  br label %348

348:                                              ; preds = %345, %341
  %349 = phi i1 [ false, %341 ], [ %347, %345 ]
  br i1 %349, label %350, label %358

350:                                              ; preds = %348
  %351 = load double, ptr %28, align 8, !tbaa !37
  %352 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 10
  %353 = load double, ptr %352, align 8, !tbaa !47
  %354 = fadd double %353, %351
  store double %354, ptr %352, align 8, !tbaa !47
  %355 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 8
  %356 = load i32, ptr %355, align 8, !tbaa !46
  %357 = add nsw i32 %356, 1
  store i32 %357, ptr %355, align 8, !tbaa !46
  br label %341, !llvm.loop !48

358:                                              ; preds = %348
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  br label %362

359:                                              ; preds = %312
  %360 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 10
  store double 1.000000e+00, ptr %360, align 8, !tbaa !47
  %361 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 8
  store i32 1, ptr %361, align 8, !tbaa !46
  br label %362

362:                                              ; preds = %359, %358
  %363 = getelementptr inbounds %class.Animation_Fade, ptr %29, i32 0, i32 11
  store i32 1, ptr %363, align 8, !tbaa !49
  call void @llvm.lifetime.end.p0(i64 24, ptr %10) #7
  ret void
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #4

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt6vectorI7Point3dSaIS0_EE5clearEv(ptr noundef nonnull align 8 dereferenceable(24)) #6 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNSt6vectorI7Point3dSaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 1 dereferenceable(3)) #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #3

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

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { mustprogress 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 #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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !16, i64 96}
!12 = !{!"_ZTS14Animation_Fade", !13, i64 0, !10, i64 16, !15, i64 20, !10, i64 24, !16, i64 32, !10, i64 40, !16, i64 48, !10, i64 56, !16, i64 64, !17, i64 72, !16, i64 96, !16, i64 104, !15, i64 112, !15, i64 115, !16, i64 120, !16, i64 128, !10, i64 136, !14, i64 140, !16, i64 144, !10, i64 152, !16, i64 160, !10, i64 168, !16, i64 176, !10, i64 184}
!13 = !{!"_ZTS13AnimationBase", !10, i64 8, !14, i64 12}
!14 = !{!"bool", !7, i64 0}
!15 = !{!"_ZTS7Point3d", !7, i64 0, !7, i64 1, !7, i64 2}
!16 = !{!"double", !7, i64 0}
!17 = !{!"_ZTSSt6vectorI7Point3dSaIS0_EE", !18, i64 0}
!18 = !{!"_ZTSSt12_Vector_baseI7Point3dSaIS0_EE", !19, i64 0}
!19 = !{!"_ZTSNSt12_Vector_baseI7Point3dSaIS0_EE12_Vector_implE", !20, i64 0}
!20 = !{!"_ZTSNSt12_Vector_baseI7Point3dSaIS0_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!21 = !{!12, !16, i64 104}
!22 = !{!12, !16, i64 120}
!23 = !{!12, !16, i64 128}
!24 = !{!12, !16, i64 144}
!25 = !{!12, !7, i64 115}
!26 = !{!12, !7, i64 112}
!27 = !{!12, !7, i64 116}
!28 = !{!12, !7, i64 113}
!29 = !{!12, !7, i64 117}
!30 = !{!12, !7, i64 114}
!31 = !{!12, !16, i64 64}
!32 = !{!33, !16, i64 0}
!33 = !{!"_ZTSZN14Animation_Fade4InitER10HyperImageiE3$_0", !16, i64 0, !16, i64 8, !16, i64 16}
!34 = !{!33, !16, i64 8}
!35 = !{!33, !16, i64 16}
!36 = !{i64 0, i64 8, !37, i64 8, i64 8, !37, i64 16, i64 8, !37}
!37 = !{!16, !16, i64 0}
!38 = !{!15, !7, i64 0}
!39 = !{!15, !7, i64 1}
!40 = !{!15, !7, i64 2}
!41 = distinct !{!41, !42}
!42 = !{!"llvm.loop.mustprogress"}
!43 = !{!12, !10, i64 24}
!44 = !{!12, !16, i64 32}
!45 = distinct !{!45, !42}
!46 = !{!12, !10, i64 40}
!47 = !{!12, !16, i64 48}
!48 = distinct !{!48, !42}
!49 = !{!12, !10, i64 56}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.Point3d = type { i8, i8, i8 }

; 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 uwtable
define dso_local void @_ZN14Animation_Fade4InitER10HyperImagei(ptr noundef nonnull align 8 dereferenceable(188) %0, ptr nocapture noundef nonnull readnone align 8 dereferenceable(27) %1, i32 noundef %2) unnamed_addr #1 align 2 {
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca %struct.Point3d, align 1
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %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 i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = getelementptr inbounds i8, ptr %0, i64 96
  %22 = getelementptr inbounds i8, ptr %0, i64 104
  %23 = load <2 x double>, ptr %21, align 8, !tbaa !5
  %24 = fdiv <2 x double> %23, <double 1.000000e+03, double 1.000000e+03>
  store <2 x double> %24, ptr %21, align 8, !tbaa !5
  %25 = getelementptr inbounds i8, ptr %0, i64 120
  %26 = load <2 x double>, ptr %25, align 8, !tbaa !5
  %27 = fdiv <2 x double> %26, <double 1.000000e+03, double 1.000000e+03>
  store <2 x double> %27, ptr %25, align 8, !tbaa !5
  %28 = sitofp i32 %2 to float
  %29 = fpext float %28 to double
  %30 = fdiv double %29, 1.000000e+03
  %31 = getelementptr inbounds i8, ptr %0, i64 144
  %32 = fcmp olt double %30, 1.200000e-02
  %storemerge = select i1 %32, double 1.200000e-02, double %30
  store double %storemerge, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #6
  %33 = getelementptr inbounds i8, ptr %0, i64 115
  %34 = load i8, ptr %33, align 1, !tbaa !20
  %35 = zext i8 %34 to i32
  %36 = getelementptr inbounds i8, ptr %0, i64 112
  %37 = load i8, ptr %36, align 8, !tbaa !21
  %38 = zext i8 %37 to i32
  %39 = sub nsw i32 %35, %38
  %40 = tail call i32 @llvm.abs.i32(i32 %39, i1 true)
  store i32 %40, ptr %4, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #6
  %41 = getelementptr inbounds i8, ptr %0, i64 116
  %42 = load i8, ptr %41, align 4, !tbaa !23
  %43 = zext i8 %42 to i32
  %44 = getelementptr inbounds i8, ptr %0, i64 113
  %45 = load i8, ptr %44, align 1, !tbaa !24
  %46 = zext i8 %45 to i32
  %47 = sub nsw i32 %43, %46
  %48 = tail call i32 @llvm.abs.i32(i32 %47, i1 true)
  store i32 %48, ptr %5, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #6
  %49 = getelementptr inbounds i8, ptr %0, i64 117
  %50 = load i8, ptr %49, align 1, !tbaa !25
  %51 = zext i8 %50 to i32
  %52 = getelementptr inbounds i8, ptr %0, i64 114
  %53 = load i8, ptr %52, align 2, !tbaa !26
  %54 = zext i8 %53 to i32
  %55 = sub nsw i32 %51, %54
  %56 = tail call i32 @llvm.abs.i32(i32 %55, i1 true)
  store i32 %56, ptr %6, align 4, !tbaa !22
  %57 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %5, ptr noundef nonnull align 4 dereferenceable(4) %6)
  %58 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 4 dereferenceable(4) %57)
  %59 = load i32, ptr %58, align 4, !tbaa !22
  %60 = sitofp i32 %59 to double
  %61 = getelementptr inbounds i8, ptr %0, i64 64
  store double %60, ptr %61, align 8, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #6
  %62 = icmp eq i32 %59, 0
  br i1 %62, label %63, label %64

63:                                               ; preds = %3
  store double 1.000000e+00, ptr %61, align 8, !tbaa !27
  br label %81

64:                                               ; preds = %3
  %65 = load <2 x i8>, ptr %33, align 1, !tbaa !28
  %66 = zext <2 x i8> %65 to <2 x i16>
  %67 = load <2 x i8>, ptr %36, align 8, !tbaa !28
  %68 = zext <2 x i8> %67 to <2 x i16>
  %69 = sub nsw <2 x i16> %66, %68
  %70 = sitofp <2 x i16> %69 to <2 x double>
  %71 = insertelement <2 x double> poison, double %60, i64 0
  %72 = shufflevector <2 x double> %71, <2 x double> poison, <2 x i32> zeroinitializer
  %73 = fdiv <2 x double> %70, %72
  %74 = load i8, ptr %49, align 1, !tbaa !25
  %75 = zext i8 %74 to i32
  %76 = load i8, ptr %52, align 2, !tbaa !26
  %77 = zext i8 %76 to i32
  %78 = sub nsw i32 %75, %77
  %79 = sitofp i32 %78 to double
  %80 = fdiv double %79, %60
  br label %81

81:                                               ; preds = %64, %63
  %.sroa.7.0 = phi double [ 0.000000e+00, %63 ], [ %80, %64 ]
  %82 = phi <2 x double> [ zeroinitializer, %63 ], [ %73, %64 ]
  %83 = getelementptr inbounds i8, ptr %0, i64 72
  call void @_ZNSt6vectorI7Point3dSaIS0_EE5clearEv(ptr noundef nonnull align 8 dereferenceable(24) %83) #6
  %84 = load double, ptr %61, align 8, !tbaa !27
  %85 = fptosi double %84 to i32
  %.not20 = icmp slt i32 %85, 0
  br i1 %.not20, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %81
  %86 = getelementptr inbounds i8, ptr %7, i64 1
  %87 = getelementptr inbounds i8, ptr %7, i64 2
  %88 = extractelement <2 x double> %82, i64 0
  %89 = extractelement <2 x double> %82, i64 1
  br label %92

._crit_edge:                                      ; preds = %92, %81
  %.lcssa = phi double [ %84, %81 ], [ %133, %92 ]
  %90 = load double, ptr %21, align 8, !tbaa !29
  %91 = fcmp ogt double %90, 0.000000e+00
  br i1 %91, label %135, label %158

92:                                               ; preds = %.lr.ph, %92
  %.021 = phi i32 [ 0, %.lr.ph ], [ %132, %92 ]
  call void @llvm.lifetime.start.p0(i64 3, ptr nonnull %7) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %8) #6
  %93 = load i8, ptr %36, align 8, !tbaa !21
  %94 = uitofp i8 %93 to double
  %95 = uitofp nneg i32 %.021 to double
  %96 = call double @llvm.fmuladd.f64(double %88, double %95, double %94)
  %97 = call double @llvm.round.f64(double %96)
  %98 = fptosi double %97 to i32
  store i32 %98, ptr %8, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #6
  store i32 0, ptr %9, align 4, !tbaa !22
  %99 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %8, ptr noundef nonnull align 4 dereferenceable(4) %9)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #6
  %100 = load i8, ptr %36, align 8, !tbaa !21
  %101 = load i8, ptr %33, align 1, !tbaa !20
  %. = call i8 @llvm.umax.i8(i8 %100, i8 %101)
  %102 = zext i8 %. to i32
  store i32 %102, ptr %10, align 4, !tbaa !22
  %103 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %99, ptr noundef nonnull align 4 dereferenceable(4) %10)
  %104 = load i32, ptr %103, align 4, !tbaa !22
  %105 = trunc i32 %104 to i8
  store i8 %105, ptr %7, align 1, !tbaa !30
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #6
  %106 = load i8, ptr %44, align 1, !tbaa !24
  %107 = uitofp i8 %106 to double
  %108 = call double @llvm.fmuladd.f64(double %89, double %95, double %107)
  %109 = call double @llvm.round.f64(double %108)
  %110 = fptosi double %109 to i32
  store i32 %110, ptr %11, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #6
  store i32 0, ptr %12, align 4, !tbaa !22
  %111 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %11, ptr noundef nonnull align 4 dereferenceable(4) %12)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #6
  %112 = load i8, ptr %44, align 1, !tbaa !24
  %113 = load i8, ptr %41, align 4, !tbaa !23
  %114 = call i8 @llvm.umax.i8(i8 %112, i8 %113)
  %115 = zext i8 %114 to i32
  store i32 %115, ptr %13, align 4, !tbaa !22
  %116 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %111, ptr noundef nonnull align 4 dereferenceable(4) %13)
  %117 = load i32, ptr %116, align 4, !tbaa !22
  %118 = trunc i32 %117 to i8
  store i8 %118, ptr %86, align 1, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #6
  %119 = load i8, ptr %52, align 2, !tbaa !26
  %120 = uitofp i8 %119 to double
  %121 = call double @llvm.fmuladd.f64(double %.sroa.7.0, double %95, double %120)
  %122 = call double @llvm.round.f64(double %121)
  %123 = fptosi double %122 to i32
  store i32 %123, ptr %14, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %15) #6
  store i32 0, ptr %15, align 4, !tbaa !22
  %124 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %14, ptr noundef nonnull align 4 dereferenceable(4) %15)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %16) #6
  %125 = load i8, ptr %52, align 2, !tbaa !26
  %126 = load i8, ptr %49, align 1, !tbaa !25
  %127 = call i8 @llvm.umax.i8(i8 %125, i8 %126)
  %128 = zext i8 %127 to i32
  store i32 %128, ptr %16, align 4, !tbaa !22
  %129 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %124, ptr noundef nonnull align 4 dereferenceable(4) %16)
  %130 = load i32, ptr %129, align 4, !tbaa !22
  %131 = trunc i32 %130 to i8
  store i8 %131, ptr %87, align 1, !tbaa !32
  call void @_ZNSt6vectorI7Point3dSaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 1 dereferenceable(3) %7)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %16) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %8) #6
  call void @llvm.lifetime.end.p0(i64 3, ptr nonnull %7) #6
  %132 = add nuw nsw i32 %.021, 1
  %133 = load double, ptr %61, align 8, !tbaa !27
  %134 = fptosi double %133 to i32
  %.not.not = icmp slt i32 %.021, %134
  br i1 %.not.not, label %92, label %._crit_edge, !llvm.loop !33

135:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %17) #6
  store i32 1, ptr %17, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %18) #6
  %136 = load double, ptr %31, align 8, !tbaa !9
  %137 = fdiv double %90, %136
  %138 = fdiv double %.lcssa, %137
  %139 = call double @llvm.round.f64(double %138)
  %140 = fptosi double %139 to i32
  store i32 %140, ptr %18, align 4, !tbaa !22
  %141 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %17, ptr noundef nonnull align 4 dereferenceable(4) %18)
  %142 = load i32, ptr %141, align 4, !tbaa !22
  %143 = getelementptr inbounds i8, ptr %0, i64 24
  store i32 %142, ptr %143, align 8, !tbaa !35
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %18) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %17) #6
  %144 = load double, ptr %21, align 8, !tbaa !29
  %145 = load double, ptr %61, align 8, !tbaa !27
  %146 = sitofp i32 %142 to double
  %147 = fdiv double %145, %146
  %148 = fdiv double %144, %147
  %.fr37 = freeze double %148
  %149 = getelementptr inbounds i8, ptr %0, i64 32
  store double %.fr37, ptr %149, align 8, !tbaa !36
  %150 = fcmp ogt double %.fr37, 1.000000e-04
  %151 = fcmp olt double %.fr37, 1.500000e-02
  %152 = and i1 %151, %150
  br i1 %152, label %.lr.ph24.split, label %.loopexit19

.lr.ph24.split:                                   ; preds = %135, %.lr.ph24.split
  %153 = phi double [ %155, %.lr.ph24.split ], [ %.fr37, %135 ]
  %154 = phi i32 [ %156, %.lr.ph24.split ], [ %142, %135 ]
  %155 = fadd double %.fr37, %153
  %156 = add nsw i32 %154, 1
  %157 = fcmp olt double %155, 1.500000e-02
  br i1 %157, label %.lr.ph24.split, label %..loopexit19_crit_edge, !llvm.loop !37

158:                                              ; preds = %._crit_edge
  %159 = getelementptr inbounds i8, ptr %0, i64 32
  store double 1.000000e+00, ptr %159, align 8, !tbaa !36
  %160 = getelementptr inbounds i8, ptr %0, i64 24
  store i32 1, ptr %160, align 8, !tbaa !35
  br label %.loopexit19

..loopexit19_crit_edge:                           ; preds = %.lr.ph24.split
  store double %155, ptr %149, align 8, !tbaa !36
  store i32 %156, ptr %143, align 8, !tbaa !35
  br label %.loopexit19

.loopexit19:                                      ; preds = %135, %..loopexit19_crit_edge, %158
  %161 = phi double [ %145, %135 ], [ %145, %..loopexit19_crit_edge ], [ %.lcssa, %158 ]
  %162 = load double, ptr %22, align 8, !tbaa !38
  %163 = fcmp ogt double %162, 0.000000e+00
  br i1 %163, label %164, label %187

164:                                              ; preds = %.loopexit19
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %19) #6
  store i32 1, ptr %19, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %20) #6
  %165 = load double, ptr %31, align 8, !tbaa !9
  %166 = fdiv double %162, %165
  %167 = fdiv double %161, %166
  %168 = call double @llvm.round.f64(double %167)
  %169 = fptosi double %168 to i32
  store i32 %169, ptr %20, align 4, !tbaa !22
  %170 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %19, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %171 = load i32, ptr %170, align 4, !tbaa !22
  %172 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 %171, ptr %172, align 8, !tbaa !39
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %20) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %19) #6
  %173 = load double, ptr %22, align 8, !tbaa !38
  %174 = load double, ptr %61, align 8, !tbaa !27
  %175 = sitofp i32 %171 to double
  %176 = fdiv double %174, %175
  %177 = fdiv double %173, %176
  %.fr = freeze double %177
  %178 = getelementptr inbounds i8, ptr %0, i64 48
  store double %.fr, ptr %178, align 8, !tbaa !40
  %179 = fcmp ogt double %.fr, 1.000000e-04
  %180 = fcmp olt double %.fr, 1.500000e-02
  %181 = and i1 %180, %179
  br i1 %181, label %.lr.ph31.split, label %.loopexit

.lr.ph31.split:                                   ; preds = %164, %.lr.ph31.split
  %182 = phi double [ %184, %.lr.ph31.split ], [ %.fr, %164 ]
  %183 = phi i32 [ %185, %.lr.ph31.split ], [ %171, %164 ]
  %184 = fadd double %.fr, %182
  %185 = add nsw i32 %183, 1
  %186 = fcmp olt double %184, 1.500000e-02
  br i1 %186, label %.lr.ph31.split, label %..loopexit_crit_edge, !llvm.loop !41

187:                                              ; preds = %.loopexit19
  %188 = getelementptr inbounds i8, ptr %0, i64 48
  store double 1.000000e+00, ptr %188, align 8, !tbaa !40
  %189 = getelementptr inbounds i8, ptr %0, i64 40
  store i32 1, ptr %189, align 8, !tbaa !39
  br label %.loopexit

..loopexit_crit_edge:                             ; preds = %.lr.ph31.split
  store double %184, ptr %178, align 8, !tbaa !40
  store i32 %185, ptr %172, align 8, !tbaa !39
  br label %.loopexit

.loopexit:                                        ; preds = %164, %..loopexit_crit_edge, %187
  %190 = getelementptr inbounds i8, ptr %0, i64 56
  store i32 1, ptr %190, align 8, !tbaa !42
  ret void
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #3

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZNSt6vectorI7Point3dSaIS0_EE5clearEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNSt6vectorI7Point3dSaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 1 dereferenceable(3)) local_unnamed_addr #1 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIiERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i8 @llvm.umax.i8(i8, i8) #5

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { mustprogress 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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = !{!"double", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !6, i64 144}
!10 = !{!"_ZTS14Animation_Fade", !11, i64 0, !12, i64 16, !14, i64 20, !12, i64 24, !6, i64 32, !12, i64 40, !6, i64 48, !12, i64 56, !6, i64 64, !15, i64 72, !6, i64 96, !6, i64 104, !14, i64 112, !14, i64 115, !6, i64 120, !6, i64 128, !12, i64 136, !13, i64 140, !6, i64 144, !12, i64 152, !6, i64 160, !12, i64 168, !6, i64 176, !12, i64 184}
!11 = !{!"_ZTS13AnimationBase", !12, i64 8, !13, i64 12}
!12 = !{!"int", !7, i64 0}
!13 = !{!"bool", !7, i64 0}
!14 = !{!"_ZTS7Point3d", !7, i64 0, !7, i64 1, !7, i64 2}
!15 = !{!"_ZTSSt6vectorI7Point3dSaIS0_EE", !16, i64 0}
!16 = !{!"_ZTSSt12_Vector_baseI7Point3dSaIS0_EE", !17, i64 0}
!17 = !{!"_ZTSNSt12_Vector_baseI7Point3dSaIS0_EE12_Vector_implE", !18, i64 0}
!18 = !{!"_ZTSNSt12_Vector_baseI7Point3dSaIS0_EE17_Vector_impl_dataE", !19, i64 0, !19, i64 8, !19, i64 16}
!19 = !{!"any pointer", !7, i64 0}
!20 = !{!10, !7, i64 115}
!21 = !{!10, !7, i64 112}
!22 = !{!12, !12, i64 0}
!23 = !{!10, !7, i64 116}
!24 = !{!10, !7, i64 113}
!25 = !{!10, !7, i64 117}
!26 = !{!10, !7, i64 114}
!27 = !{!10, !6, i64 64}
!28 = !{!7, !7, i64 0}
!29 = !{!10, !6, i64 96}
!30 = !{!14, !7, i64 0}
!31 = !{!14, !7, i64 1}
!32 = !{!14, !7, i64 2}
!33 = distinct !{!33, !34}
!34 = !{!"llvm.loop.mustprogress"}
!35 = !{!10, !12, i64 24}
!36 = !{!10, !6, i64 32}
!37 = distinct !{!37, !34}
!38 = !{!10, !6, i64 104}
!39 = !{!10, !12, i64 40}
!40 = !{!10, !6, i64 48}
!41 = distinct !{!41, !34}
!42 = !{!10, !12, i64 56}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass