; LLVM IR from jrouwe/JoltPhysics :: Jolt/Physics (PhysicsSystem)

; 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::BodyAccess::Grant" = type { i8 }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::Vec3" = type { %union.anon.13 }
%union.anon.13 = type { <4 x float> }
%"struct.JPH::AssertLastParam" = type { i8 }
%"class.JPH::PhysicsUpdateContext" = type <{ ptr, ptr, ptr, ptr, float, float, %"struct.std::atomic", [4 x i8], ptr, ptr, ptr, %"class.JPH::Array.19", i32, [4 x i8], ptr, %"struct.std::atomic", [4 x i8] }>
%"class.JPH::Array.19" = type { %"class.JPH::STLTempAllocator", i64, i64, ptr }
%"class.JPH::STLTempAllocator" = type { ptr }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::PhysicsSystem" = type <{ ptr, ptr, %"class.JPH::BodyManager", %"class.JPH::BodyLockInterfaceNoLock", %"class.JPH::BodyLockInterfaceLocking", %"class.JPH::BodyInterface", %"class.JPH::BodyInterface", %"class.JPH::NarrowPhaseQuery", %"class.JPH::NarrowPhaseQuery", ptr, ptr, ptr, %"class.std::function", %"struct.JPH::PhysicsSettings", [4 x i8], %"class.JPH::ContactConstraintManager", %"class.JPH::ConstraintManager", %"class.JPH::IslandBuilder", %"class.JPH::LargeIslandSplitter", %"class.JPH::Mutex", %"class.JPH::Array.10", %"class.JPH::Vec3", float, [12 x i8] }>
%"class.JPH::BodyManager" = type <{ %"class.JPH::Array", i32, [4 x i8], i64, %"class.JPH::Mutex", %"class.JPH::MutexArray", %"class.JPH::Array.0", %"class.JPH::Mutex", [2 x ptr], [2 x %"struct.std::atomic"], i32, [4 x i8], %"class.JPH::Mutex", %"class.JPH::Array.3", ptr, ptr, i8, [7 x i8] }>
%"class.JPH::Array" = type { i64, i64, ptr }
%"class.JPH::MutexArray" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::Array.0" = type { i64, i64, ptr }
%"class.JPH::Array.3" = type { i64, i64, ptr }
%"class.JPH::BodyLockInterfaceNoLock" = type { %"class.JPH::BodyLockInterface" }
%"class.JPH::BodyLockInterface" = type { ptr, ptr }
%"class.JPH::BodyLockInterfaceLocking" = type { %"class.JPH::BodyLockInterface" }
%"class.JPH::BodyInterface" = type { ptr, ptr, ptr }
%"class.JPH::NarrowPhaseQuery" = type { ptr, ptr }
%"class.std::function" = type { %"class.std::_Function_base", ptr }
%"class.std::_Function_base" = type { %"union.std::_Any_data", ptr }
%"union.std::_Any_data" = type { %"union.std::_Nocopy_types" }
%"union.std::_Nocopy_types" = type { { i64, i64 } }
%"struct.JPH::PhysicsSettings" = type <{ i32, i32, i32, float, float, float, float, float, float, float, float, float, float, float, i32, i32, float, float, float, i8, i8, i8, i8, i8, i8, i8, i8 }>
%"class.JPH::ContactConstraintManager" = type { [8 x i8], [2 x %"class.JPH::ContactConstraintManager::ManifoldCache"], i32, ptr, ptr, ptr, ptr, ptr, i32, %"struct.std::atomic", ptr }
%"class.JPH::ContactConstraintManager::ManifoldCache" = type <{ %"class.JPH::LFHMAllocator", %"class.JPH::LockFreeHashMap", %"class.JPH::LockFreeHashMap.6", i8, [7 x i8] }>
%"class.JPH::LFHMAllocator" = type { ptr, i32, %"struct.std::atomic" }
%"class.JPH::LockFreeHashMap" = type { ptr, %"struct.std::atomic", ptr, i32, i32 }
%"class.JPH::LockFreeHashMap.6" = type { ptr, %"struct.std::atomic", ptr, i32, i32 }
%"class.JPH::ConstraintManager" = type { ptr, %"class.JPH::Array.7", %"class.JPH::Mutex" }
%"class.JPH::Array.7" = type { i64, i64, ptr }
%"class.JPH::IslandBuilder" = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32 }
%"class.JPH::LargeIslandSplitter" = type <{ i32, [4 x i8], ptr, ptr, ptr, i32, %"struct.std::atomic", i32, [4 x i8], ptr, %"struct.std::atomic", [4 x i8] }>
%"class.JPH::Mutex" = type { %"class.std::mutex", %"class.std::thread::id" }
%"class.std::mutex" = type { %"class.std::__mutex_base" }
%"class.std::__mutex_base" = type { %union.pthread_mutex_t }
%union.pthread_mutex_t = type { %struct.__pthread_mutex_s }
%struct.__pthread_mutex_s = type { i32, i32, i32, i32, i32, i16, i16, %struct.__pthread_internal_list }
%struct.__pthread_internal_list = type { ptr, ptr }
%"class.std::thread::id" = type { i64 }
%"class.JPH::Array.10" = type { i64, i64, ptr }
%"struct.JPH::PhysicsUpdateContext::Step" = type { ptr, i8, i8, %"struct.JPH::BroadPhase::UpdateState", i32, %"struct.std::atomic", [60 x i8], %"struct.std::atomic", [60 x i8], %"struct.std::atomic", [60 x i8], %"struct.std::atomic", [60 x i8], %"struct.std::atomic", [60 x i8], %"struct.std::atomic", [60 x i8], %"class.JPH::StaticArray", i32, %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", ptr, i32, %"struct.std::atomic", %"struct.std::atomic", ptr, i32, %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::StaticArray.20", %"class.JPH::StaticArray.20", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::JobSystem::JobHandle", %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::JobSystem::JobHandle", %"class.JPH::StaticArray.20", %"class.JPH::StaticArray.20", %"class.JPH::JobSystem::JobHandle", %"class.JPH::JobSystem::JobHandle" }
%"struct.JPH::BroadPhase::UpdateState" = type { [4 x ptr] }
%"class.JPH::StaticArray" = type { i32, [32 x %"struct.JPH::StaticArray<JPH::PhysicsUpdateContext::BodyPairQueue, 32>::Storage"] }
%"struct.JPH::StaticArray<JPH::PhysicsUpdateContext::BodyPairQueue, 32>::Storage" = type { [128 x i8] }
%"class.JPH::StaticArray.20" = type { i32, [4 x i8], [32 x %"struct.JPH::StaticArray<JPH::JobSystem::JobHandle, 32>::Storage"] }
%"struct.JPH::StaticArray<JPH::JobSystem::JobHandle, 32>::Storage" = type { [8 x i8] }
%"class.JPH::JobSystem::JobHandle" = type { %"class.JPH::Ref" }
%"class.JPH::Ref" = type { ptr }
%"struct.JPH::PhysicsUpdateContext::Step::CCDBody" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::BodyID", %"class.JPH::BodyID", %"class.JPH::SubShapeID", float, float, float, float, %"class.JPH::ContactSettings" }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::ContactSettings" = type { float, float, float, float, float, float, i8, %"class.JPH::Vec3", %"class.JPH::Vec3" }

@.str.24 = external hidden unnamed_addr constant [83 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [146 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [50 x i8], align 1

; 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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef) #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK3JPH11BodyManager18GetNumActiveBodiesENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297), i8 noundef zeroext) #3 align 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) #4

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH10BodyAccess5GrantC2ENS0_7EAccessES2_(ptr noundef nonnull align 1 dereferenceable(1), i8 noundef zeroext, i8 noundef zeroext) unnamed_addr #2 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNSt13__atomic_baseIjE9fetch_addEjSt12memory_order(ptr noundef nonnull align 4 dereferenceable(4), i32 noundef, i32 noundef) #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH11BodyManager21GetActiveBodiesUnsafeENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297), i8 noundef zeroext) #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(122) ptr @_ZN3JPH11BodyManager7GetBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(297), ptr noundef nonnull align 4 dereferenceable(4)) #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122)) #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNKSt13__atomic_baseIjEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef ptr @_ZNK3JPH4Body8GetShapeEv(ptr noundef nonnull align 16 dereferenceable(122)) #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH4Body8IsSensorEv(ptr noundef nonnull align 16 dereferenceable(122)) #1 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122)) #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122)) #1 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH13PhysicsSystem20JobIntegrateVelocityEPKNS_20PhysicsUpdateContextEPNS1_4StepE(ptr noundef nonnull align 16 dereferenceable(1172) %0, ptr noundef %1, ptr noundef %2) #6 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca %"class.JPH::BodyAccess::Grant", align 1
  %8 = alloca float, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca %"class.JPH::BodyID", align 4
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Vec3", align 16
  %25 = alloca %"class.JPH::Vec3", align 16
  %26 = alloca %"class.JPH::Vec3", align 16
  %27 = alloca i8, align 1
  %28 = alloca float, align 4
  %29 = alloca %"struct.JPH::AssertLastParam", align 1
  %30 = alloca float, align 4
  %31 = alloca i32, align 4
  %32 = alloca %"struct.JPH::AssertLastParam", align 1
  %33 = alloca %"class.JPH::BodyID", align 4
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca float, align 4
  %36 = alloca %"class.JPH::Vec3", align 16
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  %37 = load ptr, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 1, ptr %7) #9
  call void @_ZN3JPH10BodyAccess5GrantC2ENS0_7EAccessES2_(ptr noundef nonnull align 1 dereferenceable(1) %7, i8 noundef zeroext 3, i8 noundef zeroext 3)
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #9
  %38 = load ptr, ptr %5, align 8, !tbaa !5
  %39 = getelementptr inbounds %"class.JPH::PhysicsUpdateContext", ptr %38, i32 0, i32 4
  %40 = load float, ptr %39, align 8, !tbaa !9
  store float %40, ptr %8, align 4, !tbaa !18
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  %41 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 2
  %42 = invoke noundef ptr @_ZNK3JPH11BodyManager21GetActiveBodiesUnsafeENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297) %41, i8 noundef zeroext 0)
          to label %43 unwind label %59

43:                                               ; preds = %3
  store ptr %42, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #9
  %44 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 2
  %45 = invoke noundef i32 @_ZNK3JPH11BodyManager18GetNumActiveBodiesENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297) %44, i8 noundef zeroext 0)
          to label %46 unwind label %63

46:                                               ; preds = %43
  store i32 %45, ptr %12, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #9
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %47, i32 0, i32 15
  %49 = call noundef i32 @_ZNKSt13__atomic_baseIjEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %48) #9
  store i32 %49, ptr %13, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #9
  %50 = alloca i8, i64 256, align 16
  store ptr %50, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #9
  store i32 0, ptr %15, align 4, !tbaa !19
  br label %51

51:                                               ; preds = %328, %46
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #9
  %52 = load ptr, ptr %6, align 8, !tbaa !5
  %53 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %52, i32 0, i32 24
  %54 = call noundef i32 @_ZNSt13__atomic_baseIjE9fetch_addEjSt12memory_order(ptr noundef nonnull align 4 dereferenceable(4) %53, i32 noundef 64, i32 noundef 5) #9
  store i32 %54, ptr %16, align 4, !tbaa !19
  %55 = load i32, ptr %16, align 4, !tbaa !19
  %56 = load i32, ptr %12, align 4, !tbaa !19
  %57 = icmp uge i32 %55, %56
  br i1 %57, label %58, label %67

58:                                               ; preds = %51
  store i32 2, ptr %17, align 4
  br label %326

59:                                               ; preds = %3
  %60 = landingpad { ptr, i32 }
          cleanup
  %61 = extractvalue { ptr, i32 } %60, 0
  store ptr %61, ptr %10, align 8
  %62 = extractvalue { ptr, i32 } %60, 1
  store i32 %62, ptr %11, align 4
  br label %349

63:                                               ; preds = %43
  %64 = landingpad { ptr, i32 }
          cleanup
  %65 = extractvalue { ptr, i32 } %64, 0
  store ptr %65, ptr %10, align 8
  %66 = extractvalue { ptr, i32 } %64, 1
  store i32 %66, ptr %11, align 4
  br label %348

67:                                               ; preds = %51
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #9
  %68 = load i32, ptr %16, align 4, !tbaa !19
  %69 = add i32 %68, 64
  store i32 %69, ptr %19, align 4, !tbaa !19
  %70 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIjERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %12, ptr noundef nonnull align 4 dereferenceable(4) %19)
          to label %71 unwind label %96

71:                                               ; preds = %67
  %72 = load i32, ptr %70, align 4, !tbaa !19
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #9
  store i32 %72, ptr %18, align 4, !tbaa !19
  br label %73

73:                                               ; preds = %318, %71
  %74 = load i32, ptr %16, align 4, !tbaa !19
  %75 = load i32, ptr %18, align 4, !tbaa !19
  %76 = icmp ult i32 %74, %75
  br i1 %76, label %77, label %325

77:                                               ; preds = %73
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #9
  %78 = load ptr, ptr %9, align 8, !tbaa !5
  %79 = load i32, ptr %16, align 4, !tbaa !19
  %80 = zext i32 %79 to i64
  %81 = getelementptr inbounds %"class.JPH::BodyID", ptr %78, i64 %80
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %20, ptr align 4 %81, i64 4, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #9
  %82 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 2
  %83 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZN3JPH11BodyManager7GetBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(297) %82, ptr noundef nonnull align 4 dereferenceable(4) %20)
          to label %84 unwind label %100

84:                                               ; preds = %77
  store ptr %83, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #9
  %85 = load ptr, ptr %21, align 8, !tbaa !5
  %86 = invoke noundef ptr @_ZN3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122) %85)
          to label %87 unwind label %104

87:                                               ; preds = %84
  store ptr %86, ptr %22, align 8, !tbaa !5
  %88 = load ptr, ptr %21, align 8, !tbaa !5
  %89 = invoke noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122) %88)
          to label %90 unwind label %104

90:                                               ; preds = %87
  br i1 %89, label %91, label %108

91:                                               ; preds = %90
  %92 = load ptr, ptr %22, align 8, !tbaa !5
  invoke void @_ZN3JPH16MotionProperties19ClampLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(182) %92)
          to label %93 unwind label %104

93:                                               ; preds = %91
  %94 = load ptr, ptr %22, align 8, !tbaa !5
  invoke void @_ZN3JPH16MotionProperties20ClampAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(182) %94)
          to label %95 unwind label %104

95:                                               ; preds = %93
  br label %108

96:                                               ; preds = %67
  %97 = landingpad { ptr, i32 }
          cleanup
  %98 = extractvalue { ptr, i32 } %97, 0
  store ptr %98, ptr %10, align 8
  %99 = extractvalue { ptr, i32 } %97, 1
  store i32 %99, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #9
  br label %329

100:                                              ; preds = %77
  %101 = landingpad { ptr, i32 }
          cleanup
  %102 = extractvalue { ptr, i32 } %101, 0
  store ptr %102, ptr %10, align 8
  %103 = extractvalue { ptr, i32 } %101, 1
  store i32 %103, ptr %11, align 4
  br label %324

104:                                              ; preds = %93, %91, %87, %84
  %105 = landingpad { ptr, i32 }
          cleanup
  %106 = extractvalue { ptr, i32 } %105, 0
  store ptr %106, ptr %10, align 8
  %107 = extractvalue { ptr, i32 } %105, 1
  store i32 %107, ptr %11, align 4
  br label %323

108:                                              ; preds = %95, %90
  %109 = load ptr, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %24) #9
  %110 = load ptr, ptr %21, align 8, !tbaa !5
  %111 = invoke { double, double } @_ZNK3JPH4Body18GetAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %110)
          to label %112 unwind label %154

112:                                              ; preds = %108
  %113 = getelementptr inbounds %"class.JPH::Vec3", ptr %24, i32 0, i32 0
  %114 = getelementptr inbounds %union.anon.13, ptr %113, i32 0, i32 0
  %115 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %116 = extractvalue { double, double } %111, 0
  store double %116, ptr %115, align 16
  %117 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %118 = extractvalue { double, double } %111, 1
  store double %118, ptr %117, align 8
  %119 = load float, ptr %8, align 4, !tbaa !18
  %120 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %24, float noundef %119)
          to label %121 unwind label %154

121:                                              ; preds = %112
  %122 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %123 = getelementptr inbounds %union.anon.13, ptr %122, i32 0, i32 0
  %124 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 0
  %125 = extractvalue { double, double } %120, 0
  store double %125, ptr %124, align 16
  %126 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 1
  %127 = extractvalue { double, double } %120, 1
  store double %127, ptr %126, align 8
  %128 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 0
  %129 = load double, ptr %128, align 16
  %130 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 1
  %131 = load double, ptr %130, align 8
  invoke void @_ZN3JPH4Body15AddRotationStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122) %109, double %129, double %131)
          to label %132 unwind label %154

132:                                              ; preds = %121
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #9
  %133 = load ptr, ptr %21, align 8, !tbaa !5
  %134 = invoke { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %133)
          to label %135 unwind label %158

135:                                              ; preds = %132
  %136 = getelementptr inbounds %"class.JPH::Vec3", ptr %26, i32 0, i32 0
  %137 = getelementptr inbounds %union.anon.13, ptr %136, i32 0, i32 0
  %138 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 0
  %139 = extractvalue { double, double } %134, 0
  store double %139, ptr %138, align 16
  %140 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 1
  %141 = extractvalue { double, double } %134, 1
  store double %141, ptr %140, align 8
  %142 = load float, ptr %8, align 4, !tbaa !18
  %143 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %142)
          to label %144 unwind label %158

144:                                              ; preds = %135
  %145 = getelementptr inbounds %"class.JPH::Vec3", ptr %25, i32 0, i32 0
  %146 = getelementptr inbounds %union.anon.13, ptr %145, i32 0, i32 0
  %147 = getelementptr inbounds { double, double }, ptr %146, i32 0, i32 0
  %148 = extractvalue { double, double } %143, 0
  store double %148, ptr %147, align 16
  %149 = getelementptr inbounds { double, double }, ptr %146, i32 0, i32 1
  %150 = extractvalue { double, double } %143, 1
  store double %150, ptr %149, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #9
  call void @llvm.lifetime.start.p0(i64 1, ptr %27) #9
  store i8 1, ptr %27, align 1, !tbaa !21
  %151 = load ptr, ptr %22, align 8, !tbaa !5
  %152 = invoke noundef zeroext i8 @_ZNK3JPH16MotionProperties16GetMotionQualityEv(ptr noundef nonnull align 16 dereferenceable(182) %151)
          to label %153 unwind label %162

153:                                              ; preds = %144
  switch i8 %152, label %273 [
    i8 0, label %273
    i8 1, label %166
  ]

154:                                              ; preds = %121, %112, %108
  %155 = landingpad { ptr, i32 }
          cleanup
  %156 = extractvalue { ptr, i32 } %155, 0
  store ptr %156, ptr %10, align 8
  %157 = extractvalue { ptr, i32 } %155, 1
  store i32 %157, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #9
  br label %323

158:                                              ; preds = %135, %132
  %159 = landingpad { ptr, i32 }
          cleanup
  %160 = extractvalue { ptr, i32 } %159, 0
  store ptr %160, ptr %10, align 8
  %161 = extractvalue { ptr, i32 } %159, 1
  store i32 %161, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #9
  br label %322

162:                                              ; preds = %301, %290, %288, %282, %276, %170, %166, %144
  %163 = landingpad { ptr, i32 }
          cleanup
  %164 = extractvalue { ptr, i32 } %163, 0
  store ptr %164, ptr %10, align 8
  %165 = extractvalue { ptr, i32 } %163, 1
  store i32 %165, ptr %11, align 4
  br label %321

166:                                              ; preds = %153
  %167 = load ptr, ptr %21, align 8, !tbaa !5
  %168 = invoke noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122) %167)
          to label %169 unwind label %162

169:                                              ; preds = %166
  br i1 %168, label %170, label %272

170:                                              ; preds = %169
  %171 = load ptr, ptr %21, align 8, !tbaa !5
  %172 = invoke noundef zeroext i1 @_ZNK3JPH4Body8IsSensorEv(ptr noundef nonnull align 16 dereferenceable(122) %171)
          to label %173 unwind label %162

173:                                              ; preds = %170
  br i1 %172, label %272, label %174

174:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #9
  %175 = load ptr, ptr %21, align 8, !tbaa !5
  %176 = invoke noundef ptr @_ZNK3JPH4Body8GetShapeEv(ptr noundef nonnull align 16 dereferenceable(122) %175)
          to label %177 unwind label %190

177:                                              ; preds = %174
  %178 = load ptr, ptr %176, align 8, !tbaa !23
  %179 = getelementptr inbounds ptr, ptr %178, i64 7
  %180 = load ptr, ptr %179, align 8
  %181 = invoke noundef float %180(ptr noundef nonnull align 8 dereferenceable(26) %176)
          to label %182 unwind label %190

182:                                              ; preds = %177
  store float %181, ptr %28, align 4, !tbaa !18
  br label %183

183:                                              ; preds = %182
  %184 = load float, ptr %28, align 4, !tbaa !18
  %185 = fcmp ogt float %184, 0.000000e+00
  br i1 %185, label %194, label %186

186:                                              ; preds = %183
  %187 = invoke noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef @.str.58, ptr noundef @.str.24, i32 noundef 1569, ptr noundef @.str.59)
          to label %188 unwind label %190

188:                                              ; preds = %186
  br i1 %187, label %189, label %194

189:                                              ; preds = %188
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #9, !srcloc !25
  br label %194

190:                                              ; preds = %186, %177, %174
  %191 = landingpad { ptr, i32 }
          cleanup
  %192 = extractvalue { ptr, i32 } %191, 0
  store ptr %192, ptr %10, align 8
  %193 = extractvalue { ptr, i32 } %191, 1
  store i32 %193, ptr %11, align 4
  br label %271

194:                                              ; preds = %189, %188, %183
  br label %195

195:                                              ; preds = %194
  br label %196

196:                                              ; preds = %195
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #9
  %197 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 13
  %198 = getelementptr inbounds %"struct.JPH::PhysicsSettings", ptr %197, i32 0, i32 6
  %199 = load float, ptr %198, align 8, !tbaa !26
  %200 = load float, ptr %28, align 4, !tbaa !18
  %201 = fmul float %199, %200
  %202 = invoke noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %201)
          to label %203 unwind label %222

203:                                              ; preds = %196
  store float %202, ptr %30, align 4, !tbaa !18
  %204 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
          to label %205 unwind label %222

205:                                              ; preds = %203
  %206 = load float, ptr %30, align 4, !tbaa !18
  %207 = fcmp ogt float %204, %206
  br i1 %207, label %208, label %269

208:                                              ; preds = %205
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #9
  %209 = load ptr, ptr %6, align 8, !tbaa !5
  %210 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %209, i32 0, i32 27
  %211 = call noundef i32 @_ZNSt13__atomic_baseIjEppEi(ptr noundef nonnull align 4 dereferenceable(4) %210, i32 noundef 0) #9
  store i32 %211, ptr %31, align 4, !tbaa !19
  br label %212

212:                                              ; preds = %208
  %213 = load i32, ptr %16, align 4, !tbaa !19
  %214 = load ptr, ptr %6, align 8, !tbaa !5
  %215 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %214, i32 0, i32 30
  %216 = load i32, ptr %215, align 8, !tbaa !52
  %217 = icmp ult i32 %213, %216
  br i1 %217, label %230, label %218

218:                                              ; preds = %212
  %219 = invoke noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef @.str.60, ptr noundef @.str.24, i32 noundef 1577)
          to label %220 unwind label %226

220:                                              ; preds = %218
  br i1 %219, label %221, label %230

221:                                              ; preds = %220
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #9, !srcloc !59
  br label %230

222:                                              ; preds = %203, %196
  %223 = landingpad { ptr, i32 }
          cleanup
  %224 = extractvalue { ptr, i32 } %223, 0
  store ptr %224, ptr %10, align 8
  %225 = extractvalue { ptr, i32 } %223, 1
  store i32 %225, ptr %11, align 4
  br label %270

226:                                              ; preds = %218
  %227 = landingpad { ptr, i32 }
          cleanup
  %228 = extractvalue { ptr, i32 } %227, 0
  store ptr %228, ptr %10, align 8
  %229 = extractvalue { ptr, i32 } %227, 1
  store i32 %229, ptr %11, align 4
  br label %268

230:                                              ; preds = %221, %220, %212
  br label %231

231:                                              ; preds = %230
  br label %232

232:                                              ; preds = %231
  %233 = load i32, ptr %31, align 4, !tbaa !19
  %234 = load ptr, ptr %6, align 8, !tbaa !5
  %235 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %234, i32 0, i32 29
  %236 = load ptr, ptr %235, align 8, !tbaa !60
  %237 = load i32, ptr %16, align 4, !tbaa !19
  %238 = zext i32 %237 to i64
  %239 = getelementptr inbounds i32, ptr %236, i64 %238
  store i32 %233, ptr %239, align 4, !tbaa !19
  %240 = load ptr, ptr %6, align 8, !tbaa !5
  %241 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %240, i32 0, i32 25
  %242 = load ptr, ptr %241, align 8, !tbaa !61
  %243 = load i32, ptr %31, align 4, !tbaa !19
  %244 = zext i32 %243 to i64
  %245 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step::CCDBody", ptr %242, i64 %244
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %20, i64 4, i1 false), !tbaa.struct !20
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %34, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !62
  %246 = load float, ptr %30, align 4, !tbaa !18
  %247 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 13
  %248 = getelementptr inbounds %"struct.JPH::PhysicsSettings", ptr %247, i32 0, i32 5
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #9
  %249 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 13
  %250 = getelementptr inbounds %"struct.JPH::PhysicsSettings", ptr %249, i32 0, i32 7
  %251 = load float, ptr %250, align 4, !tbaa !64
  %252 = load float, ptr %28, align 4, !tbaa !18
  %253 = fmul float %251, %252
  store float %253, ptr %35, align 4, !tbaa !18
  %254 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %248, ptr noundef nonnull align 4 dereferenceable(4) %35)
          to label %255 unwind label %264

255:                                              ; preds = %232
  %256 = load float, ptr %254, align 4, !tbaa !18
  %257 = getelementptr inbounds %"class.JPH::BodyID", ptr %33, i32 0, i32 0
  %258 = load i32, ptr %257, align 4
  %259 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 0
  %260 = load double, ptr %259, align 16
  %261 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 1
  %262 = load double, ptr %261, align 8
  invoke void @_ZN3JPH20PhysicsUpdateContext4Step7CCDBodyC2ENS_6BodyIDENS_4Vec3Eff(ptr noundef nonnull align 16 dereferenceable(144) %245, i32 %258, double %260, double %262, float noundef %246, float noundef %256)
          to label %263 unwind label %264

263:                                              ; preds = %255
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #9
  store i8 0, ptr %27, align 1, !tbaa !21
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #9
  br label %269

264:                                              ; preds = %255, %232
  %265 = landingpad { ptr, i32 }
          cleanup
  %266 = extractvalue { ptr, i32 } %265, 0
  store ptr %266, ptr %10, align 8
  %267 = extractvalue { ptr, i32 } %265, 1
  store i32 %267, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #9
  br label %268

268:                                              ; preds = %264, %226
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #9
  br label %270

269:                                              ; preds = %263, %205
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #9
  br label %272

270:                                              ; preds = %268, %222
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #9
  br label %271

271:                                              ; preds = %270, %190
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #9
  br label %321

272:                                              ; preds = %269, %173, %169
  br label %273

273:                                              ; preds = %272, %153, %153
  %274 = load i8, ptr %27, align 1, !tbaa !21, !range !65, !noundef !66
  %275 = trunc i8 %274 to i1
  br i1 %275, label %276, label %318

276:                                              ; preds = %273
  %277 = load ptr, ptr %21, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %36, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !62
  %278 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %279 = load double, ptr %278, align 16
  %280 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %281 = load double, ptr %280, align 8
  invoke void @_ZN3JPH4Body15AddPositionStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122) %277, double %279, double %281)
          to label %282 unwind label %162

282:                                              ; preds = %276
  %283 = load ptr, ptr %22, align 8, !tbaa !5
  %284 = invoke noundef i32 @_ZNK3JPH16MotionProperties30GetIndexInActiveBodiesInternalEv(ptr noundef nonnull align 16 dereferenceable(182) %283)
          to label %285 unwind label %162

285:                                              ; preds = %282
  %286 = load i32, ptr %13, align 4, !tbaa !19
  %287 = icmp uge i32 %284, %286
  br i1 %287, label %288, label %311

288:                                              ; preds = %285
  %289 = load ptr, ptr %21, align 8, !tbaa !5
  invoke void @_ZN3JPH4Body33CalculateWorldSpaceBoundsInternalEv(ptr noundef nonnull align 16 dereferenceable(122) %289)
          to label %290 unwind label %162

290:                                              ; preds = %288
  %291 = load ptr, ptr %21, align 8, !tbaa !5
  %292 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %291)
          to label %293 unwind label %162

293:                                              ; preds = %290
  %294 = load ptr, ptr %14, align 8, !tbaa !5
  %295 = load i32, ptr %15, align 4, !tbaa !19
  %296 = add nsw i32 %295, 1
  store i32 %296, ptr %15, align 4, !tbaa !19
  %297 = sext i32 %295 to i64
  %298 = getelementptr inbounds %"class.JPH::BodyID", ptr %294, i64 %297
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %298, ptr align 4 %292, i64 4, i1 false), !tbaa.struct !20
  %299 = load i32, ptr %15, align 4, !tbaa !19
  %300 = icmp eq i32 %299, 64
  br i1 %300, label %301, label %310

301:                                              ; preds = %293
  %302 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 9
  %303 = load ptr, ptr %302, align 16, !tbaa !67
  %304 = load ptr, ptr %14, align 8, !tbaa !5
  %305 = load i32, ptr %15, align 4, !tbaa !19
  %306 = load ptr, ptr %303, align 8, !tbaa !23
  %307 = getelementptr inbounds ptr, ptr %306, i64 19
  %308 = load ptr, ptr %307, align 8
  invoke void %308(ptr noundef nonnull align 8 dereferenceable(16) %303, ptr noundef %304, i32 noundef %305, i1 noundef zeroext false)
          to label %309 unwind label %162

309:                                              ; preds = %301
  store i32 0, ptr %15, align 4, !tbaa !19
  br label %310

310:                                              ; preds = %309, %293
  br label %311

311:                                              ; preds = %310, %285
  %312 = load ptr, ptr %6, align 8, !tbaa !5
  %313 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step", ptr %312, i32 0, i32 29
  %314 = load ptr, ptr %313, align 8, !tbaa !60
  %315 = load i32, ptr %16, align 4, !tbaa !19
  %316 = zext i32 %315 to i64
  %317 = getelementptr inbounds i32, ptr %314, i64 %316
  store i32 -1, ptr %317, align 4, !tbaa !19
  br label %318

318:                                              ; preds = %311, %273
  %319 = load i32, ptr %16, align 4, !tbaa !19
  %320 = add i32 %319, 1
  store i32 %320, ptr %16, align 4, !tbaa !19
  call void @llvm.lifetime.end.p0(i64 1, ptr %27) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #9
  br label %73, !llvm.loop !68

321:                                              ; preds = %271, %162
  call void @llvm.lifetime.end.p0(i64 1, ptr %27) #9
  br label %322

322:                                              ; preds = %321, %158
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #9
  br label %323

323:                                              ; preds = %322, %154, %104
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #9
  br label %324

324:                                              ; preds = %323, %100
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #9
  br label %329

325:                                              ; preds = %73
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #9
  store i32 0, ptr %17, align 4
  br label %326

326:                                              ; preds = %325, %58
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #9
  %327 = load i32, ptr %17, align 4
  switch i32 %327, label %355 [
    i32 0, label %328
    i32 2, label %330
  ]

328:                                              ; preds = %326
  br label %51, !llvm.loop !70

329:                                              ; preds = %324, %96
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #9
  br label %347

330:                                              ; preds = %326
  %331 = load i32, ptr %15, align 4, !tbaa !19
  %332 = icmp sgt i32 %331, 0
  br i1 %332, label %333, label %346

333:                                              ; preds = %330
  %334 = getelementptr inbounds %"class.JPH::PhysicsSystem", ptr %37, i32 0, i32 9
  %335 = load ptr, ptr %334, align 16, !tbaa !67
  %336 = load ptr, ptr %14, align 8, !tbaa !5
  %337 = load i32, ptr %15, align 4, !tbaa !19
  %338 = load ptr, ptr %335, align 8, !tbaa !23
  %339 = getelementptr inbounds ptr, ptr %338, i64 19
  %340 = load ptr, ptr %339, align 8
  invoke void %340(ptr noundef nonnull align 8 dereferenceable(16) %335, ptr noundef %336, i32 noundef %337, i1 noundef zeroext false)
          to label %341 unwind label %342

341:                                              ; preds = %333
  br label %346

342:                                              ; preds = %333
  %343 = landingpad { ptr, i32 }
          cleanup
  %344 = extractvalue { ptr, i32 } %343, 0
  store ptr %344, ptr %10, align 8
  %345 = extractvalue { ptr, i32 } %343, 1
  store i32 %345, ptr %11, align 4
  br label %347

346:                                              ; preds = %341, %330
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  call void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %7) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #9
  ret void

347:                                              ; preds = %342, %329
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #9
  br label %348

348:                                              ; preds = %347, %63
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #9
  br label %349

349:                                              ; preds = %348, %59
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  call void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %7) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %7) #9
  br label %350

350:                                              ; preds = %349
  %351 = load ptr, ptr %10, align 8
  %352 = load i32, ptr %11, align 4
  %353 = insertvalue { ptr, i32 } poison, ptr %351, 0
  %354 = insertvalue { ptr, i32 } %353, i32 %352, 1
  resume { ptr, i32 } %354

355:                                              ; preds = %326
  unreachable
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16MotionProperties19ClampLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(182)) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16MotionProperties20ClampAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(182)) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH4Body15AddRotationStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122), double, double) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body18GetAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(122)) #2 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i8 @_ZNK3JPH16MotionProperties16GetMotionQualityEv(ptr noundef nonnull align 16 dereferenceable(182)) #3 align 2

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16)) #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)) #1

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH20PhysicsUpdateContext4Step7CCDBodyC2ENS_6BodyIDENS_4Vec3Eff(ptr noundef nonnull align 16 dereferenceable(144), i32, double, double, float noundef, float noundef) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH4Body15AddPositionStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122), double, double) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK3JPH16MotionProperties30GetIndexInActiveBodiesInternalEv(ptr noundef nonnull align 16 dereferenceable(182)) #3 align 2

declare void @_ZN3JPH4Body33CalculateWorldSpaceBoundsInternalEv(ptr noundef nonnull align 16 dereferenceable(122)) #8

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { inlinehint 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 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { 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 = { 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 #8 = { "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, !11, i64 32}
!10 = !{!"_ZTSN3JPH20PhysicsUpdateContextE", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !11, i64 32, !11, i64 36, !12, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !15, i64 72, !14, i64 104, !6, i64 112, !12, i64 120}
!11 = !{!"float", !7, i64 0}
!12 = !{!"_ZTSSt6atomicIjE", !13, i64 0}
!13 = !{!"_ZTSSt13__atomic_baseIjE", !14, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = !{!"_ZTSN3JPH5ArrayINS_20PhysicsUpdateContext4StepENS_16STLTempAllocatorIS2_EEEE", !16, i64 0, !17, i64 8, !17, i64 16, !6, i64 24}
!16 = !{!"_ZTSN3JPH16STLTempAllocatorINS_20PhysicsUpdateContext4StepEEE", !6, i64 0}
!17 = !{!"long", !7, i64 0}
!18 = !{!11, !11, i64 0}
!19 = !{!14, !14, i64 0}
!20 = !{i64 0, i64 4, !19}
!21 = !{!22, !22, i64 0}
!22 = !{!"bool", !7, i64 0}
!23 = !{!24, !24, i64 0}
!24 = !{!"vtable pointer", !8, i64 0}
!25 = !{i64 2160027675}
!26 = !{!27, !11, i64 512}
!27 = !{!"_ZTSN3JPH13PhysicsSystemE", !6, i64 0, !6, i64 8, !28, i64 16, !37, i64 320, !39, i64 336, !40, i64 352, !40, i64 376, !41, i64 400, !41, i64 416, !6, i64 432, !6, i64 440, !6, i64 448, !42, i64 456, !44, i64 488, !45, i64 576, !46, i64 824, !48, i64 904, !49, i64 1016, !30, i64 1080, !50, i64 1128, !51, i64 1152, !11, i64 1168}
!28 = !{!"_ZTSN3JPH11BodyManagerE", !29, i64 0, !14, i64 24, !17, i64 32, !30, i64 40, !34, i64 88, !35, i64 104, !30, i64 128, !7, i64 176, !7, i64 192, !14, i64 200, !30, i64 208, !36, i64 256, !6, i64 280, !6, i64 288, !22, i64 296}
!29 = !{!"_ZTSN3JPH5ArrayIPNS_4BodyENS_12STLAllocatorIS2_EEEE", !17, i64 0, !17, i64 8, !6, i64 16}
!30 = !{!"_ZTSN3JPH5MutexE", !31, i64 0, !33, i64 40}
!31 = !{!"_ZTSSt5mutex", !32, i64 0}
!32 = !{!"_ZTSSt12__mutex_base", !7, i64 0}
!33 = !{!"_ZTSNSt6thread2idE", !17, i64 0}
!34 = !{!"_ZTSN3JPH10MutexArrayINS_11SharedMutexEEE", !6, i64 0, !14, i64 8}
!35 = !{!"_ZTSN3JPH5ArrayIhNS_12STLAllocatorIhEEEE", !17, i64 0, !17, i64 8, !6, i64 16}
!36 = !{!"_ZTSN3JPH5ArrayINS_6BodyIDENS_12STLAllocatorIS1_EEEE", !17, i64 0, !17, i64 8, !6, i64 16}
!37 = !{!"_ZTSN3JPH23BodyLockInterfaceNoLockE", !38, i64 0}
!38 = !{!"_ZTSN3JPH17BodyLockInterfaceE", !6, i64 8}
!39 = !{!"_ZTSN3JPH24BodyLockInterfaceLockingE", !38, i64 0}
!40 = !{!"_ZTSN3JPH13BodyInterfaceE", !6, i64 0, !6, i64 8, !6, i64 16}
!41 = !{!"_ZTSN3JPH16NarrowPhaseQueryE", !6, i64 0, !6, i64 8}
!42 = !{!"_ZTSSt8functionIFvRKN3JPH4BodyES3_RKNS0_5Mat44ES6_RNS0_20CollideShapeSettingsERNS0_18CollisionCollectorINS0_18CollideShapeResultENS0_36CollisionCollectorTraitsCollideShapeEEERKNS0_11ShapeFilterEEE", !43, i64 0, !6, i64 24}
!43 = !{!"_ZTSSt14_Function_base", !7, i64 0, !6, i64 16}
!44 = !{!"_ZTSN3JPH15PhysicsSettingsE", !14, i64 0, !14, i64 4, !14, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !14, i64 56, !14, i64 60, !11, i64 64, !11, i64 68, !11, i64 72, !22, i64 76, !22, i64 77, !22, i64 78, !22, i64 79, !22, i64 80, !22, i64 81, !22, i64 82}
!45 = !{!"_ZTSN3JPH24ContactConstraintManagerE", !7, i64 8, !14, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !14, i64 232, !12, i64 236, !6, i64 240}
!46 = !{!"_ZTSN3JPH17ConstraintManagerE", !6, i64 0, !47, i64 8, !30, i64 32}
!47 = !{!"_ZTSN3JPH5ArrayINS_3RefINS_10ConstraintEEENS_12STLAllocatorIS3_EEEE", !17, i64 0, !17, i64 8, !6, i64 16}
!48 = !{!"_ZTSN3JPH13IslandBuilderE", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !14, i64 88, !14, i64 92, !14, i64 96, !14, i64 100, !14, i64 104, !14, i64 108}
!49 = !{!"_ZTSN3JPH19LargeIslandSplitterE", !14, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !14, i64 32, !12, i64 36, !14, i64 40, !6, i64 48, !12, i64 56}
!50 = !{!"_ZTSN3JPH5ArrayIPNS_19PhysicsStepListenerENS_12STLAllocatorIS2_EEEE", !17, i64 0, !17, i64 8, !6, i64 16}
!51 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!52 = !{!53, !14, i64 4600}
!53 = !{!"_ZTSN3JPH20PhysicsUpdateContext4StepE", !6, i64 0, !22, i64 8, !22, i64 9, !54, i64 16, !14, i64 48, !12, i64 52, !7, i64 56, !12, i64 116, !7, i64 120, !12, i64 180, !7, i64 184, !12, i64 244, !7, i64 248, !12, i64 308, !7, i64 312, !12, i64 372, !7, i64 376, !55, i64 436, !14, i64 4536, !12, i64 4540, !12, i64 4544, !12, i64 4548, !12, i64 4552, !12, i64 4556, !12, i64 4560, !6, i64 4568, !14, i64 4576, !12, i64 4580, !12, i64 4584, !6, i64 4592, !14, i64 4600, !56, i64 4608, !58, i64 4616, !58, i64 4880, !58, i64 5144, !58, i64 5408, !56, i64 5672, !58, i64 5680, !56, i64 5944, !56, i64 5952, !56, i64 5960, !58, i64 5968, !56, i64 6232, !58, i64 6240, !56, i64 6504, !56, i64 6512, !58, i64 6520, !56, i64 6784, !56, i64 6792, !58, i64 6800, !58, i64 7064, !56, i64 7328, !56, i64 7336}
!54 = !{!"_ZTSN3JPH10BroadPhase11UpdateStateE", !7, i64 0}
!55 = !{!"_ZTSN3JPH11StaticArrayINS_20PhysicsUpdateContext13BodyPairQueueELj32EEE", !14, i64 0, !7, i64 4}
!56 = !{!"_ZTSN3JPH9JobSystem9JobHandleE", !57, i64 0}
!57 = !{!"_ZTSN3JPH3RefINS_9JobSystem3JobEEE", !6, i64 0}
!58 = !{!"_ZTSN3JPH11StaticArrayINS_9JobSystem9JobHandleELj32EEE", !14, i64 0, !7, i64 8}
!59 = !{i64 2160028065}
!60 = !{!53, !6, i64 4592}
!61 = !{!53, !6, i64 4568}
!62 = !{i64 0, i64 16, !63}
!63 = !{!7, !7, i64 0}
!64 = !{!27, !11, i64 516}
!65 = !{i8 0, i8 2}
!66 = !{}
!67 = !{!27, !6, i64 432}
!68 = distinct !{!68, !69}
!69 = !{!"llvm.loop.mustprogress"}
!70 = distinct !{!70, !69}


; 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::BodyAccess::Grant" = type { i8 }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::Vec3" = type { %union.anon.13 }
%union.anon.13 = type { <4 x float> }
%"struct.JPH::PhysicsUpdateContext::Step::CCDBody" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::BodyID", %"class.JPH::BodyID", %"class.JPH::SubShapeID", float, float, float, float, %"class.JPH::ContactSettings" }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::ContactSettings" = type { float, float, float, float, float, float, i8, %"class.JPH::Vec3", %"class.JPH::Vec3" }

@.str.24 = external hidden unnamed_addr constant [83 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [20 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [146 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [50 x i8], align 1

; 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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK3JPH11BodyManager18GetNumActiveBodiesENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297), i8 noundef zeroext) local_unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH10BodyAccess5GrantC2ENS0_7EAccessES2_(ptr noundef nonnull align 1 dereferenceable(1), i8 noundef zeroext, i8 noundef zeroext) unnamed_addr #2 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1)) unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH11BodyManager21GetActiveBodiesUnsafeENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297), i8 noundef zeroext) local_unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(122) ptr @_ZN3JPH11BodyManager7GetBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(297), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #5 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNKSt13__atomic_baseIjEcvjEv(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef ptr @_ZNK3JPH4Body8GetShapeEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH4Body8IsSensorEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #1 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #1 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH13PhysicsSystem20JobIntegrateVelocityEPKNS_20PhysicsUpdateContextEPNS1_4StepE(ptr noundef nonnull align 16 dereferenceable(1172) %0, ptr nocapture noundef readonly %1, ptr noundef %2) local_unnamed_addr #5 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca %"class.JPH::BodyAccess::Grant", align 1
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca %"class.JPH::BodyID", align 4
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca float, align 4
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %4) #8
  call void @_ZN3JPH10BodyAccess5GrantC2ENS0_7EAccessES2_(ptr noundef nonnull align 1 dereferenceable(1) %4, i8 noundef zeroext 3, i8 noundef zeroext 3)
  %12 = getelementptr inbounds i8, ptr %1, i64 32
  %13 = load float, ptr %12, align 8, !tbaa !5
  %14 = getelementptr inbounds i8, ptr %0, i64 16
  %15 = call noundef ptr @_ZNK3JPH11BodyManager21GetActiveBodiesUnsafeENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297) %14, i8 noundef zeroext 0)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  %16 = call noundef i32 @_ZNK3JPH11BodyManager18GetNumActiveBodiesENS_9EBodyTypeE(ptr noundef nonnull align 8 dereferenceable(297) %14, i8 noundef zeroext 0)
  store i32 %16, ptr %5, align 4, !tbaa !17
  %17 = getelementptr inbounds i8, ptr %2, i64 372
  %18 = call noundef i32 @_ZNKSt13__atomic_baseIjEcvjEv(ptr noundef nonnull align 4 dereferenceable(4) %17) #8
  %19 = alloca [256 x i8], align 16
  %20 = getelementptr inbounds i8, ptr %2, i64 4560
  %21 = call noundef i32 @_ZNSt13__atomic_baseIjE9fetch_addEjSt12memory_order(ptr noundef nonnull align 4 dereferenceable(4) %20, i32 noundef 64, i32 noundef 5) #8
  %.not115 = icmp ult i32 %21, %16
  br i1 %.not115, label %.lr.ph117, label %._crit_edge.thread

.lr.ph117:                                        ; preds = %3
  %22 = getelementptr inbounds i8, ptr %8, i64 8
  %23 = getelementptr inbounds i8, ptr %10, i64 8
  %24 = getelementptr inbounds i8, ptr %9, i64 8
  %25 = getelementptr inbounds i8, ptr %0, i64 512
  %26 = getelementptr inbounds i8, ptr %2, i64 4580
  %27 = getelementptr inbounds i8, ptr %2, i64 4600
  %28 = getelementptr inbounds i8, ptr %2, i64 4592
  %29 = getelementptr inbounds i8, ptr %2, i64 4568
  %30 = getelementptr inbounds i8, ptr %0, i64 508
  %31 = getelementptr inbounds i8, ptr %0, i64 516
  %32 = getelementptr inbounds i8, ptr %0, i64 432
  br label %35

.loopexit:                                        ; preds = %147, %35
  %.168.lcssa = phi i32 [ %.067116, %35 ], [ %.370, %147 ]
  %33 = call noundef i32 @_ZNSt13__atomic_baseIjE9fetch_addEjSt12memory_order(ptr noundef nonnull align 4 dereferenceable(4) %20, i32 noundef 64, i32 noundef 5) #8
  %34 = load i32, ptr %5, align 4, !tbaa !17
  %.not = icmp ult i32 %33, %34
  br i1 %.not, label %35, label %._crit_edge

35:                                               ; preds = %.lr.ph117, %.loopexit
  %36 = phi i32 [ %21, %.lr.ph117 ], [ %33, %.loopexit ]
  %.067116 = phi i32 [ 0, %.lr.ph117 ], [ %.168.lcssa, %.loopexit ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #8
  %37 = add i32 %36, 64
  store i32 %37, ptr %6, align 4, !tbaa !17
  %38 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIjERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %5, ptr noundef nonnull align 4 dereferenceable(4) %6)
  %39 = load i32, ptr %38, align 4, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #8
  %40 = icmp ult i32 %36, %39
  br i1 %40, label %.lr.ph.preheader, label %.loopexit

.lr.ph.preheader:                                 ; preds = %35
  %41 = zext i32 %36 to i64
  %wide.trip.count = zext i32 %39 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %147
  %indvars.iv = phi i64 [ %41, %.lr.ph.preheader ], [ %indvars.iv.next, %147 ]
  %.168114 = phi i32 [ %.067116, %.lr.ph.preheader ], [ %.370, %147 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %7) #8
  %42 = getelementptr inbounds %"class.JPH::BodyID", ptr %15, i64 %indvars.iv
  %43 = load i32, ptr %42, align 4, !tbaa !17
  store i32 %43, ptr %7, align 4, !tbaa !17
  %44 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZN3JPH11BodyManager7GetBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(297) %14, ptr noundef nonnull align 4 dereferenceable(4) %7)
          to label %45 unwind label %51

45:                                               ; preds = %.lr.ph
  %46 = invoke noundef ptr @_ZN3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
          to label %47 unwind label %53

47:                                               ; preds = %45
  %48 = call noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
  br i1 %48, label %49, label %55

49:                                               ; preds = %47
  invoke void @_ZN3JPH16MotionProperties19ClampLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(182) %46)
          to label %50 unwind label %53

50:                                               ; preds = %49
  invoke void @_ZN3JPH16MotionProperties20ClampAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(182) %46)
          to label %55 unwind label %53

51:                                               ; preds = %.lr.ph
  %52 = landingpad { ptr, i32 }
          cleanup
  br label %149

53:                                               ; preds = %50, %49, %45
  %54 = landingpad { ptr, i32 }
          cleanup
  br label %149

55:                                               ; preds = %50, %47
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #8
  %56 = invoke { double, double } @_ZNK3JPH4Body18GetAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
          to label %57 unwind label %74

57:                                               ; preds = %55
  %58 = extractvalue { double, double } %56, 0
  store double %58, ptr %8, align 16
  %59 = extractvalue { double, double } %56, 1
  store double %59, ptr %22, align 8
  %60 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %8, float noundef %13)
          to label %61 unwind label %74

61:                                               ; preds = %57
  %62 = extractvalue { double, double } %60, 0
  %63 = extractvalue { double, double } %60, 1
  invoke void @_ZN3JPH4Body15AddRotationStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122) %44, double %62, double %63)
          to label %64 unwind label %74

64:                                               ; preds = %61
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #8
  %65 = invoke { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
          to label %66 unwind label %76

66:                                               ; preds = %64
  %67 = extractvalue { double, double } %65, 0
  store double %67, ptr %10, align 16
  %68 = extractvalue { double, double } %65, 1
  store double %68, ptr %23, align 8
  %69 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %10, float noundef %13)
          to label %70 unwind label %76

70:                                               ; preds = %66
  %71 = extractvalue { double, double } %69, 0
  store double %71, ptr %9, align 16
  %72 = extractvalue { double, double } %69, 1
  store double %72, ptr %24, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #8
  %73 = call noundef zeroext i8 @_ZNK3JPH16MotionProperties16GetMotionQualityEv(ptr noundef nonnull align 16 dereferenceable(182) %46)
  %cond = icmp eq i8 %73, 1
  br i1 %cond, label %80, label %.critedge

74:                                               ; preds = %61, %57, %55
  %75 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #8
  br label %149

76:                                               ; preds = %66, %64
  %77 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #8
  br label %148

78:                                               ; preds = %139, %131, %.critedge
  %79 = landingpad { ptr, i32 }
          cleanup
  br label %148

80:                                               ; preds = %70
  %81 = call noundef zeroext i1 @_ZNK3JPH4Body9IsDynamicEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
  br i1 %81, label %82, label %.critedge

82:                                               ; preds = %80
  %83 = call noundef zeroext i1 @_ZNK3JPH4Body8IsSensorEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
  br i1 %83, label %.critedge, label %84

84:                                               ; preds = %82
  %85 = invoke noundef ptr @_ZNK3JPH4Body8GetShapeEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
          to label %86 unwind label %97

86:                                               ; preds = %84
  %87 = load ptr, ptr %85, align 8, !tbaa !18
  %88 = getelementptr inbounds i8, ptr %87, i64 56
  %89 = load ptr, ptr %88, align 8
  %90 = invoke noundef float %89(ptr noundef nonnull align 8 dereferenceable(26) %85)
          to label %91 unwind label %97

91:                                               ; preds = %86
  %92 = fcmp ogt float %90, 0.000000e+00
  br i1 %92, label %99, label %93

93:                                               ; preds = %91
  %94 = invoke noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef nonnull @.str.58, ptr noundef nonnull @.str.24, i32 noundef 1569, ptr noundef nonnull @.str.59)
          to label %95 unwind label %97

95:                                               ; preds = %93
  br i1 %94, label %96, label %99

96:                                               ; preds = %95
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #8, !srcloc !20
  br label %99

97:                                               ; preds = %93, %86, %84
  %98 = landingpad { ptr, i32 }
          cleanup
  br label %148

99:                                               ; preds = %96, %95, %91
  %100 = load float, ptr %25, align 16, !tbaa !21
  %101 = fmul float %90, %100
  %102 = call noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %101)
  %103 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %9)
  %104 = fcmp ule float %103, %102
  br i1 %104, label %.critedge, label %105

105:                                              ; preds = %99
  %106 = call noundef i32 @_ZNSt13__atomic_baseIjEppEi(ptr noundef nonnull align 4 dereferenceable(4) %26, i32 noundef 0) #8
  %107 = load i32, ptr %27, align 8, !tbaa !48
  %108 = zext i32 %107 to i64
  %109 = icmp ult i64 %indvars.iv, %108
  br i1 %109, label %116, label %110

110:                                              ; preds = %105
  %111 = invoke noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef nonnull @.str.60, ptr noundef nonnull @.str.24, i32 noundef 1577)
          to label %112 unwind label %114

112:                                              ; preds = %110
  br i1 %111, label %113, label %116

113:                                              ; preds = %112
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #8, !srcloc !55
  br label %116

114:                                              ; preds = %110
  %115 = landingpad { ptr, i32 }
          cleanup
  br label %148

116:                                              ; preds = %113, %112, %105
  %117 = load ptr, ptr %28, align 8, !tbaa !56
  %118 = getelementptr inbounds i32, ptr %117, i64 %indvars.iv
  store i32 %106, ptr %118, align 4, !tbaa !17
  %119 = load ptr, ptr %29, align 8, !tbaa !57
  %120 = zext i32 %106 to i64
  %121 = getelementptr inbounds %"struct.JPH::PhysicsUpdateContext::Step::CCDBody", ptr %119, i64 %120
  %.sroa.03.0.copyload = load i32, ptr %7, align 4, !tbaa !17
  %.sroa.01.0.copyload = load double, ptr %9, align 16
  %.sroa.22.0.copyload = load double, ptr %24, align 8, !tbaa !58
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #8
  %122 = load float, ptr %31, align 4, !tbaa !59
  %123 = fmul float %90, %122
  store float %123, ptr %11, align 4, !tbaa !60
  %124 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %30, ptr noundef nonnull align 4 dereferenceable(4) %11)
  %125 = load float, ptr %124, align 4, !tbaa !60
  invoke void @_ZN3JPH20PhysicsUpdateContext4Step7CCDBodyC2ENS_6BodyIDENS_4Vec3Eff(ptr noundef nonnull align 16 dereferenceable(144) %121, i32 %.sroa.03.0.copyload, double %.sroa.01.0.copyload, double %.sroa.22.0.copyload, float noundef %102, float noundef %125)
          to label %126 unwind label %127

126:                                              ; preds = %116
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #8
  br label %147

127:                                              ; preds = %116
  %128 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #8
  br label %148

.critedge:                                        ; preds = %99, %82, %80, %70
  %.sroa.0.0.copyload = load double, ptr %9, align 16
  %.sroa.2.0.copyload = load double, ptr %24, align 8, !tbaa !58
  invoke void @_ZN3JPH4Body15AddPositionStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122) %44, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload)
          to label %129 unwind label %78

129:                                              ; preds = %.critedge
  %130 = call noundef i32 @_ZNK3JPH16MotionProperties30GetIndexInActiveBodiesInternalEv(ptr noundef nonnull align 16 dereferenceable(182) %46)
  %.not82 = icmp ult i32 %130, %18
  br i1 %.not82, label %144, label %131

131:                                              ; preds = %129
  invoke void @_ZN3JPH4Body33CalculateWorldSpaceBoundsInternalEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
          to label %132 unwind label %78

132:                                              ; preds = %131
  %133 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %44)
  %134 = add nsw i32 %.168114, 1
  %135 = sext i32 %.168114 to i64
  %136 = getelementptr inbounds %"class.JPH::BodyID", ptr %19, i64 %135
  %137 = load i32, ptr %133, align 4, !tbaa !17
  store i32 %137, ptr %136, align 4, !tbaa !17
  %138 = icmp eq i32 %134, 64
  br i1 %138, label %139, label %144

139:                                              ; preds = %132
  %140 = load ptr, ptr %32, align 16, !tbaa !61
  %141 = load ptr, ptr %140, align 8, !tbaa !18
  %142 = getelementptr inbounds i8, ptr %141, i64 152
  %143 = load ptr, ptr %142, align 8
  invoke void %143(ptr noundef nonnull align 8 dereferenceable(16) %140, ptr noundef nonnull %19, i32 noundef 64, i1 noundef zeroext false)
          to label %144 unwind label %78

144:                                              ; preds = %139, %132, %129
  %.269 = phi i32 [ %134, %132 ], [ %.168114, %129 ], [ 0, %139 ]
  %145 = load ptr, ptr %28, align 8, !tbaa !56
  %146 = getelementptr inbounds i32, ptr %145, i64 %indvars.iv
  store i32 -1, ptr %146, align 4, !tbaa !17
  br label %147

147:                                              ; preds = %126, %144
  %.370 = phi i32 [ %.269, %144 ], [ %.168114, %126 ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #8
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %.loopexit, label %.lr.ph, !llvm.loop !62

148:                                              ; preds = %78, %114, %127, %97, %76
  %.pn83.pn = phi { ptr, i32 } [ %77, %76 ], [ %79, %78 ], [ %98, %97 ], [ %128, %127 ], [ %115, %114 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #8
  br label %149

149:                                              ; preds = %53, %74, %148, %51
  %.pn83.pn.pn.pn = phi { ptr, i32 } [ %52, %51 ], [ %.pn83.pn, %148 ], [ %75, %74 ], [ %54, %53 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #8
  br label %159

._crit_edge:                                      ; preds = %.loopexit
  %150 = icmp sgt i32 %.168.lcssa, 0
  br i1 %150, label %151, label %._crit_edge.thread

151:                                              ; preds = %._crit_edge
  %152 = getelementptr inbounds i8, ptr %0, i64 432
  %153 = load ptr, ptr %152, align 16, !tbaa !61
  %154 = load ptr, ptr %153, align 8, !tbaa !18
  %155 = getelementptr inbounds i8, ptr %154, i64 152
  %156 = load ptr, ptr %155, align 8
  invoke void %156(ptr noundef nonnull align 8 dereferenceable(16) %153, ptr noundef nonnull %19, i32 noundef %.168.lcssa, i1 noundef zeroext false)
          to label %._crit_edge.thread unwind label %157

157:                                              ; preds = %151
  %158 = landingpad { ptr, i32 }
          cleanup
  br label %159

._crit_edge.thread:                               ; preds = %3, %151, %._crit_edge
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  call void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %4) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %4) #8
  ret void

159:                                              ; preds = %157, %149
  %.pn88 = phi { ptr, i32 } [ %158, %157 ], [ %.pn83.pn.pn.pn, %149 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  call void @_ZN3JPH10BodyAccess5GrantD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %4) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %4) #8
  resume { ptr, i32 } %.pn88
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16MotionProperties19ClampLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(182)) local_unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16MotionProperties20ClampAngularVelocityEv(ptr noundef nonnull align 16 dereferenceable(182)) local_unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH4Body15AddRotationStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122), double, double) local_unnamed_addr #2 align 2

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i8 @_ZNK3JPH16MotionProperties16GetMotionQualityEv(ptr noundef nonnull align 16 dereferenceable(182)) local_unnamed_addr #3 align 2

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16)) 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 #1

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH20PhysicsUpdateContext4Step7CCDBodyC2ENS_6BodyIDENS_4Vec3Eff(ptr noundef nonnull align 16 dereferenceable(144), i32, double, double, float noundef, float noundef) unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH4Body15AddPositionStepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(122), double, double) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK3JPH16MotionProperties30GetIndexInActiveBodiesInternalEv(ptr noundef nonnull align 16 dereferenceable(182)) local_unnamed_addr #3 align 2

declare void @_ZN3JPH4Body33CalculateWorldSpaceBoundsInternalEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #7

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { inlinehint 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 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 #5 = { 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 #6 = { 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 #7 = { "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, !10, i64 32}
!6 = !{!"_ZTSN3JPH20PhysicsUpdateContextE", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !10, i64 32, !10, i64 36, !11, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !14, i64 72, !13, i64 104, !7, i64 112, !11, i64 120}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"_ZTSSt6atomicIjE", !12, i64 0}
!12 = !{!"_ZTSSt13__atomic_baseIjE", !13, i64 0}
!13 = !{!"int", !8, i64 0}
!14 = !{!"_ZTSN3JPH5ArrayINS_20PhysicsUpdateContext4StepENS_16STLTempAllocatorIS2_EEEE", !15, i64 0, !16, i64 8, !16, i64 16, !7, i64 24}
!15 = !{!"_ZTSN3JPH16STLTempAllocatorINS_20PhysicsUpdateContext4StepEEE", !7, i64 0}
!16 = !{!"long", !8, i64 0}
!17 = !{!13, !13, i64 0}
!18 = !{!19, !19, i64 0}
!19 = !{!"vtable pointer", !9, i64 0}
!20 = !{i64 2160027675}
!21 = !{!22, !10, i64 512}
!22 = !{!"_ZTSN3JPH13PhysicsSystemE", !7, i64 0, !7, i64 8, !23, i64 16, !33, i64 320, !35, i64 336, !36, i64 352, !36, i64 376, !37, i64 400, !37, i64 416, !7, i64 432, !7, i64 440, !7, i64 448, !38, i64 456, !40, i64 488, !41, i64 576, !42, i64 824, !44, i64 904, !45, i64 1016, !25, i64 1080, !46, i64 1128, !47, i64 1152, !10, i64 1168}
!23 = !{!"_ZTSN3JPH11BodyManagerE", !24, i64 0, !13, i64 24, !16, i64 32, !25, i64 40, !29, i64 88, !30, i64 104, !25, i64 128, !8, i64 176, !8, i64 192, !13, i64 200, !25, i64 208, !31, i64 256, !7, i64 280, !7, i64 288, !32, i64 296}
!24 = !{!"_ZTSN3JPH5ArrayIPNS_4BodyENS_12STLAllocatorIS2_EEEE", !16, i64 0, !16, i64 8, !7, i64 16}
!25 = !{!"_ZTSN3JPH5MutexE", !26, i64 0, !28, i64 40}
!26 = !{!"_ZTSSt5mutex", !27, i64 0}
!27 = !{!"_ZTSSt12__mutex_base", !8, i64 0}
!28 = !{!"_ZTSNSt6thread2idE", !16, i64 0}
!29 = !{!"_ZTSN3JPH10MutexArrayINS_11SharedMutexEEE", !7, i64 0, !13, i64 8}
!30 = !{!"_ZTSN3JPH5ArrayIhNS_12STLAllocatorIhEEEE", !16, i64 0, !16, i64 8, !7, i64 16}
!31 = !{!"_ZTSN3JPH5ArrayINS_6BodyIDENS_12STLAllocatorIS1_EEEE", !16, i64 0, !16, i64 8, !7, i64 16}
!32 = !{!"bool", !8, i64 0}
!33 = !{!"_ZTSN3JPH23BodyLockInterfaceNoLockE", !34, i64 0}
!34 = !{!"_ZTSN3JPH17BodyLockInterfaceE", !7, i64 8}
!35 = !{!"_ZTSN3JPH24BodyLockInterfaceLockingE", !34, i64 0}
!36 = !{!"_ZTSN3JPH13BodyInterfaceE", !7, i64 0, !7, i64 8, !7, i64 16}
!37 = !{!"_ZTSN3JPH16NarrowPhaseQueryE", !7, i64 0, !7, i64 8}
!38 = !{!"_ZTSSt8functionIFvRKN3JPH4BodyES3_RKNS0_5Mat44ES6_RNS0_20CollideShapeSettingsERNS0_18CollisionCollectorINS0_18CollideShapeResultENS0_36CollisionCollectorTraitsCollideShapeEEERKNS0_11ShapeFilterEEE", !39, i64 0, !7, i64 24}
!39 = !{!"_ZTSSt14_Function_base", !8, i64 0, !7, i64 16}
!40 = !{!"_ZTSN3JPH15PhysicsSettingsE", !13, i64 0, !13, i64 4, !13, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !13, i64 56, !13, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !32, i64 76, !32, i64 77, !32, i64 78, !32, i64 79, !32, i64 80, !32, i64 81, !32, i64 82}
!41 = !{!"_ZTSN3JPH24ContactConstraintManagerE", !8, i64 8, !13, i64 184, !7, i64 192, !7, i64 200, !7, i64 208, !7, i64 216, !7, i64 224, !13, i64 232, !11, i64 236, !7, i64 240}
!42 = !{!"_ZTSN3JPH17ConstraintManagerE", !7, i64 0, !43, i64 8, !25, i64 32}
!43 = !{!"_ZTSN3JPH5ArrayINS_3RefINS_10ConstraintEEENS_12STLAllocatorIS3_EEEE", !16, i64 0, !16, i64 8, !7, i64 16}
!44 = !{!"_ZTSN3JPH13IslandBuilderE", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !13, i64 88, !13, i64 92, !13, i64 96, !13, i64 100, !13, i64 104, !13, i64 108}
!45 = !{!"_ZTSN3JPH19LargeIslandSplitterE", !13, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !13, i64 32, !11, i64 36, !13, i64 40, !7, i64 48, !11, i64 56}
!46 = !{!"_ZTSN3JPH5ArrayIPNS_19PhysicsStepListenerENS_12STLAllocatorIS2_EEEE", !16, i64 0, !16, i64 8, !7, i64 16}
!47 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!48 = !{!49, !13, i64 4600}
!49 = !{!"_ZTSN3JPH20PhysicsUpdateContext4StepE", !7, i64 0, !32, i64 8, !32, i64 9, !50, i64 16, !13, i64 48, !11, i64 52, !8, i64 56, !11, i64 116, !8, i64 120, !11, i64 180, !8, i64 184, !11, i64 244, !8, i64 248, !11, i64 308, !8, i64 312, !11, i64 372, !8, i64 376, !51, i64 436, !13, i64 4536, !11, i64 4540, !11, i64 4544, !11, i64 4548, !11, i64 4552, !11, i64 4556, !11, i64 4560, !7, i64 4568, !13, i64 4576, !11, i64 4580, !11, i64 4584, !7, i64 4592, !13, i64 4600, !52, i64 4608, !54, i64 4616, !54, i64 4880, !54, i64 5144, !54, i64 5408, !52, i64 5672, !54, i64 5680, !52, i64 5944, !52, i64 5952, !52, i64 5960, !54, i64 5968, !52, i64 6232, !54, i64 6240, !52, i64 6504, !52, i64 6512, !54, i64 6520, !52, i64 6784, !52, i64 6792, !54, i64 6800, !54, i64 7064, !52, i64 7328, !52, i64 7336}
!50 = !{!"_ZTSN3JPH10BroadPhase11UpdateStateE", !8, i64 0}
!51 = !{!"_ZTSN3JPH11StaticArrayINS_20PhysicsUpdateContext13BodyPairQueueELj32EEE", !13, i64 0, !8, i64 4}
!52 = !{!"_ZTSN3JPH9JobSystem9JobHandleE", !53, i64 0}
!53 = !{!"_ZTSN3JPH3RefINS_9JobSystem3JobEEE", !7, i64 0}
!54 = !{!"_ZTSN3JPH11StaticArrayINS_9JobSystem9JobHandleELj32EEE", !13, i64 0, !8, i64 8}
!55 = !{i64 2160028065}
!56 = !{!49, !7, i64 4592}
!57 = !{!49, !7, i64 4568}
!58 = !{!8, !8, i64 0}
!59 = !{!22, !10, i64 516}
!60 = !{!10, !10, i64 0}
!61 = !{!22, !7, i64 432}
!62 = distinct !{!62, !63}
!63 = !{!"llvm.loop.mustprogress"}


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