; LLVM IR from zig-gamedev/zphysics :: libs/Jolt/Physics/Character (CharacterVirtual)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::CharacterContactSettings" = type { i8, i8 }
%"class.JPH::BodyLockWrite" = type { %"class.JPH::BodyLockBase.37" }
%"class.JPH::BodyLockBase.37" = type { ptr, ptr, ptr }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"struct.JPH::CharacterVirtual::Constraint" = type <{ ptr, float, float, %"class.JPH::Vec3", %"class.JPH::Plane", i8, [15 x i8] }>
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }
%"struct.JPH::CharacterVirtual::Contact" = type <{ %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, %"class.JPH::BodyID", [4 x i8], ptr, %"class.JPH::SubShapeID", i8, i8, [2 x i8], i64, ptr, i8, i8, i8, [13 x i8] }>
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::CharacterBase" = type { ptr, %"class.JPH::RefTarget", ptr, %"class.JPH::RefConst", %"class.JPH::Vec3", %"class.JPH::Plane", float, i32, %"class.JPH::BodyID", %"class.JPH::SubShapeID", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::RefConst.1", i64 }
%"class.JPH::RefTarget" = type { %"struct.std::atomic" }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::RefConst" = type { ptr }
%"class.JPH::RefConst.1" = type { ptr }
%"class.JPH::CharacterVirtual" = type <{ %"class.JPH::CharacterBase", ptr, ptr, i8, [3 x i8], float, i32, i32, float, float, float, i32, float, float, i8, [3 x i8], float, float, [12 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Vec3", %"class.JPH::Array.2", float, i8, [3 x i8], i64, %"class.JPH::BodyID", [4 x i8] }>
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Array.2" = type { i64, i64, ptr }

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140)) #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 16 dereferenceable(115)) #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH16CharacterVirtual12ContactAddedERKNS0_7ContactERNS_24CharacterContactSettingsE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 16 dereferenceable(115), ptr noundef nonnull align 1 dereferenceable(2)) #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)) #4

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

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332) %0, double %1, double %2, ptr noundef nonnull align 16 dereferenceable(49) %3, float noundef %4) #5 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca i1, align 1
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca float, align 4
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca %"class.JPH::CharacterContactSettings", align 1
  %14 = alloca %"class.JPH::BodyLockWrite", align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %20 = alloca %"class.JPH::Vec3", align 16
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca float, align 4
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  %26 = alloca ptr, align 8
  %27 = alloca %"class.JPH::Vec3", align 16
  %28 = alloca %"class.JPH::Mat44", align 16
  %29 = alloca float, align 4
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca %"class.JPH::Vec3", align 16
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca float, align 4
  %35 = alloca %"class.JPH::Vec3", align 16
  %36 = alloca %"class.JPH::Vec3", align 16
  %37 = alloca %"class.JPH::Vec3", align 16
  %38 = alloca float, align 4
  %39 = alloca float, align 4
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca %"class.JPH::Vec3", align 16
  %42 = alloca float, align 4
  %43 = alloca %"class.JPH::Vec3", align 16
  %44 = alloca %"class.JPH::Vec3", align 16
  %45 = alloca %"class.JPH::Vec3", align 16
  %46 = alloca %"class.JPH::Vec3", align 16
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = getelementptr inbounds { double, double }, ptr %7, i32 0, i32 0
  store double %1, ptr %48, align 16
  %49 = getelementptr inbounds { double, double }, ptr %7, i32 0, i32 1
  store double %2, ptr %49, align 8
  store ptr %0, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  store float %4, ptr %10, align 4, !tbaa !9
  %50 = load ptr, ptr %8, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #11
  %51 = load ptr, ptr %9, align 8, !tbaa !5
  %52 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %51, i32 0, i32 0
  %53 = load ptr, ptr %52, align 16, !tbaa !11
  store ptr %53, ptr %11, align 8, !tbaa !5
  %54 = load ptr, ptr %11, align 8, !tbaa !5
  %55 = call noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332) %50, ptr noundef nonnull align 16 dereferenceable(115) %54)
  br i1 %55, label %57, label %56

56:                                               ; preds = %5
  store i1 false, ptr %6, align 1
  store i32 1, ptr %12, align 4
  br label %341

57:                                               ; preds = %5
  call void @llvm.lifetime.start.p0(i64 2, ptr %13) #11
  call void @_ZN3JPH24CharacterContactSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(2) %13) #11
  %58 = load ptr, ptr %11, align 8, !tbaa !5
  call void @_ZNK3JPH16CharacterVirtual12ContactAddedERKNS0_7ContactERNS_24CharacterContactSettingsE(ptr noundef nonnull align 16 dereferenceable(332) %50, ptr noundef nonnull align 16 dereferenceable(115) %58, ptr noundef nonnull align 1 dereferenceable(2) %13)
  %59 = getelementptr inbounds %"class.JPH::CharacterContactSettings", ptr %13, i32 0, i32 0
  %60 = load i8, ptr %59, align 1, !tbaa !17, !range !19, !noundef !20
  %61 = trunc i8 %60 to i1
  %62 = load ptr, ptr %11, align 8, !tbaa !5
  %63 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %62, i32 0, i32 17
  %64 = zext i1 %61 to i8
  store i8 %64, ptr %63, align 2, !tbaa !21
  %65 = load ptr, ptr %11, align 8, !tbaa !5
  %66 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %65, i32 0, i32 11
  %67 = load i8, ptr %66, align 1, !tbaa !28, !range !19, !noundef !20
  %68 = trunc i8 %67 to i1
  br i1 %68, label %69, label %70

69:                                               ; preds = %57
  store i1 false, ptr %6, align 1
  store i32 1, ptr %12, align 4
  br label %340

70:                                               ; preds = %57
  %71 = getelementptr inbounds %"class.JPH::CharacterContactSettings", ptr %13, i32 0, i32 1
  %72 = load i8, ptr %71, align 1, !tbaa !29, !range !19, !noundef !20
  %73 = trunc i8 %72 to i1
  br i1 %73, label %74, label %79

74:                                               ; preds = %70
  %75 = load ptr, ptr %11, align 8, !tbaa !5
  %76 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %75, i32 0, i32 10
  %77 = load i8, ptr %76, align 4, !tbaa !30
  %78 = icmp ne i8 %77, 2
  br i1 %78, label %79, label %80

79:                                               ; preds = %74, %70
  store i1 true, ptr %6, align 1
  store i32 1, ptr %12, align 4
  br label %340

80:                                               ; preds = %74
  call void @llvm.lifetime.start.p0(i64 24, ptr %14) #11
  %81 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %50, i32 0, i32 2
  %82 = load ptr, ptr %81, align 16, !tbaa !31
  %83 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140) %82)
  %84 = load ptr, ptr %11, align 8, !tbaa !5
  %85 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %84, i32 0, i32 6
  call void @_ZN3JPH13BodyLockWriteCI2NS_12BodyLockBaseILb1ENS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24) %14, ptr noundef nonnull align 8 dereferenceable(16) %83, ptr noundef nonnull align 4 dereferenceable(4) %85)
  %86 = invoke noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24) %14)
          to label %87 unwind label %89

87:                                               ; preds = %80
  br i1 %86, label %93, label %88

88:                                               ; preds = %87
  store i1 false, ptr %6, align 1
  store i32 1, ptr %12, align 4
  br label %338

89:                                               ; preds = %80
  %90 = landingpad { ptr, i32 }
          cleanup
  %91 = extractvalue { ptr, i32 } %90, 0
  store ptr %91, ptr %15, align 8
  %92 = extractvalue { ptr, i32 } %90, 1
  store i32 %92, ptr %16, align 4
  br label %339

93:                                               ; preds = %87
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  %94 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE7GetBodyEv(ptr noundef nonnull align 8 dereferenceable(24) %14)
          to label %95 unwind label %133

95:                                               ; preds = %93
  store ptr %94, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #11
  store float 0x3FECCCCCC0000000, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #11
  store float 0x3FD99999A0000000, ptr %19, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #11
  %96 = load ptr, ptr %11, align 8, !tbaa !5
  %97 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %96, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %21, ptr align 16 %97, i64 16, i1 false), !tbaa.struct !39
  %98 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 0
  %99 = load double, ptr %98, align 16
  %100 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 1
  %101 = load double, ptr %100, align 8
  %102 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %7, double %99, double %101)
          to label %103 unwind label %137

103:                                              ; preds = %95
  %104 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %105 = getelementptr inbounds %union.anon, ptr %104, i32 0, i32 0
  %106 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 0
  %107 = extractvalue { double, double } %102, 0
  store double %107, ptr %106, align 16
  %108 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 1
  %109 = extractvalue { double, double } %102, 1
  store double %109, ptr %108, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #11
  %110 = load ptr, ptr %11, align 8, !tbaa !5
  %111 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %110, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %23, ptr align 16 %111, i64 16, i1 false), !tbaa.struct !39
  %112 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 0
  %113 = load double, ptr %112, align 16
  %114 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 1
  %115 = load double, ptr %114, align 8
  %116 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %113, double %115)
          to label %117 unwind label %141

117:                                              ; preds = %103
  store float %116, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #11
  %118 = load float, ptr %22, align 4, !tbaa !9
  %119 = fneg float %118
  %120 = load ptr, ptr %11, align 8, !tbaa !5
  %121 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %120, i32 0, i32 4
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #11
  store float 0.000000e+00, ptr %25, align 4, !tbaa !9
  %122 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %121, ptr noundef nonnull align 4 dereferenceable(4) %25)
          to label %123 unwind label %145

123:                                              ; preds = %117
  %124 = load float, ptr %122, align 4, !tbaa !9
  %125 = fmul float %124, 0x3FD99999A0000000
  %126 = load float, ptr %10, align 4, !tbaa !9
  %127 = fdiv float %125, %126
  %128 = fneg float %127
  %129 = call float @llvm.fmuladd.f32(float %119, float 0x3FECCCCCC0000000, float %128)
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #11
  store float %129, ptr %24, align 4, !tbaa !9
  %130 = load float, ptr %24, align 4, !tbaa !9
  %131 = fcmp olt float %130, 0.000000e+00
  br i1 %131, label %132, label %149

132:                                              ; preds = %123
  store i1 true, ptr %6, align 1
  store i32 1, ptr %12, align 4
  br label %333

133:                                              ; preds = %93
  %134 = landingpad { ptr, i32 }
          cleanup
  %135 = extractvalue { ptr, i32 } %134, 0
  store ptr %135, ptr %15, align 8
  %136 = extractvalue { ptr, i32 } %134, 1
  store i32 %136, ptr %16, align 4
  br label %337

137:                                              ; preds = %95
  %138 = landingpad { ptr, i32 }
          cleanup
  %139 = extractvalue { ptr, i32 } %138, 0
  store ptr %139, ptr %15, align 8
  %140 = extractvalue { ptr, i32 } %138, 1
  store i32 %140, ptr %16, align 4
  br label %336

141:                                              ; preds = %103
  %142 = landingpad { ptr, i32 }
          cleanup
  %143 = extractvalue { ptr, i32 } %142, 0
  store ptr %143, ptr %15, align 8
  %144 = extractvalue { ptr, i32 } %142, 1
  store i32 %144, ptr %16, align 4
  br label %335

145:                                              ; preds = %117
  %146 = landingpad { ptr, i32 }
          cleanup
  %147 = extractvalue { ptr, i32 } %146, 0
  store ptr %147, ptr %15, align 8
  %148 = extractvalue { ptr, i32 } %146, 1
  store i32 %148, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #11
  br label %334

149:                                              ; preds = %123
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #11
  %150 = load ptr, ptr %17, align 8, !tbaa !5
  %151 = invoke noundef ptr @_ZNK3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122) %150)
          to label %152 unwind label %271

152:                                              ; preds = %149
  store ptr %151, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #11
  %153 = load ptr, ptr %17, align 8, !tbaa !5
  %154 = invoke { double, double } @_ZNK3JPH4Body23GetCenterOfMassPositionEv(ptr noundef nonnull align 16 dereferenceable(122) %153)
          to label %155 unwind label %275

155:                                              ; preds = %152
  %156 = getelementptr inbounds %"class.JPH::Vec3", ptr %27, i32 0, i32 0
  %157 = getelementptr inbounds %union.anon, ptr %156, i32 0, i32 0
  %158 = getelementptr inbounds { double, double }, ptr %157, i32 0, i32 0
  %159 = extractvalue { double, double } %154, 0
  store double %159, ptr %158, align 16
  %160 = getelementptr inbounds { double, double }, ptr %157, i32 0, i32 1
  %161 = extractvalue { double, double } %154, 1
  store double %161, ptr %160, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr %28) #11
  %162 = load ptr, ptr %17, align 8, !tbaa !5
  invoke void @_ZNK3JPH4Body17GetInverseInertiaEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %28, ptr noundef nonnull align 16 dereferenceable(122) %162)
          to label %163 unwind label %279

163:                                              ; preds = %155
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #11
  %164 = load ptr, ptr %26, align 8, !tbaa !5
  %165 = invoke noundef float @_ZNK3JPH16MotionProperties14GetInverseMassEv(ptr noundef nonnull align 16 dereferenceable(182) %164)
          to label %166 unwind label %283

166:                                              ; preds = %163
  store float %165, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %31) #11
  %167 = load ptr, ptr %11, align 8, !tbaa !5
  %168 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %167, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %32, ptr align 16 %27, i64 16, i1 false), !tbaa.struct !39
  %169 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 0
  %170 = load double, ptr %169, align 16
  %171 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 1
  %172 = load double, ptr %171, align 8
  %173 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %168, double %170, double %172)
          to label %174 unwind label %287

174:                                              ; preds = %166
  %175 = getelementptr inbounds %"class.JPH::Vec3", ptr %31, i32 0, i32 0
  %176 = getelementptr inbounds %union.anon, ptr %175, i32 0, i32 0
  %177 = getelementptr inbounds { double, double }, ptr %176, i32 0, i32 0
  %178 = extractvalue { double, double } %173, 0
  store double %178, ptr %177, align 16
  %179 = getelementptr inbounds { double, double }, ptr %176, i32 0, i32 1
  %180 = extractvalue { double, double } %173, 1
  store double %180, ptr %179, align 8
  %181 = load ptr, ptr %11, align 8, !tbaa !5
  %182 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %181, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %33, ptr align 16 %182, i64 16, i1 false), !tbaa.struct !39
  %183 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 0
  %184 = load double, ptr %183, align 16
  %185 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 1
  %186 = load double, ptr %185, align 8
  %187 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %31, double %184, double %186)
          to label %188 unwind label %287

188:                                              ; preds = %174
  %189 = getelementptr inbounds %"class.JPH::Vec3", ptr %30, i32 0, i32 0
  %190 = getelementptr inbounds %union.anon, ptr %189, i32 0, i32 0
  %191 = getelementptr inbounds { double, double }, ptr %190, i32 0, i32 0
  %192 = extractvalue { double, double } %187, 0
  store double %192, ptr %191, align 16
  %193 = getelementptr inbounds { double, double }, ptr %190, i32 0, i32 1
  %194 = extractvalue { double, double } %187, 1
  store double %194, ptr %193, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %31) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %36, ptr align 16 %30, i64 16, i1 false), !tbaa.struct !39
  %195 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %196 = load double, ptr %195, align 16
  %197 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %198 = load double, ptr %197, align 8
  %199 = invoke { double, double } @_ZNK3JPH5Mat4411Multiply3x3ENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %28, double %196, double %198)
          to label %200 unwind label %291

200:                                              ; preds = %188
  %201 = getelementptr inbounds %"class.JPH::Vec3", ptr %35, i32 0, i32 0
  %202 = getelementptr inbounds %union.anon, ptr %201, i32 0, i32 0
  %203 = getelementptr inbounds { double, double }, ptr %202, i32 0, i32 0
  %204 = extractvalue { double, double } %199, 0
  store double %204, ptr %203, align 16
  %205 = getelementptr inbounds { double, double }, ptr %202, i32 0, i32 1
  %206 = extractvalue { double, double } %199, 1
  store double %206, ptr %205, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %37, ptr align 16 %30, i64 16, i1 false), !tbaa.struct !39
  %207 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 0
  %208 = load double, ptr %207, align 16
  %209 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 1
  %210 = load double, ptr %209, align 8
  %211 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %35, double %208, double %210)
          to label %212 unwind label %291

212:                                              ; preds = %200
  %213 = load float, ptr %29, align 4, !tbaa !9
  %214 = fadd float %211, %213
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #11
  store float %214, ptr %34, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #11
  %215 = load float, ptr %24, align 4, !tbaa !9
  %216 = load float, ptr %34, align 4, !tbaa !9
  %217 = fdiv float %215, %216
  store float %217, ptr %38, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #11
  %218 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %50, i32 0, i32 17
  %219 = load float, ptr %218, align 16, !tbaa !41
  %220 = load float, ptr %10, align 4, !tbaa !9
  %221 = fmul float %219, %220
  store float %221, ptr %39, align 4, !tbaa !9
  %222 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %38, ptr noundef nonnull align 4 dereferenceable(4) %39)
          to label %223 unwind label %295

223:                                              ; preds = %212
  %224 = load float, ptr %222, align 4, !tbaa !9
  store float %224, ptr %38, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #11
  %225 = load float, ptr %38, align 4, !tbaa !9
  %226 = fneg float %225
  %227 = load ptr, ptr %11, align 8, !tbaa !5
  %228 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %227, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %41, ptr align 16 %228, i64 16, i1 false), !tbaa.struct !39
  %229 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %230 = load double, ptr %229, align 16
  %231 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %232 = load double, ptr %231, align 8
  %233 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %226, double %230, double %232)
          to label %234 unwind label %299

234:                                              ; preds = %223
  %235 = getelementptr inbounds %"class.JPH::Vec3", ptr %40, i32 0, i32 0
  %236 = getelementptr inbounds %union.anon, ptr %235, i32 0, i32 0
  %237 = getelementptr inbounds { double, double }, ptr %236, i32 0, i32 0
  %238 = extractvalue { double, double } %233, 0
  store double %238, ptr %237, align 16
  %239 = getelementptr inbounds { double, double }, ptr %236, i32 0, i32 1
  %240 = extractvalue { double, double } %233, 1
  store double %240, ptr %239, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #11
  %241 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %50, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %43, ptr align 16 %241, i64 16, i1 false), !tbaa.struct !39
  %242 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 0
  %243 = load double, ptr %242, align 16
  %244 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 1
  %245 = load double, ptr %244, align 8
  %246 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %40, double %243, double %245)
          to label %247 unwind label %303

247:                                              ; preds = %234
  store float %246, ptr %42, align 4, !tbaa !9
  %248 = load float, ptr %42, align 4, !tbaa !9
  %249 = fcmp olt float %248, 0.000000e+00
  br i1 %249, label %250, label %307

250:                                              ; preds = %247
  %251 = load float, ptr %42, align 4, !tbaa !9
  %252 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %50, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %45, ptr align 16 %252, i64 16, i1 false), !tbaa.struct !39
  %253 = getelementptr inbounds { double, double }, ptr %45, i32 0, i32 0
  %254 = load double, ptr %253, align 16
  %255 = getelementptr inbounds { double, double }, ptr %45, i32 0, i32 1
  %256 = load double, ptr %255, align 8
  %257 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %251, double %254, double %256)
          to label %258 unwind label %303

258:                                              ; preds = %250
  %259 = getelementptr inbounds %"class.JPH::Vec3", ptr %44, i32 0, i32 0
  %260 = getelementptr inbounds %union.anon, ptr %259, i32 0, i32 0
  %261 = getelementptr inbounds { double, double }, ptr %260, i32 0, i32 0
  %262 = extractvalue { double, double } %257, 0
  store double %262, ptr %261, align 16
  %263 = getelementptr inbounds { double, double }, ptr %260, i32 0, i32 1
  %264 = extractvalue { double, double } %257, 1
  store double %264, ptr %263, align 8
  %265 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 0
  %266 = load double, ptr %265, align 16
  %267 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 1
  %268 = load double, ptr %267, align 8
  %269 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %40, double %266, double %268)
          to label %270 unwind label %303

270:                                              ; preds = %258
  br label %307

271:                                              ; preds = %149
  %272 = landingpad { ptr, i32 }
          cleanup
  %273 = extractvalue { ptr, i32 } %272, 0
  store ptr %273, ptr %15, align 8
  %274 = extractvalue { ptr, i32 } %272, 1
  store i32 %274, ptr %16, align 4
  br label %332

275:                                              ; preds = %152
  %276 = landingpad { ptr, i32 }
          cleanup
  %277 = extractvalue { ptr, i32 } %276, 0
  store ptr %277, ptr %15, align 8
  %278 = extractvalue { ptr, i32 } %276, 1
  store i32 %278, ptr %16, align 4
  br label %331

279:                                              ; preds = %155
  %280 = landingpad { ptr, i32 }
          cleanup
  %281 = extractvalue { ptr, i32 } %280, 0
  store ptr %281, ptr %15, align 8
  %282 = extractvalue { ptr, i32 } %280, 1
  store i32 %282, ptr %16, align 4
  br label %330

283:                                              ; preds = %163
  %284 = landingpad { ptr, i32 }
          cleanup
  %285 = extractvalue { ptr, i32 } %284, 0
  store ptr %285, ptr %15, align 8
  %286 = extractvalue { ptr, i32 } %284, 1
  store i32 %286, ptr %16, align 4
  br label %329

287:                                              ; preds = %174, %166
  %288 = landingpad { ptr, i32 }
          cleanup
  %289 = extractvalue { ptr, i32 } %288, 0
  store ptr %289, ptr %15, align 8
  %290 = extractvalue { ptr, i32 } %288, 1
  store i32 %290, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %31) #11
  br label %328

291:                                              ; preds = %200, %188
  %292 = landingpad { ptr, i32 }
          cleanup
  %293 = extractvalue { ptr, i32 } %292, 0
  store ptr %293, ptr %15, align 8
  %294 = extractvalue { ptr, i32 } %292, 1
  store i32 %294, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #11
  br label %327

295:                                              ; preds = %212
  %296 = landingpad { ptr, i32 }
          cleanup
  %297 = extractvalue { ptr, i32 } %296, 0
  store ptr %297, ptr %15, align 8
  %298 = extractvalue { ptr, i32 } %296, 1
  store i32 %298, ptr %16, align 4
  br label %326

299:                                              ; preds = %223
  %300 = landingpad { ptr, i32 }
          cleanup
  %301 = extractvalue { ptr, i32 } %300, 0
  store ptr %301, ptr %15, align 8
  %302 = extractvalue { ptr, i32 } %300, 1
  store i32 %302, ptr %16, align 4
  br label %325

303:                                              ; preds = %311, %307, %258, %250, %234
  %304 = landingpad { ptr, i32 }
          cleanup
  %305 = extractvalue { ptr, i32 } %304, 0
  store ptr %305, ptr %15, align 8
  %306 = extractvalue { ptr, i32 } %304, 1
  store i32 %306, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #11
  br label %325

307:                                              ; preds = %270, %247
  %308 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %50, i32 0, i32 2
  %309 = load ptr, ptr %308, align 16, !tbaa !31
  %310 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH13PhysicsSystem22GetBodyInterfaceNoLockEv(ptr noundef nonnull align 16 dereferenceable(1140) %309)
          to label %311 unwind label %303

311:                                              ; preds = %307
  %312 = load ptr, ptr %11, align 8, !tbaa !5
  %313 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %312, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %46, ptr align 16 %40, i64 16, i1 false), !tbaa.struct !39
  %314 = load ptr, ptr %11, align 8, !tbaa !5
  %315 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %314, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %315, i64 16, i1 false), !tbaa.struct !39
  %316 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 0
  %317 = load double, ptr %316, align 16
  %318 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 1
  %319 = load double, ptr %318, align 8
  %320 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %321 = load double, ptr %320, align 16
  %322 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %323 = load double, ptr %322, align 8
  invoke void @_ZN3JPH13BodyInterface10AddImpulseERKNS_6BodyIDENS_4Vec3ES4_(ptr noundef nonnull align 8 dereferenceable(24) %310, ptr noundef nonnull align 4 dereferenceable(4) %313, double %317, double %319, double %321, double %323)
          to label %324 unwind label %303

324:                                              ; preds = %311
  store i1 true, ptr %6, align 1
  store i32 1, ptr %12, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr %28) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  br label %333

325:                                              ; preds = %303, %299
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #11
  br label %326

326:                                              ; preds = %325, %295
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #11
  br label %327

327:                                              ; preds = %326, %291
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #11
  br label %328

328:                                              ; preds = %327, %287
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #11
  br label %329

329:                                              ; preds = %328, %283
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #11
  br label %330

330:                                              ; preds = %329, %279
  call void @llvm.lifetime.end.p0(i64 64, ptr %28) #11
  br label %331

331:                                              ; preds = %330, %275
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #11
  br label %332

332:                                              ; preds = %331, %271
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  br label %334

333:                                              ; preds = %324, %132
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  br label %338

334:                                              ; preds = %332, %145
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  br label %335

335:                                              ; preds = %334, %141
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  br label %336

336:                                              ; preds = %335, %137
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #11
  br label %337

337:                                              ; preds = %336, %133
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  br label %339

338:                                              ; preds = %333, %88
  call void @_ZN3JPH12BodyLockBaseILb1ENS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %14) #11
  call void @llvm.lifetime.end.p0(i64 24, ptr %14) #11
  br label %340

339:                                              ; preds = %337, %89
  call void @_ZN3JPH12BodyLockBaseILb1ENS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %14) #11
  call void @llvm.lifetime.end.p0(i64 24, ptr %14) #11
  call void @llvm.lifetime.end.p0(i64 2, ptr %13) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #11
  br label %343

340:                                              ; preds = %338, %79, %69
  call void @llvm.lifetime.end.p0(i64 2, ptr %13) #11
  br label %341

341:                                              ; preds = %340, %56
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #11
  %342 = load i1, ptr %6, align 1
  ret i1 %342

343:                                              ; preds = %339
  %344 = load ptr, ptr %15, align 8
  %345 = load i32, ptr %16, align 4
  %346 = insertvalue { ptr, i32 } poison, ptr %344, 0
  %347 = insertvalue { ptr, i32 } %346, i32 %345, 1
  resume { ptr, i32 } %347
}

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH13BodyLockWriteCI2NS_12BodyLockBaseILb1ENS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24)) #4 align 2

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #8

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body17GetInverseInertiaEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) #7 align 2

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH13PhysicsSystem22GetBodyInterfaceNoLockEv(ptr noundef nonnull align 16 dereferenceable(1140)) #9 align 2

declare void @_ZN3JPH13BodyInterface10AddImpulseERKNS_6BodyIDENS_4Vec3ES4_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 4 dereferenceable(4), double, double, double, double) #10

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !6, i64 0, !10, i64 8, !10, i64 12, !13, i64 16, !14, i64 32, !16, i64 48}
!13 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!14 = !{!"_ZTSN3JPH5PlaneE", !15, i64 0}
!15 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!16 = !{!"bool", !7, i64 0}
!17 = !{!18, !16, i64 0}
!18 = !{!"_ZTSN3JPH24CharacterContactSettingsE", !16, i64 0, !16, i64 1}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!22, !16, i64 114}
!22 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !13, i64 0, !13, i64 16, !13, i64 32, !13, i64 48, !10, i64 64, !10, i64 68, !23, i64 72, !6, i64 80, !25, i64 88, !26, i64 92, !16, i64 93, !27, i64 96, !6, i64 104, !16, i64 112, !16, i64 113, !16, i64 114}
!23 = !{!"_ZTSN3JPH6BodyIDE", !24, i64 0}
!24 = !{!"int", !7, i64 0}
!25 = !{!"_ZTSN3JPH10SubShapeIDE", !24, i64 0}
!26 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!27 = !{!"long", !7, i64 0}
!28 = !{!22, !16, i64 93}
!29 = !{!18, !16, i64 1}
!30 = !{!22, !26, i64 92}
!31 = !{!32, !6, i64 16}
!32 = !{!"_ZTSN3JPH13CharacterBaseE", !33, i64 8, !6, i64 16, !36, i64 24, !13, i64 32, !14, i64 48, !10, i64 64, !37, i64 68, !23, i64 72, !25, i64 76, !13, i64 80, !13, i64 96, !13, i64 112, !38, i64 128, !27, i64 136}
!33 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !34, i64 0}
!34 = !{!"_ZTSSt6atomicIjE", !35, i64 0}
!35 = !{!"_ZTSSt13__atomic_baseIjE", !24, i64 0}
!36 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !6, i64 0}
!37 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !7, i64 0}
!38 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !6, i64 0}
!39 = !{i64 0, i64 16, !40}
!40 = !{!7, !7, i64 0}
!41 = !{!42, !10, i64 208}
!42 = !{!"_ZTSN3JPH16CharacterVirtualE", !32, i64 0, !6, i64 144, !6, i64 152, !43, i64 160, !10, i64 164, !24, i64 168, !24, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !24, i64 188, !10, i64 192, !10, i64 196, !16, i64 200, !10, i64 204, !10, i64 208, !13, i64 224, !13, i64 240, !44, i64 256, !13, i64 272, !45, i64 288, !10, i64 312, !16, i64 316, !27, i64 320, !23, i64 328}
!43 = !{!"_ZTSN3JPH13EBackFaceModeE", !7, i64 0}
!44 = !{!"_ZTSN3JPH4QuatE", !15, i64 0}
!45 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !27, i64 0, !27, i64 8, !6, i64 16}


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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::CharacterContactSettings" = type { i8, i8 }
%"class.JPH::BodyLockWrite" = type { %"class.JPH::BodyLockBase.37" }
%"class.JPH::BodyLockBase.37" = type { ptr, ptr, ptr }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }

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

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: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #1 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140)) local_unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 16 dereferenceable(115)) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH16CharacterVirtual12ContactAddedERKNS0_7ContactERNS_24CharacterContactSettingsE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 16 dereferenceable(115), ptr noundef nonnull align 1 dereferenceable(2)) 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 #3

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

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

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332) %0, double %1, double %2, ptr nocapture noundef nonnull readonly align 16 dereferenceable(49) %3, float noundef %4) local_unnamed_addr #4 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca %"class.JPH::Vec3", align 16
  %7 = alloca %"class.JPH::CharacterContactSettings", align 1
  %8 = alloca %"class.JPH::BodyLockWrite", align 8
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca float, align 4
  %11 = alloca %"class.JPH::Mat44", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca float, align 4
  %15 = alloca float, align 4
  %16 = alloca %"class.JPH::Vec3", align 16
  store double %1, ptr %6, align 16
  %17 = getelementptr inbounds i8, ptr %6, i64 8
  store double %2, ptr %17, align 8
  %18 = load ptr, ptr %3, align 16, !tbaa !5
  %19 = tail call noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 16 dereferenceable(115) %18)
  br i1 %19, label %20, label %136

20:                                               ; preds = %5
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %7) #10
  call void @_ZN3JPH24CharacterContactSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(2) %7) #10
  call void @_ZNK3JPH16CharacterVirtual12ContactAddedERKNS0_7ContactERNS_24CharacterContactSettingsE(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 16 dereferenceable(115) %18, ptr noundef nonnull align 1 dereferenceable(2) %7)
  %21 = load i8, ptr %7, align 1, !tbaa !15, !range !17, !noundef !18
  %22 = getelementptr inbounds i8, ptr %18, i64 114
  store i8 %21, ptr %22, align 2, !tbaa !19
  %23 = getelementptr inbounds i8, ptr %18, i64 93
  %24 = load i8, ptr %23, align 1, !tbaa !26, !range !17, !noundef !18
  %25 = trunc nuw i8 %24 to i1
  br i1 %25, label %135, label %26

26:                                               ; preds = %20
  %27 = getelementptr inbounds i8, ptr %7, i64 1
  %28 = load i8, ptr %27, align 1, !tbaa !27, !range !17, !noundef !18
  %29 = trunc nuw i8 %28 to i1
  br i1 %29, label %30, label %135

30:                                               ; preds = %26
  %31 = getelementptr inbounds i8, ptr %18, i64 92
  %32 = load i8, ptr %31, align 4, !tbaa !28
  %.not = icmp eq i8 %32, 2
  br i1 %.not, label %33, label %135

33:                                               ; preds = %30
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %8) #10
  %34 = getelementptr inbounds i8, ptr %0, i64 16
  %35 = load ptr, ptr %34, align 16, !tbaa !29
  %36 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140) %35)
  %37 = getelementptr inbounds i8, ptr %18, i64 72
  call void @_ZN3JPH13BodyLockWriteCI2NS_12BodyLockBaseILb1ENS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 8 dereferenceable(16) %36, ptr noundef nonnull align 4 dereferenceable(4) %37)
  %38 = call noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24) %8)
  br i1 %38, label %39, label %134

39:                                               ; preds = %33
  %40 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE7GetBodyEv(ptr noundef nonnull align 8 dereferenceable(24) %8)
          to label %41 unwind label %58

41:                                               ; preds = %39
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #10
  %42 = getelementptr inbounds i8, ptr %18, i64 16
  %.sroa.030.0.copyload = load double, ptr %42, align 16
  %.sroa.231.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 24
  %.sroa.231.0.copyload = load double, ptr %.sroa.231.0..sroa_idx, align 8, !tbaa !37
  %43 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.030.0.copyload, double %.sroa.231.0.copyload)
          to label %44 unwind label %60

44:                                               ; preds = %41
  %45 = extractvalue { double, double } %43, 0
  store double %45, ptr %9, align 16
  %46 = getelementptr inbounds i8, ptr %9, i64 8
  %47 = extractvalue { double, double } %43, 1
  store double %47, ptr %46, align 8
  %48 = getelementptr inbounds i8, ptr %18, i64 32
  %.sroa.027.0.copyload = load double, ptr %48, align 16
  %.sroa.228.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 40
  %.sroa.228.0.copyload = load double, ptr %.sroa.228.0..sroa_idx, align 8, !tbaa !37
  %49 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %9, double %.sroa.027.0.copyload, double %.sroa.228.0.copyload)
  %50 = fneg float %49
  %51 = getelementptr inbounds i8, ptr %18, i64 64
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #10
  store float 0.000000e+00, ptr %10, align 4, !tbaa !38
  %52 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %51, ptr noundef nonnull align 4 dereferenceable(4) %10)
  %53 = load float, ptr %52, align 4, !tbaa !38
  %54 = fmul float %53, 0xBFD99999A0000000
  %55 = fdiv float %54, %4
  %56 = call float @llvm.fmuladd.f32(float %50, float 0x3FECCCCCC0000000, float %55)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #10
  %57 = fcmp olt float %56, 0.000000e+00
  br i1 %57, label %131, label %62

58:                                               ; preds = %39
  %59 = landingpad { ptr, i32 }
          cleanup
  br label %133

60:                                               ; preds = %41
  %61 = landingpad { ptr, i32 }
          cleanup
  br label %132

62:                                               ; preds = %44
  %63 = invoke noundef ptr @_ZNK3JPH4Body19GetMotionPropertiesEv(ptr noundef nonnull align 16 dereferenceable(122) %40)
          to label %64 unwind label %109

64:                                               ; preds = %62
  %65 = invoke { double, double } @_ZNK3JPH4Body23GetCenterOfMassPositionEv(ptr noundef nonnull align 16 dereferenceable(122) %40)
          to label %66 unwind label %111

66:                                               ; preds = %64
  %67 = extractvalue { double, double } %65, 0
  %68 = extractvalue { double, double } %65, 1
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %11) #10
  invoke void @_ZNK3JPH4Body17GetInverseInertiaEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %11, ptr noundef nonnull align 16 dereferenceable(122) %40)
          to label %69 unwind label %113

69:                                               ; preds = %66
  %70 = invoke noundef float @_ZNK3JPH16MotionProperties14GetInverseMassEv(ptr noundef nonnull align 16 dereferenceable(182) %63)
          to label %71 unwind label %115

71:                                               ; preds = %69
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #10
  %72 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %18, double %67, double %68)
          to label %73 unwind label %117

73:                                               ; preds = %71
  %74 = extractvalue { double, double } %72, 0
  store double %74, ptr %12, align 16
  %75 = getelementptr inbounds i8, ptr %12, i64 8
  %76 = extractvalue { double, double } %72, 1
  store double %76, ptr %75, align 8
  %.sroa.017.0.copyload = load double, ptr %48, align 16
  %.sroa.218.0.copyload = load double, ptr %.sroa.228.0..sroa_idx, align 8, !tbaa !37
  %77 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %.sroa.017.0.copyload, double %.sroa.218.0.copyload)
          to label %78 unwind label %117

78:                                               ; preds = %73
  %79 = extractvalue { double, double } %77, 0
  %80 = extractvalue { double, double } %77, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #10
  %81 = invoke { double, double } @_ZNK3JPH5Mat4411Multiply3x3ENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %11, double %79, double %80)
          to label %82 unwind label %119

82:                                               ; preds = %78
  %83 = extractvalue { double, double } %81, 0
  store double %83, ptr %13, align 16
  %84 = getelementptr inbounds i8, ptr %13, i64 8
  %85 = extractvalue { double, double } %81, 1
  store double %85, ptr %84, align 8
  %86 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %79, double %80)
  %87 = fadd float %70, %86
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #10
  %88 = fdiv float %56, %87
  store float %88, ptr %14, align 4, !tbaa !38
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %15) #10
  %89 = getelementptr inbounds i8, ptr %0, i64 208
  %90 = load float, ptr %89, align 16, !tbaa !39
  %91 = fmul float %90, %4
  store float %91, ptr %15, align 4, !tbaa !38
  %92 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %14, ptr noundef nonnull align 4 dereferenceable(4) %15)
  %93 = load float, ptr %92, align 4, !tbaa !38
  store float %93, ptr %14, align 4, !tbaa !38
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #10
  %94 = fneg float %93
  %.sroa.010.0.copyload = load double, ptr %48, align 16
  %.sroa.211.0.copyload = load double, ptr %.sroa.228.0..sroa_idx, align 8, !tbaa !37
  %95 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %94, double %.sroa.010.0.copyload, double %.sroa.211.0.copyload)
          to label %96 unwind label %121

96:                                               ; preds = %82
  %97 = extractvalue { double, double } %95, 0
  store double %97, ptr %16, align 16
  %98 = getelementptr inbounds i8, ptr %16, i64 8
  %99 = extractvalue { double, double } %95, 1
  store double %99, ptr %98, align 8
  %100 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.07.0.copyload = load double, ptr %100, align 16
  %.sroa.28.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.28.0.copyload = load double, ptr %.sroa.28.0..sroa_idx, align 8, !tbaa !37
  %101 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %.sroa.07.0.copyload, double %.sroa.28.0.copyload)
  %102 = fcmp olt float %101, 0.000000e+00
  br i1 %102, label %103, label %125

103:                                              ; preds = %96
  %.sroa.03.0.copyload = load double, ptr %100, align 16
  %.sroa.24.0.copyload = load double, ptr %.sroa.28.0..sroa_idx, align 8, !tbaa !37
  %104 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %101, double %.sroa.03.0.copyload, double %.sroa.24.0.copyload)
          to label %105 unwind label %123

105:                                              ; preds = %103
  %106 = extractvalue { double, double } %104, 0
  %107 = extractvalue { double, double } %104, 1
  %108 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %106, double %107)
  br label %125

109:                                              ; preds = %62
  %110 = landingpad { ptr, i32 }
          cleanup
  br label %132

111:                                              ; preds = %64
  %112 = landingpad { ptr, i32 }
          cleanup
  br label %132

113:                                              ; preds = %66
  %114 = landingpad { ptr, i32 }
          cleanup
  br label %130

115:                                              ; preds = %69
  %116 = landingpad { ptr, i32 }
          cleanup
  br label %130

117:                                              ; preds = %73, %71
  %118 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #10
  br label %130

119:                                              ; preds = %78
  %120 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #10
  br label %130

121:                                              ; preds = %82
  %122 = landingpad { ptr, i32 }
          cleanup
  br label %129

123:                                              ; preds = %125, %103
  %124 = landingpad { ptr, i32 }
          cleanup
  br label %129

125:                                              ; preds = %105, %96
  %126 = load ptr, ptr %34, align 16, !tbaa !29
  %127 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH13PhysicsSystem22GetBodyInterfaceNoLockEv(ptr noundef nonnull align 16 dereferenceable(1140) %126)
  %.sroa.01.0.copyload = load double, ptr %16, align 16
  %.sroa.22.0.copyload = load double, ptr %98, align 8, !tbaa !37
  %.sroa.0.0.copyload = load double, ptr %18, align 16
  %.sroa.2.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 8
  %.sroa.2.0.copyload = load double, ptr %.sroa.2.0..sroa_idx, align 8, !tbaa !37
  invoke void @_ZN3JPH13BodyInterface10AddImpulseERKNS_6BodyIDENS_4Vec3ES4_(ptr noundef nonnull align 8 dereferenceable(24) %127, ptr noundef nonnull align 4 dereferenceable(4) %37, double %.sroa.01.0.copyload, double %.sroa.22.0.copyload, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload)
          to label %128 unwind label %123

128:                                              ; preds = %125
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #10
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %11) #10
  br label %131

129:                                              ; preds = %123, %121
  %.pn = phi { ptr, i32 } [ %124, %123 ], [ %122, %121 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %15) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #10
  br label %130

130:                                              ; preds = %115, %119, %129, %117, %113
  %.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %114, %113 ], [ %116, %115 ], [ %118, %117 ], [ %.pn, %129 ], [ %120, %119 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %11) #10
  br label %132

131:                                              ; preds = %44, %128
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #10
  br label %134

132:                                              ; preds = %109, %130, %111, %60
  %.pn.pn.pn.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %61, %60 ], [ %110, %109 ], [ %.pn.pn.pn.pn.pn, %130 ], [ %112, %111 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #10
  br label %133

133:                                              ; preds = %132, %58
  %.pn.pn.pn.pn.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn.pn.pn.pn.pn.pn.pn.pn, %132 ], [ %59, %58 ]
  call void @_ZN3JPH12BodyLockBaseILb1ENS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %8) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #10
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %7) #10
  resume { ptr, i32 } %.pn.pn.pn.pn.pn.pn.pn.pn.pn

134:                                              ; preds = %33, %131
  call void @_ZN3JPH12BodyLockBaseILb1ENS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %8) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #10
  br label %135

135:                                              ; preds = %26, %30, %20, %134
  %.2 = phi i1 [ %38, %134 ], [ false, %20 ], [ true, %30 ], [ true, %26 ]
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %7) #10
  br label %136

136:                                              ; preds = %5, %135
  %.3 = phi i1 [ %.2, %135 ], [ false, %5 ]
  ret i1 %.3
}

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH13BodyLockWriteCI2NS_12BodyLockBaseILb1ENS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb1ENS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #3 align 2

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #7

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body17GetInverseInertiaEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #6 align 2

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH13PhysicsSystem22GetBodyInterfaceNoLockEv(ptr noundef nonnull align 16 dereferenceable(1140)) local_unnamed_addr #8 align 2

declare void @_ZN3JPH13BodyInterface10AddImpulseERKNS_6BodyIDENS_4Vec3ES4_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 4 dereferenceable(4), double, double, double, double) local_unnamed_addr #9

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !7, i64 0, !10, i64 8, !10, i64 12, !11, i64 16, !12, i64 32, !14, i64 48}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!12 = !{!"_ZTSN3JPH5PlaneE", !13, i64 0}
!13 = !{!"_ZTSN3JPH4Vec4E", !8, i64 0}
!14 = !{!"bool", !8, i64 0}
!15 = !{!16, !14, i64 0}
!16 = !{!"_ZTSN3JPH24CharacterContactSettingsE", !14, i64 0, !14, i64 1}
!17 = !{i8 0, i8 2}
!18 = !{}
!19 = !{!20, !14, i64 114}
!20 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !11, i64 0, !11, i64 16, !11, i64 32, !11, i64 48, !10, i64 64, !10, i64 68, !21, i64 72, !7, i64 80, !23, i64 88, !24, i64 92, !14, i64 93, !25, i64 96, !7, i64 104, !14, i64 112, !14, i64 113, !14, i64 114}
!21 = !{!"_ZTSN3JPH6BodyIDE", !22, i64 0}
!22 = !{!"int", !8, i64 0}
!23 = !{!"_ZTSN3JPH10SubShapeIDE", !22, i64 0}
!24 = !{!"_ZTSN3JPH11EMotionTypeE", !8, i64 0}
!25 = !{!"long", !8, i64 0}
!26 = !{!20, !14, i64 93}
!27 = !{!16, !14, i64 1}
!28 = !{!20, !24, i64 92}
!29 = !{!30, !7, i64 16}
!30 = !{!"_ZTSN3JPH13CharacterBaseE", !31, i64 8, !7, i64 16, !34, i64 24, !11, i64 32, !12, i64 48, !10, i64 64, !35, i64 68, !21, i64 72, !23, i64 76, !11, i64 80, !11, i64 96, !11, i64 112, !36, i64 128, !25, i64 136}
!31 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !32, i64 0}
!32 = !{!"_ZTSSt6atomicIjE", !33, i64 0}
!33 = !{!"_ZTSSt13__atomic_baseIjE", !22, i64 0}
!34 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !7, i64 0}
!35 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !8, i64 0}
!36 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !7, i64 0}
!37 = !{!8, !8, i64 0}
!38 = !{!10, !10, i64 0}
!39 = !{!40, !10, i64 208}
!40 = !{!"_ZTSN3JPH16CharacterVirtualE", !30, i64 0, !7, i64 144, !7, i64 152, !41, i64 160, !10, i64 164, !22, i64 168, !22, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !22, i64 188, !10, i64 192, !10, i64 196, !14, i64 200, !10, i64 204, !10, i64 208, !11, i64 224, !11, i64 240, !42, i64 256, !11, i64 272, !43, i64 288, !10, i64 312, !14, i64 316, !25, i64 320, !21, i64 328}
!41 = !{!"_ZTSN3JPH13EBackFaceModeE", !8, i64 0}
!42 = !{!"_ZTSN3JPH4QuatE", !13, i64 0}
!43 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !7, i64 16}


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