; 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::RefConst.1" = type { ptr }
%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::BodyLockRead" = type { %"class.JPH::BodyLockBase" }
%"class.JPH::BodyLockBase" = type { ptr, ptr, ptr }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::Array.27" = type { %"class.JPH::STLTempAllocator", i64, i64, ptr }
%"class.JPH::STLTempAllocator" = type { ptr }
%"class.JPH::Array.35" = type { %"class.JPH::STLTempAllocator.36", i64, i64, ptr }
%"class.JPH::STLTempAllocator.36" = type { ptr }
%"class.JPH::Array.28" = type { %"class.JPH::STLTempAllocator.29", i64, i64, ptr }
%"class.JPH::STLTempAllocator.29" = 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::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::Plane" = type { %"class.JPH::Vec4" }
%"class.JPH::Array.2" = type { i64, i64, ptr }
%"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] }>

@_ZN3JPH15PhysicsMaterial8sDefaultE = external global %"class.JPH::RefConst.1", align 8

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() #1 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) #7 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH12BodyLockReadCI2NS_12BodyLockBaseILb0EKNS_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 #8 align 2

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24)) unnamed_addr #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 @_ZNK3JPH16CharacterVirtual20DetermineConstraintsERNS_5ArrayINS0_7ContactENS_16STLTempAllocatorIS2_EEEEfRNS1_INS0_10ConstraintENS3_IS7_EEEE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 8 dereferenceable(32), float noundef, ptr noundef nonnull align 8 dereferenceable(32)) #5 align 2

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332), double, double, float noundef, float noundef, ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(8)) #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16), double, double) #5 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH16CharacterVirtual23UpdateSupportingContactEbRNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %0, i1 noundef zeroext %1, ptr noundef nonnull align 8 dereferenceable(8) %2) #5 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca ptr, align 8
  %5 = alloca i8, align 1
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Mat44", align 16
  %14 = alloca %"class.JPH::Quat", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca %"class.JPH::Vec3", align 16
  %21 = alloca ptr, align 8
  %22 = alloca float, align 4
  %23 = alloca ptr, align 8
  %24 = alloca float, align 4
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i32, align 4
  %29 = alloca ptr, align 8
  %30 = alloca float, align 4
  %31 = alloca %"class.JPH::Vec3", align 16
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca i8, align 1
  %35 = alloca %"class.JPH::Vec3", align 16
  %36 = alloca %"class.JPH::Vec3", align 16
  %37 = alloca %"class.JPH::BodyLockRead", align 8
  %38 = alloca ptr, align 8
  %39 = alloca i32, align 4
  %40 = alloca ptr, align 8
  %41 = alloca %"class.JPH::Vec3", align 16
  %42 = alloca %"class.JPH::Vec3", align 16
  %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 = alloca ptr, align 8
  %49 = alloca %"class.JPH::Vec3", align 16
  %50 = alloca %"class.JPH::Vec3", align 16
  %51 = alloca %"class.JPH::Vec3", align 16
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca %"class.JPH::BodyID", align 4
  %54 = alloca %"class.JPH::SubShapeID", align 4
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca %"class.JPH::Vec3", align 16
  %59 = alloca %"class.JPH::Array.27", align 8
  %60 = alloca %"class.JPH::STLTempAllocator", align 8
  %61 = alloca %"class.JPH::Array.35", align 8
  %62 = alloca %"class.JPH::STLTempAllocator.36", align 8
  %63 = alloca %"class.JPH::Vec3", align 16
  %64 = alloca float, align 4
  %65 = alloca %"class.JPH::Array.28", align 8
  %66 = alloca %"class.JPH::STLTempAllocator.29", align 8
  %67 = alloca %"class.JPH::Vec3", align 16
  %68 = alloca float, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  %69 = zext i1 %1 to i8
  store i8 %69, ptr %5, align 1, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  %70 = load ptr, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #11
  %71 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 23
  store ptr %71, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #11
  %72 = load ptr, ptr %7, align 8, !tbaa !5
  %73 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %72)
  store ptr %73, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #11
  %74 = load ptr, ptr %7, align 8, !tbaa !5
  %75 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %74)
  store ptr %75, ptr %9, align 8, !tbaa !5
  br label %76

76:                                               ; preds = %141, %3
  %77 = load ptr, ptr %8, align 8, !tbaa !5
  %78 = load ptr, ptr %9, align 8, !tbaa !5
  %79 = icmp ne ptr %77, %78
  br i1 %79, label %81, label %80

80:                                               ; preds = %76
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #11
  br label %144

81:                                               ; preds = %76
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #11
  %82 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %82, ptr %10, align 8, !tbaa !5
  %83 = load ptr, ptr %10, align 8, !tbaa !5
  %84 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %83, i32 0, i32 16
  %85 = load i8, ptr %84, align 1, !tbaa !11, !range !20, !noundef !21
  %86 = trunc i8 %85 to i1
  br i1 %86, label %140, label %87

87:                                               ; preds = %81
  %88 = load ptr, ptr %10, align 8, !tbaa !5
  %89 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %88, i32 0, i32 15
  %90 = load i8, ptr %89, align 16, !tbaa !22, !range !20, !noundef !21
  %91 = trunc i8 %90 to i1
  br i1 %91, label %140, label %92

92:                                               ; preds = %87
  %93 = load ptr, ptr %10, align 8, !tbaa !5
  %94 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %93, i32 0, i32 4
  %95 = load float, ptr %94, align 16, !tbaa !23
  %96 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 9
  %97 = load float, ptr %96, align 4, !tbaa !24
  %98 = fcmp olt float %95, %97
  br i1 %98, label %99, label %140

99:                                               ; preds = %92
  %100 = load i8, ptr %5, align 1, !tbaa !9, !range !20, !noundef !21
  %101 = trunc i8 %100 to i1
  br i1 %101, label %125, label %102

102:                                              ; preds = %99
  %103 = load ptr, ptr %10, align 8, !tbaa !5
  %104 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %103, i32 0, i32 3
  %105 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 22
  %106 = load ptr, ptr %10, align 8, !tbaa !5
  %107 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %106, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %107, i64 16, i1 false), !tbaa.struct !38
  %108 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  %109 = load double, ptr %108, align 16
  %110 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  %111 = load double, ptr %110, align 8
  %112 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %105, double %109, double %111)
  %113 = getelementptr inbounds %"class.JPH::Vec3", ptr %11, i32 0, i32 0
  %114 = getelementptr inbounds %union.anon, ptr %113, i32 0, i32 0
  %115 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %116 = extractvalue { double, double } %112, 0
  store double %116, ptr %115, align 16
  %117 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %118 = extractvalue { double, double } %112, 1
  store double %118, ptr %117, align 8
  %119 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 0
  %120 = load double, ptr %119, align 16
  %121 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 1
  %122 = load double, ptr %121, align 8
  %123 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %104, double %120, double %122)
  %124 = fcmp ole float %123, 0x3F1A36E2E0000000
  br i1 %124, label %125, label %140

125:                                              ; preds = %102, %99
  %126 = load ptr, ptr %10, align 8, !tbaa !5
  %127 = call noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332) %70, ptr noundef nonnull align 16 dereferenceable(115) %126)
  br i1 %127, label %128, label %136

128:                                              ; preds = %125
  %129 = load ptr, ptr %10, align 8, !tbaa !5
  %130 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %129, i32 0, i32 11
  %131 = load i8, ptr %130, align 1, !tbaa !40, !range !20, !noundef !21
  %132 = trunc i8 %131 to i1
  br i1 %132, label %136, label %133

133:                                              ; preds = %128
  %134 = load ptr, ptr %10, align 8, !tbaa !5
  %135 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %134, i32 0, i32 15
  store i8 1, ptr %135, align 16, !tbaa !22
  br label %139

136:                                              ; preds = %128, %125
  %137 = load ptr, ptr %10, align 8, !tbaa !5
  %138 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %137, i32 0, i32 16
  store i8 1, ptr %138, align 1, !tbaa !11
  br label %139

139:                                              ; preds = %136, %133
  br label %140

140:                                              ; preds = %139, %102, %92, %87, %81
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #11
  br label %141

141:                                              ; preds = %140
  %142 = load ptr, ptr %8, align 8, !tbaa !5
  %143 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %142, i32 1
  store ptr %143, ptr %8, align 8, !tbaa !5
  br label %76

144:                                              ; preds = %80
  call void @llvm.lifetime.start.p0(i64 64, ptr %13) #11
  %145 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 21
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %14, ptr align 16 %145, i64 16, i1 false), !tbaa.struct !38
  %146 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 20
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %15, ptr align 16 %146, i64 16, i1 false), !tbaa.struct !38
  %147 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 0
  %148 = load double, ptr %147, align 16
  %149 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 1
  %150 = load double, ptr %149, align 8
  %151 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 0
  %152 = load double, ptr %151, align 16
  %153 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 1
  %154 = load double, ptr %153, align 8
  call void @_ZN3JPH5Mat4427sInverseRotationTranslationENS_4QuatENS_4Vec3E(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %13, double %148, double %150, double %152, double %154)
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #11
  store i32 0, ptr %16, align 4, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #11
  store i32 0, ptr %17, align 4, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #11
  store i32 0, ptr %18, align 4, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #11
  %155 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %156 = getelementptr inbounds %"class.JPH::Vec3", ptr %19, 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 } %155, 0
  store double %159, ptr %158, align 16
  %160 = getelementptr inbounds { double, double }, ptr %157, i32 0, i32 1
  %161 = extractvalue { double, double } %155, 1
  store double %161, ptr %160, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #11
  %162 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %163 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %164 = getelementptr inbounds %union.anon, ptr %163, i32 0, i32 0
  %165 = getelementptr inbounds { double, double }, ptr %164, i32 0, i32 0
  %166 = extractvalue { double, double } %162, 0
  store double %166, ptr %165, align 16
  %167 = getelementptr inbounds { double, double }, ptr %164, i32 0, i32 1
  %168 = extractvalue { double, double } %162, 1
  store double %168, ptr %167, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #11
  store ptr null, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #11
  store float 0xC7EFFFFFE0000000, ptr %22, align 4, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #11
  store ptr null, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #11
  store float 0x47EFFFFFE0000000, ptr %24, align 4, !tbaa !42
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #11
  %169 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 23
  store ptr %169, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #11
  %170 = load ptr, ptr %25, align 8, !tbaa !5
  %171 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %170)
  store ptr %171, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #11
  %172 = load ptr, ptr %25, align 8, !tbaa !5
  %173 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %172)
  store ptr %173, ptr %27, align 8, !tbaa !5
  br label %174

174:                                              ; preds = %364, %144
  %175 = load ptr, ptr %26, align 8, !tbaa !5
  %176 = load ptr, ptr %27, align 8, !tbaa !5
  %177 = icmp ne ptr %175, %176
  br i1 %177, label %179, label %178

178:                                              ; preds = %174
  store i32 4, ptr %28, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #11
  br label %367

179:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #11
  %180 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %180, ptr %29, align 8, !tbaa !5
  %181 = load ptr, ptr %29, align 8, !tbaa !5
  %182 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %181, i32 0, i32 15
  %183 = load i8, ptr %182, align 16, !tbaa !22, !range !20, !noundef !21
  %184 = trunc i8 %183 to i1
  br i1 %184, label %185, label %360

185:                                              ; preds = %179
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #11
  %186 = load ptr, ptr %29, align 8, !tbaa !5
  %187 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %186, i32 0, i32 3
  %188 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %31, ptr align 16 %188, i64 16, i1 false), !tbaa.struct !38
  %189 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 0
  %190 = load double, ptr %189, align 16
  %191 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 1
  %192 = load double, ptr %191, align 8
  %193 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %187, double %190, double %192)
  store float %193, ptr %30, align 4, !tbaa !42
  %194 = load ptr, ptr %29, align 8, !tbaa !5
  %195 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %194, i32 0, i32 4
  %196 = load float, ptr %195, align 16, !tbaa !23
  %197 = load float, ptr %24, align 4, !tbaa !42
  %198 = fcmp olt float %196, %197
  br i1 %198, label %199, label %204

199:                                              ; preds = %185
  %200 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %200, ptr %23, align 8, !tbaa !5
  %201 = load ptr, ptr %29, align 8, !tbaa !5
  %202 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %201, i32 0, i32 4
  %203 = load float, ptr %202, align 16, !tbaa !23
  store float %203, ptr %24, align 4, !tbaa !42
  br label %204

204:                                              ; preds = %199, %185
  %205 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 5
  %206 = load ptr, ptr %29, align 8, !tbaa !5
  %207 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %206, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %33, ptr align 16 %207, i64 16, i1 false), !tbaa.struct !38
  %208 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 0
  %209 = load double, ptr %208, align 16
  %210 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 1
  %211 = load double, ptr %210, align 8
  %212 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %13, double %209, double %211)
  %213 = getelementptr inbounds %"class.JPH::Vec3", ptr %32, i32 0, i32 0
  %214 = getelementptr inbounds %union.anon, ptr %213, i32 0, i32 0
  %215 = getelementptr inbounds { double, double }, ptr %214, i32 0, i32 0
  %216 = extractvalue { double, double } %212, 0
  store double %216, ptr %215, align 16
  %217 = getelementptr inbounds { double, double }, ptr %214, i32 0, i32 1
  %218 = extractvalue { double, double } %212, 1
  store double %218, ptr %217, align 8
  %219 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 0
  %220 = load double, ptr %219, align 16
  %221 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 1
  %222 = load double, ptr %221, align 8
  %223 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %205, double %220, double %222)
  %224 = fcmp ogt float %223, 0.000000e+00
  br i1 %224, label %225, label %226

225:                                              ; preds = %204
  store i32 5, ptr %28, align 4
  br label %357

226:                                              ; preds = %204
  %227 = load float, ptr %22, align 4, !tbaa !42
  %228 = load float, ptr %30, align 4, !tbaa !42
  %229 = fcmp olt float %227, %228
  br i1 %229, label %230, label %233

230:                                              ; preds = %226
  %231 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %231, ptr %21, align 8, !tbaa !5
  %232 = load float, ptr %30, align 4, !tbaa !42
  store float %232, ptr %22, align 4, !tbaa !42
  br label %233

233:                                              ; preds = %230, %226
  call void @llvm.lifetime.start.p0(i64 1, ptr %34) #11
  %234 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 6
  %235 = load float, ptr %234, align 16, !tbaa !43
  %236 = fcmp ogt float %235, 0x3FEFFF2E40000000
  br i1 %236, label %242, label %237

237:                                              ; preds = %233
  %238 = load float, ptr %30, align 4, !tbaa !42
  %239 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 6
  %240 = load float, ptr %239, align 16, !tbaa !43
  %241 = fcmp oge float %238, %240
  br label %242

242:                                              ; preds = %237, %233
  %243 = phi i1 [ true, %233 ], [ %241, %237 ]
  %244 = zext i1 %243 to i8
  store i8 %244, ptr %34, align 1, !tbaa !9
  %245 = load i8, ptr %34, align 1, !tbaa !9, !range !20, !noundef !21
  %246 = trunc i8 %245 to i1
  br i1 %246, label %247, label %250

247:                                              ; preds = %242
  %248 = load i32, ptr %16, align 4, !tbaa !41
  %249 = add nsw i32 %248, 1
  store i32 %249, ptr %16, align 4, !tbaa !41
  br label %253

250:                                              ; preds = %242
  %251 = load i32, ptr %17, align 4, !tbaa !41
  %252 = add nsw i32 %251, 1
  store i32 %252, ptr %17, align 4, !tbaa !41
  br label %253

253:                                              ; preds = %250, %247
  %254 = load float, ptr %30, align 4, !tbaa !42
  %255 = fcmp oge float %254, 0x3FB47AE140000000
  br i1 %255, label %256, label %356

256:                                              ; preds = %253
  %257 = load ptr, ptr %29, align 8, !tbaa !5
  %258 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %257, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %35, ptr align 16 %258, i64 16, i1 false), !tbaa.struct !38
  %259 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %260 = load double, ptr %259, align 16
  %261 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %262 = load double, ptr %261, align 8
  %263 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %260, double %262)
  %264 = load i32, ptr %18, align 4, !tbaa !41
  %265 = add nsw i32 %264, 1
  store i32 %265, ptr %18, align 4, !tbaa !41
  %266 = load ptr, ptr %29, align 8, !tbaa !5
  %267 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %266, i32 0, i32 10
  %268 = load i8, ptr %267, align 4, !tbaa !44
  %269 = icmp ne i8 %268, 1
  br i1 %269, label %273, label %270

270:                                              ; preds = %256
  %271 = load i8, ptr %34, align 1, !tbaa !9, !range !20, !noundef !21
  %272 = trunc i8 %271 to i1
  br i1 %272, label %281, label %273

273:                                              ; preds = %270, %256
  %274 = load ptr, ptr %29, align 8, !tbaa !5
  %275 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %274, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %36, ptr align 16 %275, i64 16, i1 false), !tbaa.struct !38
  %276 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %277 = load double, ptr %276, align 16
  %278 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %279 = load double, ptr %278, align 8
  %280 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %277, double %279)
  br label %355

281:                                              ; preds = %270
  call void @llvm.lifetime.start.p0(i64 24, ptr %37) #11
  %282 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 2
  %283 = load ptr, ptr %282, align 16, !tbaa !45
  %284 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140) %283)
  %285 = load ptr, ptr %29, align 8, !tbaa !5
  %286 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %285, i32 0, i32 6
  call void @_ZN3JPH12BodyLockReadCI2NS_12BodyLockBaseILb0EKNS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24) %37, ptr noundef nonnull align 8 dereferenceable(16) %284, ptr noundef nonnull align 4 dereferenceable(4) %286)
  %287 = invoke noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb0EKNS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24) %37)
          to label %288 unwind label %331

288:                                              ; preds = %281
  br i1 %287, label %289, label %344

289:                                              ; preds = %288
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #11
  %290 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZNK3JPH12BodyLockBaseILb0EKNS_4BodyEE7GetBodyEv(ptr noundef nonnull align 8 dereferenceable(24) %37)
          to label %291 unwind label %335

291:                                              ; preds = %289
  store ptr %290, ptr %40, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %41) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %42) #11
  %292 = load ptr, ptr %40, align 8, !tbaa !5
  invoke void @_ZNK3JPH16CharacterVirtual23GetAdjustedBodyVelocityERKNS_4BodyERNS_4Vec3ES5_(ptr noundef nonnull align 16 dereferenceable(332) %70, ptr noundef nonnull align 16 dereferenceable(122) %292, ptr noundef nonnull align 16 dereferenceable(16) %41, ptr noundef nonnull align 16 dereferenceable(16) %42)
          to label %293 unwind label %339

293:                                              ; preds = %291
  %294 = load ptr, ptr %40, align 8, !tbaa !5
  %295 = invoke { double, double } @_ZNK3JPH4Body23GetCenterOfMassPositionEv(ptr noundef nonnull align 16 dereferenceable(122) %294)
          to label %296 unwind label %339

296:                                              ; preds = %293
  %297 = getelementptr inbounds %"class.JPH::Vec3", ptr %44, i32 0, i32 0
  %298 = getelementptr inbounds %union.anon, ptr %297, i32 0, i32 0
  %299 = getelementptr inbounds { double, double }, ptr %298, i32 0, i32 0
  %300 = extractvalue { double, double } %295, 0
  store double %300, ptr %299, align 16
  %301 = getelementptr inbounds { double, double }, ptr %298, i32 0, i32 1
  %302 = extractvalue { double, double } %295, 1
  store double %302, ptr %301, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %45, ptr align 16 %41, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %46, ptr align 16 %42, i64 16, i1 false), !tbaa.struct !38
  %303 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 24
  %304 = load float, ptr %303, align 8, !tbaa !46
  %305 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 0
  %306 = load double, ptr %305, align 16
  %307 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 1
  %308 = load double, ptr %307, align 8
  %309 = getelementptr inbounds { double, double }, ptr %45, i32 0, i32 0
  %310 = load double, ptr %309, align 16
  %311 = getelementptr inbounds { double, double }, ptr %45, i32 0, i32 1
  %312 = load double, ptr %311, align 8
  %313 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 0
  %314 = load double, ptr %313, align 16
  %315 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 1
  %316 = load double, ptr %315, align 8
  %317 = invoke { double, double } @_ZNK3JPH16CharacterVirtual32CalculateCharacterGroundVelocityENS_4Vec3ES1_S1_f(ptr noundef nonnull align 16 dereferenceable(332) %70, double %306, double %308, double %310, double %312, double %314, double %316, float noundef %304)
          to label %318 unwind label %339

318:                                              ; preds = %296
  %319 = getelementptr inbounds %"class.JPH::Vec3", ptr %43, i32 0, i32 0
  %320 = getelementptr inbounds %union.anon, ptr %319, i32 0, i32 0
  %321 = getelementptr inbounds { double, double }, ptr %320, i32 0, i32 0
  %322 = extractvalue { double, double } %317, 0
  store double %322, ptr %321, align 16
  %323 = getelementptr inbounds { double, double }, ptr %320, i32 0, i32 1
  %324 = extractvalue { double, double } %317, 1
  store double %324, ptr %323, align 8
  %325 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 0
  %326 = load double, ptr %325, align 16
  %327 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 1
  %328 = load double, ptr %327, align 8
  %329 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %326, double %328)
          to label %330 unwind label %339

330:                                              ; preds = %318
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %41) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #11
  br label %353

331:                                              ; preds = %344, %281
  %332 = landingpad { ptr, i32 }
          cleanup
  %333 = extractvalue { ptr, i32 } %332, 0
  store ptr %333, ptr %38, align 8
  %334 = extractvalue { ptr, i32 } %332, 1
  store i32 %334, ptr %39, align 4
  br label %354

335:                                              ; preds = %289
  %336 = landingpad { ptr, i32 }
          cleanup
  %337 = extractvalue { ptr, i32 } %336, 0
  store ptr %337, ptr %38, align 8
  %338 = extractvalue { ptr, i32 } %336, 1
  store i32 %338, ptr %39, align 4
  br label %343

339:                                              ; preds = %318, %296, %293, %291
  %340 = landingpad { ptr, i32 }
          cleanup
  %341 = extractvalue { ptr, i32 } %340, 0
  store ptr %341, ptr %38, align 8
  %342 = extractvalue { ptr, i32 } %340, 1
  store i32 %342, ptr %39, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %41) #11
  br label %343

343:                                              ; preds = %339, %335
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #11
  br label %354

344:                                              ; preds = %288
  %345 = load ptr, ptr %29, align 8, !tbaa !5
  %346 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %345, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %346, i64 16, i1 false), !tbaa.struct !38
  %347 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %348 = load double, ptr %347, align 16
  %349 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %350 = load double, ptr %349, align 8
  %351 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %348, double %350)
          to label %352 unwind label %331

352:                                              ; preds = %344
  br label %353

353:                                              ; preds = %352, %330
  call void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %37) #11
  call void @llvm.lifetime.end.p0(i64 24, ptr %37) #11
  br label %355

354:                                              ; preds = %343, %331
  call void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %37) #11
  call void @llvm.lifetime.end.p0(i64 24, ptr %37) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #11
  br label %580

355:                                              ; preds = %353, %273
  br label %356

356:                                              ; preds = %355, %253
  call void @llvm.lifetime.end.p0(i64 1, ptr %34) #11
  store i32 0, ptr %28, align 4
  br label %357

357:                                              ; preds = %356, %225
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #11
  %358 = load i32, ptr %28, align 4
  switch i32 %358, label %361 [
    i32 0, label %359
  ]

359:                                              ; preds = %357
  br label %360

360:                                              ; preds = %359, %179
  store i32 0, ptr %28, align 4
  br label %361

361:                                              ; preds = %360, %357
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #11
  %362 = load i32, ptr %28, align 4
  switch i32 %362, label %586 [
    i32 0, label %363
    i32 5, label %364
  ]

363:                                              ; preds = %361
  br label %364

364:                                              ; preds = %363, %361
  %365 = load ptr, ptr %26, align 8, !tbaa !5
  %366 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %365, i32 1
  store ptr %366, ptr %26, align 8, !tbaa !5
  br label %174

367:                                              ; preds = %178
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #11
  %368 = load ptr, ptr %21, align 8, !tbaa !5
  %369 = icmp ne ptr %368, null
  br i1 %369, label %370, label %372

370:                                              ; preds = %367
  %371 = load ptr, ptr %21, align 8, !tbaa !5
  br label %374

372:                                              ; preds = %367
  %373 = load ptr, ptr %23, align 8, !tbaa !5
  br label %374

374:                                              ; preds = %372, %370
  %375 = phi ptr [ %371, %370 ], [ %373, %372 ]
  store ptr %375, ptr %48, align 8, !tbaa !5
  %376 = load i32, ptr %18, align 4, !tbaa !41
  %377 = icmp sge i32 %376, 1
  br i1 %377, label %378, label %397

378:                                              ; preds = %374
  call void @llvm.lifetime.start.p0(i64 16, ptr %49) #11
  %379 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %19)
  %380 = getelementptr inbounds %"class.JPH::Vec3", ptr %49, i32 0, i32 0
  %381 = getelementptr inbounds %union.anon, ptr %380, i32 0, i32 0
  %382 = getelementptr inbounds { double, double }, ptr %381, i32 0, i32 0
  %383 = extractvalue { double, double } %379, 0
  store double %383, ptr %382, align 16
  %384 = getelementptr inbounds { double, double }, ptr %381, i32 0, i32 1
  %385 = extractvalue { double, double } %379, 1
  store double %385, ptr %384, align 8
  %386 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %386, ptr align 16 %49, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %49) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %50) #11
  %387 = load i32, ptr %18, align 4, !tbaa !41
  %388 = sitofp i32 %387 to float
  %389 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %20, float noundef %388)
  %390 = getelementptr inbounds %"class.JPH::Vec3", ptr %50, i32 0, i32 0
  %391 = getelementptr inbounds %union.anon, ptr %390, i32 0, i32 0
  %392 = getelementptr inbounds { double, double }, ptr %391, i32 0, i32 0
  %393 = extractvalue { double, double } %389, 0
  store double %393, ptr %392, align 16
  %394 = getelementptr inbounds { double, double }, ptr %391, i32 0, i32 1
  %395 = extractvalue { double, double } %389, 1
  store double %395, ptr %394, align 8
  %396 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %396, ptr align 16 %50, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %50) #11
  br label %425

397:                                              ; preds = %374
  %398 = load ptr, ptr %48, align 8, !tbaa !5
  %399 = icmp ne ptr %398, null
  br i1 %399, label %400, label %407

400:                                              ; preds = %397
  %401 = load ptr, ptr %48, align 8, !tbaa !5
  %402 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %401, i32 0, i32 3
  %403 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %403, ptr align 16 %402, i64 16, i1 false), !tbaa.struct !38
  %404 = load ptr, ptr %48, align 8, !tbaa !5
  %405 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %404, i32 0, i32 1
  %406 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %406, ptr align 16 %405, i64 16, i1 false), !tbaa.struct !38
  br label %424

407:                                              ; preds = %397
  call void @llvm.lifetime.start.p0(i64 16, ptr %51) #11
  %408 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %409 = getelementptr inbounds %"class.JPH::Vec3", ptr %51, i32 0, i32 0
  %410 = getelementptr inbounds %union.anon, ptr %409, i32 0, i32 0
  %411 = getelementptr inbounds { double, double }, ptr %410, i32 0, i32 0
  %412 = extractvalue { double, double } %408, 0
  store double %412, ptr %411, align 16
  %413 = getelementptr inbounds { double, double }, ptr %410, i32 0, i32 1
  %414 = extractvalue { double, double } %408, 1
  store double %414, ptr %413, align 8
  %415 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %415, ptr align 16 %51, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %51) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %52) #11
  %416 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %417 = getelementptr inbounds %"class.JPH::Vec3", ptr %52, i32 0, i32 0
  %418 = getelementptr inbounds %union.anon, ptr %417, i32 0, i32 0
  %419 = getelementptr inbounds { double, double }, ptr %418, i32 0, i32 0
  %420 = extractvalue { double, double } %416, 0
  store double %420, ptr %419, align 16
  %421 = getelementptr inbounds { double, double }, ptr %418, i32 0, i32 1
  %422 = extractvalue { double, double } %416, 1
  store double %422, ptr %421, align 8
  %423 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %423, ptr align 16 %52, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %52) #11
  br label %424

424:                                              ; preds = %407, %400
  br label %425

425:                                              ; preds = %424, %378
  %426 = load ptr, ptr %48, align 8, !tbaa !5
  %427 = icmp ne ptr %426, null
  br i1 %427, label %428, label %447

428:                                              ; preds = %425
  %429 = load ptr, ptr %48, align 8, !tbaa !5
  %430 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %429, i32 0, i32 6
  %431 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %431, ptr align 8 %430, i64 4, i1 false), !tbaa.struct !47
  %432 = load ptr, ptr %48, align 8, !tbaa !5
  %433 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %432, i32 0, i32 9
  %434 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 9
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %434, ptr align 8 %433, i64 4, i1 false), !tbaa.struct !47
  %435 = load ptr, ptr %48, align 8, !tbaa !5
  %436 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %435, i32 0, i32 0
  %437 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %437, ptr align 16 %436, i64 16, i1 false), !tbaa.struct !38
  %438 = load ptr, ptr %48, align 8, !tbaa !5
  %439 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %438, i32 0, i32 14
  %440 = load ptr, ptr %439, align 8, !tbaa !48
  %441 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 13
  %442 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSEPKS1_(ptr noundef nonnull align 8 dereferenceable(8) %441, ptr noundef %440)
  %443 = load ptr, ptr %48, align 8, !tbaa !5
  %444 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %443, i32 0, i32 13
  %445 = load i64, ptr %444, align 16, !tbaa !49
  %446 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 14
  store i64 %445, ptr %446, align 8, !tbaa !50
  br label %461

447:                                              ; preds = %425
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #11
  call void @_ZN3JPH6BodyIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %53)
  %448 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %448, ptr align 4 %53, i64 4, i1 false), !tbaa.struct !47
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #11
  call void @llvm.memset.p0.i64(ptr align 4 %54, i8 0, i64 4, i1 false)
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %54) #11
  %449 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 9
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %449, ptr align 4 %54, i64 4, i1 false), !tbaa.struct !47
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #11
  %450 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %451 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %452 = getelementptr inbounds %union.anon, ptr %451, i32 0, i32 0
  %453 = getelementptr inbounds { double, double }, ptr %452, i32 0, i32 0
  %454 = extractvalue { double, double } %450, 0
  store double %454, ptr %453, align 16
  %455 = getelementptr inbounds { double, double }, ptr %452, i32 0, i32 1
  %456 = extractvalue { double, double } %450, 1
  store double %456, ptr %455, align 8
  %457 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %457, ptr align 16 %55, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #11
  %458 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 13
  %459 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSERKS2_(ptr noundef nonnull align 8 dereferenceable(8) %458, ptr noundef nonnull align 8 dereferenceable(8) @_ZN3JPH15PhysicsMaterial8sDefaultE)
  %460 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 14
  store i64 0, ptr %460, align 8, !tbaa !50
  br label %461

461:                                              ; preds = %447, %428
  %462 = load i32, ptr %16, align 4, !tbaa !41
  %463 = icmp sgt i32 %462, 0
  br i1 %463, label %464, label %466

464:                                              ; preds = %461
  %465 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 7
  store i32 0, ptr %465, align 4, !tbaa !51
  br label %579

466:                                              ; preds = %461
  %467 = load i32, ptr %17, align 4, !tbaa !41
  %468 = icmp sgt i32 %467, 0
  br i1 %468, label %469, label %572

469:                                              ; preds = %466
  call void @llvm.lifetime.start.p0(i64 16, ptr %56) #11
  %470 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 22
  %471 = load ptr, ptr %23, align 8, !tbaa !5
  %472 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %471, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %57, ptr align 16 %472, i64 16, i1 false), !tbaa.struct !38
  %473 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 0
  %474 = load double, ptr %473, align 16
  %475 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 1
  %476 = load double, ptr %475, align 8
  %477 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %470, double %474, double %476)
  %478 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %479 = getelementptr inbounds %union.anon, ptr %478, i32 0, i32 0
  %480 = getelementptr inbounds { double, double }, ptr %479, i32 0, i32 0
  %481 = extractvalue { double, double } %477, 0
  store double %481, ptr %480, align 16
  %482 = getelementptr inbounds { double, double }, ptr %479, i32 0, i32 1
  %483 = extractvalue { double, double } %477, 1
  store double %483, ptr %482, align 8
  %484 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %58, ptr align 16 %484, i64 16, i1 false), !tbaa.struct !38
  %485 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 0
  %486 = load double, ptr %485, align 16
  %487 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 1
  %488 = load double, ptr %487, align 8
  %489 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %486, double %488)
  %490 = fcmp ogt float %489, 0x3F1A36E2E0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #11
  br i1 %490, label %491, label %493

491:                                              ; preds = %469
  %492 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 7
  store i32 1, ptr %492, align 4, !tbaa !51
  br label %571

493:                                              ; preds = %469
  call void @llvm.lifetime.start.p0(i64 32, ptr %59) #11
  %494 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 23
  %495 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %494)
  %496 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 23
  %497 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %496)
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #11
  %498 = load ptr, ptr %6, align 8, !tbaa !5
  call void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual7ContactEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %60, ptr noundef nonnull align 8 dereferenceable(8) %498)
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEEC2EPKS2_S7_RKS4_(ptr noundef nonnull align 8 dereferenceable(32) %59, ptr noundef %495, ptr noundef %497, ptr noundef nonnull align 8 dereferenceable(8) %60)
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #11
  call void @llvm.lifetime.start.p0(i64 32, ptr %61) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #11
  %499 = load ptr, ptr %6, align 8, !tbaa !5
  invoke void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %62, ptr noundef nonnull align 8 dereferenceable(8) %499)
          to label %500 unwind label %544

500:                                              ; preds = %493
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %61, ptr noundef nonnull align 8 dereferenceable(8) %62)
          to label %501 unwind label %544

501:                                              ; preds = %500
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #11
  %502 = invoke noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %59)
          to label %503 unwind label %548

503:                                              ; preds = %501
  %504 = mul i64 %502, 2
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %61, i64 noundef %504)
          to label %505 unwind label %548

505:                                              ; preds = %503
  %506 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 24
  %507 = load float, ptr %506, align 8, !tbaa !46
  invoke void @_ZNK3JPH16CharacterVirtual20DetermineConstraintsERNS_5ArrayINS0_7ContactENS_16STLTempAllocatorIS2_EEEEfRNS1_INS0_10ConstraintENS3_IS7_EEEE(ptr noundef nonnull align 16 dereferenceable(332) %70, ptr noundef nonnull align 8 dereferenceable(32) %59, float noundef %507, ptr noundef nonnull align 8 dereferenceable(32) %61)
          to label %508 unwind label %548

508:                                              ; preds = %505
  call void @llvm.lifetime.start.p0(i64 16, ptr %63) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #11
  call void @llvm.lifetime.start.p0(i64 32, ptr %65) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #11
  %509 = load ptr, ptr %6, align 8, !tbaa !5
  invoke void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual14IgnoredContactEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %66, ptr noundef nonnull align 8 dereferenceable(8) %509)
          to label %510 unwind label %552

510:                                              ; preds = %508
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %65, ptr noundef nonnull align 8 dereferenceable(8) %66)
          to label %511 unwind label %552

511:                                              ; preds = %510
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #11
  %512 = invoke noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %59)
          to label %513 unwind label %556

513:                                              ; preds = %511
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %65, i64 noundef %512)
          to label %514 unwind label %556

514:                                              ; preds = %513
  %515 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 4
  %516 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %515)
          to label %517 unwind label %556

517:                                              ; preds = %514
  %518 = getelementptr inbounds %"class.JPH::Vec3", ptr %67, i32 0, i32 0
  %519 = getelementptr inbounds %union.anon, ptr %518, i32 0, i32 0
  %520 = getelementptr inbounds { double, double }, ptr %519, i32 0, i32 0
  %521 = extractvalue { double, double } %516, 0
  store double %521, ptr %520, align 16
  %522 = getelementptr inbounds { double, double }, ptr %519, i32 0, i32 1
  %523 = extractvalue { double, double } %516, 1
  store double %523, ptr %522, align 8
  %524 = load ptr, ptr %6, align 8, !tbaa !5
  %525 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 0
  %526 = load double, ptr %525, align 16
  %527 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 1
  %528 = load double, ptr %527, align 8
  invoke void @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %70, double %526, double %528, float noundef 1.000000e+00, float noundef 1.000000e+00, ptr noundef nonnull align 8 dereferenceable(32) %61, ptr noundef nonnull align 8 dereferenceable(32) %65, ptr noundef nonnull align 4 dereferenceable(4) %64, ptr noundef nonnull align 16 dereferenceable(16) %63, ptr noundef nonnull align 8 dereferenceable(8) %524)
          to label %529 unwind label %556

529:                                              ; preds = %517
  call void @llvm.lifetime.start.p0(i64 4, ptr %68) #11
  %530 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %70, i32 0, i32 24
  %531 = load float, ptr %530, align 8, !tbaa !46
  %532 = fmul float 0x3FE3333340000000, %531
  %533 = invoke noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %532)
          to label %534 unwind label %560

534:                                              ; preds = %529
  store float %533, ptr %68, align 4, !tbaa !42
  %535 = load float, ptr %64, align 4, !tbaa !42
  %536 = fcmp olt float %535, 0x3F50624DE0000000
  br i1 %536, label %542, label %537

537:                                              ; preds = %534
  %538 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %63)
          to label %539 unwind label %560

539:                                              ; preds = %537
  %540 = load float, ptr %68, align 4, !tbaa !42
  %541 = fcmp olt float %538, %540
  br i1 %541, label %542, label %564

542:                                              ; preds = %539, %534
  %543 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 7
  store i32 0, ptr %543, align 4, !tbaa !51
  br label %566

544:                                              ; preds = %500, %493
  %545 = landingpad { ptr, i32 }
          cleanup
  %546 = extractvalue { ptr, i32 } %545, 0
  store ptr %546, ptr %38, align 8
  %547 = extractvalue { ptr, i32 } %545, 1
  store i32 %547, ptr %39, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #11
  br label %570

548:                                              ; preds = %505, %503, %501
  %549 = landingpad { ptr, i32 }
          cleanup
  %550 = extractvalue { ptr, i32 } %549, 0
  store ptr %550, ptr %38, align 8
  %551 = extractvalue { ptr, i32 } %549, 1
  store i32 %551, ptr %39, align 4
  br label %569

552:                                              ; preds = %510, %508
  %553 = landingpad { ptr, i32 }
          cleanup
  %554 = extractvalue { ptr, i32 } %553, 0
  store ptr %554, ptr %38, align 8
  %555 = extractvalue { ptr, i32 } %553, 1
  store i32 %555, ptr %39, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #11
  br label %568

556:                                              ; preds = %517, %514, %513, %511
  %557 = landingpad { ptr, i32 }
          cleanup
  %558 = extractvalue { ptr, i32 } %557, 0
  store ptr %558, ptr %38, align 8
  %559 = extractvalue { ptr, i32 } %557, 1
  store i32 %559, ptr %39, align 4
  br label %567

560:                                              ; preds = %537, %529
  %561 = landingpad { ptr, i32 }
          cleanup
  %562 = extractvalue { ptr, i32 } %561, 0
  store ptr %562, ptr %38, align 8
  %563 = extractvalue { ptr, i32 } %561, 1
  store i32 %563, ptr %39, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %68) #11
  br label %567

564:                                              ; preds = %539
  %565 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 7
  store i32 1, ptr %565, align 4, !tbaa !51
  br label %566

566:                                              ; preds = %564, %542
  call void @llvm.lifetime.end.p0(i64 4, ptr %68) #11
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %65) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr %65) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %63) #11
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %61) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr %61) #11
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %59) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr %59) #11
  br label %571

567:                                              ; preds = %560, %556
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %65) #11
  br label %568

568:                                              ; preds = %567, %552
  call void @llvm.lifetime.end.p0(i64 32, ptr %65) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %63) #11
  br label %569

569:                                              ; preds = %568, %548
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %61) #11
  br label %570

570:                                              ; preds = %569, %544
  call void @llvm.lifetime.end.p0(i64 32, ptr %61) #11
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %59) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr %59) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #11
  br label %580

571:                                              ; preds = %566, %491
  br label %578

572:                                              ; preds = %466
  %573 = load ptr, ptr %48, align 8, !tbaa !5
  %574 = icmp ne ptr %573, null
  %575 = zext i1 %574 to i64
  %576 = select i1 %574, i32 2, i32 3
  %577 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %70, i32 0, i32 7
  store i32 %576, ptr %577, align 4, !tbaa !51
  br label %578

578:                                              ; preds = %572, %571
  br label %579

579:                                              ; preds = %578, %464
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr %13) #11
  ret void

580:                                              ; preds = %570, %354
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr %13) #11
  br label %581

581:                                              ; preds = %580
  %582 = load ptr, ptr %38, align 8
  %583 = load i32, ptr %39, align 4
  %584 = insertvalue { ptr, i32 } poison, ptr %582, 0
  %585 = insertvalue { ptr, i32 } %584, i32 %583, 1
  resume { ptr, i32 } %585

586:                                              ; preds = %361
  unreachable
}

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSEPKS1_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) #8 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSERKS2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #8 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEEC2EPKS2_S7_RKS4_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef, ptr noundef, ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #8 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) #8 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) #8 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #7 align 2

attributes #0 = { 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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #4 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { 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"="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 = { 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 #8 = { 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 #9 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #10 = { 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 #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 = !{!"bool", !7, i64 0}
!11 = !{!12, !10, i64 113}
!12 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !13, i64 0, !13, i64 16, !13, i64 32, !13, i64 48, !14, i64 64, !14, i64 68, !15, i64 72, !6, i64 80, !17, i64 88, !18, i64 92, !10, i64 93, !19, i64 96, !6, i64 104, !10, i64 112, !10, i64 113, !10, i64 114}
!13 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = !{!"_ZTSN3JPH6BodyIDE", !16, i64 0}
!16 = !{!"int", !7, i64 0}
!17 = !{!"_ZTSN3JPH10SubShapeIDE", !16, i64 0}
!18 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!19 = !{!"long", !7, i64 0}
!20 = !{i8 0, i8 2}
!21 = !{}
!22 = !{!12, !10, i64 112}
!23 = !{!12, !14, i64 64}
!24 = !{!25, !14, i64 180}
!25 = !{!"_ZTSN3JPH16CharacterVirtualE", !26, i64 0, !6, i64 144, !6, i64 152, !35, i64 160, !14, i64 164, !16, i64 168, !16, i64 172, !14, i64 176, !14, i64 180, !14, i64 184, !16, i64 188, !14, i64 192, !14, i64 196, !10, i64 200, !14, i64 204, !14, i64 208, !13, i64 224, !13, i64 240, !36, i64 256, !13, i64 272, !37, i64 288, !14, i64 312, !10, i64 316, !19, i64 320, !15, i64 328}
!26 = !{!"_ZTSN3JPH13CharacterBaseE", !27, i64 8, !6, i64 16, !30, i64 24, !13, i64 32, !31, i64 48, !14, i64 64, !33, i64 68, !15, i64 72, !17, i64 76, !13, i64 80, !13, i64 96, !13, i64 112, !34, i64 128, !19, i64 136}
!27 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !28, i64 0}
!28 = !{!"_ZTSSt6atomicIjE", !29, i64 0}
!29 = !{!"_ZTSSt13__atomic_baseIjE", !16, i64 0}
!30 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !6, i64 0}
!31 = !{!"_ZTSN3JPH5PlaneE", !32, i64 0}
!32 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!33 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !7, i64 0}
!34 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !6, i64 0}
!35 = !{!"_ZTSN3JPH13EBackFaceModeE", !7, i64 0}
!36 = !{!"_ZTSN3JPH4QuatE", !32, i64 0}
!37 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !19, i64 0, !19, i64 8, !6, i64 16}
!38 = !{i64 0, i64 16, !39}
!39 = !{!7, !7, i64 0}
!40 = !{!12, !10, i64 93}
!41 = !{!16, !16, i64 0}
!42 = !{!14, !14, i64 0}
!43 = !{!26, !14, i64 64}
!44 = !{!12, !18, i64 92}
!45 = !{!26, !6, i64 16}
!46 = !{!25, !14, i64 312}
!47 = !{i64 0, i64 4, !41}
!48 = !{!12, !6, i64 104}
!49 = !{!12, !19, i64 96}
!50 = !{!26, !19, i64 136}
!51 = !{!26, !33, i64 68}


; 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::RefConst.1" = type { ptr }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::BodyLockRead" = type { %"class.JPH::BodyLockBase" }
%"class.JPH::BodyLockBase" = type { ptr, ptr, ptr }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::Array.27" = type { %"class.JPH::STLTempAllocator", i64, i64, ptr }
%"class.JPH::STLTempAllocator" = type { ptr }
%"class.JPH::Array.35" = type { %"class.JPH::STLTempAllocator.36", i64, i64, ptr }
%"class.JPH::STLTempAllocator.36" = type { ptr }
%"class.JPH::Array.28" = type { %"class.JPH::STLTempAllocator.29", i64, i64, ptr }
%"class.JPH::STLTempAllocator.29" = type { ptr }

@_ZN3JPH15PhysicsMaterial8sDefaultE = external global %"class.JPH::RefConst.1", align 8

; 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 } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() local_unnamed_addr #1 align 2

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

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

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

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

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

; 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: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) local_unnamed_addr #6 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 #5 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 #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH12BodyLockReadCI2NS_12BodyLockBaseILb0EKNS_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 uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb0EKNS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #7 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24)) 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 @_ZNK3JPH16CharacterVirtual20DetermineConstraintsERNS_5ArrayINS0_7ContactENS_16STLTempAllocatorIS2_EEEEfRNS1_INS0_10ConstraintENS3_IS7_EEEE(ptr noundef nonnull align 16 dereferenceable(332), ptr noundef nonnull align 8 dereferenceable(32), float noundef, ptr noundef nonnull align 8 dereferenceable(32)) local_unnamed_addr #4 align 2

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332), double, double, float noundef, float noundef, ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #4 align 2

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH16CharacterVirtual23UpdateSupportingContactEbRNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %0, i1 noundef zeroext %1, ptr noundef nonnull align 8 dereferenceable(8) %2) local_unnamed_addr #4 align 2 personality ptr @__gxx_personality_v0 {
  %4 = alloca %"class.JPH::Mat44", align 16
  %5 = alloca %"class.JPH::Vec3", align 16
  %6 = alloca %"class.JPH::Vec3", align 16
  %7 = alloca %"class.JPH::BodyLockRead", align 8
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca %"class.JPH::BodyID", align 4
  %11 = alloca %"class.JPH::SubShapeID", align 4
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Array.27", align 8
  %14 = alloca %"class.JPH::STLTempAllocator", align 8
  %15 = alloca %"class.JPH::Array.35", align 8
  %16 = alloca %"class.JPH::STLTempAllocator.36", align 8
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca float, align 4
  %19 = alloca %"class.JPH::Array.28", align 8
  %20 = alloca %"class.JPH::STLTempAllocator.29", align 8
  %21 = getelementptr inbounds i8, ptr %0, i64 288
  %22 = tail call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  %23 = tail call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  %.not193 = icmp eq ptr %22, %23
  br i1 %.not193, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %3
  %24 = getelementptr inbounds i8, ptr %0, i64 180
  %25 = getelementptr inbounds i8, ptr %0, i64 272
  br i1 %1, label %.lr.ph.split.us, label %.lr.ph.split

.lr.ph.split.us:                                  ; preds = %.lr.ph, %46
  %.0194.us = phi ptr [ %47, %46 ], [ %22, %.lr.ph ]
  %26 = getelementptr inbounds i8, ptr %.0194.us, i64 113
  %27 = load i8, ptr %26, align 1, !tbaa !5, !range !18, !noundef !19
  %28 = trunc nuw i8 %27 to i1
  br i1 %28, label %46, label %29

29:                                               ; preds = %.lr.ph.split.us
  %30 = getelementptr inbounds i8, ptr %.0194.us, i64 112
  %31 = load i8, ptr %30, align 16, !tbaa !20, !range !18, !noundef !19
  %32 = trunc nuw i8 %31 to i1
  br i1 %32, label %46, label %33

33:                                               ; preds = %29
  %34 = getelementptr inbounds i8, ptr %.0194.us, i64 64
  %35 = load float, ptr %34, align 16, !tbaa !21
  %36 = load float, ptr %24, align 4, !tbaa !22
  %37 = fcmp olt float %35, %36
  br i1 %37, label %38, label %46

38:                                               ; preds = %33
  %39 = tail call noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 16 dereferenceable(115) %.0194.us)
  br i1 %39, label %40, label %45

40:                                               ; preds = %38
  %41 = getelementptr inbounds i8, ptr %.0194.us, i64 93
  %42 = load i8, ptr %41, align 1, !tbaa !36, !range !18, !noundef !19
  %43 = trunc nuw i8 %42 to i1
  br i1 %43, label %45, label %44

44:                                               ; preds = %40
  store i8 1, ptr %30, align 16, !tbaa !20
  br label %46

45:                                               ; preds = %40, %38
  store i8 1, ptr %26, align 1, !tbaa !5
  br label %46

46:                                               ; preds = %45, %44, %33, %29, %.lr.ph.split.us
  %47 = getelementptr inbounds i8, ptr %.0194.us, i64 128
  %.not.us = icmp eq ptr %47, %23
  br i1 %.not.us, label %._crit_edge, label %.lr.ph.split.us

._crit_edge:                                      ; preds = %93, %46, %3
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %4) #10
  %48 = getelementptr inbounds i8, ptr %0, i64 256
  %.sroa.087.0.copyload = load double, ptr %48, align 16
  %.sroa.288.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 264
  %.sroa.288.0.copyload = load double, ptr %.sroa.288.0..sroa_idx, align 8, !tbaa !37
  %49 = getelementptr inbounds i8, ptr %0, i64 240
  %.sroa.085.0.copyload = load double, ptr %49, align 16
  %.sroa.286.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 248
  %.sroa.286.0.copyload = load double, ptr %.sroa.286.0..sroa_idx, align 8, !tbaa !37
  call void @_ZN3JPH5Mat4427sInverseRotationTranslationENS_4QuatENS_4Vec3E(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %4, double %.sroa.087.0.copyload, double %.sroa.288.0.copyload, double %.sroa.085.0.copyload, double %.sroa.286.0.copyload)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #10
  %50 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %51 = extractvalue { double, double } %50, 0
  store double %51, ptr %5, align 16
  %52 = getelementptr inbounds i8, ptr %5, i64 8
  %53 = extractvalue { double, double } %50, 1
  store double %53, ptr %52, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #10
  %54 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %55 = extractvalue { double, double } %54, 0
  store double %55, ptr %6, align 16
  %56 = getelementptr inbounds i8, ptr %6, i64 8
  %57 = extractvalue { double, double } %54, 1
  store double %57, ptr %56, align 8
  %58 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  %59 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  %.not158195 = icmp eq ptr %58, %59
  br i1 %.not158195, label %.thread, label %.lr.ph205

.lr.ph205:                                        ; preds = %._crit_edge
  %60 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.248.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %61 = getelementptr inbounds i8, ptr %0, i64 48
  %62 = getelementptr inbounds i8, ptr %0, i64 64
  %63 = getelementptr inbounds i8, ptr %0, i64 16
  %.sroa.229.0..sroa_idx = getelementptr inbounds i8, ptr %8, i64 8
  %.sroa.227.0..sroa_idx = getelementptr inbounds i8, ptr %9, i64 8
  %64 = getelementptr inbounds i8, ptr %0, i64 312
  br label %99

.lr.ph.split:                                     ; preds = %.lr.ph, %93
  %.0194 = phi ptr [ %94, %93 ], [ %22, %.lr.ph ]
  %65 = getelementptr inbounds i8, ptr %.0194, i64 113
  %66 = load i8, ptr %65, align 1, !tbaa !5, !range !18, !noundef !19
  %67 = trunc nuw i8 %66 to i1
  br i1 %67, label %93, label %68

68:                                               ; preds = %.lr.ph.split
  %69 = getelementptr inbounds i8, ptr %.0194, i64 112
  %70 = load i8, ptr %69, align 16, !tbaa !20, !range !18, !noundef !19
  %71 = trunc nuw i8 %70 to i1
  br i1 %71, label %93, label %72

72:                                               ; preds = %68
  %73 = getelementptr inbounds i8, ptr %.0194, i64 64
  %74 = load float, ptr %73, align 16, !tbaa !21
  %75 = load float, ptr %24, align 4, !tbaa !22
  %76 = fcmp olt float %74, %75
  br i1 %76, label %77, label %93

77:                                               ; preds = %72
  %78 = getelementptr inbounds i8, ptr %.0194, i64 48
  %79 = getelementptr inbounds i8, ptr %.0194, i64 16
  %.sroa.089.0.copyload = load double, ptr %79, align 16
  %.sroa.290.0..sroa_idx = getelementptr inbounds i8, ptr %.0194, i64 24
  %.sroa.290.0.copyload = load double, ptr %.sroa.290.0..sroa_idx, align 8, !tbaa !37
  %80 = tail call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %25, double %.sroa.089.0.copyload, double %.sroa.290.0.copyload)
  %81 = extractvalue { double, double } %80, 0
  %82 = extractvalue { double, double } %80, 1
  %83 = tail call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %78, double %81, double %82)
  %84 = fcmp ugt float %83, 0x3F1A36E2E0000000
  br i1 %84, label %93, label %85

85:                                               ; preds = %77
  %86 = tail call noundef zeroext i1 @_ZNK3JPH16CharacterVirtual15ValidateContactERKNS0_7ContactE(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 16 dereferenceable(115) %.0194)
  br i1 %86, label %87, label %92

87:                                               ; preds = %85
  %88 = getelementptr inbounds i8, ptr %.0194, i64 93
  %89 = load i8, ptr %88, align 1, !tbaa !36, !range !18, !noundef !19
  %90 = trunc nuw i8 %89 to i1
  br i1 %90, label %92, label %91

91:                                               ; preds = %87
  store i8 1, ptr %69, align 16, !tbaa !20
  br label %93

92:                                               ; preds = %87, %85
  store i8 1, ptr %65, align 1, !tbaa !5
  br label %93

93:                                               ; preds = %91, %92, %77, %72, %68, %.lr.ph.split
  %94 = getelementptr inbounds i8, ptr %.0194, i64 128
  %.not = icmp eq ptr %94, %23
  br i1 %.not, label %._crit_edge, label %.lr.ph.split

._crit_edge206:                                   ; preds = %161
  %95 = icmp sgt i32 %.4, 0
  %96 = icmp sgt i32 %.4119, 0
  %.not159 = icmp eq ptr %.4129, null
  %97 = select i1 %.not159, ptr %.3138, ptr %.4129
  %98 = icmp sgt i32 %.4124, 0
  br i1 %98, label %176, label %163

99:                                               ; preds = %.lr.ph205, %161
  %.0114203 = phi i32 [ 0, %.lr.ph205 ], [ %.4, %161 ]
  %.0115202 = phi i32 [ 0, %.lr.ph205 ], [ %.4119, %161 ]
  %.0120201 = phi i32 [ 0, %.lr.ph205 ], [ %.4124, %161 ]
  %.0125200 = phi ptr [ null, %.lr.ph205 ], [ %.4129, %161 ]
  %.0130199 = phi float [ 0xC7EFFFFFE0000000, %.lr.ph205 ], [ %.4134, %161 ]
  %.0135198 = phi ptr [ null, %.lr.ph205 ], [ %.3138, %161 ]
  %.0139197 = phi float [ 0x47EFFFFFE0000000, %.lr.ph205 ], [ %.3142, %161 ]
  %.0143196 = phi ptr [ %58, %.lr.ph205 ], [ %162, %161 ]
  %100 = getelementptr inbounds i8, ptr %.0143196, i64 112
  %101 = load i8, ptr %100, align 16, !tbaa !20, !range !18, !noundef !19
  %102 = trunc nuw i8 %101 to i1
  br i1 %102, label %103, label %161

103:                                              ; preds = %99
  %104 = getelementptr inbounds i8, ptr %.0143196, i64 48
  %.sroa.047.0.copyload = load double, ptr %60, align 16
  %.sroa.248.0.copyload = load double, ptr %.sroa.248.0..sroa_idx, align 8, !tbaa !37
  %105 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %104, double %.sroa.047.0.copyload, double %.sroa.248.0.copyload)
  %106 = getelementptr inbounds i8, ptr %.0143196, i64 64
  %107 = load float, ptr %106, align 16, !tbaa !21
  %108 = fcmp olt float %107, %.0139197
  %.1140 = select i1 %108, float %107, float %.0139197
  %.1136 = select i1 %108, ptr %.0143196, ptr %.0135198
  %.sroa.043.0.copyload = load double, ptr %.0143196, align 16
  %.sroa.244.0..sroa_idx = getelementptr inbounds i8, ptr %.0143196, i64 8
  %.sroa.244.0.copyload = load double, ptr %.sroa.244.0..sroa_idx, align 8, !tbaa !37
  %109 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %4, double %.sroa.043.0.copyload, double %.sroa.244.0.copyload)
  %110 = extractvalue { double, double } %109, 0
  %111 = extractvalue { double, double } %109, 1
  %112 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %61, double %110, double %111)
  %113 = fcmp ule float %112, 0.000000e+00
  br i1 %113, label %114, label %161

114:                                              ; preds = %103
  %115 = fcmp olt float %.0130199, %105
  %.1131 = select i1 %115, float %105, float %.0130199
  %.1126 = select i1 %115, ptr %.0143196, ptr %.0125200
  %116 = load float, ptr %62, align 16, !tbaa !38
  %117 = fcmp ule float %116, 0x3FEFFF2E40000000
  %118 = fcmp ult float %105, %116
  %.not177 = and i1 %117, %118
  %119 = zext i1 %.not177 to i32
  %.1116 = add nsw i32 %.0115202, %119
  %not..not177 = xor i1 %.not177, true
  %120 = zext i1 %not..not177 to i32
  %.1 = add nsw i32 %.0114203, %120
  %121 = fcmp ult float %105, 0x3FB47AE140000000
  br i1 %121, label %161, label %122

122:                                              ; preds = %114
  %.sroa.039.0.copyload = load double, ptr %104, align 16
  %.sroa.240.0..sroa_idx = getelementptr inbounds i8, ptr %.0143196, i64 56
  %.sroa.240.0.copyload = load double, ptr %.sroa.240.0..sroa_idx, align 8, !tbaa !37
  %123 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %5, double %.sroa.039.0.copyload, double %.sroa.240.0.copyload)
  %124 = add nsw i32 %.0120201, 1
  %125 = getelementptr inbounds i8, ptr %.0143196, i64 92
  %126 = load i8, ptr %125, align 4, !tbaa !39
  %.not163 = icmp ne i8 %126, 1
  %brmerge = select i1 %.not163, i1 true, i1 %.not177
  br i1 %brmerge, label %127, label %130

127:                                              ; preds = %122
  %128 = getelementptr inbounds i8, ptr %.0143196, i64 16
  %.sroa.037.0.copyload = load double, ptr %128, align 16
  %.sroa.238.0..sroa_idx = getelementptr inbounds i8, ptr %.0143196, i64 24
  %.sroa.238.0.copyload = load double, ptr %.sroa.238.0..sroa_idx, align 8, !tbaa !37
  %129 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.037.0.copyload, double %.sroa.238.0.copyload)
  br label %161

130:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %7) #10
  %131 = load ptr, ptr %63, align 16, !tbaa !40
  %132 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem20GetBodyLockInterfaceEv(ptr noundef nonnull align 16 dereferenceable(1140) %131)
  %133 = getelementptr inbounds i8, ptr %.0143196, i64 72
  call void @_ZN3JPH12BodyLockReadCI2NS_12BodyLockBaseILb0EKNS_4BodyEEEERKNS_17BodyLockInterfaceERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(24) %7, ptr noundef nonnull align 8 dereferenceable(16) %132, ptr noundef nonnull align 4 dereferenceable(4) %133)
  %134 = invoke noundef zeroext i1 @_ZNK3JPH12BodyLockBaseILb0EKNS_4BodyEE26SucceededAndIsInBroadPhaseEv(ptr noundef nonnull align 8 dereferenceable(24) %7)
          to label %135 unwind label %150

135:                                              ; preds = %130
  br i1 %134, label %136, label %156

136:                                              ; preds = %135
  %137 = invoke noundef nonnull align 16 dereferenceable(122) ptr @_ZNK3JPH12BodyLockBaseILb0EKNS_4BodyEE7GetBodyEv(ptr noundef nonnull align 8 dereferenceable(24) %7)
          to label %138 unwind label %152

138:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #10
  invoke void @_ZNK3JPH16CharacterVirtual23GetAdjustedBodyVelocityERKNS_4BodyERNS_4Vec3ES5_(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 16 dereferenceable(122) %137, ptr noundef nonnull align 16 dereferenceable(16) %8, ptr noundef nonnull align 16 dereferenceable(16) %9)
          to label %139 unwind label %154

139:                                              ; preds = %138
  %140 = invoke { double, double } @_ZNK3JPH4Body23GetCenterOfMassPositionEv(ptr noundef nonnull align 16 dereferenceable(122) %137)
          to label %141 unwind label %154

141:                                              ; preds = %139
  %142 = extractvalue { double, double } %140, 0
  %143 = extractvalue { double, double } %140, 1
  %.sroa.028.0.copyload = load double, ptr %8, align 16
  %.sroa.229.0.copyload = load double, ptr %.sroa.229.0..sroa_idx, align 8, !tbaa !37
  %.sroa.026.0.copyload = load double, ptr %9, align 16
  %.sroa.227.0.copyload = load double, ptr %.sroa.227.0..sroa_idx, align 8, !tbaa !37
  %144 = load float, ptr %64, align 8, !tbaa !41
  %145 = invoke { double, double } @_ZNK3JPH16CharacterVirtual32CalculateCharacterGroundVelocityENS_4Vec3ES1_S1_f(ptr noundef nonnull align 16 dereferenceable(332) %0, double %142, double %143, double %.sroa.028.0.copyload, double %.sroa.229.0.copyload, double %.sroa.026.0.copyload, double %.sroa.227.0.copyload, float noundef %144)
          to label %146 unwind label %154

146:                                              ; preds = %141
  %147 = extractvalue { double, double } %145, 0
  %148 = extractvalue { double, double } %145, 1
  %149 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %147, double %148)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #10
  br label %159

150:                                              ; preds = %130
  %151 = landingpad { ptr, i32 }
          cleanup
  br label %160

152:                                              ; preds = %136
  %153 = landingpad { ptr, i32 }
          cleanup
  br label %160

154:                                              ; preds = %141, %139, %138
  %155 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #10
  br label %160

156:                                              ; preds = %135
  %157 = getelementptr inbounds i8, ptr %.0143196, i64 16
  %.sroa.024.0.copyload = load double, ptr %157, align 16
  %.sroa.225.0..sroa_idx = getelementptr inbounds i8, ptr %.0143196, i64 24
  %.sroa.225.0.copyload = load double, ptr %.sroa.225.0..sroa_idx, align 8, !tbaa !37
  %158 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.024.0.copyload, double %.sroa.225.0.copyload)
  br label %159

159:                                              ; preds = %156, %146
  call void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %7) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #10
  br label %161

160:                                              ; preds = %152, %154, %150
  %.pn164.pn = phi { ptr, i32 } [ %151, %150 ], [ %155, %154 ], [ %153, %152 ]
  call void @_ZN3JPH12BodyLockBaseILb0EKNS_4BodyEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %7) #10
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #10
  br label %263

161:                                              ; preds = %103, %127, %159, %114, %99
  %.3142 = phi float [ %.0139197, %99 ], [ %.1140, %114 ], [ %.1140, %159 ], [ %.1140, %127 ], [ %.1140, %103 ]
  %.3138 = phi ptr [ %.0135198, %99 ], [ %.1136, %114 ], [ %.1136, %159 ], [ %.1136, %127 ], [ %.1136, %103 ]
  %.4134 = phi float [ %.0130199, %99 ], [ %.1131, %114 ], [ %.1131, %159 ], [ %.1131, %127 ], [ %.0130199, %103 ]
  %.4129 = phi ptr [ %.0125200, %99 ], [ %.1126, %114 ], [ %.1126, %159 ], [ %.1126, %127 ], [ %.0125200, %103 ]
  %.4124 = phi i32 [ %.0120201, %99 ], [ %.0120201, %114 ], [ %124, %159 ], [ %124, %127 ], [ %.0120201, %103 ]
  %.4119 = phi i32 [ %.0115202, %99 ], [ %.1116, %114 ], [ %.1116, %159 ], [ %.1116, %127 ], [ %.0115202, %103 ]
  %.4 = phi i32 [ %.0114203, %99 ], [ %.1, %114 ], [ %.1, %159 ], [ %.1, %127 ], [ %.0114203, %103 ]
  %162 = getelementptr inbounds i8, ptr %.0143196, i64 128
  %.not158 = icmp eq ptr %162, %59
  br i1 %.not158, label %._crit_edge206, label %99

163:                                              ; preds = %._crit_edge206
  %.not160 = icmp eq ptr %97, null
  br i1 %.not160, label %.thread, label %.thread172

.thread172:                                       ; preds = %163
  %164 = getelementptr inbounds i8, ptr %97, i64 48
  %165 = getelementptr inbounds i8, ptr %0, i64 96
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %165, ptr noundef nonnull align 16 dereferenceable(16) %164, i64 16, i1 false), !tbaa.struct !42
  %166 = getelementptr inbounds i8, ptr %97, i64 16
  %167 = getelementptr inbounds i8, ptr %0, i64 112
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %167, ptr noundef nonnull align 16 dereferenceable(16) %166, i64 16, i1 false), !tbaa.struct !42
  br label %198

.thread:                                          ; preds = %._crit_edge, %163
  %.0135.lcssa221237 = phi ptr [ %.3138, %163 ], [ null, %._crit_edge ]
  %.0115.lcssa225236 = phi i1 [ %96, %163 ], [ false, %._crit_edge ]
  %.0114.lcssa229235 = phi i1 [ %95, %163 ], [ false, %._crit_edge ]
  %168 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %169 = extractvalue { double, double } %168, 0
  %170 = extractvalue { double, double } %168, 1
  %171 = getelementptr inbounds i8, ptr %0, i64 96
  store double %169, ptr %171, align 16
  %.sroa.49.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 104
  store double %170, ptr %.sroa.49.0..sroa_idx, align 8, !tbaa !37
  %172 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %173 = extractvalue { double, double } %172, 0
  %174 = extractvalue { double, double } %172, 1
  %175 = getelementptr inbounds i8, ptr %0, i64 112
  store double %173, ptr %175, align 16
  %.sroa.47.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 120
  store double %174, ptr %.sroa.47.0..sroa_idx, align 8, !tbaa !37
  br label %186

176:                                              ; preds = %._crit_edge206
  %177 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %5)
  %178 = extractvalue { double, double } %177, 0
  %179 = extractvalue { double, double } %177, 1
  %180 = getelementptr inbounds i8, ptr %0, i64 96
  store double %178, ptr %180, align 16
  %.sroa.413.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 104
  store double %179, ptr %.sroa.413.0..sroa_idx, align 8, !tbaa !37
  %181 = uitofp nneg i32 %.4124 to float
  %182 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %6, float noundef %181)
  %183 = extractvalue { double, double } %182, 0
  %184 = extractvalue { double, double } %182, 1
  %185 = getelementptr inbounds i8, ptr %0, i64 112
  store double %183, ptr %185, align 16
  %.sroa.411.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 120
  store double %184, ptr %.sroa.411.0..sroa_idx, align 8, !tbaa !37
  %.not161 = icmp eq ptr %97, null
  br i1 %.not161, label %186, label %198

186:                                              ; preds = %.thread, %176
  %.0114.lcssa228 = phi i1 [ %.0114.lcssa229235, %.thread ], [ %95, %176 ]
  %.0115.lcssa224 = phi i1 [ %.0115.lcssa225236, %.thread ], [ %96, %176 ]
  %.0135.lcssa220 = phi ptr [ %.0135.lcssa221237, %.thread ], [ %.3138, %176 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #10
  call void @_ZN3JPH6BodyIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %10)
  %187 = getelementptr inbounds i8, ptr %0, i64 72
  %188 = load i32, ptr %10, align 4, !tbaa !43
  store i32 %188, ptr %187, align 8, !tbaa !43
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #10
  store i32 0, ptr %11, align 4
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %11) #10
  %189 = getelementptr inbounds i8, ptr %0, i64 76
  %190 = load i32, ptr %11, align 4, !tbaa !43
  store i32 %190, ptr %189, align 4, !tbaa !43
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #10
  %191 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %192 = extractvalue { double, double } %191, 0
  %193 = extractvalue { double, double } %191, 1
  %194 = getelementptr inbounds i8, ptr %0, i64 80
  store double %192, ptr %194, align 16
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 88
  store double %193, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !37
  %195 = getelementptr inbounds i8, ptr %0, i64 128
  %196 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSERKS2_(ptr noundef nonnull align 8 dereferenceable(8) %195, ptr noundef nonnull align 8 dereferenceable(8) @_ZN3JPH15PhysicsMaterial8sDefaultE)
  %197 = getelementptr inbounds i8, ptr %0, i64 136
  store i64 0, ptr %197, align 8, !tbaa !44
  br i1 %.0114.lcssa228, label %213, label %215

198:                                              ; preds = %176, %.thread172
  %199 = getelementptr inbounds i8, ptr %97, i64 72
  %200 = getelementptr inbounds i8, ptr %0, i64 72
  %201 = load i32, ptr %199, align 8, !tbaa !43
  store i32 %201, ptr %200, align 8, !tbaa !43
  %202 = getelementptr inbounds i8, ptr %97, i64 88
  %203 = getelementptr inbounds i8, ptr %0, i64 76
  %204 = load i32, ptr %202, align 8, !tbaa !43
  store i32 %204, ptr %203, align 4, !tbaa !43
  %205 = getelementptr inbounds i8, ptr %0, i64 80
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %205, ptr noundef nonnull align 16 dereferenceable(16) %97, i64 16, i1 false), !tbaa.struct !42
  %206 = getelementptr inbounds i8, ptr %97, i64 104
  %207 = load ptr, ptr %206, align 8, !tbaa !45
  %208 = getelementptr inbounds i8, ptr %0, i64 128
  %209 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSEPKS1_(ptr noundef nonnull align 8 dereferenceable(8) %208, ptr noundef %207)
  %210 = getelementptr inbounds i8, ptr %97, i64 96
  %211 = load i64, ptr %210, align 16, !tbaa !46
  %212 = getelementptr inbounds i8, ptr %0, i64 136
  store i64 %211, ptr %212, align 8, !tbaa !44
  br i1 %95, label %213, label %215

213:                                              ; preds = %186, %198
  %214 = getelementptr inbounds i8, ptr %0, i64 68
  store i32 0, ptr %214, align 4, !tbaa !47
  br label %262

215:                                              ; preds = %186, %198
  %.not161170240 = phi i32 [ 3, %186 ], [ 2, %198 ]
  %.0135.lcssa218239 = phi ptr [ %.0135.lcssa220, %186 ], [ %.3138, %198 ]
  %.0115.lcssa222238 = phi i1 [ %.0115.lcssa224, %186 ], [ %96, %198 ]
  br i1 %.0115.lcssa222238, label %216, label %260

216:                                              ; preds = %215
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #10
  %217 = getelementptr inbounds i8, ptr %0, i64 272
  %218 = getelementptr inbounds i8, ptr %.0135.lcssa218239, i64 16
  %.sroa.03.0.copyload = load double, ptr %218, align 16
  %.sroa.24.0..sroa_idx = getelementptr inbounds i8, ptr %.0135.lcssa218239, i64 24
  %.sroa.24.0.copyload = load double, ptr %.sroa.24.0..sroa_idx, align 8, !tbaa !37
  %219 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %217, double %.sroa.03.0.copyload, double %.sroa.24.0.copyload)
  %220 = extractvalue { double, double } %219, 0
  store double %220, ptr %12, align 16
  %221 = getelementptr inbounds i8, ptr %12, i64 8
  %222 = extractvalue { double, double } %219, 1
  store double %222, ptr %221, align 8
  %223 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.01.0.copyload = load double, ptr %223, align 16
  %.sroa.22.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.22.0.copyload = load double, ptr %.sroa.22.0..sroa_idx, align 8, !tbaa !37
  %224 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %.sroa.01.0.copyload, double %.sroa.22.0.copyload)
  %225 = fcmp ogt float %224, 0x3F1A36E2E0000000
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #10
  br i1 %225, label %226, label %228

226:                                              ; preds = %216
  %227 = getelementptr inbounds i8, ptr %0, i64 68
  store i32 1, ptr %227, align 4, !tbaa !47
  br label %262

228:                                              ; preds = %216
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %13) #10
  %229 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  %230 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %21)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #10
  call void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual7ContactEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %14, ptr noundef nonnull align 8 dereferenceable(8) %2)
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEEC2EPKS2_S7_RKS4_(ptr noundef nonnull align 8 dereferenceable(32) %13, ptr noundef %229, ptr noundef %230, ptr noundef nonnull align 8 dereferenceable(8) %14)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #10
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %15) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #10
  call void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %16, ptr noundef nonnull align 8 dereferenceable(8) %2)
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %15, ptr noundef nonnull align 8 dereferenceable(8) %16)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #10
  %231 = call noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %13)
  %232 = shl i64 %231, 1
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %15, i64 noundef %232)
          to label %233 unwind label %252

233:                                              ; preds = %228
  %234 = getelementptr inbounds i8, ptr %0, i64 312
  %235 = load float, ptr %234, align 8, !tbaa !41
  invoke void @_ZNK3JPH16CharacterVirtual20DetermineConstraintsERNS_5ArrayINS0_7ContactENS_16STLTempAllocatorIS2_EEEEfRNS1_INS0_10ConstraintENS3_IS7_EEEE(ptr noundef nonnull align 16 dereferenceable(332) %0, ptr noundef nonnull align 8 dereferenceable(32) %13, float noundef %235, ptr noundef nonnull align 8 dereferenceable(32) %15)
          to label %236 unwind label %252

236:                                              ; preds = %233
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %18) #10
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %19) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %20) #10
  call void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual14IgnoredContactEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %20, ptr noundef nonnull align 8 dereferenceable(8) %2)
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef nonnull align 8 dereferenceable(8) %20)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %20) #10
  %237 = call noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %13)
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %19, i64 noundef %237)
          to label %238 unwind label %254

238:                                              ; preds = %236
  %239 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %223)
          to label %240 unwind label %254

240:                                              ; preds = %238
  %241 = extractvalue { double, double } %239, 0
  %242 = extractvalue { double, double } %239, 1
  invoke void @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %0, double %241, double %242, float noundef 1.000000e+00, float noundef 1.000000e+00, ptr noundef nonnull align 8 dereferenceable(32) %15, ptr noundef nonnull align 8 dereferenceable(32) %19, ptr noundef nonnull align 4 dereferenceable(4) %18, ptr noundef nonnull align 16 dereferenceable(16) %17, ptr noundef nonnull align 8 dereferenceable(8) %2)
          to label %243 unwind label %254

243:                                              ; preds = %240
  %244 = load float, ptr %234, align 8, !tbaa !41
  %245 = fmul float %244, 0x3FE3333340000000
  %246 = call noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %245)
  %247 = load float, ptr %18, align 4, !tbaa !48
  %248 = fcmp olt float %247, 0x3F50624DE0000000
  br i1 %248, label %257, label %249

249:                                              ; preds = %243
  %250 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %17)
  %251 = fcmp olt float %250, %246
  br i1 %251, label %257, label %256

252:                                              ; preds = %233, %228
  %253 = landingpad { ptr, i32 }
          cleanup
  br label %259

254:                                              ; preds = %240, %238, %236
  %255 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %19) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %19) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %18) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #10
  br label %259

256:                                              ; preds = %249
  br label %257

257:                                              ; preds = %243, %249, %256
  %.sink = phi i32 [ 1, %256 ], [ 0, %249 ], [ 0, %243 ]
  %258 = getelementptr inbounds i8, ptr %0, i64 68
  store i32 %.sink, ptr %258, align 4, !tbaa !47
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %19) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %19) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %18) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #10
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %15) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #10
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %13) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %13) #10
  br label %262

259:                                              ; preds = %254, %252
  %.pn = phi { ptr, i32 } [ %255, %254 ], [ %253, %252 ]
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %15) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #10
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %13) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %13) #10
  br label %263

260:                                              ; preds = %215
  %261 = getelementptr inbounds i8, ptr %0, i64 68
  store i32 %.not161170240, ptr %261, align 4, !tbaa !47
  br label %262

262:                                              ; preds = %260, %257, %226, %213
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #10
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %4) #10
  ret void

263:                                              ; preds = %259, %160
  %.pn164.pn.pn = phi { ptr, i32 } [ %.pn164.pn, %160 ], [ %.pn, %259 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #10
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %4) #10
  resume { ptr, i32 } %.pn164.pn.pn
}

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSEPKS1_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) local_unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH8RefConstINS_15PhysicsMaterialEEaSERKS2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #7 align 2

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) local_unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) local_unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #6 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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { 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"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { 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 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #9 = { 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 #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, !16, i64 113}
!6 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !7, i64 0, !7, i64 16, !7, i64 32, !7, i64 48, !10, i64 64, !10, i64 68, !11, i64 72, !13, i64 80, !14, i64 88, !15, i64 92, !16, i64 93, !17, i64 96, !13, i64 104, !16, i64 112, !16, i64 113, !16, i64 114}
!7 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"_ZTSN3JPH6BodyIDE", !12, i64 0}
!12 = !{!"int", !8, i64 0}
!13 = !{!"any pointer", !8, i64 0}
!14 = !{!"_ZTSN3JPH10SubShapeIDE", !12, i64 0}
!15 = !{!"_ZTSN3JPH11EMotionTypeE", !8, i64 0}
!16 = !{!"bool", !8, i64 0}
!17 = !{!"long", !8, i64 0}
!18 = !{i8 0, i8 2}
!19 = !{}
!20 = !{!6, !16, i64 112}
!21 = !{!6, !10, i64 64}
!22 = !{!23, !10, i64 180}
!23 = !{!"_ZTSN3JPH16CharacterVirtualE", !24, i64 0, !13, i64 144, !13, i64 152, !33, i64 160, !10, i64 164, !12, i64 168, !12, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !12, i64 188, !10, i64 192, !10, i64 196, !16, i64 200, !10, i64 204, !10, i64 208, !7, i64 224, !7, i64 240, !34, i64 256, !7, i64 272, !35, i64 288, !10, i64 312, !16, i64 316, !17, i64 320, !11, i64 328}
!24 = !{!"_ZTSN3JPH13CharacterBaseE", !25, i64 8, !13, i64 16, !28, i64 24, !7, i64 32, !29, i64 48, !10, i64 64, !31, i64 68, !11, i64 72, !14, i64 76, !7, i64 80, !7, i64 96, !7, i64 112, !32, i64 128, !17, i64 136}
!25 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !26, i64 0}
!26 = !{!"_ZTSSt6atomicIjE", !27, i64 0}
!27 = !{!"_ZTSSt13__atomic_baseIjE", !12, i64 0}
!28 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !13, i64 0}
!29 = !{!"_ZTSN3JPH5PlaneE", !30, i64 0}
!30 = !{!"_ZTSN3JPH4Vec4E", !8, i64 0}
!31 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !8, i64 0}
!32 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !13, i64 0}
!33 = !{!"_ZTSN3JPH13EBackFaceModeE", !8, i64 0}
!34 = !{!"_ZTSN3JPH4QuatE", !30, i64 0}
!35 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !17, i64 0, !17, i64 8, !13, i64 16}
!36 = !{!6, !16, i64 93}
!37 = !{!8, !8, i64 0}
!38 = !{!24, !10, i64 64}
!39 = !{!6, !15, i64 92}
!40 = !{!24, !13, i64 16}
!41 = !{!23, !10, i64 312}
!42 = !{i64 0, i64 16, !37}
!43 = !{!12, !12, i64 0}
!44 = !{!24, !17, i64 136}
!45 = !{!6, !13, i64 104}
!46 = !{!6, !17, i64 96}
!47 = !{!24, !31, i64 68}
!48 = !{!10, !10, i64 0}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass