; LLVM IR from jrouwe/JoltPhysics :: TestFramework/Application/Application.ll (ZN11Application12UpdateCameraEf)

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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%class.Application = type { ptr, [8 x i8], %struct.CameraState, %struct.CameraState, ptr, ptr, ptr, %"class.JPH::RefConst", ptr, ptr, ptr, ptr, %"class.std::__cxx11::basic_string", %"class.std::chrono::time_point", i8, i8, i8, i8, float, float, float, float, i32 }
%struct.CameraState = type <{ %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, [12 x i8] }>
%"class.JPH::RefConst" = type { ptr }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char, std::char_traits<char>, JPH::STLAllocator<char>>::_Alloc_hider", i64, %union.anon.0 }
%"struct.std::__cxx11::basic_string<char, std::char_traits<char>, JPH::STLAllocator<char>>::_Alloc_hider" = type { ptr }
%union.anon.0 = type { i64, [8 x i8] }
%"class.std::chrono::time_point" = type { %"class.std::chrono::duration" }
%"class.std::chrono::duration" = type { i64 }

; 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 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: mustprogress uwtable
define dso_local void @_ZN11Application12UpdateCameraEf(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %1) #2 align 2 {
  %3 = alloca ptr, align 8
  %4 = alloca float, align 4
  %5 = alloca float, align 4
  %6 = alloca i8, align 1
  %7 = alloca i8, align 1
  %8 = alloca i8, align 1
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca %"class.JPH::Vec3", align 16
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  %21 = alloca %"class.JPH::Vec3", align 16
  store ptr %0, ptr %3, align 8, !tbaa !5
  store float %1, ptr %4, align 4, !tbaa !9
  %22 = load ptr, ptr %3, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #7
  %23 = load ptr, ptr %22, align 16, !tbaa !11
  %24 = getelementptr inbounds ptr, ptr %23, i64 5
  %25 = load ptr, ptr %24, align 8
  %26 = call noundef float %25(ptr noundef nonnull align 16 dereferenceable(272) %22)
  %27 = fmul float 2.000000e+01, %26
  %28 = load float, ptr %4, align 4, !tbaa !9
  %29 = fmul float %27, %28
  store float %29, ptr %5, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %6) #7
  %30 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %31 = load ptr, ptr %30, align 16, !tbaa !13
  %32 = load ptr, ptr %31, align 8, !tbaa !11
  %33 = getelementptr inbounds ptr, ptr %32, i64 5
  %34 = load ptr, ptr %33, align 8
  %35 = call noundef zeroext i1 %34(ptr noundef nonnull align 8 dereferenceable(8) %31, i32 noundef 42)
  br i1 %35, label %43, label %36

36:                                               ; preds = %2
  %37 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %38 = load ptr, ptr %37, align 16, !tbaa !13
  %39 = load ptr, ptr %38, align 8, !tbaa !11
  %40 = getelementptr inbounds ptr, ptr %39, i64 5
  %41 = load ptr, ptr %40, align 8
  %42 = call noundef zeroext i1 %41(ptr noundef nonnull align 8 dereferenceable(8) %38, i32 noundef 43)
  br label %43

43:                                               ; preds = %36, %2
  %44 = phi i1 [ true, %2 ], [ %42, %36 ]
  %45 = zext i1 %44 to i8
  store i8 %45, ptr %6, align 1, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #7
  %46 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %47 = load ptr, ptr %46, align 16, !tbaa !13
  %48 = load ptr, ptr %47, align 8, !tbaa !11
  %49 = getelementptr inbounds ptr, ptr %48, i64 5
  %50 = load ptr, ptr %49, align 8
  %51 = call noundef zeroext i1 %50(ptr noundef nonnull align 8 dereferenceable(8) %47, i32 noundef 44)
  br i1 %51, label %59, label %52

52:                                               ; preds = %43
  %53 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %54 = load ptr, ptr %53, align 16, !tbaa !13
  %55 = load ptr, ptr %54, align 8, !tbaa !11
  %56 = getelementptr inbounds ptr, ptr %55, i64 5
  %57 = load ptr, ptr %56, align 8
  %58 = call noundef zeroext i1 %57(ptr noundef nonnull align 8 dereferenceable(8) %54, i32 noundef 45)
  br label %59

59:                                               ; preds = %52, %43
  %60 = phi i1 [ true, %43 ], [ %58, %52 ]
  %61 = zext i1 %60 to i8
  store i8 %61, ptr %7, align 1, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 1, ptr %8) #7
  %62 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %63 = load ptr, ptr %62, align 16, !tbaa !13
  %64 = load ptr, ptr %63, align 8, !tbaa !11
  %65 = getelementptr inbounds ptr, ptr %64, i64 5
  %66 = load ptr, ptr %65, align 8
  %67 = call noundef zeroext i1 %66(ptr noundef nonnull align 8 dereferenceable(8) %63, i32 noundef 46)
  br i1 %67, label %75, label %68

68:                                               ; preds = %59
  %69 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %70 = load ptr, ptr %69, align 16, !tbaa !13
  %71 = load ptr, ptr %70, align 8, !tbaa !11
  %72 = getelementptr inbounds ptr, ptr %71, i64 5
  %73 = load ptr, ptr %72, align 8
  %74 = call noundef zeroext i1 %73(ptr noundef nonnull align 8 dereferenceable(8) %70, i32 noundef 47)
  br label %75

75:                                               ; preds = %68, %59
  %76 = phi i1 [ true, %59 ], [ %74, %68 ]
  %77 = zext i1 %76 to i8
  store i8 %77, ptr %8, align 1, !tbaa !25
  %78 = load i8, ptr %6, align 1, !tbaa !25, !range !26, !noundef !27
  %79 = trunc i8 %78 to i1
  br i1 %79, label %80, label %83

80:                                               ; preds = %75
  %81 = load float, ptr %5, align 4, !tbaa !9
  %82 = fmul float %81, 1.000000e+01
  store float %82, ptr %5, align 4, !tbaa !9
  br label %95

83:                                               ; preds = %75
  %84 = load i8, ptr %7, align 1, !tbaa !25, !range !26, !noundef !27
  %85 = trunc i8 %84 to i1
  br i1 %85, label %86, label %89

86:                                               ; preds = %83
  %87 = load float, ptr %5, align 4, !tbaa !9
  %88 = fdiv float %87, 2.500000e+01
  store float %88, ptr %5, align 4, !tbaa !9
  br label %94

89:                                               ; preds = %83
  %90 = load i8, ptr %8, align 1, !tbaa !25, !range !26, !noundef !27
  %91 = trunc i8 %90 to i1
  br i1 %91, label %92, label %93

92:                                               ; preds = %89
  store float 0.000000e+00, ptr %5, align 4, !tbaa !9
  br label %93

93:                                               ; preds = %92, %89
  br label %94

94:                                               ; preds = %93, %86
  br label %95

95:                                               ; preds = %94, %80
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #7
  %96 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %97 = getelementptr inbounds %struct.CameraState, ptr %96, i32 0, i32 1
  %98 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %99 = getelementptr inbounds %struct.CameraState, ptr %98, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %10, ptr align 16 %99, i64 16, i1 false), !tbaa.struct !28
  %100 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 0
  %101 = load double, ptr %100, align 16
  %102 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 1
  %103 = load double, ptr %102, align 8
  %104 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %97, double %101, double %103)
  %105 = getelementptr inbounds %"class.JPH::Vec3", ptr %9, i32 0, i32 0
  %106 = getelementptr inbounds %union.anon, ptr %105, i32 0, i32 0
  %107 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 0
  %108 = extractvalue { double, double } %104, 0
  store double %108, ptr %107, align 16
  %109 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 1
  %110 = extractvalue { double, double } %104, 1
  store double %110, ptr %109, align 8
  %111 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %112 = load ptr, ptr %111, align 16, !tbaa !13
  %113 = load ptr, ptr %112, align 8, !tbaa !11
  %114 = getelementptr inbounds ptr, ptr %113, i64 5
  %115 = load ptr, ptr %114, align 8
  %116 = call noundef zeroext i1 %115(ptr noundef nonnull align 8 dereferenceable(8) %112, i32 noundef 2)
  br i1 %116, label %117, label %137

117:                                              ; preds = %95
  %118 = load float, ptr %5, align 4, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %9, i64 16, i1 false), !tbaa.struct !28
  %119 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  %120 = load double, ptr %119, align 16
  %121 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  %122 = load double, ptr %121, align 8
  %123 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %118, double %120, double %122)
  %124 = getelementptr inbounds %"class.JPH::Vec3", ptr %11, i32 0, i32 0
  %125 = getelementptr inbounds %union.anon, ptr %124, i32 0, i32 0
  %126 = getelementptr inbounds { double, double }, ptr %125, i32 0, i32 0
  %127 = extractvalue { double, double } %123, 0
  store double %127, ptr %126, align 16
  %128 = getelementptr inbounds { double, double }, ptr %125, i32 0, i32 1
  %129 = extractvalue { double, double } %123, 1
  store double %129, ptr %128, align 8
  %130 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %131 = getelementptr inbounds %struct.CameraState, ptr %130, i32 0, i32 0
  %132 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 0
  %133 = load double, ptr %132, align 16
  %134 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 1
  %135 = load double, ptr %134, align 8
  %136 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %131, double %133, double %135)
  br label %137

137:                                              ; preds = %117, %95
  %138 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %139 = load ptr, ptr %138, align 16, !tbaa !13
  %140 = load ptr, ptr %139, align 8, !tbaa !11
  %141 = getelementptr inbounds ptr, ptr %140, i64 5
  %142 = load ptr, ptr %141, align 8
  %143 = call noundef zeroext i1 %142(ptr noundef nonnull align 8 dereferenceable(8) %139, i32 noundef 5)
  br i1 %143, label %144, label %164

144:                                              ; preds = %137
  %145 = load float, ptr %5, align 4, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %14, ptr align 16 %9, i64 16, i1 false), !tbaa.struct !28
  %146 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 0
  %147 = load double, ptr %146, align 16
  %148 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 1
  %149 = load double, ptr %148, align 8
  %150 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %145, double %147, double %149)
  %151 = getelementptr inbounds %"class.JPH::Vec3", ptr %13, i32 0, i32 0
  %152 = getelementptr inbounds %union.anon, ptr %151, i32 0, i32 0
  %153 = getelementptr inbounds { double, double }, ptr %152, i32 0, i32 0
  %154 = extractvalue { double, double } %150, 0
  store double %154, ptr %153, align 16
  %155 = getelementptr inbounds { double, double }, ptr %152, i32 0, i32 1
  %156 = extractvalue { double, double } %150, 1
  store double %156, ptr %155, align 8
  %157 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %158 = getelementptr inbounds %struct.CameraState, ptr %157, i32 0, i32 0
  %159 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 0
  %160 = load double, ptr %159, align 16
  %161 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 1
  %162 = load double, ptr %161, align 8
  %163 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %158, double %160, double %162)
  br label %164

164:                                              ; preds = %144, %137
  %165 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %166 = load ptr, ptr %165, align 16, !tbaa !13
  %167 = load ptr, ptr %166, align 8, !tbaa !11
  %168 = getelementptr inbounds ptr, ptr %167, i64 5
  %169 = load ptr, ptr %168, align 8
  %170 = call noundef zeroext i1 %169(ptr noundef nonnull align 8 dereferenceable(8) %166, i32 noundef 24)
  br i1 %170, label %171, label %193

171:                                              ; preds = %164
  %172 = load float, ptr %5, align 4, !tbaa !9
  %173 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %174 = getelementptr inbounds %struct.CameraState, ptr %173, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %16, ptr align 16 %174, i64 16, i1 false), !tbaa.struct !28
  %175 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 0
  %176 = load double, ptr %175, align 16
  %177 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 1
  %178 = load double, ptr %177, align 8
  %179 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %172, double %176, double %178)
  %180 = getelementptr inbounds %"class.JPH::Vec3", ptr %15, i32 0, i32 0
  %181 = getelementptr inbounds %union.anon, ptr %180, i32 0, i32 0
  %182 = getelementptr inbounds { double, double }, ptr %181, i32 0, i32 0
  %183 = extractvalue { double, double } %179, 0
  store double %183, ptr %182, align 16
  %184 = getelementptr inbounds { double, double }, ptr %181, i32 0, i32 1
  %185 = extractvalue { double, double } %179, 1
  store double %185, ptr %184, align 8
  %186 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %187 = getelementptr inbounds %struct.CameraState, ptr %186, i32 0, i32 0
  %188 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 0
  %189 = load double, ptr %188, align 16
  %190 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 1
  %191 = load double, ptr %190, align 8
  %192 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %187, double %189, double %191)
  br label %193

193:                                              ; preds = %171, %164
  %194 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 8
  %195 = load ptr, ptr %194, align 16, !tbaa !13
  %196 = load ptr, ptr %195, align 8, !tbaa !11
  %197 = getelementptr inbounds ptr, ptr %196, i64 5
  %198 = load ptr, ptr %197, align 8
  %199 = call noundef zeroext i1 %198(ptr noundef nonnull align 8 dereferenceable(8) %195, i32 noundef 20)
  br i1 %199, label %200, label %222

200:                                              ; preds = %193
  %201 = load float, ptr %5, align 4, !tbaa !9
  %202 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %203 = getelementptr inbounds %struct.CameraState, ptr %202, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %18, ptr align 16 %203, i64 16, i1 false), !tbaa.struct !28
  %204 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 0
  %205 = load double, ptr %204, align 16
  %206 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 1
  %207 = load double, ptr %206, align 8
  %208 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %201, double %205, double %207)
  %209 = getelementptr inbounds %"class.JPH::Vec3", ptr %17, i32 0, i32 0
  %210 = getelementptr inbounds %union.anon, ptr %209, i32 0, i32 0
  %211 = getelementptr inbounds { double, double }, ptr %210, i32 0, i32 0
  %212 = extractvalue { double, double } %208, 0
  store double %212, ptr %211, align 16
  %213 = getelementptr inbounds { double, double }, ptr %210, i32 0, i32 1
  %214 = extractvalue { double, double } %208, 1
  store double %214, ptr %213, align 8
  %215 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %216 = getelementptr inbounds %struct.CameraState, ptr %215, i32 0, i32 0
  %217 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  %218 = load double, ptr %217, align 16
  %219 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  %220 = load double, ptr %219, align 8
  %221 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %216, double %218, double %220)
  br label %222

222:                                              ; preds = %200, %193
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  call void @_ZN11Application29GetCameraLocalHeadingAndPitchERfS0_(ptr noundef nonnull align 16 dereferenceable(272) %22, ptr noundef nonnull align 4 dereferenceable(4) %19, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %223 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 9
  %224 = load ptr, ptr %223, align 8, !tbaa !30
  %225 = load ptr, ptr %224, align 8, !tbaa !11
  %226 = getelementptr inbounds ptr, ptr %225, i64 7
  %227 = load ptr, ptr %226, align 8
  %228 = call noundef i32 %227(ptr noundef nonnull align 8 dereferenceable(8) %224)
  %229 = sitofp i32 %228 to float
  %230 = fmul float %229, 5.000000e-01
  %231 = call noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef %230)
  %232 = load float, ptr %19, align 4, !tbaa !9
  %233 = fadd float %232, %231
  store float %233, ptr %19, align 4, !tbaa !9
  %234 = load float, ptr %20, align 4, !tbaa !9
  %235 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 9
  %236 = load ptr, ptr %235, align 8, !tbaa !30
  %237 = load ptr, ptr %236, align 8, !tbaa !11
  %238 = getelementptr inbounds ptr, ptr %237, i64 8
  %239 = load ptr, ptr %238, align 8
  %240 = call noundef i32 %239(ptr noundef nonnull align 8 dereferenceable(8) %236)
  %241 = sitofp i32 %240 to float
  %242 = fmul float %241, 5.000000e-01
  %243 = call noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef %242)
  %244 = fsub float %234, %243
  %245 = call noundef float @_ZN3JPH5ClampIfEET_S1_S1_S1_(float noundef %244, float noundef 0xBFF8A14D60000000, float noundef 0x3FF8A14D60000000)
  store float %245, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #7
  %246 = load float, ptr %20, align 4, !tbaa !9
  %247 = call noundef float @_ZN3JPH3CosEf(float noundef %246)
  %248 = load float, ptr %19, align 4, !tbaa !9
  %249 = call noundef float @_ZN3JPH3CosEf(float noundef %248)
  %250 = fmul float %247, %249
  %251 = load float, ptr %20, align 4, !tbaa !9
  %252 = call noundef float @_ZN3JPH3SinEf(float noundef %251)
  %253 = load float, ptr %20, align 4, !tbaa !9
  %254 = call noundef float @_ZN3JPH3CosEf(float noundef %253)
  %255 = load float, ptr %19, align 4, !tbaa !9
  %256 = call noundef float @_ZN3JPH3SinEf(float noundef %255)
  %257 = fmul float %254, %256
  call void @_ZN3JPH4Vec3C2Efff(ptr noundef nonnull align 16 dereferenceable(16) %21, float noundef %250, float noundef %252, float noundef %257)
  %258 = getelementptr inbounds %class.Application, ptr %22, i32 0, i32 2
  %259 = getelementptr inbounds %struct.CameraState, ptr %258, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %259, ptr align 16 %21, i64 16, i1 false), !tbaa.struct !28
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #7
  %260 = load float, ptr %19, align 4, !tbaa !9
  %261 = load float, ptr %20, align 4, !tbaa !9
  call void @_ZN11Application25ConvertCameraLocalToWorldEff(ptr noundef nonnull align 16 dereferenceable(272) %22, float noundef %260, float noundef %261)
  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 16, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %6) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #7
  ret void
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11Application29GetCameraLocalHeadingAndPitchERfS0_(ptr noundef nonnull align 16 dereferenceable(272), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH4Vec3C2Efff(ptr noundef nonnull align 16 dereferenceable(16), float noundef, float noundef, float noundef) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11Application25ConvertCameraLocalToWorldEff(ptr noundef nonnull align 16 dereferenceable(272), float noundef, float noundef) #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #4 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) #4

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef) #5

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH5ClampIfEET_S1_S1_S1_(float noundef, float noundef, float noundef) #6

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3CosEf(float noundef) #6

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3SinEf(float noundef) #6

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 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="128" "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 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="128" "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 = { alwaysinline 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 #6 = { alwaysinline 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 #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 = !{!"float", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"vtable pointer", !8, i64 0}
!13 = !{!14, !6, i64 176}
!14 = !{!"_ZTS11Application", !15, i64 16, !15, i64 80, !6, i64 144, !6, i64 152, !6, i64 160, !17, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !18, i64 208, !21, i64 240, !23, i64 248, !23, i64 249, !23, i64 250, !23, i64 251, !10, i64 252, !10, i64 256, !10, i64 260, !10, i64 264, !24, i64 268}
!15 = !{!"_ZTS11CameraState", !16, i64 0, !16, i64 16, !16, i64 32, !10, i64 48}
!16 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!17 = !{!"_ZTSN3JPH8RefConstI4FontEE", !6, i64 0}
!18 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEEE", !19, i64 0, !20, i64 8, !7, i64 16}
!19 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEE12_Alloc_hiderE", !6, i64 0}
!20 = !{!"long", !7, i64 0}
!21 = !{!"_ZTSNSt6chrono10time_pointINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEEEE", !22, i64 0}
!22 = !{!"_ZTSNSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE", !20, i64 0}
!23 = !{!"bool", !7, i64 0}
!24 = !{!"int", !7, i64 0}
!25 = !{!23, !23, i64 0}
!26 = !{i8 0, i8 2}
!27 = !{}
!28 = !{i64 0, i64 16, !29}
!29 = !{!7, !7, i64 0}
!30 = !{!14, !6, i64 184}


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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }

; 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 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: mustprogress uwtable
define dso_local void @_ZN11Application12UpdateCameraEf(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %1) local_unnamed_addr #2 align 2 {
  %3 = alloca float, align 4
  %4 = alloca float, align 4
  %5 = alloca %"class.JPH::Vec3", align 16
  %6 = load ptr, ptr %0, align 16, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %6, i64 40
  %8 = load ptr, ptr %7, align 8
  %9 = tail call noundef float %8(ptr noundef nonnull align 16 dereferenceable(272) %0)
  %10 = fmul float %9, 2.000000e+01
  %11 = fmul float %10, %1
  %12 = getelementptr inbounds i8, ptr %0, i64 176
  %13 = load ptr, ptr %12, align 16, !tbaa !8
  %14 = load ptr, ptr %13, align 8, !tbaa !5
  %15 = getelementptr inbounds i8, ptr %14, i64 40
  %16 = load ptr, ptr %15, align 8
  %17 = tail call noundef zeroext i1 %16(ptr noundef nonnull align 8 dereferenceable(8) %13, i32 noundef 42)
  br i1 %17, label %24, label %18

18:                                               ; preds = %2
  %19 = load ptr, ptr %12, align 16, !tbaa !8
  %20 = load ptr, ptr %19, align 8, !tbaa !5
  %21 = getelementptr inbounds i8, ptr %20, i64 40
  %22 = load ptr, ptr %21, align 8
  %23 = tail call noundef zeroext i1 %22(ptr noundef nonnull align 8 dereferenceable(8) %19, i32 noundef 43)
  br label %24

24:                                               ; preds = %18, %2
  %25 = phi i1 [ true, %2 ], [ %23, %18 ]
  %26 = load ptr, ptr %12, align 16, !tbaa !8
  %27 = load ptr, ptr %26, align 8, !tbaa !5
  %28 = getelementptr inbounds i8, ptr %27, i64 40
  %29 = load ptr, ptr %28, align 8
  %30 = tail call noundef zeroext i1 %29(ptr noundef nonnull align 8 dereferenceable(8) %26, i32 noundef 44)
  br i1 %30, label %37, label %31

31:                                               ; preds = %24
  %32 = load ptr, ptr %12, align 16, !tbaa !8
  %33 = load ptr, ptr %32, align 8, !tbaa !5
  %34 = getelementptr inbounds i8, ptr %33, i64 40
  %35 = load ptr, ptr %34, align 8
  %36 = tail call noundef zeroext i1 %35(ptr noundef nonnull align 8 dereferenceable(8) %32, i32 noundef 45)
  br label %37

37:                                               ; preds = %31, %24
  %38 = phi i1 [ true, %24 ], [ %36, %31 ]
  %39 = load ptr, ptr %12, align 16, !tbaa !8
  %40 = load ptr, ptr %39, align 8, !tbaa !5
  %41 = getelementptr inbounds i8, ptr %40, i64 40
  %42 = load ptr, ptr %41, align 8
  %43 = tail call noundef zeroext i1 %42(ptr noundef nonnull align 8 dereferenceable(8) %39, i32 noundef 46)
  br i1 %43, label %50, label %44

44:                                               ; preds = %37
  %45 = load ptr, ptr %12, align 16, !tbaa !8
  %46 = load ptr, ptr %45, align 8, !tbaa !5
  %47 = getelementptr inbounds i8, ptr %46, i64 40
  %48 = load ptr, ptr %47, align 8
  %49 = tail call noundef zeroext i1 %48(ptr noundef nonnull align 8 dereferenceable(8) %45, i32 noundef 47)
  br label %50

50:                                               ; preds = %44, %37
  %51 = phi i1 [ true, %37 ], [ %49, %44 ]
  br i1 %25, label %52, label %54

52:                                               ; preds = %50
  %53 = fmul float %11, 1.000000e+01
  br label %59

54:                                               ; preds = %50
  br i1 %38, label %55, label %57

55:                                               ; preds = %54
  %56 = fdiv float %11, 2.500000e+01
  br label %59

57:                                               ; preds = %54
  br i1 %51, label %58, label %59

58:                                               ; preds = %57
  br label %59

59:                                               ; preds = %55, %58, %57, %52
  %.0 = phi float [ %53, %52 ], [ %56, %55 ], [ 0.000000e+00, %58 ], [ %11, %57 ]
  %60 = getelementptr inbounds i8, ptr %0, i64 16
  %61 = getelementptr inbounds i8, ptr %0, i64 32
  %62 = getelementptr inbounds i8, ptr %0, i64 48
  %.sroa.015.0.copyload = load double, ptr %62, align 16
  %.sroa.216.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 56
  %.sroa.216.0.copyload = load double, ptr %.sroa.216.0..sroa_idx, align 8, !tbaa !23
  %63 = tail call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %61, double %.sroa.015.0.copyload, double %.sroa.216.0.copyload)
  %64 = extractvalue { double, double } %63, 0
  %65 = extractvalue { double, double } %63, 1
  %66 = load ptr, ptr %12, align 16, !tbaa !8
  %67 = load ptr, ptr %66, align 8, !tbaa !5
  %68 = getelementptr inbounds i8, ptr %67, i64 40
  %69 = load ptr, ptr %68, align 8
  %70 = tail call noundef zeroext i1 %69(ptr noundef nonnull align 8 dereferenceable(8) %66, i32 noundef 2)
  br i1 %70, label %71, label %76

71:                                               ; preds = %59
  %72 = tail call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %.0, double %64, double %65)
  %73 = extractvalue { double, double } %72, 0
  %74 = extractvalue { double, double } %72, 1
  %75 = tail call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %60, double %73, double %74)
  br label %76

76:                                               ; preds = %71, %59
  %77 = load ptr, ptr %12, align 16, !tbaa !8
  %78 = load ptr, ptr %77, align 8, !tbaa !5
  %79 = getelementptr inbounds i8, ptr %78, i64 40
  %80 = load ptr, ptr %79, align 8
  %81 = tail call noundef zeroext i1 %80(ptr noundef nonnull align 8 dereferenceable(8) %77, i32 noundef 5)
  br i1 %81, label %82, label %87

82:                                               ; preds = %76
  %83 = tail call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %.0, double %64, double %65)
  %84 = extractvalue { double, double } %83, 0
  %85 = extractvalue { double, double } %83, 1
  %86 = tail call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %60, double %84, double %85)
  br label %87

87:                                               ; preds = %82, %76
  %88 = load ptr, ptr %12, align 16, !tbaa !8
  %89 = load ptr, ptr %88, align 8, !tbaa !5
  %90 = getelementptr inbounds i8, ptr %89, i64 40
  %91 = load ptr, ptr %90, align 8
  %92 = tail call noundef zeroext i1 %91(ptr noundef nonnull align 8 dereferenceable(8) %88, i32 noundef 24)
  br i1 %92, label %93, label %98

93:                                               ; preds = %87
  %.sroa.03.0.copyload = load double, ptr %61, align 16
  %.sroa.24.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.24.0.copyload = load double, ptr %.sroa.24.0..sroa_idx, align 8, !tbaa !23
  %94 = tail call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %.0, double %.sroa.03.0.copyload, double %.sroa.24.0.copyload)
  %95 = extractvalue { double, double } %94, 0
  %96 = extractvalue { double, double } %94, 1
  %97 = tail call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %60, double %95, double %96)
  br label %98

98:                                               ; preds = %93, %87
  %99 = load ptr, ptr %12, align 16, !tbaa !8
  %100 = load ptr, ptr %99, align 8, !tbaa !5
  %101 = getelementptr inbounds i8, ptr %100, i64 40
  %102 = load ptr, ptr %101, align 8
  %103 = tail call noundef zeroext i1 %102(ptr noundef nonnull align 8 dereferenceable(8) %99, i32 noundef 20)
  br i1 %103, label %104, label %109

104:                                              ; preds = %98
  %.sroa.0.0.copyload = load double, ptr %61, align 16
  %.sroa.2.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.2.0.copyload = load double, ptr %.sroa.2.0..sroa_idx, align 8, !tbaa !23
  %105 = tail call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %.0, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload)
  %106 = extractvalue { double, double } %105, 0
  %107 = extractvalue { double, double } %105, 1
  %108 = tail call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %60, double %106, double %107)
  br label %109

109:                                              ; preds = %104, %98
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #7
  call void @_ZN11Application29GetCameraLocalHeadingAndPitchERfS0_(ptr noundef nonnull align 16 dereferenceable(272) %0, ptr noundef nonnull align 4 dereferenceable(4) %3, ptr noundef nonnull align 4 dereferenceable(4) %4)
  %110 = getelementptr inbounds i8, ptr %0, i64 184
  %111 = load ptr, ptr %110, align 8, !tbaa !24
  %112 = load ptr, ptr %111, align 8, !tbaa !5
  %113 = getelementptr inbounds i8, ptr %112, i64 56
  %114 = load ptr, ptr %113, align 8
  %115 = call noundef i32 %114(ptr noundef nonnull align 8 dereferenceable(8) %111)
  %116 = sitofp i32 %115 to float
  %117 = fmul float %116, 5.000000e-01
  %118 = call noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef %117)
  %119 = load float, ptr %3, align 4, !tbaa !25
  %120 = fadd float %118, %119
  store float %120, ptr %3, align 4, !tbaa !25
  %121 = load float, ptr %4, align 4, !tbaa !25
  %122 = load ptr, ptr %110, align 8, !tbaa !24
  %123 = load ptr, ptr %122, align 8, !tbaa !5
  %124 = getelementptr inbounds i8, ptr %123, i64 64
  %125 = load ptr, ptr %124, align 8
  %126 = call noundef i32 %125(ptr noundef nonnull align 8 dereferenceable(8) %122)
  %127 = sitofp i32 %126 to float
  %128 = fmul float %127, 5.000000e-01
  %129 = call noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef %128)
  %130 = fsub float %121, %129
  %131 = call noundef float @_ZN3JPH5ClampIfEET_S1_S1_S1_(float noundef %130, float noundef 0xBFF8A14D60000000, float noundef 0x3FF8A14D60000000)
  store float %131, ptr %4, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #7
  %132 = call noundef float @_ZN3JPH3CosEf(float noundef %131)
  %133 = load float, ptr %3, align 4, !tbaa !25
  %134 = call noundef float @_ZN3JPH3CosEf(float noundef %133)
  %135 = fmul float %132, %134
  %136 = load float, ptr %4, align 4, !tbaa !25
  %137 = call noundef float @_ZN3JPH3SinEf(float noundef %136)
  %138 = load float, ptr %4, align 4, !tbaa !25
  %139 = call noundef float @_ZN3JPH3CosEf(float noundef %138)
  %140 = load float, ptr %3, align 4, !tbaa !25
  %141 = call noundef float @_ZN3JPH3SinEf(float noundef %140)
  %142 = fmul float %139, %141
  call void @_ZN3JPH4Vec3C2Efff(ptr noundef nonnull align 16 dereferenceable(16) %5, float noundef %135, float noundef %137, float noundef %142)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %61, ptr noundef nonnull align 16 dereferenceable(16) %5, i64 16, i1 false), !tbaa.struct !26
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #7
  %143 = load float, ptr %3, align 4, !tbaa !25
  %144 = load float, ptr %4, align 4, !tbaa !25
  call void @_ZN11Application25ConvertCameraLocalToWorldEff(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %143, float noundef %144)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #7
  ret void
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11Application29GetCameraLocalHeadingAndPitchERfS0_(ptr noundef nonnull align 16 dereferenceable(272), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH4Vec3C2Efff(ptr noundef nonnull align 16 dereferenceable(16), float noundef, float noundef, float noundef) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN11Application25ConvertCameraLocalToWorldEff(ptr noundef nonnull align 16 dereferenceable(272), float noundef, float noundef) local_unnamed_addr #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #4 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) local_unnamed_addr #4

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZN3JPH16DegreesToRadiansEf(float noundef) local_unnamed_addr #5

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH5ClampIfEET_S1_S1_S1_(float noundef, float noundef, float noundef) local_unnamed_addr #6

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3CosEf(float noundef) local_unnamed_addr #6

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3SinEf(float noundef) local_unnamed_addr #6

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="128" "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 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="128" "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 = { alwaysinline 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 #6 = { alwaysinline 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 #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 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !14, i64 176}
!9 = !{!"_ZTS11Application", !10, i64 16, !10, i64 80, !14, i64 144, !14, i64 152, !14, i64 160, !15, i64 168, !14, i64 176, !14, i64 184, !14, i64 192, !14, i64 200, !16, i64 208, !19, i64 240, !21, i64 248, !21, i64 249, !21, i64 250, !21, i64 251, !13, i64 252, !13, i64 256, !13, i64 260, !13, i64 264, !22, i64 268}
!10 = !{!"_ZTS11CameraState", !11, i64 0, !11, i64 16, !11, i64 32, !13, i64 48}
!11 = !{!"_ZTSN3JPH4Vec3E", !12, i64 0}
!12 = !{!"omnipotent char", !7, i64 0}
!13 = !{!"float", !12, i64 0}
!14 = !{!"any pointer", !12, i64 0}
!15 = !{!"_ZTSN3JPH8RefConstI4FontEE", !14, i64 0}
!16 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEEE", !17, i64 0, !18, i64 8, !12, i64 16}
!17 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEE12_Alloc_hiderE", !14, i64 0}
!18 = !{!"long", !12, i64 0}
!19 = !{!"_ZTSNSt6chrono10time_pointINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEEEE", !20, i64 0}
!20 = !{!"_ZTSNSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE", !18, i64 0}
!21 = !{!"bool", !12, i64 0}
!22 = !{!"int", !12, i64 0}
!23 = !{!12, !12, i64 0}
!24 = !{!9, !14, i64 184}
!25 = !{!13, !13, i64 0}
!26 = !{i64 0, i64 16, !23}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass