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

; 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.std::chrono::time_point" = type { %"class.std::chrono::duration" }
%"class.std::chrono::duration" = type { i64 }
%"class.std::chrono::duration.52" = type { i64 }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }
%struct.DisableCustomMemoryHook = type { i8 }
%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::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"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] }

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

declare i32 @__gxx_personality_v0(...)

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

declare void @_ZN23DisableCustomMemoryHookC1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #1

; Function Attrs: nounwind
declare void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #2

; Function Attrs: nounwind
declare i64 @_ZNSt6chrono3_V212system_clock3nowEv() #2

; 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) #3

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11Application11RenderFrameEv(ptr noundef nonnull align 16 dereferenceable(272) %0) #4 align 2 personality ptr @__gxx_personality_v0 {
  %2 = alloca i1, align 1
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca %"class.std::chrono::time_point", align 8
  %6 = alloca %"class.std::chrono::duration.52", align 8
  %7 = alloca %"class.std::chrono::duration", align 8
  %8 = alloca float, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca i32, align 4
  %12 = alloca %"class.JPH::Mat44", align 16
  %13 = alloca i8, align 1
  %14 = alloca %struct.DisableCustomMemoryHook, align 1
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  %17 = load ptr, ptr %3, align 8
  %18 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 8
  %19 = load ptr, ptr %18, align 16, !tbaa !9
  %20 = load ptr, ptr %19, align 8, !tbaa !22
  %21 = getelementptr inbounds ptr, ptr %20, i64 4
  %22 = load ptr, ptr %21, align 8
  call void %22(ptr noundef nonnull align 8 dereferenceable(8) %19)
  %23 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %24 = load ptr, ptr %23, align 8, !tbaa !24
  %25 = load ptr, ptr %24, align 8, !tbaa !22
  %26 = getelementptr inbounds ptr, ptr %25, i64 4
  %27 = load ptr, ptr %26, align 8
  call void %27(ptr noundef nonnull align 8 dereferenceable(8) %24)
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #9
  %28 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 8
  %29 = load ptr, ptr %28, align 16, !tbaa !9
  %30 = load ptr, ptr %29, align 8, !tbaa !22
  %31 = getelementptr inbounds ptr, ptr %30, i64 6
  %32 = load ptr, ptr %31, align 8
  %33 = call noundef i32 %32(ptr noundef nonnull align 8 dereferenceable(8) %29)
  store i32 %33, ptr %4, align 4, !tbaa !25
  br label %34

34:                                               ; preds = %54, %1
  %35 = load i32, ptr %4, align 4, !tbaa !25
  %36 = icmp ne i32 %35, 0
  br i1 %36, label %38, label %37

37:                                               ; preds = %34
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #9
  br label %61

38:                                               ; preds = %34
  %39 = load i32, ptr %4, align 4, !tbaa !25
  switch i32 %39, label %53 [
    i32 17, label %40
    i32 16, label %47
    i32 21, label %49
    i32 41, label %50
  ]

40:                                               ; preds = %38
  %41 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 14
  %42 = load i8, ptr %41, align 8, !tbaa !27, !range !28, !noundef !29
  %43 = trunc i8 %42 to i1
  %44 = xor i1 %43, true
  %45 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 14
  %46 = zext i1 %44 to i8
  store i8 %46, ptr %45, align 8, !tbaa !27
  br label %53

47:                                               ; preds = %38
  %48 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 15
  store i8 1, ptr %48, align 1, !tbaa !30
  br label %53

49:                                               ; preds = %38
  br label %53

50:                                               ; preds = %38
  %51 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 11
  %52 = load ptr, ptr %51, align 8, !tbaa !31
  call void @_ZN7DebugUI16ToggleVisibilityEv(ptr noundef nonnull align 8 dereferenceable(24) %52)
  br label %53

53:                                               ; preds = %50, %49, %47, %40, %38
  br label %54

54:                                               ; preds = %53
  %55 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 8
  %56 = load ptr, ptr %55, align 16, !tbaa !9
  %57 = load ptr, ptr %56, align 8, !tbaa !22
  %58 = getelementptr inbounds ptr, ptr %57, i64 7
  %59 = load ptr, ptr %58, align 8
  %60 = call noundef i32 %59(ptr noundef nonnull align 8 dereferenceable(8) %56)
  store i32 %60, ptr %4, align 4, !tbaa !25
  br label %34, !llvm.loop !32

61:                                               ; preds = %37
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #9
  %62 = call i64 @_ZNSt6chrono3_V212system_clock3nowEv() #9
  %63 = getelementptr inbounds %"class.std::chrono::time_point", ptr %5, i32 0, i32 0
  %64 = getelementptr inbounds %"class.std::chrono::duration", ptr %63, i32 0, i32 0
  store i64 %62, ptr %64, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #9
  %65 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 13
  %66 = call i64 @_ZNSt6chronomiINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEES6_EENSt11common_typeIJT0_T1_EE4typeERKNS_10time_pointIT_S8_EERKNSC_ISD_S9_EE(ptr noundef nonnull align 8 dereferenceable(8) %5, ptr noundef nonnull align 8 dereferenceable(8) %65)
  %67 = getelementptr inbounds %"class.std::chrono::duration", ptr %7, i32 0, i32 0
  store i64 %66, ptr %67, align 8
  %68 = call i64 @_ZNSt6chrono13duration_castINS_8durationIlSt5ratioILl1ELl1000000EEEElS2_ILl1ELl1000000000EEEENSt9enable_ifIXsr13__is_durationIT_EE5valueES7_E4typeERKNS1_IT0_T1_EE(ptr noundef nonnull align 8 dereferenceable(8) %7)
  %69 = getelementptr inbounds %"class.std::chrono::duration.52", ptr %6, i32 0, i32 0
  store i64 %68, ptr %69, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #9
  %70 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 13
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %70, ptr align 8 %5, i64 8, i1 false), !tbaa.struct !34
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #9
  %71 = call noundef i64 @_ZNKSt6chrono8durationIlSt5ratioILl1ELl1000000EEE5countEv(ptr noundef nonnull align 8 dereferenceable(8) %6)
  %72 = sitofp i64 %71 to float
  %73 = fmul float 0x3EB0C6F7A0000000, %72
  store float %73, ptr %8, align 4, !tbaa !36
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #9
  store float 0.000000e+00, ptr %9, align 4, !tbaa !36
  %74 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  %75 = load float, ptr %74, align 16, !tbaa !37
  %76 = fcmp ole float %75, 0.000000e+00
  br i1 %76, label %77, label %91

77:                                               ; preds = %61
  %78 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 14
  %79 = load i8, ptr %78, align 8, !tbaa !27, !range !28, !noundef !29
  %80 = trunc i8 %79 to i1
  br i1 %80, label %81, label %85

81:                                               ; preds = %77
  %82 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 15
  %83 = load i8, ptr %82, align 1, !tbaa !30, !range !28, !noundef !29
  %84 = trunc i8 %83 to i1
  br i1 %84, label %85, label %87

85:                                               ; preds = %81, %77
  %86 = load float, ptr %8, align 4, !tbaa !36
  br label %88

87:                                               ; preds = %81
  br label %88

88:                                               ; preds = %87, %85
  %89 = phi float [ %86, %85 ], [ 0.000000e+00, %87 ]
  store float %89, ptr %9, align 4, !tbaa !36
  %90 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 20
  store float 0.000000e+00, ptr %90, align 4, !tbaa !38
  br label %128

91:                                               ; preds = %61
  %92 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 15
  %93 = load i8, ptr %92, align 1, !tbaa !30, !range !28, !noundef !29
  %94 = trunc i8 %93 to i1
  br i1 %94, label %95, label %98

95:                                               ; preds = %91
  %96 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  %97 = load float, ptr %96, align 16, !tbaa !37
  store float %97, ptr %9, align 4, !tbaa !36
  br label %127

98:                                               ; preds = %91
  %99 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 14
  %100 = load i8, ptr %99, align 8, !tbaa !27, !range !28, !noundef !29
  %101 = trunc i8 %100 to i1
  br i1 %101, label %126, label %102

102:                                              ; preds = %98
  %103 = load float, ptr %8, align 4, !tbaa !36
  %104 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 20
  %105 = load float, ptr %104, align 4, !tbaa !38
  %106 = fadd float %103, %105
  store float %106, ptr %9, align 4, !tbaa !36
  %107 = load float, ptr %9, align 4, !tbaa !36
  %108 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  %109 = load float, ptr %108, align 16, !tbaa !37
  %110 = fcmp olt float %107, %109
  br i1 %110, label %111, label %114

111:                                              ; preds = %102
  %112 = load float, ptr %9, align 4, !tbaa !36
  %113 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 20
  store float %112, ptr %113, align 4, !tbaa !38
  store float 0.000000e+00, ptr %9, align 4, !tbaa !36
  br label %125

114:                                              ; preds = %102
  %115 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #9
  %116 = load float, ptr %9, align 4, !tbaa !36
  %117 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  %118 = load float, ptr %117, align 16, !tbaa !37
  %119 = fsub float %116, %118
  store float %119, ptr %10, align 4, !tbaa !36
  %120 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %115, ptr noundef nonnull align 4 dereferenceable(4) %10)
  %121 = load float, ptr %120, align 4, !tbaa !36
  %122 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 20
  store float %121, ptr %122, align 4, !tbaa !38
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #9
  %123 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 19
  %124 = load float, ptr %123, align 16, !tbaa !37
  store float %124, ptr %9, align 4, !tbaa !36
  br label %125

125:                                              ; preds = %114, %111
  br label %126

126:                                              ; preds = %125, %98
  br label %127

127:                                              ; preds = %126, %95
  br label %128

128:                                              ; preds = %127, %88
  %129 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 15
  store i8 0, ptr %129, align 1, !tbaa !30
  %130 = load float, ptr %9, align 4, !tbaa !36
  %131 = fcmp ogt float %130, 0.000000e+00
  br i1 %131, label %132, label %133

132:                                              ; preds = %128
  call void @_ZN11Application18ClearDebugRendererEv(ptr noundef nonnull align 16 dereferenceable(272) %17)
  br label %133

133:                                              ; preds = %132, %128
  %134 = load float, ptr %9, align 4, !tbaa !36
  %135 = load ptr, ptr %17, align 16, !tbaa !22
  %136 = getelementptr inbounds ptr, ptr %135, i64 2
  %137 = load ptr, ptr %136, align 8
  %138 = call noundef zeroext i1 %137(ptr noundef nonnull align 16 dereferenceable(272) %17, float noundef %134)
  br i1 %138, label %140, label %139

139:                                              ; preds = %133
  store i1 false, ptr %2, align 1
  store i32 1, ptr %11, align 4
  br label %290

140:                                              ; preds = %133
  %141 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 16
  %142 = load i8, ptr %141, align 2, !tbaa !39, !range !28, !noundef !29
  %143 = trunc i8 %142 to i1
  br i1 %143, label %144, label %147

144:                                              ; preds = %140
  %145 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 4
  %146 = load ptr, ptr %145, align 16, !tbaa !40
  call void @llvm.lifetime.start.p0(i64 64, ptr %12) #9
  call void @_ZN3JPH5Mat449sIdentityEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %12)
  call void @_ZN3JPH13DebugRenderer20DrawCoordinateSystemERKNS_5Mat44Ef(ptr noundef nonnull align 8 dereferenceable(320) %146, ptr noundef nonnull align 16 dereferenceable(64) %12, float noundef 1.000000e+00)
  call void @llvm.lifetime.end.p0(i64 64, ptr %12) #9
  br label %147

147:                                              ; preds = %144, %140
  %148 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 16
  store i8 0, ptr %148, align 2, !tbaa !39
  %149 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %150 = load ptr, ptr %149, align 16, !tbaa !41
  %151 = call noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144) %150)
  br i1 %151, label %154, label %152

152:                                              ; preds = %147
  %153 = load float, ptr %8, align 4, !tbaa !36
  call void @_ZN11Application12UpdateCameraEf(ptr noundef nonnull align 16 dereferenceable(272) %17, float noundef %153)
  br label %154

154:                                              ; preds = %152, %147
  %155 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 6
  %156 = load ptr, ptr %155, align 16, !tbaa !42
  %157 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 3
  %158 = load ptr, ptr %17, align 16, !tbaa !22
  %159 = getelementptr inbounds ptr, ptr %158, i64 5
  %160 = load ptr, ptr %159, align 8
  %161 = call noundef float %160(ptr noundef nonnull align 16 dereferenceable(272) %17)
  %162 = load ptr, ptr %156, align 16, !tbaa !22
  %163 = getelementptr inbounds ptr, ptr %162, i64 3
  %164 = load ptr, ptr %163, align 8
  call void %164(ptr noundef nonnull align 16 dereferenceable(832) %156, ptr noundef nonnull align 16 dereferenceable(52) %157, float noundef %161)
  %165 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 4
  %166 = load ptr, ptr %165, align 16, !tbaa !40
  call void @_ZN16DebugRendererImp14DrawShadowPassEv(ptr noundef nonnull align 16 dereferenceable(816) %166)
  %167 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 6
  %168 = load ptr, ptr %167, align 16, !tbaa !42
  %169 = load ptr, ptr %168, align 16, !tbaa !22
  %170 = getelementptr inbounds ptr, ptr %169, i64 4
  %171 = load ptr, ptr %170, align 8
  call void %171(ptr noundef nonnull align 16 dereferenceable(832) %168)
  %172 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 4
  %173 = load ptr, ptr %172, align 16, !tbaa !40
  call void @_ZN16DebugRendererImp4DrawEv(ptr noundef nonnull align 16 dereferenceable(816) %173)
  %174 = load float, ptr %8, align 4, !tbaa !36
  call void @_ZN11Application7DrawFPSEf(ptr noundef nonnull align 16 dereferenceable(272) %17, float noundef %174)
  %175 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %176 = load ptr, ptr %175, align 16, !tbaa !41
  %177 = call noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144) %176)
  br i1 %177, label %178, label %278

178:                                              ; preds = %154
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #9
  %179 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %180 = load ptr, ptr %179, align 8, !tbaa !24
  %181 = load ptr, ptr %180, align 8, !tbaa !22
  %182 = getelementptr inbounds ptr, ptr %181, i64 9
  %183 = load ptr, ptr %182, align 8
  %184 = call noundef zeroext i1 %183(ptr noundef nonnull align 8 dereferenceable(8) %180)
  %185 = zext i1 %184 to i8
  store i8 %185, ptr %13, align 1, !tbaa !43
  %186 = load i8, ptr %13, align 1, !tbaa !43, !range !28, !noundef !29
  %187 = trunc i8 %186 to i1
  br i1 %187, label %188, label %211

188:                                              ; preds = %178
  %189 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 17
  %190 = load i8, ptr %189, align 1, !tbaa !44, !range !28, !noundef !29
  %191 = trunc i8 %190 to i1
  br i1 %191, label %211, label %192

192:                                              ; preds = %188
  %193 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %194 = load ptr, ptr %193, align 16, !tbaa !41
  %195 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %196 = load ptr, ptr %195, align 8, !tbaa !24
  %197 = load ptr, ptr %196, align 8, !tbaa !22
  %198 = getelementptr inbounds ptr, ptr %197, i64 5
  %199 = load ptr, ptr %198, align 8
  %200 = call noundef i32 %199(ptr noundef nonnull align 8 dereferenceable(8) %196)
  %201 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %202 = load ptr, ptr %201, align 8, !tbaa !24
  %203 = load ptr, ptr %202, align 8, !tbaa !22
  %204 = getelementptr inbounds ptr, ptr %203, i64 6
  %205 = load ptr, ptr %204, align 8
  %206 = call noundef i32 %205(ptr noundef nonnull align 8 dereferenceable(8) %202)
  %207 = load ptr, ptr %194, align 8, !tbaa !22
  %208 = getelementptr inbounds ptr, ptr %207, i64 11
  %209 = load ptr, ptr %208, align 8
  %210 = call noundef zeroext i1 %209(ptr noundef nonnull align 8 dereferenceable(144) %194, i32 noundef %200, i32 noundef %206)
  br label %238

211:                                              ; preds = %188, %178
  %212 = load i8, ptr %13, align 1, !tbaa !43, !range !28, !noundef !29
  %213 = trunc i8 %212 to i1
  br i1 %213, label %237, label %214

214:                                              ; preds = %211
  %215 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 17
  %216 = load i8, ptr %215, align 1, !tbaa !44, !range !28, !noundef !29
  %217 = trunc i8 %216 to i1
  br i1 %217, label %218, label %237

218:                                              ; preds = %214
  %219 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %220 = load ptr, ptr %219, align 16, !tbaa !41
  %221 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %222 = load ptr, ptr %221, align 8, !tbaa !24
  %223 = load ptr, ptr %222, align 8, !tbaa !22
  %224 = getelementptr inbounds ptr, ptr %223, i64 5
  %225 = load ptr, ptr %224, align 8
  %226 = call noundef i32 %225(ptr noundef nonnull align 8 dereferenceable(8) %222)
  %227 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %228 = load ptr, ptr %227, align 8, !tbaa !24
  %229 = load ptr, ptr %228, align 8, !tbaa !22
  %230 = getelementptr inbounds ptr, ptr %229, i64 6
  %231 = load ptr, ptr %230, align 8
  %232 = call noundef i32 %231(ptr noundef nonnull align 8 dereferenceable(8) %228)
  %233 = load ptr, ptr %220, align 8, !tbaa !22
  %234 = getelementptr inbounds ptr, ptr %233, i64 12
  %235 = load ptr, ptr %234, align 8
  %236 = call noundef zeroext i1 %235(ptr noundef nonnull align 8 dereferenceable(144) %220, i32 noundef %226, i32 noundef %232)
  br label %237

237:                                              ; preds = %218, %214, %211
  br label %238

238:                                              ; preds = %237, %192
  %239 = load i8, ptr %13, align 1, !tbaa !43, !range !28, !noundef !29
  %240 = trunc i8 %239 to i1
  %241 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 17
  %242 = zext i1 %240 to i8
  store i8 %242, ptr %241, align 1, !tbaa !44
  %243 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %244 = load ptr, ptr %243, align 16, !tbaa !41
  %245 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %246 = load ptr, ptr %245, align 8, !tbaa !24
  %247 = load ptr, ptr %246, align 8, !tbaa !22
  %248 = getelementptr inbounds ptr, ptr %247, i64 5
  %249 = load ptr, ptr %248, align 8
  %250 = call noundef i32 %249(ptr noundef nonnull align 8 dereferenceable(8) %246)
  %251 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 9
  %252 = load ptr, ptr %251, align 8, !tbaa !24
  %253 = load ptr, ptr %252, align 8, !tbaa !22
  %254 = getelementptr inbounds ptr, ptr %253, i64 6
  %255 = load ptr, ptr %254, align 8
  %256 = call noundef i32 %255(ptr noundef nonnull align 8 dereferenceable(8) %252)
  %257 = load ptr, ptr %244, align 8, !tbaa !22
  %258 = getelementptr inbounds ptr, ptr %257, i64 13
  %259 = load ptr, ptr %258, align 8
  %260 = call noundef zeroext i1 %259(ptr noundef nonnull align 8 dereferenceable(144) %244, i32 noundef %250, i32 noundef %256)
  call void @llvm.lifetime.start.p0(i64 1, ptr %14) #9
  call void @_ZN23DisableCustomMemoryHookC1Ev(ptr noundef nonnull align 1 dereferenceable(1) %14)
  %261 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %262 = load ptr, ptr %261, align 16, !tbaa !41
  %263 = load float, ptr %8, align 4, !tbaa !36
  %264 = load ptr, ptr %262, align 8, !tbaa !22
  %265 = getelementptr inbounds ptr, ptr %264, i64 9
  %266 = load ptr, ptr %265, align 8
  invoke void %266(ptr noundef nonnull align 8 dereferenceable(248) %262, float noundef %263)
          to label %267 unwind label %274

267:                                              ; preds = %238
  %268 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %269 = load ptr, ptr %268, align 16, !tbaa !41
  %270 = load ptr, ptr %269, align 8, !tbaa !22
  %271 = getelementptr inbounds ptr, ptr %270, i64 10
  %272 = load ptr, ptr %271, align 8
  invoke void %272(ptr noundef nonnull align 8 dereferenceable(248) %269)
          to label %273 unwind label %274

273:                                              ; preds = %267
  call void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #9
  br label %284

274:                                              ; preds = %267, %238
  %275 = landingpad { ptr, i32 }
          cleanup
  %276 = extractvalue { ptr, i32 } %275, 0
  store ptr %276, ptr %15, align 8
  %277 = extractvalue { ptr, i32 } %275, 1
  store i32 %277, ptr %16, align 4
  call void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %14) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #9
  br label %292

278:                                              ; preds = %154
  %279 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 10
  %280 = load ptr, ptr %279, align 16, !tbaa !41
  %281 = load ptr, ptr %280, align 8, !tbaa !22
  %282 = getelementptr inbounds ptr, ptr %281, i64 14
  %283 = load ptr, ptr %282, align 8
  call void %283(ptr noundef nonnull align 8 dereferenceable(144) %280)
  br label %284

284:                                              ; preds = %278, %273
  %285 = getelementptr inbounds %class.Application, ptr %17, i32 0, i32 6
  %286 = load ptr, ptr %285, align 16, !tbaa !42
  %287 = load ptr, ptr %286, align 16, !tbaa !22
  %288 = getelementptr inbounds ptr, ptr %287, i64 5
  %289 = load ptr, ptr %288, align 8
  call void %289(ptr noundef nonnull align 16 dereferenceable(832) %286)
  store i1 true, ptr %2, align 1
  store i32 1, ptr %11, align 4
  br label %290

290:                                              ; preds = %284, %139
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #9
  %291 = load i1, ptr %2, align 1
  ret i1 %291

292:                                              ; preds = %274
  %293 = load ptr, ptr %15, align 8
  %294 = load i32, ptr %16, align 4
  %295 = insertvalue { ptr, i32 } poison, ptr %293, 0
  %296 = insertvalue { ptr, i32 } %295, i32 %294, 1
  resume { ptr, i32 } %296
}

declare void @_ZN7DebugUI16ToggleVisibilityEv(ptr noundef nonnull align 8 dereferenceable(24)) #1

; Function Attrs: mustprogress uwtable
declare dso_local i64 @_ZNSt6chrono13duration_castINS_8durationIlSt5ratioILl1ELl1000000EEEElS2_ILl1ELl1000000000EEEENSt9enable_ifIXsr13__is_durationIT_EE5valueES7_E4typeERKNS1_IT0_T1_EE(ptr noundef nonnull align 8 dereferenceable(8)) #4

; Function Attrs: mustprogress uwtable
declare dso_local i64 @_ZNSt6chronomiINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEES6_EENSt11common_typeIJT0_T1_EE4typeERKNS_10time_pointIT_S8_EERKNSC_ISD_S9_EE(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #4

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNKSt6chrono8durationIlSt5ratioILl1ELl1000000EEE5countEv(ptr noundef nonnull align 8 dereferenceable(8)) #5 align 2

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

declare void @_ZN3JPH13DebugRenderer20DrawCoordinateSystemERKNS_5Mat44Ef(ptr noundef nonnull align 8 dereferenceable(320), ptr noundef nonnull align 16 dereferenceable(64), float noundef) #1

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZN3JPH5Mat449sIdentityEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16) #7 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144)) #5 align 2

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

declare void @_ZN16DebugRendererImp14DrawShadowPassEv(ptr noundef nonnull align 16 dereferenceable(816)) #1

declare void @_ZN16DebugRendererImp4DrawEv(ptr noundef nonnull align 16 dereferenceable(816)) #1

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { 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 = { 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 #7 = { 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 #8 = { mustprogress uwtable "min-legal-vector-width"="64" "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 #9 = { 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, !6, i64 176}
!10 = !{!"_ZTS11Application", !11, i64 16, !11, i64 80, !6, i64 144, !6, i64 152, !6, i64 160, !14, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !15, i64 208, !18, i64 240, !20, i64 248, !20, i64 249, !20, i64 250, !20, i64 251, !13, i64 252, !13, i64 256, !13, i64 260, !13, i64 264, !21, i64 268}
!11 = !{!"_ZTS11CameraState", !12, i64 0, !12, i64 16, !12, i64 32, !13, i64 48}
!12 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!13 = !{!"float", !7, i64 0}
!14 = !{!"_ZTSN3JPH8RefConstI4FontEE", !6, i64 0}
!15 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEEE", !16, i64 0, !17, i64 8, !7, i64 16}
!16 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEE12_Alloc_hiderE", !6, i64 0}
!17 = !{!"long", !7, i64 0}
!18 = !{!"_ZTSNSt6chrono10time_pointINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEEEE", !19, i64 0}
!19 = !{!"_ZTSNSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE", !17, i64 0}
!20 = !{!"bool", !7, i64 0}
!21 = !{!"int", !7, i64 0}
!22 = !{!23, !23, i64 0}
!23 = !{!"vtable pointer", !8, i64 0}
!24 = !{!10, !6, i64 184}
!25 = !{!26, !26, i64 0}
!26 = !{!"_ZTS4EKey", !7, i64 0}
!27 = !{!10, !20, i64 248}
!28 = !{i8 0, i8 2}
!29 = !{}
!30 = !{!10, !20, i64 249}
!31 = !{!10, !6, i64 200}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{i64 0, i64 8, !35}
!35 = !{!17, !17, i64 0}
!36 = !{!13, !13, i64 0}
!37 = !{!10, !13, i64 256}
!38 = !{!10, !13, i64 260}
!39 = !{!10, !20, i64 250}
!40 = !{!10, !6, i64 144}
!41 = !{!10, !6, i64 192}
!42 = !{!10, !6, i64 160}
!43 = !{!20, !20, i64 0}
!44 = !{!10, !20, i64 251}


; 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.std::chrono::time_point" = type { %"class.std::chrono::duration" }
%"class.std::chrono::duration" = type { i64 }
%"class.std::chrono::duration.52" = type { i64 }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }
%struct.DisableCustomMemoryHook = type { i8 }

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

declare i32 @__gxx_personality_v0(...)

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

declare void @_ZN23DisableCustomMemoryHookC1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #1

; Function Attrs: nounwind
declare void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #2

; Function Attrs: nounwind
declare i64 @_ZNSt6chrono3_V212system_clock3nowEv() local_unnamed_addr #2

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN11Application11RenderFrameEv(ptr noundef nonnull align 16 dereferenceable(272) %0) local_unnamed_addr #3 align 2 personality ptr @__gxx_personality_v0 {
  %2 = alloca %"class.std::chrono::time_point", align 8
  %3 = alloca %"class.std::chrono::duration.52", align 8
  %4 = alloca %"class.std::chrono::duration", align 8
  %5 = alloca float, align 4
  %6 = alloca %"class.JPH::Mat44", align 16
  %7 = alloca %struct.DisableCustomMemoryHook, align 1
  %8 = getelementptr inbounds i8, ptr %0, i64 176
  %9 = load ptr, ptr %8, align 16, !tbaa !5
  %10 = load ptr, ptr %9, align 8, !tbaa !21
  %11 = getelementptr inbounds i8, ptr %10, i64 32
  %12 = load ptr, ptr %11, align 8
  tail call void %12(ptr noundef nonnull align 8 dereferenceable(8) %9)
  %13 = getelementptr inbounds i8, ptr %0, i64 184
  %14 = load ptr, ptr %13, align 8, !tbaa !23
  %15 = load ptr, ptr %14, align 8, !tbaa !21
  %16 = getelementptr inbounds i8, ptr %15, i64 32
  %17 = load ptr, ptr %16, align 8
  tail call void %17(ptr noundef nonnull align 8 dereferenceable(8) %14)
  %18 = load ptr, ptr %8, align 16, !tbaa !5
  %19 = load ptr, ptr %18, align 8, !tbaa !21
  %20 = getelementptr inbounds i8, ptr %19, i64 48
  %21 = load ptr, ptr %20, align 8
  %22 = tail call noundef i32 %21(ptr noundef nonnull align 8 dereferenceable(8) %18)
  %23 = getelementptr inbounds i8, ptr %0, i64 200
  %24 = getelementptr inbounds i8, ptr %0, i64 249
  %25 = getelementptr inbounds i8, ptr %0, i64 248
  br label %26

26:                                               ; preds = %45, %1
  %.018 = phi i32 [ %22, %1 ], [ %50, %45 ]
  switch i32 %.018, label %45 [
    i32 0, label %27
    i32 17, label %39
    i32 16, label %42
    i32 41, label %43
  ]

27:                                               ; preds = %26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #8
  %28 = tail call i64 @_ZNSt6chrono3_V212system_clock3nowEv() #8
  store i64 %28, ptr %2, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #8
  %29 = getelementptr inbounds i8, ptr %0, i64 240
  %30 = call i64 @_ZNSt6chronomiINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEES6_EENSt11common_typeIJT0_T1_EE4typeERKNS_10time_pointIT_S8_EERKNSC_ISD_S9_EE(ptr noundef nonnull align 8 dereferenceable(8) %2, ptr noundef nonnull align 8 dereferenceable(8) %29)
  store i64 %30, ptr %4, align 8
  %31 = call i64 @_ZNSt6chrono13duration_castINS_8durationIlSt5ratioILl1ELl1000000EEEElS2_ILl1ELl1000000000EEEENSt9enable_ifIXsr13__is_durationIT_EE5valueES7_E4typeERKNS1_IT0_T1_EE(ptr noundef nonnull align 8 dereferenceable(8) %4)
  store i64 %31, ptr %3, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #8
  %32 = load i64, ptr %2, align 8, !tbaa !24
  store i64 %32, ptr %29, align 16, !tbaa !24
  %33 = call noundef i64 @_ZNKSt6chrono8durationIlSt5ratioILl1ELl1000000EEE5countEv(ptr noundef nonnull align 8 dereferenceable(8) %3)
  %34 = sitofp i64 %33 to float
  %35 = fmul float %34, 0x3EB0C6F7A0000000
  %36 = getelementptr inbounds i8, ptr %0, i64 256
  %37 = load float, ptr %36, align 16, !tbaa !25
  %38 = fcmp ugt float %37, 0.000000e+00
  br i1 %38, label %61, label %51

39:                                               ; preds = %26
  %40 = load i8, ptr %25, align 8, !tbaa !26, !range !27, !noundef !28
  %41 = xor i8 %40, 1
  store i8 %41, ptr %25, align 8, !tbaa !26
  br label %45

42:                                               ; preds = %26
  store i8 1, ptr %24, align 1, !tbaa !29
  br label %45

43:                                               ; preds = %26
  %44 = load ptr, ptr %23, align 8, !tbaa !30
  tail call void @_ZN7DebugUI16ToggleVisibilityEv(ptr noundef nonnull align 8 dereferenceable(24) %44)
  br label %45

45:                                               ; preds = %26, %39, %42, %43
  %46 = load ptr, ptr %8, align 16, !tbaa !5
  %47 = load ptr, ptr %46, align 8, !tbaa !21
  %48 = getelementptr inbounds i8, ptr %47, i64 56
  %49 = load ptr, ptr %48, align 8
  %50 = tail call noundef i32 %49(ptr noundef nonnull align 8 dereferenceable(8) %46)
  br label %26, !llvm.loop !31

51:                                               ; preds = %27
  %52 = load i8, ptr %25, align 8, !tbaa !26, !range !27, !noundef !28
  %53 = trunc nuw i8 %52 to i1
  br i1 %53, label %54, label %57

54:                                               ; preds = %51
  %55 = load i8, ptr %24, align 1, !tbaa !29, !range !27, !noundef !28
  %56 = trunc nuw i8 %55 to i1
  br i1 %56, label %57, label %58

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

58:                                               ; preds = %54, %57
  %59 = phi float [ %35, %57 ], [ 0.000000e+00, %54 ]
  %60 = getelementptr inbounds i8, ptr %0, i64 260
  store float 0.000000e+00, ptr %60, align 4, !tbaa !33
  br label %78

61:                                               ; preds = %27
  %62 = load i8, ptr %24, align 1, !tbaa !29, !range !27, !noundef !28
  %63 = trunc nuw i8 %62 to i1
  br i1 %63, label %78, label %64

64:                                               ; preds = %61
  %65 = load i8, ptr %25, align 8, !tbaa !26, !range !27, !noundef !28
  %66 = trunc nuw i8 %65 to i1
  br i1 %66, label %.thread, label %67

67:                                               ; preds = %64
  %68 = getelementptr inbounds i8, ptr %0, i64 260
  %69 = load float, ptr %68, align 4, !tbaa !33
  %70 = fadd float %35, %69
  %71 = fcmp olt float %70, %37
  br i1 %71, label %72, label %73

72:                                               ; preds = %67
  store float %70, ptr %68, align 4, !tbaa !33
  br label %.thread

73:                                               ; preds = %67
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  %74 = fsub float %70, %37
  store float %74, ptr %5, align 4, !tbaa !34
  %75 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %36, ptr noundef nonnull align 4 dereferenceable(4) %5)
  %76 = load float, ptr %75, align 4, !tbaa !34
  store float %76, ptr %68, align 4, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  %77 = load float, ptr %36, align 16, !tbaa !25
  br label %78

.thread:                                          ; preds = %64, %72
  store i8 0, ptr %24, align 1, !tbaa !29
  br label %81

78:                                               ; preds = %61, %73, %58
  %.019 = phi float [ %59, %58 ], [ %77, %73 ], [ %37, %61 ]
  store i8 0, ptr %24, align 1, !tbaa !29
  %79 = fcmp ogt float %.019, 0.000000e+00
  br i1 %79, label %80, label %81

80:                                               ; preds = %78
  call void @_ZN11Application18ClearDebugRendererEv(ptr noundef nonnull align 16 dereferenceable(272) %0)
  br label %81

81:                                               ; preds = %.thread, %80, %78
  %.01923 = phi float [ 0.000000e+00, %.thread ], [ %.019, %80 ], [ %.019, %78 ]
  %82 = load ptr, ptr %0, align 16, !tbaa !21
  %83 = getelementptr inbounds i8, ptr %82, i64 16
  %84 = load ptr, ptr %83, align 8
  %85 = call noundef zeroext i1 %84(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %.01923)
  br i1 %85, label %86, label %183

86:                                               ; preds = %81
  %87 = getelementptr inbounds i8, ptr %0, i64 250
  %88 = load i8, ptr %87, align 2, !tbaa !35, !range !27, !noundef !28
  %89 = trunc nuw i8 %88 to i1
  br i1 %89, label %90, label %93

90:                                               ; preds = %86
  %91 = getelementptr inbounds i8, ptr %0, i64 144
  %92 = load ptr, ptr %91, align 16, !tbaa !36
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %6) #8
  call void @_ZN3JPH5Mat449sIdentityEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %6)
  call void @_ZN3JPH13DebugRenderer20DrawCoordinateSystemERKNS_5Mat44Ef(ptr noundef nonnull align 8 dereferenceable(320) %92, ptr noundef nonnull align 16 dereferenceable(64) %6, float noundef 1.000000e+00)
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %6) #8
  br label %93

93:                                               ; preds = %90, %86
  store i8 0, ptr %87, align 2, !tbaa !35
  %94 = getelementptr inbounds i8, ptr %0, i64 192
  %95 = load ptr, ptr %94, align 16, !tbaa !37
  %96 = call noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144) %95)
  br i1 %96, label %98, label %97

97:                                               ; preds = %93
  call void @_ZN11Application12UpdateCameraEf(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %35)
  br label %98

98:                                               ; preds = %97, %93
  %99 = getelementptr inbounds i8, ptr %0, i64 160
  %100 = load ptr, ptr %99, align 16, !tbaa !38
  %101 = getelementptr inbounds i8, ptr %0, i64 80
  %102 = load ptr, ptr %0, align 16, !tbaa !21
  %103 = getelementptr inbounds i8, ptr %102, i64 40
  %104 = load ptr, ptr %103, align 8
  %105 = call noundef float %104(ptr noundef nonnull align 16 dereferenceable(272) %0)
  %106 = load ptr, ptr %100, align 16, !tbaa !21
  %107 = getelementptr inbounds i8, ptr %106, i64 24
  %108 = load ptr, ptr %107, align 8
  call void %108(ptr noundef nonnull align 16 dereferenceable(832) %100, ptr noundef nonnull align 16 dereferenceable(52) %101, float noundef %105)
  %109 = getelementptr inbounds i8, ptr %0, i64 144
  %110 = load ptr, ptr %109, align 16, !tbaa !36
  call void @_ZN16DebugRendererImp14DrawShadowPassEv(ptr noundef nonnull align 16 dereferenceable(816) %110)
  %111 = load ptr, ptr %99, align 16, !tbaa !38
  %112 = load ptr, ptr %111, align 16, !tbaa !21
  %113 = getelementptr inbounds i8, ptr %112, i64 32
  %114 = load ptr, ptr %113, align 8
  call void %114(ptr noundef nonnull align 16 dereferenceable(832) %111)
  %115 = load ptr, ptr %109, align 16, !tbaa !36
  call void @_ZN16DebugRendererImp4DrawEv(ptr noundef nonnull align 16 dereferenceable(816) %115)
  call void @_ZN11Application7DrawFPSEf(ptr noundef nonnull align 16 dereferenceable(272) %0, float noundef %35)
  %116 = load ptr, ptr %94, align 16, !tbaa !37
  %117 = call noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144) %116)
  br i1 %117, label %118, label %173

118:                                              ; preds = %98
  %119 = load ptr, ptr %13, align 8, !tbaa !23
  %120 = load ptr, ptr %119, align 8, !tbaa !21
  %121 = getelementptr inbounds i8, ptr %120, i64 72
  %122 = load ptr, ptr %121, align 8
  %123 = call noundef zeroext i1 %122(ptr noundef nonnull align 8 dereferenceable(8) %119)
  %124 = zext i1 %123 to i8
  %125 = getelementptr inbounds i8, ptr %0, i64 251
  %126 = load i8, ptr %125, align 1, !tbaa !39, !range !27, !noundef !28
  %127 = trunc nuw i8 %126 to i1
  br i1 %123, label %128, label %.critedge

128:                                              ; preds = %118
  br i1 %127, label %144, label %.sink.split

.critedge:                                        ; preds = %118
  br i1 %127, label %.sink.split, label %144

.sink.split:                                      ; preds = %.critedge, %128
  %.sink29 = phi i64 [ 88, %128 ], [ 96, %.critedge ]
  %129 = load ptr, ptr %94, align 16, !tbaa !37
  %130 = load ptr, ptr %13, align 8, !tbaa !23
  %131 = load ptr, ptr %130, align 8, !tbaa !21
  %132 = getelementptr inbounds i8, ptr %131, i64 40
  %133 = load ptr, ptr %132, align 8
  %134 = call noundef i32 %133(ptr noundef nonnull align 8 dereferenceable(8) %130)
  %135 = load ptr, ptr %13, align 8, !tbaa !23
  %136 = load ptr, ptr %135, align 8, !tbaa !21
  %137 = getelementptr inbounds i8, ptr %136, i64 48
  %138 = load ptr, ptr %137, align 8
  %139 = call noundef i32 %138(ptr noundef nonnull align 8 dereferenceable(8) %135)
  %140 = load ptr, ptr %129, align 8, !tbaa !21
  %141 = getelementptr inbounds i8, ptr %140, i64 %.sink29
  %142 = load ptr, ptr %141, align 8
  %143 = call noundef zeroext i1 %142(ptr noundef nonnull align 8 dereferenceable(144) %129, i32 noundef %134, i32 noundef %139)
  br label %144

144:                                              ; preds = %.sink.split, %128, %.critedge
  %145 = getelementptr inbounds i8, ptr %0, i64 251
  store i8 %124, ptr %145, align 1, !tbaa !39
  %146 = load ptr, ptr %94, align 16, !tbaa !37
  %147 = load ptr, ptr %13, align 8, !tbaa !23
  %148 = load ptr, ptr %147, align 8, !tbaa !21
  %149 = getelementptr inbounds i8, ptr %148, i64 40
  %150 = load ptr, ptr %149, align 8
  %151 = call noundef i32 %150(ptr noundef nonnull align 8 dereferenceable(8) %147)
  %152 = load ptr, ptr %13, align 8, !tbaa !23
  %153 = load ptr, ptr %152, align 8, !tbaa !21
  %154 = getelementptr inbounds i8, ptr %153, i64 48
  %155 = load ptr, ptr %154, align 8
  %156 = call noundef i32 %155(ptr noundef nonnull align 8 dereferenceable(8) %152)
  %157 = load ptr, ptr %146, align 8, !tbaa !21
  %158 = getelementptr inbounds i8, ptr %157, i64 104
  %159 = load ptr, ptr %158, align 8
  %160 = call noundef zeroext i1 %159(ptr noundef nonnull align 8 dereferenceable(144) %146, i32 noundef %151, i32 noundef %156)
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %7) #8
  call void @_ZN23DisableCustomMemoryHookC1Ev(ptr noundef nonnull align 1 dereferenceable(1) %7)
  %161 = load ptr, ptr %94, align 16, !tbaa !37
  %162 = load ptr, ptr %161, align 8, !tbaa !21
  %163 = getelementptr inbounds i8, ptr %162, i64 72
  %164 = load ptr, ptr %163, align 8
  invoke void %164(ptr noundef nonnull align 8 dereferenceable(248) %161, float noundef %35)
          to label %165 unwind label %171

165:                                              ; preds = %144
  %166 = load ptr, ptr %94, align 16, !tbaa !37
  %167 = load ptr, ptr %166, align 8, !tbaa !21
  %168 = getelementptr inbounds i8, ptr %167, i64 80
  %169 = load ptr, ptr %168, align 8
  invoke void %169(ptr noundef nonnull align 8 dereferenceable(248) %166)
          to label %170 unwind label %171

170:                                              ; preds = %165
  call void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %7) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %7) #8
  br label %178

171:                                              ; preds = %165, %144
  %172 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN23DisableCustomMemoryHookD1Ev(ptr noundef nonnull align 1 dereferenceable(1) %7) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %7) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #8
  resume { ptr, i32 } %172

173:                                              ; preds = %98
  %174 = load ptr, ptr %94, align 16, !tbaa !37
  %175 = load ptr, ptr %174, align 8, !tbaa !21
  %176 = getelementptr inbounds i8, ptr %175, i64 112
  %177 = load ptr, ptr %176, align 8
  call void %177(ptr noundef nonnull align 8 dereferenceable(144) %174)
  br label %178

178:                                              ; preds = %173, %170
  %179 = load ptr, ptr %99, align 16, !tbaa !38
  %180 = load ptr, ptr %179, align 16, !tbaa !21
  %181 = getelementptr inbounds i8, ptr %180, i64 40
  %182 = load ptr, ptr %181, align 8
  call void %182(ptr noundef nonnull align 16 dereferenceable(832) %179)
  br label %183

183:                                              ; preds = %81, %178
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #8
  ret i1 %85
}

declare void @_ZN7DebugUI16ToggleVisibilityEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #1

; Function Attrs: mustprogress uwtable
declare dso_local i64 @_ZNSt6chrono13duration_castINS_8durationIlSt5ratioILl1ELl1000000EEEElS2_ILl1ELl1000000000EEEENSt9enable_ifIXsr13__is_durationIT_EE5valueES7_E4typeERKNS1_IT0_T1_EE(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #3

; Function Attrs: mustprogress uwtable
declare dso_local i64 @_ZNSt6chronomiINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEES6_EENSt11common_typeIJT0_T1_EE4typeERKNS_10time_pointIT_S8_EERKNSC_ISD_S9_EE(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #3

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

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

declare void @_ZN3JPH13DebugRenderer20DrawCoordinateSystemERKNS_5Mat44Ef(ptr noundef nonnull align 8 dereferenceable(320), ptr noundef nonnull align 16 dereferenceable(64), float noundef) local_unnamed_addr #1

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZN3JPH5Mat449sIdentityEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK9UIElement9IsVisibleEv(ptr noundef nonnull align 8 dereferenceable(144)) local_unnamed_addr #4 align 2

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

declare void @_ZN16DebugRendererImp14DrawShadowPassEv(ptr noundef nonnull align 16 dereferenceable(816)) local_unnamed_addr #1

declare void @_ZN16DebugRendererImp4DrawEv(ptr noundef nonnull align 16 dereferenceable(816)) local_unnamed_addr #1

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 #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 = { 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 #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 = { mustprogress uwtable "min-legal-vector-width"="64" "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 #8 = { 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, !12, i64 176}
!6 = !{!"_ZTS11Application", !7, i64 16, !7, i64 80, !12, i64 144, !12, i64 152, !12, i64 160, !13, i64 168, !12, i64 176, !12, i64 184, !12, i64 192, !12, i64 200, !14, i64 208, !17, i64 240, !19, i64 248, !19, i64 249, !19, i64 250, !19, i64 251, !11, i64 252, !11, i64 256, !11, i64 260, !11, i64 264, !20, i64 268}
!7 = !{!"_ZTS11CameraState", !8, i64 0, !8, i64 16, !8, i64 32, !11, i64 48}
!8 = !{!"_ZTSN3JPH4Vec3E", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!"float", !9, i64 0}
!12 = !{!"any pointer", !9, i64 0}
!13 = !{!"_ZTSN3JPH8RefConstI4FontEE", !12, i64 0}
!14 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEEE", !15, i64 0, !16, i64 8, !9, i64 16}
!15 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcEN3JPH12STLAllocatorIcEEE12_Alloc_hiderE", !12, i64 0}
!16 = !{!"long", !9, i64 0}
!17 = !{!"_ZTSNSt6chrono10time_pointINS_3_V212system_clockENS_8durationIlSt5ratioILl1ELl1000000000EEEEEE", !18, i64 0}
!18 = !{!"_ZTSNSt6chrono8durationIlSt5ratioILl1ELl1000000000EEEE", !16, i64 0}
!19 = !{!"bool", !9, i64 0}
!20 = !{!"int", !9, i64 0}
!21 = !{!22, !22, i64 0}
!22 = !{!"vtable pointer", !10, i64 0}
!23 = !{!6, !12, i64 184}
!24 = !{!16, !16, i64 0}
!25 = !{!6, !11, i64 256}
!26 = !{!6, !19, i64 248}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!6, !19, i64 249}
!30 = !{!6, !12, i64 200}
!31 = distinct !{!31, !32}
!32 = !{!"llvm.loop.mustprogress"}
!33 = !{!6, !11, i64 260}
!34 = !{!11, !11, i64 0}
!35 = !{!6, !19, i64 250}
!36 = !{!6, !12, i64 144}
!37 = !{!6, !12, i64 192}
!38 = !{!6, !12, i64 160}
!39 = !{!6, !19, i64 251}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,SROAPass,SimplifyCFGPass,TailCallElimPass