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

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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::ScopeExit.40" = type <{ %class.anon.41, i8, [7 x i8] }>
%class.anon.41 = type { ptr }
%"struct.JPH::CharacterVirtual::Contact" = type <{ %"class.JPH::CharacterVirtual::ContactKey", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, i8, i8, [6 x i8], ptr, i64, ptr, i8, i8, i8, [5 x i8] }>
%"class.JPH::CharacterVirtual::ContactKey" = type { %"class.JPH::BodyID", %"class.JPH::CharacterID", %"class.JPH::SubShapeID" }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::CharacterID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::Array.29" = type { %"class.JPH::STLTempAllocator.30", i64, i64, ptr }
%"class.JPH::STLTempAllocator.30" = type { ptr }
%"class.JPH::Array.43" = type { %"class.JPH::STLTempAllocator.44", i64, i64, ptr }
%"class.JPH::STLTempAllocator.44" = type { ptr }
%"class.JPH::CharacterVirtual" = type <{ %"class.JPH::CharacterBase", %"class.JPH::CharacterID", [4 x i8], ptr, ptr, i8, [3 x i8], float, i32, i32, float, float, float, i32, float, float, i8, [3 x i8], float, float, [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Vec3", %"class.JPH::Array.2", i32, [4 x i8], %"class.JPH::UnorderedMap", float, i8, [3 x i8], i64, %"class.JPH::BodyID", [12 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::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::RefConst.1" = type { ptr }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Array.2" = type { i64, i64, ptr }
%"class.JPH::UnorderedMap" = type { %"class.JPH::HashTable.base", [4 x i8] }
%"class.JPH::HashTable.base" = type <{ ptr, ptr, i32, i32, i32 }>

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123)) unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372), double, double, double, double, ptr noundef nonnull align 16 dereferenceable(123), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12)) #5 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144), double, double) #6 align 2

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

; 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) #7 align 2

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16CharacterVirtual9MoveShapeERNS_4Vec3ES1_fPNS_5ArrayINS0_7ContactENS_12STLAllocatorIS4_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372), ptr noundef nonnull align 16 dereferenceable(16), double, double, float noundef, ptr noundef, ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 8 dereferenceable(8)) #5 align 2

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16CharacterVirtual13MoveToContactENS_4Vec3ERKNS0_7ContactERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372), double, double, ptr noundef nonnull align 16 dereferenceable(123), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 8 dereferenceable(8)) #5 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN3JPH16CharacterVirtual10WalkStairsEfNS_4Vec3ES1_S1_S1_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, float noundef %1, double %2, double %3, double %4, double %5, double %6, double %7, ptr noundef byval(%"class.JPH::Vec3") align 16 %8, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12, ptr noundef nonnull align 8 dereferenceable(8) %13) #5 align 2 personality ptr @__gxx_personality_v0 {
  %15 = alloca i1, align 1
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca %"class.JPH::Vec3", align 16
  %19 = alloca ptr, align 8
  %20 = alloca float, align 4
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca %"class.JPH::ScopeExit.40", align 8
  %27 = alloca %class.anon.41, align 8
  %28 = alloca %"class.JPH::Vec3", align 16
  %29 = alloca %"struct.JPH::CharacterVirtual::Contact", align 16
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca %"class.JPH::Array.29", align 8
  %33 = alloca %"class.JPH::STLTempAllocator.30", align 8
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca %"class.JPH::Vec3", align 16
  %36 = alloca i32, align 4
  %37 = alloca %"class.JPH::Vec3", align 16
  %38 = alloca %"class.JPH::Vec3", align 16
  %39 = alloca %"class.JPH::Vec3", align 16
  %40 = alloca %"class.JPH::Vec3", align 16
  %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::Array.43", align 8
  %45 = alloca %"class.JPH::STLTempAllocator.44", align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %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::Vec3", align 16
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca float, align 4
  %58 = alloca i8, align 1
  %59 = alloca float, align 4
  %60 = alloca ptr, align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca ptr, align 8
  %64 = alloca %"class.JPH::Vec3", align 16
  %65 = alloca %"class.JPH::Vec3", align 16
  %66 = alloca %"class.JPH::Vec3", align 16
  %67 = alloca %"class.JPH::Vec3", align 16
  %68 = alloca %"class.JPH::Vec3", align 16
  %69 = alloca %"class.JPH::Vec3", align 16
  %70 = alloca %"class.JPH::Vec3", align 16
  %71 = alloca %"class.JPH::Vec3", align 16
  %72 = alloca %"class.JPH::Vec3", align 16
  %73 = alloca float, align 4
  %74 = alloca %"class.JPH::Vec3", align 16
  %75 = alloca %"class.JPH::Vec3", align 16
  %76 = alloca %"struct.JPH::CharacterVirtual::Contact", align 16
  %77 = alloca %"class.JPH::Vec3", align 16
  %78 = alloca %"class.JPH::Vec3", align 16
  %79 = alloca %"class.JPH::Vec3", align 16
  %80 = alloca %"class.JPH::Vec3", align 16
  %81 = alloca %"class.JPH::Vec3", align 16
  %82 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 0
  store double %2, ptr %82, align 16
  %83 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 1
  store double %3, ptr %83, align 8
  %84 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  store double %4, ptr %84, align 16
  %85 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  store double %5, ptr %85, align 8
  %86 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 0
  store double %6, ptr %86, align 16
  %87 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 1
  store double %7, ptr %87, align 8
  store ptr %0, ptr %19, align 8, !tbaa !5
  store float %1, ptr %20, align 4, !tbaa !9
  store ptr %9, ptr %21, align 8, !tbaa !5
  store ptr %10, ptr %22, align 8, !tbaa !5
  store ptr %11, ptr %23, align 8, !tbaa !5
  store ptr %12, ptr %24, align 8, !tbaa !5
  store ptr %13, ptr %25, align 8, !tbaa !5
  %88 = load ptr, ptr %19, align 8
  call void @_ZN3JPH16CharacterVirtual27StartTrackingContactChangesEv(ptr noundef nonnull align 16 dereferenceable(372) %88)
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  %89 = getelementptr inbounds %class.anon.41, ptr %27, i32 0, i32 0
  store ptr %88, ptr %89, align 8, !tbaa !11
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0EC2EOSH_"(ptr noundef nonnull align 8 dereferenceable(9) %26, ptr noundef nonnull align 8 dereferenceable(8) %27)
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %28) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %28, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.lifetime.start.p0(i64 128, ptr %29) #9
  invoke void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123) %29)
          to label %90 unwind label %114

90:                                               ; preds = %14
  call void @llvm.lifetime.start.p0(i64 32, ptr %32) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #9
  %91 = load ptr, ptr %25, align 8, !tbaa !5
  invoke void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual10ContactKeyEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %33, ptr noundef nonnull align 8 dereferenceable(8) %91)
          to label %92 unwind label %118

92:                                               ; preds = %90
  invoke void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %32, ptr noundef nonnull align 8 dereferenceable(8) %33)
          to label %93 unwind label %118

93:                                               ; preds = %92
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #9
  %94 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %88, i32 0, i32 22
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %34, ptr align 16 %94, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %35, ptr align 16 %28, i64 16, i1 false), !tbaa.struct !13
  %95 = load ptr, ptr %21, align 8, !tbaa !5
  %96 = load ptr, ptr %22, align 8, !tbaa !5
  %97 = load ptr, ptr %23, align 8, !tbaa !5
  %98 = load ptr, ptr %24, align 8, !tbaa !5
  %99 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 0
  %100 = load double, ptr %99, align 16
  %101 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 1
  %102 = load double, ptr %101, align 8
  %103 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %104 = load double, ptr %103, align 16
  %105 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %106 = load double, ptr %105, align 8
  %107 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %88, double %100, double %102, double %104, double %106, ptr noundef nonnull align 16 dereferenceable(123) %29, ptr noundef nonnull align 8 dereferenceable(32) %32, ptr noundef nonnull align 8 dereferenceable(8) %95, ptr noundef nonnull align 8 dereferenceable(8) %96, ptr noundef nonnull align 8 dereferenceable(8) %97, ptr noundef nonnull align 8 dereferenceable(12) %98)
          to label %108 unwind label %122

108:                                              ; preds = %93
  br i1 %107, label %109, label %131

109:                                              ; preds = %108
  %110 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %29, i32 0, i32 7
  %111 = load float, ptr %110, align 4, !tbaa !15
  %112 = fcmp olt float %111, 0x3EB0C6F7A0000000
  br i1 %112, label %113, label %126

113:                                              ; preds = %109
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %570

114:                                              ; preds = %14
  %115 = landingpad { ptr, i32 }
          cleanup
  %116 = extractvalue { ptr, i32 } %115, 0
  store ptr %116, ptr %30, align 8
  %117 = extractvalue { ptr, i32 } %115, 1
  store i32 %117, ptr %31, align 4
  br label %574

118:                                              ; preds = %92, %90
  %119 = landingpad { ptr, i32 }
          cleanup
  %120 = extractvalue { ptr, i32 } %119, 0
  store ptr %120, ptr %30, align 8
  %121 = extractvalue { ptr, i32 } %119, 1
  store i32 %121, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #9
  br label %573

122:                                              ; preds = %126, %93
  %123 = landingpad { ptr, i32 }
          cleanup
  %124 = extractvalue { ptr, i32 } %123, 0
  store ptr %124, ptr %30, align 8
  %125 = extractvalue { ptr, i32 } %123, 1
  store i32 %125, ptr %31, align 4
  br label %572

126:                                              ; preds = %109
  %127 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %29, i32 0, i32 7
  %128 = load float, ptr %127, align 4, !tbaa !15
  %129 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mLEf(ptr noundef nonnull align 16 dereferenceable(16) %28, float noundef %128)
          to label %130 unwind label %122

130:                                              ; preds = %126
  br label %131

131:                                              ; preds = %130, %108
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #9
  %132 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %88, i32 0, i32 22
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %38, ptr align 16 %28, i64 16, i1 false), !tbaa.struct !13
  %133 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 0
  %134 = load double, ptr %133, align 16
  %135 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 1
  %136 = load double, ptr %135, align 8
  %137 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %132, double %134, double %136)
          to label %138 unwind label %205

138:                                              ; preds = %131
  %139 = getelementptr inbounds %"class.JPH::Vec3", ptr %37, i32 0, i32 0
  %140 = getelementptr inbounds %union.anon, ptr %139, i32 0, i32 0
  %141 = getelementptr inbounds { double, double }, ptr %140, i32 0, i32 0
  %142 = extractvalue { double, double } %137, 0
  store double %142, ptr %141, align 16
  %143 = getelementptr inbounds { double, double }, ptr %140, i32 0, i32 1
  %144 = extractvalue { double, double } %137, 1
  store double %144, ptr %143, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #9
  %145 = load float, ptr %20, align 4, !tbaa !9
  %146 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %17, float noundef %145)
          to label %147 unwind label %209

147:                                              ; preds = %138
  %148 = getelementptr inbounds %"class.JPH::Vec3", ptr %39, i32 0, i32 0
  %149 = getelementptr inbounds %union.anon, ptr %148, i32 0, i32 0
  %150 = getelementptr inbounds { double, double }, ptr %149, i32 0, i32 0
  %151 = extractvalue { double, double } %146, 0
  store double %151, ptr %150, align 16
  %152 = getelementptr inbounds { double, double }, ptr %149, i32 0, i32 1
  %153 = extractvalue { double, double } %146, 1
  store double %153, ptr %152, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #9
  %154 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %88, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %42, ptr align 16 %154, i64 16, i1 false), !tbaa.struct !13
  %155 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 0
  %156 = load double, ptr %155, align 16
  %157 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 1
  %158 = load double, ptr %157, align 8
  %159 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %39, double %156, double %158)
          to label %160 unwind label %213

160:                                              ; preds = %147
  %161 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %88, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %43, ptr align 16 %161, i64 16, i1 false), !tbaa.struct !13
  %162 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 0
  %163 = load double, ptr %162, align 16
  %164 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 1
  %165 = load double, ptr %164, align 8
  %166 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %159, double %163, double %165)
          to label %167 unwind label %213

167:                                              ; preds = %160
  %168 = getelementptr inbounds %"class.JPH::Vec3", ptr %41, i32 0, i32 0
  %169 = getelementptr inbounds %union.anon, ptr %168, i32 0, i32 0
  %170 = getelementptr inbounds { double, double }, ptr %169, i32 0, i32 0
  %171 = extractvalue { double, double } %166, 0
  store double %171, ptr %170, align 16
  %172 = getelementptr inbounds { double, double }, ptr %169, i32 0, i32 1
  %173 = extractvalue { double, double } %166, 1
  store double %173, ptr %172, align 8
  %174 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %175 = load double, ptr %174, align 16
  %176 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %177 = load double, ptr %176, align 8
  %178 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %39, double %175, double %177)
          to label %179 unwind label %213

179:                                              ; preds = %167
  %180 = getelementptr inbounds %"class.JPH::Vec3", ptr %40, i32 0, i32 0
  %181 = getelementptr inbounds %union.anon, ptr %180, i32 0, i32 0
  %182 = getelementptr inbounds { double, double }, ptr %181, i32 0, i32 0
  %183 = extractvalue { double, double } %178, 0
  store double %183, ptr %182, align 16
  %184 = getelementptr inbounds { double, double }, ptr %181, i32 0, i32 1
  %185 = extractvalue { double, double } %178, 1
  store double %185, ptr %184, align 8
  call void @llvm.lifetime.start.p0(i64 32, ptr %44) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #9
  %186 = load ptr, ptr %25, align 8, !tbaa !5
  invoke void @_ZN3JPH16STLTempAllocatorINS_4Vec3EEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %45, ptr noundef nonnull align 8 dereferenceable(8) %186)
          to label %187 unwind label %217

187:                                              ; preds = %179
  invoke void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEEC2ERKS3_(ptr noundef nonnull align 8 dereferenceable(32) %44, ptr noundef nonnull align 8 dereferenceable(8) %45)
          to label %188 unwind label %217

188:                                              ; preds = %187
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #9
  %189 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %88, i32 0, i32 25
  %190 = invoke noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %189)
          to label %191 unwind label %221

191:                                              ; preds = %188
  invoke void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %44, i64 noundef %190)
          to label %192 unwind label %221

192:                                              ; preds = %191
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #9
  %193 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %88, i32 0, i32 25
  store ptr %193, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #9
  %194 = load ptr, ptr %46, align 8, !tbaa !5
  %195 = invoke noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %194)
          to label %196 unwind label %225

196:                                              ; preds = %192
  store ptr %195, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #9
  %197 = load ptr, ptr %46, align 8, !tbaa !5
  %198 = invoke noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %197)
          to label %199 unwind label %229

199:                                              ; preds = %196
  store ptr %198, ptr %48, align 8, !tbaa !5
  br label %200

200:                                              ; preds = %286, %199
  %201 = load ptr, ptr %47, align 8, !tbaa !5
  %202 = load ptr, ptr %48, align 8, !tbaa !5
  %203 = icmp ne ptr %201, %202
  br i1 %203, label %233, label %204

204:                                              ; preds = %200
  store i32 2, ptr %36, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #9
  br label %291

205:                                              ; preds = %131
  %206 = landingpad { ptr, i32 }
          cleanup
  %207 = extractvalue { ptr, i32 } %206, 0
  store ptr %207, ptr %30, align 8
  %208 = extractvalue { ptr, i32 } %206, 1
  store i32 %208, ptr %31, align 4
  br label %569

209:                                              ; preds = %138
  %210 = landingpad { ptr, i32 }
          cleanup
  %211 = extractvalue { ptr, i32 } %210, 0
  store ptr %211, ptr %30, align 8
  %212 = extractvalue { ptr, i32 } %210, 1
  store i32 %212, ptr %31, align 4
  br label %568

213:                                              ; preds = %167, %160, %147
  %214 = landingpad { ptr, i32 }
          cleanup
  %215 = extractvalue { ptr, i32 } %214, 0
  store ptr %215, ptr %30, align 8
  %216 = extractvalue { ptr, i32 } %214, 1
  store i32 %216, ptr %31, align 4
  br label %567

217:                                              ; preds = %187, %179
  %218 = landingpad { ptr, i32 }
          cleanup
  %219 = extractvalue { ptr, i32 } %218, 0
  store ptr %219, ptr %30, align 8
  %220 = extractvalue { ptr, i32 } %218, 1
  store i32 %220, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #9
  br label %566

221:                                              ; preds = %291, %191, %188
  %222 = landingpad { ptr, i32 }
          cleanup
  %223 = extractvalue { ptr, i32 } %222, 0
  store ptr %223, ptr %30, align 8
  %224 = extractvalue { ptr, i32 } %222, 1
  store i32 %224, ptr %31, align 4
  br label %565

225:                                              ; preds = %192
  %226 = landingpad { ptr, i32 }
          cleanup
  %227 = extractvalue { ptr, i32 } %226, 0
  store ptr %227, ptr %30, align 8
  %228 = extractvalue { ptr, i32 } %226, 1
  store i32 %228, ptr %31, align 4
  br label %290

229:                                              ; preds = %196
  %230 = landingpad { ptr, i32 }
          cleanup
  %231 = extractvalue { ptr, i32 } %230, 0
  store ptr %231, ptr %30, align 8
  %232 = extractvalue { ptr, i32 } %230, 1
  store i32 %232, ptr %31, align 4
  br label %289

233:                                              ; preds = %200
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #9
  %234 = load ptr, ptr %47, align 8, !tbaa !5
  store ptr %234, ptr %49, align 8, !tbaa !5
  %235 = load ptr, ptr %49, align 8, !tbaa !5
  %236 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %235, i32 0, i32 14
  %237 = load i8, ptr %236, align 8, !tbaa !26, !range !27, !noundef !28
  %238 = trunc i8 %237 to i1
  br i1 %238, label %239, label %285

239:                                              ; preds = %233
  %240 = load ptr, ptr %49, align 8, !tbaa !5
  %241 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %240, i32 0, i32 15
  %242 = load i8, ptr %241, align 1, !tbaa !29, !range !27, !noundef !28
  %243 = trunc i8 %242 to i1
  br i1 %243, label %285, label %244

244:                                              ; preds = %239
  %245 = load ptr, ptr %49, align 8, !tbaa !5
  %246 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %245, i32 0, i32 5
  %247 = load ptr, ptr %49, align 8, !tbaa !5
  %248 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %247, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %51, ptr align 16 %248, i64 16, i1 false), !tbaa.struct !13
  %249 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 0
  %250 = load double, ptr %249, align 16
  %251 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 1
  %252 = load double, ptr %251, align 8
  %253 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %40, double %250, double %252)
          to label %254 unwind label %281

254:                                              ; preds = %244
  %255 = getelementptr inbounds %"class.JPH::Vec3", ptr %50, i32 0, i32 0
  %256 = getelementptr inbounds %union.anon, ptr %255, i32 0, i32 0
  %257 = getelementptr inbounds { double, double }, ptr %256, i32 0, i32 0
  %258 = extractvalue { double, double } %253, 0
  store double %258, ptr %257, align 16
  %259 = getelementptr inbounds { double, double }, ptr %256, i32 0, i32 1
  %260 = extractvalue { double, double } %253, 1
  store double %260, ptr %259, align 8
  %261 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 0
  %262 = load double, ptr %261, align 16
  %263 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 1
  %264 = load double, ptr %263, align 8
  %265 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %246, double %262, double %264)
          to label %266 unwind label %281

266:                                              ; preds = %254
  %267 = fcmp olt float %265, 0.000000e+00
  br i1 %267, label %268, label %285

268:                                              ; preds = %266
  %269 = load ptr, ptr %49, align 8, !tbaa !5
  %270 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %269, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %52, ptr align 16 %270, i64 16, i1 false), !tbaa.struct !13
  %271 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 0
  %272 = load double, ptr %271, align 16
  %273 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 1
  %274 = load double, ptr %273, align 8
  %275 = invoke noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %88, double %272, double %274)
          to label %276 unwind label %281

276:                                              ; preds = %268
  br i1 %275, label %277, label %285

277:                                              ; preds = %276
  %278 = load ptr, ptr %49, align 8, !tbaa !5
  %279 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %278, i32 0, i32 5
  invoke void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE9push_backERKS1_(ptr noundef nonnull align 8 dereferenceable(32) %44, ptr noundef nonnull align 16 dereferenceable(16) %279)
          to label %280 unwind label %281

280:                                              ; preds = %277
  br label %285

281:                                              ; preds = %277, %268, %254, %244
  %282 = landingpad { ptr, i32 }
          cleanup
  %283 = extractvalue { ptr, i32 } %282, 0
  store ptr %283, ptr %30, align 8
  %284 = extractvalue { ptr, i32 } %282, 1
  store i32 %284, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #9
  br label %289

285:                                              ; preds = %280, %276, %266, %239, %233
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #9
  br label %286

286:                                              ; preds = %285
  %287 = load ptr, ptr %47, align 8, !tbaa !5
  %288 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %287, i32 1
  store ptr %288, ptr %47, align 8, !tbaa !5
  br label %200

289:                                              ; preds = %281, %229
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #9
  br label %290

290:                                              ; preds = %289, %225
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #9
  br label %565

291:                                              ; preds = %204
  %292 = invoke noundef zeroext i1 @_ZNK3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32) %44)
          to label %293 unwind label %221

293:                                              ; preds = %291
  br i1 %292, label %294, label %295

294:                                              ; preds = %293
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %564

295:                                              ; preds = %293
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %53, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %54, ptr align 16 %39, i64 16, i1 false), !tbaa.struct !13
  %296 = load float, ptr %20, align 4, !tbaa !9
  %297 = load ptr, ptr %21, align 8, !tbaa !5
  %298 = load ptr, ptr %22, align 8, !tbaa !5
  %299 = load ptr, ptr %23, align 8, !tbaa !5
  %300 = load ptr, ptr %24, align 8, !tbaa !5
  %301 = load ptr, ptr %25, align 8, !tbaa !5
  %302 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %303 = load double, ptr %302, align 16
  %304 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %305 = load double, ptr %304, align 8
  invoke void @_ZN3JPH16CharacterVirtual9MoveShapeERNS_4Vec3ES1_fPNS_5ArrayINS0_7ContactENS_12STLAllocatorIS4_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %88, ptr noundef nonnull align 16 dereferenceable(16) %53, double %303, double %305, float noundef %296, ptr noundef null, ptr noundef nonnull align 8 dereferenceable(8) %297, ptr noundef nonnull align 8 dereferenceable(8) %298, ptr noundef nonnull align 8 dereferenceable(8) %299, ptr noundef nonnull align 8 dereferenceable(12) %300, ptr noundef nonnull align 8 dereferenceable(8) %301)
          to label %306 unwind label %324

306:                                              ; preds = %295
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %56, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !13
  %307 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 0
  %308 = load double, ptr %307, align 16
  %309 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 1
  %310 = load double, ptr %309, align 8
  %311 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %53, double %308, double %310)
          to label %312 unwind label %328

312:                                              ; preds = %306
  %313 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %314 = getelementptr inbounds %union.anon, ptr %313, i32 0, i32 0
  %315 = getelementptr inbounds { double, double }, ptr %314, i32 0, i32 0
  %316 = extractvalue { double, double } %311, 0
  store double %316, ptr %315, align 16
  %317 = getelementptr inbounds { double, double }, ptr %314, i32 0, i32 1
  %318 = extractvalue { double, double } %311, 1
  store double %318, ptr %317, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #9
  %319 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %55)
          to label %320 unwind label %332

320:                                              ; preds = %312
  store float %319, ptr %57, align 4, !tbaa !9
  %321 = load float, ptr %57, align 4, !tbaa !9
  %322 = fcmp olt float %321, 0x3E45798EE0000000
  br i1 %322, label %323, label %336

323:                                              ; preds = %320
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %560

324:                                              ; preds = %295
  %325 = landingpad { ptr, i32 }
          cleanup
  %326 = extractvalue { ptr, i32 } %325, 0
  store ptr %326, ptr %30, align 8
  %327 = extractvalue { ptr, i32 } %325, 1
  store i32 %327, ptr %31, align 4
  br label %563

328:                                              ; preds = %306
  %329 = landingpad { ptr, i32 }
          cleanup
  %330 = extractvalue { ptr, i32 } %329, 0
  store ptr %330, ptr %30, align 8
  %331 = extractvalue { ptr, i32 } %329, 1
  store i32 %331, ptr %31, align 4
  br label %562

332:                                              ; preds = %312
  %333 = landingpad { ptr, i32 }
          cleanup
  %334 = extractvalue { ptr, i32 } %333, 0
  store ptr %334, ptr %30, align 8
  %335 = extractvalue { ptr, i32 } %333, 1
  store i32 %335, ptr %31, align 4
  br label %561

336:                                              ; preds = %320
  call void @llvm.lifetime.start.p0(i64 1, ptr %58) #9
  store i8 0, ptr %58, align 1, !tbaa !30
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #9
  %337 = invoke noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %17)
          to label %338 unwind label %351

338:                                              ; preds = %336
  %339 = fmul float 0xBFA99999A0000000, %337
  store float %339, ptr %59, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #9
  store ptr %44, ptr %60, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #9
  %340 = load ptr, ptr %60, align 8, !tbaa !5
  %341 = invoke noundef ptr @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %340)
          to label %342 unwind label %355

342:                                              ; preds = %338
  store ptr %341, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #9
  %343 = load ptr, ptr %60, align 8, !tbaa !5
  %344 = invoke noundef ptr @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %343)
          to label %345 unwind label %359

345:                                              ; preds = %342
  store ptr %344, ptr %62, align 8, !tbaa !5
  br label %346

346:                                              ; preds = %383, %345
  %347 = load ptr, ptr %61, align 8, !tbaa !5
  %348 = load ptr, ptr %62, align 8, !tbaa !5
  %349 = icmp ne ptr %347, %348
  br i1 %349, label %363, label %350

350:                                              ; preds = %346
  store i32 4, ptr %36, align 4
  br label %386

351:                                              ; preds = %336
  %352 = landingpad { ptr, i32 }
          cleanup
  %353 = extractvalue { ptr, i32 } %352, 0
  store ptr %353, ptr %30, align 8
  %354 = extractvalue { ptr, i32 } %352, 1
  store i32 %354, ptr %31, align 4
  br label %559

355:                                              ; preds = %338
  %356 = landingpad { ptr, i32 }
          cleanup
  %357 = extractvalue { ptr, i32 } %356, 0
  store ptr %357, ptr %30, align 8
  %358 = extractvalue { ptr, i32 } %356, 1
  store i32 %358, ptr %31, align 4
  br label %388

359:                                              ; preds = %342
  %360 = landingpad { ptr, i32 }
          cleanup
  %361 = extractvalue { ptr, i32 } %360, 0
  store ptr %361, ptr %30, align 8
  %362 = extractvalue { ptr, i32 } %360, 1
  store i32 %362, ptr %31, align 4
  br label %387

363:                                              ; preds = %346
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #9
  %364 = load ptr, ptr %61, align 8, !tbaa !5
  store ptr %364, ptr %63, align 8, !tbaa !5
  %365 = load ptr, ptr %63, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %64, ptr align 16 %55, i64 16, i1 false), !tbaa.struct !13
  %366 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 0
  %367 = load double, ptr %366, align 16
  %368 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 1
  %369 = load double, ptr %368, align 8
  %370 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %365, double %367, double %369)
          to label %371 unwind label %375

371:                                              ; preds = %363
  %372 = load float, ptr %59, align 4, !tbaa !9
  %373 = fcmp olt float %370, %372
  br i1 %373, label %374, label %379

374:                                              ; preds = %371
  store i8 1, ptr %58, align 1, !tbaa !30
  store i32 4, ptr %36, align 4
  br label %380

375:                                              ; preds = %363
  %376 = landingpad { ptr, i32 }
          cleanup
  %377 = extractvalue { ptr, i32 } %376, 0
  store ptr %377, ptr %30, align 8
  %378 = extractvalue { ptr, i32 } %376, 1
  store i32 %378, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #9
  br label %387

379:                                              ; preds = %371
  store i32 0, ptr %36, align 4
  br label %380

380:                                              ; preds = %379, %374
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #9
  %381 = load i32, ptr %36, align 4
  switch i32 %381, label %386 [
    i32 0, label %382
  ]

382:                                              ; preds = %380
  br label %383

383:                                              ; preds = %382
  %384 = load ptr, ptr %61, align 8, !tbaa !5
  %385 = getelementptr inbounds %"class.JPH::Vec3", ptr %384, i32 1
  store ptr %385, ptr %61, align 8, !tbaa !5
  br label %346

386:                                              ; preds = %380, %350
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #9
  br label %389

387:                                              ; preds = %375, %359
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #9
  br label %388

388:                                              ; preds = %387, %355
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #9
  br label %559

389:                                              ; preds = %386
  %390 = load i8, ptr %58, align 1, !tbaa !30, !range !27, !noundef !28
  %391 = trunc i8 %390 to i1
  br i1 %391, label %393, label %392

392:                                              ; preds = %389
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %558

393:                                              ; preds = %389
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %66) #9
  %394 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %28)
          to label %395 unwind label %429

395:                                              ; preds = %393
  %396 = getelementptr inbounds %"class.JPH::Vec3", ptr %66, i32 0, i32 0
  %397 = getelementptr inbounds %union.anon, ptr %396, i32 0, i32 0
  %398 = getelementptr inbounds { double, double }, ptr %397, i32 0, i32 0
  %399 = extractvalue { double, double } %394, 0
  store double %399, ptr %398, align 16
  %400 = getelementptr inbounds { double, double }, ptr %397, i32 0, i32 1
  %401 = extractvalue { double, double } %394, 1
  store double %401, ptr %400, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %67, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !13
  %402 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 0
  %403 = load double, ptr %402, align 16
  %404 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 1
  %405 = load double, ptr %404, align 8
  %406 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %66, double %403, double %405)
          to label %407 unwind label %429

407:                                              ; preds = %395
  %408 = getelementptr inbounds %"class.JPH::Vec3", ptr %65, i32 0, i32 0
  %409 = getelementptr inbounds %union.anon, ptr %408, i32 0, i32 0
  %410 = getelementptr inbounds { double, double }, ptr %409, i32 0, i32 0
  %411 = extractvalue { double, double } %406, 0
  store double %411, ptr %410, align 16
  %412 = getelementptr inbounds { double, double }, ptr %409, i32 0, i32 1
  %413 = extractvalue { double, double } %406, 1
  store double %413, ptr %412, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %66) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %68, ptr align 16 %53, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %65, i64 16, i1 false), !tbaa.struct !13
  %414 = load ptr, ptr %21, align 8, !tbaa !5
  %415 = load ptr, ptr %22, align 8, !tbaa !5
  %416 = load ptr, ptr %23, align 8, !tbaa !5
  %417 = load ptr, ptr %24, align 8, !tbaa !5
  %418 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %419 = load double, ptr %418, align 16
  %420 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %421 = load double, ptr %420, align 8
  %422 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 0
  %423 = load double, ptr %422, align 16
  %424 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 1
  %425 = load double, ptr %424, align 8
  %426 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %88, double %419, double %421, double %423, double %425, ptr noundef nonnull align 16 dereferenceable(123) %29, ptr noundef nonnull align 8 dereferenceable(32) %32, ptr noundef nonnull align 8 dereferenceable(8) %414, ptr noundef nonnull align 8 dereferenceable(8) %415, ptr noundef nonnull align 8 dereferenceable(8) %416, ptr noundef nonnull align 8 dereferenceable(12) %417)
          to label %427 unwind label %433

427:                                              ; preds = %407
  br i1 %426, label %437, label %428

428:                                              ; preds = %427
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %556

429:                                              ; preds = %395, %393
  %430 = landingpad { ptr, i32 }
          cleanup
  %431 = extractvalue { ptr, i32 } %430, 0
  store ptr %431, ptr %30, align 8
  %432 = extractvalue { ptr, i32 } %430, 1
  store i32 %432, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %66) #9
  br label %557

433:                                              ; preds = %544, %538, %534, %445, %437, %407
  %434 = landingpad { ptr, i32 }
          cleanup
  %435 = extractvalue { ptr, i32 } %434, 0
  store ptr %435, ptr %30, align 8
  %436 = extractvalue { ptr, i32 } %434, 1
  store i32 %436, ptr %31, align 4
  br label %557

437:                                              ; preds = %427
  %438 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %29, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %70, ptr align 16 %438, i64 16, i1 false), !tbaa.struct !13
  %439 = getelementptr inbounds { double, double }, ptr %70, i32 0, i32 0
  %440 = load double, ptr %439, align 16
  %441 = getelementptr inbounds { double, double }, ptr %70, i32 0, i32 1
  %442 = load double, ptr %441, align 8
  %443 = invoke noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %88, double %440, double %442)
          to label %444 unwind label %433

444:                                              ; preds = %437
  br i1 %443, label %445, label %534

445:                                              ; preds = %444
  %446 = invoke noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %18, float noundef 0x3D71979980000000)
          to label %447 unwind label %433

447:                                              ; preds = %445
  br i1 %446, label %448, label %449

448:                                              ; preds = %447
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %556

449:                                              ; preds = %447
  call void @llvm.lifetime.start.p0(i64 16, ptr %71) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %71, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !13
  %450 = load float, ptr %20, align 4, !tbaa !9
  %451 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %18, float noundef %450)
          to label %452 unwind label %489

452:                                              ; preds = %449
  %453 = getelementptr inbounds %"class.JPH::Vec3", ptr %72, i32 0, i32 0
  %454 = getelementptr inbounds %union.anon, ptr %453, i32 0, i32 0
  %455 = getelementptr inbounds { double, double }, ptr %454, i32 0, i32 0
  %456 = extractvalue { double, double } %451, 0
  store double %456, ptr %455, align 16
  %457 = getelementptr inbounds { double, double }, ptr %454, i32 0, i32 1
  %458 = extractvalue { double, double } %451, 1
  store double %458, ptr %457, align 8
  %459 = load float, ptr %20, align 4, !tbaa !9
  %460 = load ptr, ptr %21, align 8, !tbaa !5
  %461 = load ptr, ptr %22, align 8, !tbaa !5
  %462 = load ptr, ptr %23, align 8, !tbaa !5
  %463 = load ptr, ptr %24, align 8, !tbaa !5
  %464 = load ptr, ptr %25, align 8, !tbaa !5
  %465 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 0
  %466 = load double, ptr %465, align 16
  %467 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 1
  %468 = load double, ptr %467, align 8
  invoke void @_ZN3JPH16CharacterVirtual9MoveShapeERNS_4Vec3ES1_fPNS_5ArrayINS0_7ContactENS_12STLAllocatorIS4_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %88, ptr noundef nonnull align 16 dereferenceable(16) %71, double %466, double %468, float noundef %459, ptr noundef null, ptr noundef nonnull align 8 dereferenceable(8) %460, ptr noundef nonnull align 8 dereferenceable(8) %461, ptr noundef nonnull align 8 dereferenceable(8) %462, ptr noundef nonnull align 8 dereferenceable(12) %463, ptr noundef nonnull align 8 dereferenceable(8) %464)
          to label %469 unwind label %489

469:                                              ; preds = %452
  call void @llvm.lifetime.start.p0(i64 4, ptr %73) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %74) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %75, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !13
  %470 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 0
  %471 = load double, ptr %470, align 16
  %472 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 1
  %473 = load double, ptr %472, align 8
  %474 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %71, double %471, double %473)
          to label %475 unwind label %493

475:                                              ; preds = %469
  %476 = getelementptr inbounds %"class.JPH::Vec3", ptr %74, i32 0, i32 0
  %477 = getelementptr inbounds %union.anon, ptr %476, i32 0, i32 0
  %478 = getelementptr inbounds { double, double }, ptr %477, i32 0, i32 0
  %479 = extractvalue { double, double } %474, 0
  store double %479, ptr %478, align 16
  %480 = getelementptr inbounds { double, double }, ptr %477, i32 0, i32 1
  %481 = extractvalue { double, double } %474, 1
  store double %481, ptr %480, align 8
  %482 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %74)
          to label %483 unwind label %493

483:                                              ; preds = %475
  call void @llvm.lifetime.end.p0(i64 16, ptr %74) #9
  store float %482, ptr %73, align 4, !tbaa !9
  %484 = load float, ptr %73, align 4, !tbaa !9
  %485 = load float, ptr %57, align 4, !tbaa !9
  %486 = fadd float %485, 0x3E45798EE0000000
  %487 = fcmp ole float %484, %486
  br i1 %487, label %488, label %497

488:                                              ; preds = %483
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %529

489:                                              ; preds = %452, %449
  %490 = landingpad { ptr, i32 }
          cleanup
  %491 = extractvalue { ptr, i32 } %490, 0
  store ptr %491, ptr %30, align 8
  %492 = extractvalue { ptr, i32 } %490, 1
  store i32 %492, ptr %31, align 4
  br label %533

493:                                              ; preds = %475, %469
  %494 = landingpad { ptr, i32 }
          cleanup
  %495 = extractvalue { ptr, i32 } %494, 0
  store ptr %495, ptr %30, align 8
  %496 = extractvalue { ptr, i32 } %494, 1
  store i32 %496, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %74) #9
  br label %532

497:                                              ; preds = %483
  call void @llvm.lifetime.start.p0(i64 128, ptr %76) #9
  invoke void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123) %76)
          to label %498 unwind label %514

498:                                              ; preds = %497
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %77, ptr align 16 %71, i64 16, i1 false), !tbaa.struct !13
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %78, ptr align 16 %65, i64 16, i1 false), !tbaa.struct !13
  %499 = load ptr, ptr %21, align 8, !tbaa !5
  %500 = load ptr, ptr %22, align 8, !tbaa !5
  %501 = load ptr, ptr %23, align 8, !tbaa !5
  %502 = load ptr, ptr %24, align 8, !tbaa !5
  %503 = getelementptr inbounds { double, double }, ptr %77, i32 0, i32 0
  %504 = load double, ptr %503, align 16
  %505 = getelementptr inbounds { double, double }, ptr %77, i32 0, i32 1
  %506 = load double, ptr %505, align 8
  %507 = getelementptr inbounds { double, double }, ptr %78, i32 0, i32 0
  %508 = load double, ptr %507, align 16
  %509 = getelementptr inbounds { double, double }, ptr %78, i32 0, i32 1
  %510 = load double, ptr %509, align 8
  %511 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %88, double %504, double %506, double %508, double %510, ptr noundef nonnull align 16 dereferenceable(123) %76, ptr noundef nonnull align 8 dereferenceable(32) %32, ptr noundef nonnull align 8 dereferenceable(8) %499, ptr noundef nonnull align 8 dereferenceable(8) %500, ptr noundef nonnull align 8 dereferenceable(8) %501, ptr noundef nonnull align 8 dereferenceable(12) %502)
          to label %512 unwind label %514

512:                                              ; preds = %498
  br i1 %511, label %518, label %513

513:                                              ; preds = %512
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %528

514:                                              ; preds = %518, %498, %497
  %515 = landingpad { ptr, i32 }
          cleanup
  %516 = extractvalue { ptr, i32 } %515, 0
  store ptr %516, ptr %30, align 8
  %517 = extractvalue { ptr, i32 } %515, 1
  store i32 %517, ptr %31, align 4
  call void @llvm.lifetime.end.p0(i64 128, ptr %76) #9
  br label %532

518:                                              ; preds = %512
  %519 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %76, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %79, ptr align 16 %519, i64 16, i1 false), !tbaa.struct !13
  %520 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 0
  %521 = load double, ptr %520, align 16
  %522 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 1
  %523 = load double, ptr %522, align 8
  %524 = invoke noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %88, double %521, double %523)
          to label %525 unwind label %514

525:                                              ; preds = %518
  br i1 %524, label %526, label %527

526:                                              ; preds = %525
  store i1 false, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %528

527:                                              ; preds = %525
  store i32 0, ptr %36, align 4
  br label %528

528:                                              ; preds = %527, %526, %513
  call void @llvm.lifetime.end.p0(i64 128, ptr %76) #9
  br label %529

529:                                              ; preds = %528, %488
  call void @llvm.lifetime.end.p0(i64 4, ptr %73) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #9
  %530 = load i32, ptr %36, align 4
  switch i32 %530, label %556 [
    i32 0, label %531
  ]

531:                                              ; preds = %529
  br label %534

532:                                              ; preds = %514, %493
  call void @llvm.lifetime.end.p0(i64 4, ptr %73) #9
  br label %533

533:                                              ; preds = %532, %489
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #9
  br label %557

534:                                              ; preds = %531, %444
  %535 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %29, i32 0, i32 7
  %536 = load float, ptr %535, align 4, !tbaa !15
  %537 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mLEf(ptr noundef nonnull align 16 dereferenceable(16) %65, float noundef %536)
          to label %538 unwind label %433

538:                                              ; preds = %534
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %80, ptr align 16 %65, i64 16, i1 false), !tbaa.struct !13
  %539 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 0
  %540 = load double, ptr %539, align 16
  %541 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 1
  %542 = load double, ptr %541, align 8
  %543 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %53, double %540, double %542)
          to label %544 unwind label %433

544:                                              ; preds = %538
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %81, ptr align 16 %53, i64 16, i1 false), !tbaa.struct !13
  %545 = load ptr, ptr %21, align 8, !tbaa !5
  %546 = load ptr, ptr %22, align 8, !tbaa !5
  %547 = load ptr, ptr %23, align 8, !tbaa !5
  %548 = load ptr, ptr %24, align 8, !tbaa !5
  %549 = load ptr, ptr %25, align 8, !tbaa !5
  %550 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 0
  %551 = load double, ptr %550, align 16
  %552 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 1
  %553 = load double, ptr %552, align 8
  invoke void @_ZN3JPH16CharacterVirtual13MoveToContactENS_4Vec3ERKNS0_7ContactERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %88, double %551, double %553, ptr noundef nonnull align 16 dereferenceable(123) %29, ptr noundef nonnull align 8 dereferenceable(8) %545, ptr noundef nonnull align 8 dereferenceable(8) %546, ptr noundef nonnull align 8 dereferenceable(8) %547, ptr noundef nonnull align 8 dereferenceable(12) %548, ptr noundef nonnull align 8 dereferenceable(8) %549)
          to label %554 unwind label %433

554:                                              ; preds = %544
  %555 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %88, i32 0, i32 7
  store i32 0, ptr %555, align 4, !tbaa !31
  store i1 true, ptr %15, align 1
  store i32 1, ptr %36, align 4
  br label %556

556:                                              ; preds = %554, %529, %448, %428
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #9
  br label %558

557:                                              ; preds = %533, %433, %429
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #9
  br label %559

558:                                              ; preds = %556, %392
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %58) #9
  br label %560

559:                                              ; preds = %557, %388, %351
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #9
  call void @llvm.lifetime.end.p0(i64 1, ptr %58) #9
  br label %561

560:                                              ; preds = %558, %323
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #9
  br label %564

561:                                              ; preds = %559, %332
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #9
  br label %562

562:                                              ; preds = %561, %328
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #9
  br label %563

563:                                              ; preds = %562, %324
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #9
  br label %565

564:                                              ; preds = %560, %294
  call void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %44) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr %44) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #9
  br label %570

565:                                              ; preds = %563, %290, %221
  call void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %44) #9
  br label %566

566:                                              ; preds = %565, %217
  call void @llvm.lifetime.end.p0(i64 32, ptr %44) #9
  br label %567

567:                                              ; preds = %566, %213
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #9
  br label %568

568:                                              ; preds = %567, %209
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #9
  br label %569

569:                                              ; preds = %568, %205
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #9
  br label %572

570:                                              ; preds = %564, %113
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %32) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr %32) #9
  call void @llvm.lifetime.end.p0(i64 128, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #9
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9) %26) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #9
  %571 = load i1, ptr %15, align 1
  ret i1 %571

572:                                              ; preds = %569, %122
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %32) #9
  br label %573

573:                                              ; preds = %572, %118
  call void @llvm.lifetime.end.p0(i64 32, ptr %32) #9
  br label %574

574:                                              ; preds = %573, %114
  call void @llvm.lifetime.end.p0(i64 128, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #9
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9) %26) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #9
  br label %575

575:                                              ; preds = %574
  %576 = load ptr, ptr %30, align 8
  %577 = load i32, ptr %31, align 4
  %578 = insertvalue { ptr, i32 } poison, ptr %576, 0
  %579 = insertvalue { ptr, i32 } %578, i32 %577, 1
  resume { ptr, i32 } %579
}

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0EC2EOSH_"(ptr noundef nonnull align 8 dereferenceable(9), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #3 align 2

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

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

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

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

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

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

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

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9)) unnamed_addr #3 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 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress 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 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { alwaysinline mustprogress 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 #8 = { 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 #9 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"_ZTSZN3JPH16CharacterVirtual10WalkStairsEfNS_4Vec3ES1_S1_S1_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0", !6, i64 0}
!13 = !{i64 0, i64 16, !14}
!14 = !{!7, !7, i64 0}
!15 = !{!16, !10, i64 84}
!16 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !17, i64 0, !22, i64 16, !22, i64 32, !22, i64 48, !22, i64 64, !10, i64 80, !10, i64 84, !23, i64 88, !24, i64 89, !6, i64 96, !25, i64 104, !6, i64 112, !24, i64 120, !24, i64 121, !24, i64 122}
!17 = !{!"_ZTSN3JPH16CharacterVirtual10ContactKeyE", !18, i64 0, !20, i64 4, !21, i64 8}
!18 = !{!"_ZTSN3JPH6BodyIDE", !19, i64 0}
!19 = !{!"int", !7, i64 0}
!20 = !{!"_ZTSN3JPH11CharacterIDE", !19, i64 0}
!21 = !{!"_ZTSN3JPH10SubShapeIDE", !19, i64 0}
!22 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!23 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!24 = !{!"bool", !7, i64 0}
!25 = !{!"long", !7, i64 0}
!26 = !{!16, !24, i64 120}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!16, !24, i64 121}
!30 = !{!24, !24, i64 0}
!31 = !{!32, !39, i64 68}
!32 = !{!"_ZTSN3JPH13CharacterBaseE", !33, i64 8, !6, i64 16, !36, i64 24, !22, i64 32, !37, i64 48, !10, i64 64, !39, i64 68, !18, i64 72, !21, i64 76, !22, i64 80, !22, i64 96, !22, i64 112, !40, i64 128, !25, i64 136}
!33 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !34, i64 0}
!34 = !{!"_ZTSSt6atomicIjE", !35, i64 0}
!35 = !{!"_ZTSSt13__atomic_baseIjE", !19, i64 0}
!36 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !6, i64 0}
!37 = !{!"_ZTSN3JPH5PlaneE", !38, i64 0}
!38 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!39 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !7, i64 0}
!40 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !6, i64 0}


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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::ScopeExit.40" = type <{ %class.anon.41, i8, [7 x i8] }>
%class.anon.41 = type { ptr }
%"struct.JPH::CharacterVirtual::Contact" = type <{ %"class.JPH::CharacterVirtual::ContactKey", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, i8, i8, [6 x i8], ptr, i64, ptr, i8, i8, i8, [5 x i8] }>
%"class.JPH::CharacterVirtual::ContactKey" = type { %"class.JPH::BodyID", %"class.JPH::CharacterID", %"class.JPH::SubShapeID" }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::CharacterID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::Array.29" = type { %"class.JPH::STLTempAllocator.30", i64, i64, ptr }
%"class.JPH::STLTempAllocator.30" = type { ptr }
%"class.JPH::Array.43" = type { %"class.JPH::STLTempAllocator.44", i64, i64, ptr }
%"class.JPH::STLTempAllocator.44" = type { ptr }

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123)) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372), double, double, double, double, ptr noundef nonnull align 16 dereferenceable(123), ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12)) local_unnamed_addr #4 align 2

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

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

; Function Attrs: 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 #6 align 2

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

; 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 #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)) local_unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual10ContactKeyEEC2ERNS_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_16CharacterVirtual10ContactKeyENS_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 nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #7 align 2

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16CharacterVirtual13MoveToContactENS_4Vec3ERKNS0_7ContactERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372), double, double, ptr noundef nonnull align 16 dereferenceable(123), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef zeroext i1 @_ZN3JPH16CharacterVirtual10WalkStairsEfNS_4Vec3ES1_S1_S1_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, float noundef %1, double %2, double %3, double %4, double %5, double %6, double %7, ptr nocapture noundef readonly byval(%"class.JPH::Vec3") align 16 %8, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12, ptr noundef nonnull align 8 dereferenceable(8) %13) local_unnamed_addr #4 align 2 personality ptr @__gxx_personality_v0 {
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::ScopeExit.40", align 8
  %18 = alloca %class.anon.41, align 8
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca %"struct.JPH::CharacterVirtual::Contact", align 16
  %21 = alloca %"class.JPH::Array.29", align 8
  %22 = alloca %"class.JPH::STLTempAllocator.30", align 8
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Vec3", align 16
  %25 = alloca %"class.JPH::Array.43", align 8
  %26 = alloca %"class.JPH::STLTempAllocator.44", align 8
  %27 = alloca %"class.JPH::Vec3", align 16
  %28 = alloca %"class.JPH::Vec3", align 16
  %29 = alloca %"class.JPH::Vec3", align 16
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca %"class.JPH::Vec3", align 16
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca %"struct.JPH::CharacterVirtual::Contact", align 16
  store double %4, ptr %15, align 16
  %34 = getelementptr inbounds i8, ptr %15, i64 8
  store double %5, ptr %34, align 8
  store double %6, ptr %16, align 16
  %35 = getelementptr inbounds i8, ptr %16, i64 8
  store double %7, ptr %35, align 8
  tail call void @_ZN3JPH16CharacterVirtual27StartTrackingContactChangesEv(ptr noundef nonnull align 16 dereferenceable(372) %0)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %18) #8
  store ptr %0, ptr %18, align 8, !tbaa !5
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0EC2EOSH_"(ptr noundef nonnull align 8 dereferenceable(9) %17, ptr noundef nonnull align 8 dereferenceable(8) %18)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #8
  store double %2, ptr %19, align 16
  %.sroa.2111.0..sroa_idx = getelementptr inbounds i8, ptr %19, i64 8
  store double %3, ptr %.sroa.2111.0..sroa_idx, align 8, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %20) #8
  invoke void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123) %20)
          to label %36 unwind label %44

36:                                               ; preds = %14
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %21) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %22) #8
  call void @_ZN3JPH16STLTempAllocatorINS_16CharacterVirtual10ContactKeyEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %22, ptr noundef nonnull align 8 dereferenceable(8) %13)
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEEC2ERKS4_(ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(8) %22)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %22) #8
  %37 = getelementptr inbounds i8, ptr %0, i64 240
  %.sroa.072.0.copyload = load double, ptr %37, align 16
  %.sroa.273.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 248
  %.sroa.273.0.copyload = load double, ptr %.sroa.273.0..sroa_idx, align 8, !tbaa !10
  %.sroa.070.0.copyload = load double, ptr %19, align 16
  %.sroa.271.0.copyload = load double, ptr %.sroa.2111.0..sroa_idx, align 8, !tbaa !10
  %38 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %.sroa.072.0.copyload, double %.sroa.273.0.copyload, double %.sroa.070.0.copyload, double %.sroa.271.0.copyload, ptr noundef nonnull align 16 dereferenceable(123) %20, ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12)
          to label %39 unwind label %46

39:                                               ; preds = %36
  br i1 %38, label %40, label %50

40:                                               ; preds = %39
  %41 = getelementptr inbounds i8, ptr %20, i64 84
  %42 = load float, ptr %41, align 4, !tbaa !11
  %43 = fcmp olt float %42, 0x3EB0C6F7A0000000
  br i1 %43, label %195, label %48

44:                                               ; preds = %14
  %45 = landingpad { ptr, i32 }
          cleanup
  br label %197

46:                                               ; preds = %36
  %47 = landingpad { ptr, i32 }
          cleanup
  br label %196

48:                                               ; preds = %40
  %49 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mLEf(ptr noundef nonnull align 16 dereferenceable(16) %19, float noundef %42)
  br label %50

50:                                               ; preds = %48, %39
  %.sroa.062.0.copyload = load double, ptr %19, align 16
  %.sroa.263.0.copyload = load double, ptr %.sroa.2111.0..sroa_idx, align 8, !tbaa !10
  %51 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %37, double %.sroa.062.0.copyload, double %.sroa.263.0.copyload)
          to label %52 unwind label %77

52:                                               ; preds = %50
  %53 = extractvalue { double, double } %51, 0
  %54 = extractvalue { double, double } %51, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #8
  %55 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %15, float noundef %1)
          to label %56 unwind label %79

56:                                               ; preds = %52
  %57 = extractvalue { double, double } %55, 0
  store double %57, ptr %23, align 16
  %58 = getelementptr inbounds i8, ptr %23, i64 8
  %59 = extractvalue { double, double } %55, 1
  store double %59, ptr %58, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #8
  %60 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.058.0.copyload = load double, ptr %60, align 16
  %.sroa.259.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.259.0.copyload = load double, ptr %.sroa.259.0..sroa_idx, align 8, !tbaa !10
  %61 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %.sroa.058.0.copyload, double %.sroa.259.0.copyload)
  %.sroa.056.0.copyload = load double, ptr %60, align 16
  %.sroa.257.0.copyload = load double, ptr %.sroa.259.0..sroa_idx, align 8, !tbaa !10
  %62 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %61, double %.sroa.056.0.copyload, double %.sroa.257.0.copyload)
          to label %63 unwind label %81

63:                                               ; preds = %56
  %64 = extractvalue { double, double } %62, 0
  %65 = extractvalue { double, double } %62, 1
  %66 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %64, double %65)
          to label %67 unwind label %81

67:                                               ; preds = %63
  %68 = extractvalue { double, double } %66, 0
  store double %68, ptr %24, align 16
  %69 = getelementptr inbounds i8, ptr %24, i64 8
  %70 = extractvalue { double, double } %66, 1
  store double %70, ptr %69, align 8
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %25) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %26) #8
  call void @_ZN3JPH16STLTempAllocatorINS_4Vec3EEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %26, ptr noundef nonnull align 8 dereferenceable(8) %13)
  call void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEEC2ERKS3_(ptr noundef nonnull align 8 dereferenceable(32) %25, ptr noundef nonnull align 8 dereferenceable(8) %26)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %26) #8
  %71 = getelementptr inbounds i8, ptr %0, i64 288
  %72 = call noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %71)
  invoke void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32) %25, i64 noundef %72)
          to label %73 unwind label %83

73:                                               ; preds = %67
  %74 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %71)
  %75 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %71)
  %.not159 = icmp eq ptr %74, %75
  br i1 %.not159, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %106, %73
  %76 = call noundef zeroext i1 @_ZNK3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32) %25)
  br i1 %76, label %191, label %108

77:                                               ; preds = %50
  %78 = landingpad { ptr, i32 }
          cleanup
  br label %196

79:                                               ; preds = %52
  %80 = landingpad { ptr, i32 }
          cleanup
  br label %194

81:                                               ; preds = %63, %56
  %82 = landingpad { ptr, i32 }
          cleanup
  br label %193

83:                                               ; preds = %67
  %84 = landingpad { ptr, i32 }
          cleanup
  br label %192

.lr.ph:                                           ; preds = %73, %106
  %.0134160 = phi ptr [ %107, %106 ], [ %74, %73 ]
  %85 = getelementptr inbounds i8, ptr %.0134160, i64 120
  %86 = load i8, ptr %85, align 8, !tbaa !23, !range !24, !noundef !25
  %87 = trunc nuw i8 %86 to i1
  br i1 %87, label %88, label %106

88:                                               ; preds = %.lr.ph
  %89 = getelementptr inbounds i8, ptr %.0134160, i64 121
  %90 = load i8, ptr %89, align 1, !tbaa !26, !range !24, !noundef !25
  %91 = trunc nuw i8 %90 to i1
  br i1 %91, label %106, label %92

92:                                               ; preds = %88
  %93 = getelementptr inbounds i8, ptr %.0134160, i64 64
  %94 = getelementptr inbounds i8, ptr %.0134160, i64 32
  %.sroa.040.0.copyload = load double, ptr %94, align 16
  %.sroa.241.0..sroa_idx = getelementptr inbounds i8, ptr %.0134160, i64 40
  %.sroa.241.0.copyload = load double, ptr %.sroa.241.0..sroa_idx, align 8, !tbaa !10
  %95 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %24, double %.sroa.040.0.copyload, double %.sroa.241.0.copyload)
          to label %96 unwind label %104

96:                                               ; preds = %92
  %97 = extractvalue { double, double } %95, 0
  %98 = extractvalue { double, double } %95, 1
  %99 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %93, double %97, double %98)
  %100 = fcmp olt float %99, 0.000000e+00
  br i1 %100, label %101, label %106

101:                                              ; preds = %96
  %.sroa.038.0.copyload = load double, ptr %93, align 16
  %.sroa.239.0..sroa_idx = getelementptr inbounds i8, ptr %.0134160, i64 72
  %.sroa.239.0.copyload = load double, ptr %.sroa.239.0..sroa_idx, align 8, !tbaa !10
  %102 = call noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %0, double %.sroa.038.0.copyload, double %.sroa.239.0.copyload)
  br i1 %102, label %103, label %106

103:                                              ; preds = %101
  invoke void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE9push_backERKS1_(ptr noundef nonnull align 8 dereferenceable(32) %25, ptr noundef nonnull align 16 dereferenceable(16) %93)
          to label %106 unwind label %104

104:                                              ; preds = %103, %92
  %105 = landingpad { ptr, i32 }
          cleanup
  br label %192

106:                                              ; preds = %103, %101, %96, %88, %.lr.ph
  %107 = getelementptr inbounds i8, ptr %.0134160, i64 128
  %.not = icmp eq ptr %107, %75
  br i1 %.not, label %._crit_edge, label %.lr.ph

108:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %27) #8
  store double %53, ptr %27, align 16
  %.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %27, i64 8
  store double %54, ptr %.sroa.8.0..sroa_idx, align 8, !tbaa !10
  %.sroa.036.0.copyload = load double, ptr %23, align 16
  %.sroa.237.0.copyload = load double, ptr %58, align 8, !tbaa !10
  invoke void @_ZN3JPH16CharacterVirtual9MoveShapeERNS_4Vec3ES1_fPNS_5ArrayINS0_7ContactENS_12STLAllocatorIS4_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, ptr noundef nonnull align 16 dereferenceable(16) %27, double %.sroa.036.0.copyload, double %.sroa.237.0.copyload, float noundef %1, ptr noundef null, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12, ptr noundef nonnull align 8 dereferenceable(8) %13)
          to label %109 unwind label %117

109:                                              ; preds = %108
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %28) #8
  %110 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %53, double %54)
          to label %111 unwind label %119

111:                                              ; preds = %109
  %112 = extractvalue { double, double } %110, 0
  store double %112, ptr %28, align 16
  %113 = getelementptr inbounds i8, ptr %28, i64 8
  %114 = extractvalue { double, double } %110, 1
  store double %114, ptr %113, align 8
  %115 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %28)
  %116 = fcmp olt float %115, 0x3E45798EE0000000
  br i1 %116, label %.critedge157, label %121

117:                                              ; preds = %108
  %118 = landingpad { ptr, i32 }
          cleanup
  br label %190

119:                                              ; preds = %109
  %120 = landingpad { ptr, i32 }
          cleanup
  br label %189

121:                                              ; preds = %111
  %122 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %15)
  %123 = fmul float %122, 0xBFA99999A0000000
  %124 = call noundef ptr @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %25)
  %125 = call noundef ptr @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %25)
  %.not140.not161 = icmp eq ptr %124, %125
  br i1 %.not140.not161, label %.critedge157, label %.lr.ph165

126:                                              ; preds = %.lr.ph165
  %127 = getelementptr inbounds i8, ptr %.0138162, i64 16
  %.not140.not = icmp eq ptr %127, %125
  br i1 %.not140.not, label %.critedge157, label %.lr.ph165

.lr.ph165:                                        ; preds = %121, %126
  %.0138162 = phi ptr [ %127, %126 ], [ %124, %121 ]
  %.sroa.022.0.copyload = load double, ptr %28, align 16
  %.sroa.223.0.copyload = load double, ptr %113, align 8, !tbaa !10
  %128 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %.0138162, double %.sroa.022.0.copyload, double %.sroa.223.0.copyload)
  %129 = fcmp uge float %128, %123
  br i1 %129, label %126, label %130

130:                                              ; preds = %.lr.ph165
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %29) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %30) #8
  %131 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %19)
          to label %132 unwind label %143

132:                                              ; preds = %130
  %133 = extractvalue { double, double } %131, 0
  store double %133, ptr %30, align 16
  %134 = getelementptr inbounds i8, ptr %30, i64 8
  %135 = extractvalue { double, double } %131, 1
  store double %135, ptr %134, align 8
  %.sroa.020.0.copyload = load double, ptr %8, align 16
  %.sroa.221.0..sroa_idx = getelementptr inbounds i8, ptr %8, i64 8
  %.sroa.221.0.copyload = load double, ptr %.sroa.221.0..sroa_idx, align 8, !tbaa !10
  %136 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %30, double %.sroa.020.0.copyload, double %.sroa.221.0.copyload)
          to label %137 unwind label %143

137:                                              ; preds = %132
  %138 = extractvalue { double, double } %136, 0
  store double %138, ptr %29, align 16
  %139 = getelementptr inbounds i8, ptr %29, i64 8
  %140 = extractvalue { double, double } %136, 1
  store double %140, ptr %139, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #8
  %.sroa.018.0.copyload = load double, ptr %27, align 16
  %.sroa.219.0.copyload = load double, ptr %.sroa.8.0..sroa_idx, align 8, !tbaa !10
  %141 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %.sroa.018.0.copyload, double %.sroa.219.0.copyload, double %138, double %140, ptr noundef nonnull align 16 dereferenceable(123) %20, ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12)
          to label %142 unwind label %145

142:                                              ; preds = %137
  br i1 %141, label %147, label %187

143:                                              ; preds = %132, %130
  %144 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #8
  br label %188

145:                                              ; preds = %180, %137
  %146 = landingpad { ptr, i32 }
          cleanup
  br label %188

147:                                              ; preds = %142
  %148 = getelementptr inbounds i8, ptr %20, i64 64
  %.sroa.014.0.copyload = load double, ptr %148, align 16
  %.sroa.215.0..sroa_idx = getelementptr inbounds i8, ptr %20, i64 72
  %.sroa.215.0.copyload = load double, ptr %.sroa.215.0..sroa_idx, align 8, !tbaa !10
  %149 = call noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %0, double %.sroa.014.0.copyload, double %.sroa.215.0.copyload)
  br i1 %149, label %150, label %180

150:                                              ; preds = %147
  %151 = call noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %16, float noundef 0x3D71979980000000)
  br i1 %151, label %187, label %152

152:                                              ; preds = %150
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %31) #8
  store double %53, ptr %31, align 16
  %.sroa.8.0..sroa_idx66 = getelementptr inbounds i8, ptr %31, i64 8
  store double %54, ptr %.sroa.8.0..sroa_idx66, align 8, !tbaa !10
  %153 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %16, float noundef %1)
          to label %154 unwind label %166

154:                                              ; preds = %152
  %155 = extractvalue { double, double } %153, 0
  %156 = extractvalue { double, double } %153, 1
  invoke void @_ZN3JPH16CharacterVirtual9MoveShapeERNS_4Vec3ES1_fPNS_5ArrayINS0_7ContactENS_12STLAllocatorIS4_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, ptr noundef nonnull align 16 dereferenceable(16) %31, double %155, double %156, float noundef %1, ptr noundef null, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12, ptr noundef nonnull align 8 dereferenceable(8) %13)
          to label %157 unwind label %166

157:                                              ; preds = %154
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %32) #8
  %158 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %31, double %53, double %54)
          to label %159 unwind label %168

159:                                              ; preds = %157
  %160 = extractvalue { double, double } %158, 0
  store double %160, ptr %32, align 16
  %161 = getelementptr inbounds i8, ptr %32, i64 8
  %162 = extractvalue { double, double } %158, 1
  store double %162, ptr %161, align 8
  %163 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %32)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %32) #8
  %164 = fadd float %115, 0x3E45798EE0000000
  %165 = fcmp ugt float %163, %164
  br i1 %165, label %170, label %.critedge

166:                                              ; preds = %154, %152
  %167 = landingpad { ptr, i32 }
          cleanup
  br label %179

168:                                              ; preds = %157
  %169 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %32) #8
  br label %179

170:                                              ; preds = %159
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %33) #8
  invoke void @_ZN3JPH16CharacterVirtual7ContactC2Ev(ptr noundef nonnull align 16 dereferenceable(123) %33)
          to label %171 unwind label %174

171:                                              ; preds = %170
  %.sroa.08.0.copyload = load double, ptr %31, align 16
  %.sroa.29.0.copyload = load double, ptr %.sroa.8.0..sroa_idx66, align 8, !tbaa !10
  %172 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual23GetFirstContactForSweepENS_4Vec3ES1_RNS0_7ContactERKNS_5ArrayINS0_10ContactKeyENS_16STLTempAllocatorIS5_EEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %.sroa.08.0.copyload, double %.sroa.29.0.copyload, double %138, double %140, ptr noundef nonnull align 16 dereferenceable(123) %33, ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12)
          to label %173 unwind label %174

173:                                              ; preds = %171
  br i1 %172, label %176, label %.critedge155

174:                                              ; preds = %171, %170
  %175 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %33) #8
  br label %179

176:                                              ; preds = %173
  %177 = getelementptr inbounds i8, ptr %33, i64 64
  %.sroa.04.0.copyload = load double, ptr %177, align 16
  %.sroa.25.0..sroa_idx = getelementptr inbounds i8, ptr %33, i64 72
  %.sroa.25.0.copyload = load double, ptr %.sroa.25.0..sroa_idx, align 8, !tbaa !10
  %178 = call noundef zeroext i1 @_ZNK3JPH13CharacterBase15IsSlopeTooSteepENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(144) %0, double %.sroa.04.0.copyload, double %.sroa.25.0.copyload)
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %33) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #8
  br i1 %178, label %187, label %180

179:                                              ; preds = %168, %174, %166
  %.pn.pn = phi { ptr, i32 } [ %167, %166 ], [ %175, %174 ], [ %169, %168 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #8
  br label %188

180:                                              ; preds = %176, %147
  %181 = getelementptr inbounds i8, ptr %20, i64 84
  %182 = load float, ptr %181, align 4, !tbaa !11
  %183 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mLEf(ptr noundef nonnull align 16 dereferenceable(16) %29, float noundef %182)
  %.sroa.02.0.copyload = load double, ptr %29, align 16
  %.sroa.23.0.copyload = load double, ptr %139, align 8, !tbaa !10
  %184 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %.sroa.02.0.copyload, double %.sroa.23.0.copyload)
  %.sroa.0.0.copyload = load double, ptr %27, align 16
  %.sroa.2.0.copyload = load double, ptr %.sroa.8.0..sroa_idx, align 8, !tbaa !10
  invoke void @_ZN3JPH16CharacterVirtual13MoveToContactENS_4Vec3ERKNS0_7ContactERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload, ptr noundef nonnull align 16 dereferenceable(123) %20, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(12) %12, ptr noundef nonnull align 8 dereferenceable(8) %13)
          to label %185 unwind label %145

185:                                              ; preds = %180
  %186 = getelementptr inbounds i8, ptr %0, i64 68
  store i32 0, ptr %186, align 4, !tbaa !27
  br label %187

.critedge:                                        ; preds = %159
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #8
  br label %187

.critedge155:                                     ; preds = %173
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %33) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #8
  br label %187

187:                                              ; preds = %.critedge155, %.critedge, %150, %142, %176, %185
  %.2 = phi i1 [ true, %185 ], [ false, %176 ], [ false, %142 ], [ false, %150 ], [ false, %.critedge ], [ false, %.critedge155 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %29) #8
  br label %.critedge157

188:                                              ; preds = %179, %145, %143
  %.pn143 = phi { ptr, i32 } [ %146, %145 ], [ %.pn.pn, %179 ], [ %144, %143 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %29) #8
  br label %189

.critedge157:                                     ; preds = %126, %121, %187, %111
  %.4 = phi i1 [ false, %111 ], [ %.2, %187 ], [ false, %121 ], [ false, %126 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #8
  br label %191

189:                                              ; preds = %188, %119
  %.pn143.pn = phi { ptr, i32 } [ %.pn143, %188 ], [ %120, %119 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #8
  br label %190

190:                                              ; preds = %189, %117
  %.pn143.pn.pn = phi { ptr, i32 } [ %.pn143.pn, %189 ], [ %118, %117 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #8
  br label %192

191:                                              ; preds = %._crit_edge, %.critedge157
  %.5 = phi i1 [ %.4, %.critedge157 ], [ false, %._crit_edge ]
  call void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %25) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %25) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #8
  br label %195

192:                                              ; preds = %190, %104, %83
  %.pn147 = phi { ptr, i32 } [ %105, %104 ], [ %.pn143.pn.pn, %190 ], [ %84, %83 ]
  call void @_ZN3JPH5ArrayINS_4Vec3ENS_16STLTempAllocatorIS1_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %25) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %25) #8
  br label %193

193:                                              ; preds = %192, %81
  %.pn147.pn = phi { ptr, i32 } [ %.pn147, %192 ], [ %82, %81 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #8
  br label %194

194:                                              ; preds = %193, %79
  %.pn147.pn.pn = phi { ptr, i32 } [ %.pn147.pn, %193 ], [ %80, %79 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #8
  br label %196

195:                                              ; preds = %40, %191
  %.6 = phi i1 [ %.5, %191 ], [ false, %40 ]
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %21) #8
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %20) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #8
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9) %17) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #8
  ret i1 %.6

196:                                              ; preds = %77, %194, %46
  %.pn147.pn.pn.pn.pn = phi { ptr, i32 } [ %47, %46 ], [ %.pn147.pn.pn, %194 ], [ %78, %77 ]
  call void @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %21) #8
  br label %197

197:                                              ; preds = %196, %44
  %.pn147.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn147.pn.pn.pn.pn, %196 ], [ %45, %44 ]
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %20) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #8
  call void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9) %17) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #8
  resume { ptr, i32 } %.pn147.pn.pn.pn.pn.pn
}

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0EC2EOSH_"(ptr noundef nonnull align 8 dereferenceable(9), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH16STLTempAllocatorINS_4Vec3EEC2ERNS_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_4Vec3ENS_16STLTempAllocatorIS1_EEEC2ERKS3_(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_4Vec3ENS_16STLTempAllocatorIS1_EEE7reserveEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) local_unnamed_addr #3 align 2

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

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

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

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

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare hidden void @"_ZN3JPH9ScopeExitIZNS_16CharacterVirtual10WalkStairsEfNS_4Vec3ES2_S2_S2_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0ED2Ev"(ptr noundef nonnull align 8 dereferenceable(9)) unnamed_addr #2 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTSZN3JPH16CharacterVirtual10WalkStairsEfNS_4Vec3ES1_S1_S1_RKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterERNS_13TempAllocatorEE3$_0", !7, i64 0}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!8, !8, i64 0}
!11 = !{!12, !19, i64 84}
!12 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !13, i64 0, !18, i64 16, !18, i64 32, !18, i64 48, !18, i64 64, !19, i64 80, !19, i64 84, !20, i64 88, !21, i64 89, !7, i64 96, !22, i64 104, !7, i64 112, !21, i64 120, !21, i64 121, !21, i64 122}
!13 = !{!"_ZTSN3JPH16CharacterVirtual10ContactKeyE", !14, i64 0, !16, i64 4, !17, i64 8}
!14 = !{!"_ZTSN3JPH6BodyIDE", !15, i64 0}
!15 = !{!"int", !8, i64 0}
!16 = !{!"_ZTSN3JPH11CharacterIDE", !15, i64 0}
!17 = !{!"_ZTSN3JPH10SubShapeIDE", !15, i64 0}
!18 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!19 = !{!"float", !8, i64 0}
!20 = !{!"_ZTSN3JPH11EMotionTypeE", !8, i64 0}
!21 = !{!"bool", !8, i64 0}
!22 = !{!"long", !8, i64 0}
!23 = !{!12, !21, i64 120}
!24 = !{i8 0, i8 2}
!25 = !{}
!26 = !{!12, !21, i64 121}
!27 = !{!28, !35, i64 68}
!28 = !{!"_ZTSN3JPH13CharacterBaseE", !29, i64 8, !7, i64 16, !32, i64 24, !18, i64 32, !33, i64 48, !19, i64 64, !35, i64 68, !14, i64 72, !17, i64 76, !18, i64 80, !18, i64 96, !18, i64 112, !36, i64 128, !22, i64 136}
!29 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !30, i64 0}
!30 = !{!"_ZTSSt6atomicIjE", !31, i64 0}
!31 = !{!"_ZTSSt13__atomic_baseIjE", !15, i64 0}
!32 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !7, i64 0}
!33 = !{!"_ZTSN3JPH5PlaneE", !34, i64 0}
!34 = !{!"_ZTSN3JPH4Vec4E", !8, i64 0}
!35 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !8, i64 0}
!36 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !7, i64 0}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SCCPPass,SROAPass,SimplifyCFGPass,TailCallElimPass