; LLVM IR from jrouwe/JoltPhysics :: Jolt/Physics/Collision/Shape (ConvexHullShape)

; 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.6 }
%union.anon.6 = type { <4 x float> }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }
%"class.JPH::CollideSoftBodyVertexIterator" = type { %"class.JPH::StridedPtr", %"class.JPH::StridedPtr.32", %"class.JPH::StridedPtr.34", %"class.JPH::StridedPtr.36", %"class.JPH::StridedPtr.38" }
%"class.JPH::StridedPtr" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.32" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.34" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.36" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.38" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }
%"class.JPH::ConvexHullShape" = type <{ %"class.JPH::ConvexShape.base", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Mat44", %"class.JPH::AABox", %"class.JPH::Array.8", %"class.JPH::Array.11", %"class.JPH::Array.14", %"class.JPH::Array.17", float, float, float, [4 x i8] }>
%"class.JPH::ConvexShape.base" = type <{ %"class.JPH::Shape.base", [6 x i8], %"class.JPH::RefConst", float }>
%"class.JPH::Shape.base" = type <{ ptr, %"class.JPH::RefTarget.5", [4 x i8], i64, i8, i8 }>
%"class.JPH::RefTarget.5" = 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::AABox" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::Array.8" = type { i64, i64, ptr }
%"class.JPH::Array.11" = type { i64, i64, ptr }
%"class.JPH::Array.14" = type { i64, i64, ptr }
%"class.JPH::Array.17" = type { i64, i64, ptr }
%"struct.JPH::ConvexHullShape::Face" = type { i16, i16 }
%"struct.JPH::ConvexHullShape::Point" = type { %"class.JPH::Vec3", i32, [3 x i32] }

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

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

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec35CrossES0_(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) #5 align 2

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

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

; Function Attrs: 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 noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16)) #4 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double, double) #6

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsInsideOutENS_4Vec3E(double, double) #6

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #6 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() #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 } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) #1

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK3JPH15ConvexHullShape23CollideSoftBodyVerticesERKNS_5Mat44ENS_4Vec3ERKNS_29CollideSoftBodyVertexIteratorEji(ptr noundef nonnull align 16 dereferenceable(272) %0, ptr noundef nonnull align 16 dereferenceable(64) %1, double %2, double %3, ptr noundef nonnull align 8 dereferenceable(80) %4, i32 noundef %5, i32 noundef %6) unnamed_addr #3 align 2 {
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca %"class.JPH::Mat44", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca i8, align 1
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca float, align 4
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca %"class.JPH::CollideSoftBodyVertexIterator", align 8
  %21 = alloca %"class.JPH::CollideSoftBodyVertexIterator", align 8
  %22 = alloca i32, align 4
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Vec3", align 16
  %25 = alloca float, align 4
  %26 = alloca %"class.JPH::Vec3", align 16
  %27 = alloca i32, align 4
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca float, align 4
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca i32, align 4
  %36 = alloca %"class.JPH::Vec3", align 16
  %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 float, align 4
  %42 = alloca %"class.JPH::Vec3", align 16
  %43 = alloca %"class.JPH::Vec3", align 16
  %44 = alloca i8, align 1
  %45 = alloca %"class.JPH::Vec3", align 16
  %46 = alloca %"class.JPH::Vec3", align 16
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = alloca float, align 4
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca %"class.JPH::Vec3", align 16
  %59 = alloca %"class.JPH::Vec3", align 16
  %60 = alloca %"class.JPH::Vec3", align 16
  %61 = alloca %"class.JPH::Vec3", align 16
  %62 = alloca %"class.JPH::Vec3", align 16
  %63 = alloca %"class.JPH::Vec3", align 16
  %64 = alloca i32, align 4
  %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 float, align 4
  %71 = alloca %"class.JPH::Vec3", align 16
  %72 = alloca %"class.JPH::Vec3", align 16
  %73 = alloca %"class.JPH::Vec3", align 16
  %74 = alloca %"class.JPH::Vec3", align 16
  %75 = alloca float, align 4
  %76 = alloca float, align 4
  %77 = alloca %"class.JPH::Vec3", align 16
  %78 = alloca %"class.JPH::Vec3", align 16
  %79 = alloca %"class.JPH::Plane", align 16
  %80 = alloca %"class.JPH::Vec3", align 16
  %81 = alloca %"class.JPH::Vec3", align 16
  %82 = alloca %"class.JPH::Plane", align 16
  %83 = getelementptr inbounds { double, double }, ptr %8, i32 0, i32 0
  store double %2, ptr %83, align 16
  %84 = getelementptr inbounds { double, double }, ptr %8, i32 0, i32 1
  store double %3, ptr %84, align 8
  store ptr %0, ptr %9, align 8, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !5
  store ptr %4, ptr %11, align 8, !tbaa !5
  store i32 %5, ptr %12, align 4, !tbaa !9
  store i32 %6, ptr %13, align 4, !tbaa !9
  %85 = load ptr, ptr %9, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr %14) #8
  %86 = load ptr, ptr %10, align 8, !tbaa !5
  call void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %14, ptr noundef nonnull align 16 dereferenceable(64) %86)
  call void @llvm.lifetime.start.p0(i64 16, ptr %15) #8
  %87 = call { double, double } @_ZNK3JPH4Vec310ReciprocalEv(ptr noundef nonnull align 16 dereferenceable(16) %8)
  %88 = getelementptr inbounds %"class.JPH::Vec3", ptr %15, i32 0, i32 0
  %89 = getelementptr inbounds %union.anon.6, ptr %88, i32 0, i32 0
  %90 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 0
  %91 = extractvalue { double, double } %87, 0
  store double %91, ptr %90, align 16
  %92 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 1
  %93 = extractvalue { double, double } %87, 1
  store double %93, ptr %92, align 8
  call void @llvm.lifetime.start.p0(i64 1, ptr %16) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %17, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !11
  %94 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  %95 = load double, ptr %94, align 16
  %96 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  %97 = load double, ptr %96, align 8
  %98 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %95, double %97)
  %99 = zext i1 %98 to i8
  store i8 %99, ptr %16, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %19, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !11
  %100 = getelementptr inbounds { double, double }, ptr %19, i32 0, i32 0
  %101 = load double, ptr %100, align 16
  %102 = getelementptr inbounds { double, double }, ptr %19, i32 0, i32 1
  %103 = load double, ptr %102, align 8
  %104 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsInsideOutENS_4Vec3E(double %101, double %103)
  %105 = zext i1 %104 to i64
  %106 = select i1 %104, float -1.000000e+00, float 1.000000e+00
  store float %106, ptr %18, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 80, ptr %20) #8
  %107 = load ptr, ptr %11, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %20, ptr align 8 %107, i64 80, i1 false), !tbaa.struct !17
  call void @llvm.lifetime.start.p0(i64 80, ptr %21) #8
  %108 = load ptr, ptr %11, align 8, !tbaa !5
  %109 = load i32, ptr %12, align 4, !tbaa !9
  call void @_ZNK3JPH29CollideSoftBodyVertexIteratorplEi(ptr dead_on_unwind writable sret(%"class.JPH::CollideSoftBodyVertexIterator") align 8 %21, ptr noundef nonnull align 8 dereferenceable(80) %108, i32 noundef %109)
  br label %110

110:                                              ; preds = %548, %7
  %111 = call noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIteratorneERKS0_(ptr noundef nonnull align 8 dereferenceable(80) %20, ptr noundef nonnull align 8 dereferenceable(80) %21)
  br i1 %111, label %113, label %112

112:                                              ; preds = %110
  store i32 2, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 80, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 80, ptr %20) #8
  br label %550

113:                                              ; preds = %110
  %114 = call noundef float @_ZNK3JPH29CollideSoftBodyVertexIterator10GetInvMassEv(ptr noundef nonnull align 8 dereferenceable(80) %20)
  %115 = fcmp ogt float %114, 0.000000e+00
  br i1 %115, label %116, label %547

116:                                              ; preds = %113
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #8
  %117 = call { double, double } @_ZNK3JPH29CollideSoftBodyVertexIterator11GetPositionEv(ptr noundef nonnull align 8 dereferenceable(80) %20)
  %118 = getelementptr inbounds %"class.JPH::Vec3", ptr %24, i32 0, i32 0
  %119 = getelementptr inbounds %union.anon.6, ptr %118, i32 0, i32 0
  %120 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 0
  %121 = extractvalue { double, double } %117, 0
  store double %121, ptr %120, align 16
  %122 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 1
  %123 = extractvalue { double, double } %117, 1
  store double %123, ptr %122, align 8
  %124 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 0
  %125 = load double, ptr %124, align 16
  %126 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 1
  %127 = load double, ptr %126, align 8
  %128 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %14, double %125, double %127)
  %129 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %130 = getelementptr inbounds %union.anon.6, ptr %129, i32 0, i32 0
  %131 = getelementptr inbounds { double, double }, ptr %130, i32 0, i32 0
  %132 = extractvalue { double, double } %128, 0
  store double %132, ptr %131, align 16
  %133 = getelementptr inbounds { double, double }, ptr %130, i32 0, i32 1
  %134 = extractvalue { double, double } %128, 1
  store double %134, ptr %133, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #8
  store float 0xC7EFFFFFE0000000, ptr %25, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #8
  %135 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %136 = getelementptr inbounds %"class.JPH::Vec3", ptr %26, i32 0, i32 0
  %137 = getelementptr inbounds %union.anon.6, ptr %136, i32 0, i32 0
  %138 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 0
  %139 = extractvalue { double, double } %135, 0
  store double %139, ptr %138, align 16
  %140 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 1
  %141 = extractvalue { double, double } %135, 1
  store double %141, ptr %140, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #8
  store i32 0, ptr %27, align 4, !tbaa !9
  %142 = load i8, ptr %16, align 1, !tbaa !13, !range !18, !noundef !19
  %143 = trunc i8 %142 to i1
  br i1 %143, label %144, label %189

144:                                              ; preds = %116
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #8
  %145 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 7
  store ptr %145, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #8
  %146 = load ptr, ptr %28, align 8, !tbaa !5
  %147 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %146)
  store ptr %147, ptr %29, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #8
  %148 = load ptr, ptr %28, align 8, !tbaa !5
  %149 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %148)
  store ptr %149, ptr %30, align 8, !tbaa !5
  br label %150

150:                                              ; preds = %185, %144
  %151 = load ptr, ptr %29, align 8, !tbaa !5
  %152 = load ptr, ptr %30, align 8, !tbaa !5
  %153 = icmp ne ptr %151, %152
  br i1 %153, label %155, label %154

154:                                              ; preds = %150
  store i32 5, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #8
  br label %188

155:                                              ; preds = %150
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #8
  %156 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %156, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #8
  %157 = load ptr, ptr %31, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %33, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !11
  %158 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 0
  %159 = load double, ptr %158, align 16
  %160 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 1
  %161 = load double, ptr %160, align 8
  %162 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %157, double %159, double %161)
  store float %162, ptr %32, align 4, !tbaa !15
  %163 = load float, ptr %32, align 4, !tbaa !15
  %164 = load float, ptr %25, align 4, !tbaa !15
  %165 = fcmp ogt float %163, %164
  br i1 %165, label %166, label %184

166:                                              ; preds = %155
  %167 = load float, ptr %32, align 4, !tbaa !15
  store float %167, ptr %25, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 16, ptr %34) #8
  %168 = load ptr, ptr %31, align 8, !tbaa !5
  %169 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %168)
  %170 = getelementptr inbounds %"class.JPH::Vec3", ptr %34, i32 0, i32 0
  %171 = getelementptr inbounds %union.anon.6, ptr %170, i32 0, i32 0
  %172 = getelementptr inbounds { double, double }, ptr %171, i32 0, i32 0
  %173 = extractvalue { double, double } %169, 0
  store double %173, ptr %172, align 16
  %174 = getelementptr inbounds { double, double }, ptr %171, i32 0, i32 1
  %175 = extractvalue { double, double } %169, 1
  store double %175, ptr %174, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %34, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #8
  %176 = load ptr, ptr %31, align 8, !tbaa !5
  %177 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 7
  %178 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %177)
  %179 = ptrtoint ptr %176 to i64
  %180 = ptrtoint ptr %178 to i64
  %181 = sub i64 %179, %180
  %182 = sdiv exact i64 %181, 16
  %183 = trunc i64 %182 to i32
  store i32 %183, ptr %27, align 4, !tbaa !9
  br label %184

184:                                              ; preds = %166, %155
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #8
  br label %185

185:                                              ; preds = %184
  %186 = load ptr, ptr %29, align 8, !tbaa !5
  %187 = getelementptr inbounds %"class.JPH::Plane", ptr %186, i32 1
  store ptr %187, ptr %29, align 8, !tbaa !5
  br label %150

188:                                              ; preds = %154
  br label %279

189:                                              ; preds = %116
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #8
  store i32 0, ptr %35, align 4, !tbaa !9
  br label %190

190:                                              ; preds = %275, %189
  %191 = load i32, ptr %35, align 4, !tbaa !9
  %192 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 7
  %193 = call noundef i64 @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %192)
  %194 = trunc i64 %193 to i32
  %195 = icmp ult i32 %191, %194
  br i1 %195, label %197, label %196

196:                                              ; preds = %190
  store i32 7, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #8
  br label %278

197:                                              ; preds = %190
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #8
  %198 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 7
  %199 = load i32, ptr %35, align 4, !tbaa !9
  %200 = zext i32 %199 to i64
  %201 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %198, i64 noundef %200)
  %202 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %201)
  %203 = getelementptr inbounds %"class.JPH::Vec3", ptr %38, i32 0, i32 0
  %204 = getelementptr inbounds %union.anon.6, ptr %203, i32 0, i32 0
  %205 = getelementptr inbounds { double, double }, ptr %204, i32 0, i32 0
  %206 = extractvalue { double, double } %202, 0
  store double %206, ptr %205, align 16
  %207 = getelementptr inbounds { double, double }, ptr %204, i32 0, i32 1
  %208 = extractvalue { double, double } %202, 1
  store double %208, ptr %207, align 8
  %209 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 0
  %210 = load double, ptr %209, align 16
  %211 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 1
  %212 = load double, ptr %211, align 8
  %213 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %15, double %210, double %212)
  %214 = getelementptr inbounds %"class.JPH::Vec3", ptr %37, i32 0, i32 0
  %215 = getelementptr inbounds %union.anon.6, ptr %214, i32 0, i32 0
  %216 = getelementptr inbounds { double, double }, ptr %215, i32 0, i32 0
  %217 = extractvalue { double, double } %213, 0
  store double %217, ptr %216, align 16
  %218 = getelementptr inbounds { double, double }, ptr %215, i32 0, i32 1
  %219 = extractvalue { double, double } %213, 1
  store double %219, ptr %218, align 8
  %220 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %37)
  %221 = getelementptr inbounds %"class.JPH::Vec3", ptr %36, i32 0, i32 0
  %222 = getelementptr inbounds %union.anon.6, ptr %221, i32 0, i32 0
  %223 = getelementptr inbounds { double, double }, ptr %222, i32 0, i32 0
  %224 = extractvalue { double, double } %220, 0
  store double %224, ptr %223, align 16
  %225 = getelementptr inbounds { double, double }, ptr %222, i32 0, i32 1
  %226 = extractvalue { double, double } %220, 1
  store double %226, ptr %225, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #8
  %227 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 5
  %228 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 8
  %229 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 6
  %230 = load i32, ptr %35, align 4, !tbaa !9
  %231 = zext i32 %230 to i64
  %232 = call noundef nonnull align 2 dereferenceable(4) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %229, i64 noundef %231)
  %233 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Face", ptr %232, i32 0, i32 0
  %234 = load i16, ptr %233, align 2, !tbaa !20
  %235 = zext i16 %234 to i64
  %236 = call noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %228, i64 noundef %235)
  %237 = load i8, ptr %236, align 1, !tbaa !12
  %238 = zext i8 %237 to i64
  %239 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %227, i64 noundef %238)
  %240 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %239, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %40, ptr align 16 %240, i64 16, i1 false), !tbaa.struct !11
  %241 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 0
  %242 = load double, ptr %241, align 16
  %243 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 1
  %244 = load double, ptr %243, align 8
  %245 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %242, double %244)
  %246 = getelementptr inbounds %"class.JPH::Vec3", ptr %39, i32 0, i32 0
  %247 = getelementptr inbounds %union.anon.6, ptr %246, i32 0, i32 0
  %248 = getelementptr inbounds { double, double }, ptr %247, i32 0, i32 0
  %249 = extractvalue { double, double } %245, 0
  store double %249, ptr %248, align 16
  %250 = getelementptr inbounds { double, double }, ptr %247, i32 0, i32 1
  %251 = extractvalue { double, double } %245, 1
  store double %251, ptr %250, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %43, ptr align 16 %39, i64 16, i1 false), !tbaa.struct !11
  %252 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 0
  %253 = load double, ptr %252, align 16
  %254 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 1
  %255 = load double, ptr %254, align 8
  %256 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %253, double %255)
  %257 = getelementptr inbounds %"class.JPH::Vec3", ptr %42, i32 0, i32 0
  %258 = getelementptr inbounds %union.anon.6, ptr %257, i32 0, i32 0
  %259 = getelementptr inbounds { double, double }, ptr %258, i32 0, i32 0
  %260 = extractvalue { double, double } %256, 0
  store double %260, ptr %259, align 16
  %261 = getelementptr inbounds { double, double }, ptr %258, i32 0, i32 1
  %262 = extractvalue { double, double } %256, 1
  store double %262, ptr %261, align 8
  %263 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 0
  %264 = load double, ptr %263, align 16
  %265 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 1
  %266 = load double, ptr %265, align 8
  %267 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %36, double %264, double %266)
  store float %267, ptr %41, align 4, !tbaa !15
  %268 = load float, ptr %41, align 4, !tbaa !15
  %269 = load float, ptr %25, align 4, !tbaa !15
  %270 = fcmp ogt float %268, %269
  br i1 %270, label %271, label %274

271:                                              ; preds = %197
  %272 = load float, ptr %41, align 4, !tbaa !15
  store float %272, ptr %25, align 4, !tbaa !15
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %36, i64 16, i1 false), !tbaa.struct !11
  %273 = load i32, ptr %35, align 4, !tbaa !9
  store i32 %273, ptr %27, align 4, !tbaa !9
  br label %274

274:                                              ; preds = %271, %197
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #8
  br label %275

275:                                              ; preds = %274
  %276 = load i32, ptr %35, align 4, !tbaa !9
  %277 = add i32 %276, 1
  store i32 %277, ptr %35, align 4, !tbaa !9
  br label %190, !llvm.loop !23

278:                                              ; preds = %196
  br label %279

279:                                              ; preds = %278, %188
  call void @llvm.lifetime.start.p0(i64 1, ptr %44) #8
  %280 = load float, ptr %25, align 4, !tbaa !15
  %281 = fcmp ogt float %280, 0.000000e+00
  %282 = zext i1 %281 to i8
  store i8 %282, ptr %44, align 1, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #8
  %283 = load float, ptr %25, align 4, !tbaa !15
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %284 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %285 = load double, ptr %284, align 16
  %286 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %287 = load double, ptr %286, align 8
  %288 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %283, double %285, double %287)
  %289 = getelementptr inbounds %"class.JPH::Vec3", ptr %46, i32 0, i32 0
  %290 = getelementptr inbounds %union.anon.6, ptr %289, i32 0, i32 0
  %291 = getelementptr inbounds { double, double }, ptr %290, i32 0, i32 0
  %292 = extractvalue { double, double } %288, 0
  store double %292, ptr %291, align 16
  %293 = getelementptr inbounds { double, double }, ptr %290, i32 0, i32 1
  %294 = extractvalue { double, double } %288, 1
  store double %294, ptr %293, align 8
  %295 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 0
  %296 = load double, ptr %295, align 16
  %297 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 1
  %298 = load double, ptr %297, align 8
  %299 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %296, double %298)
  %300 = getelementptr inbounds %"class.JPH::Vec3", ptr %45, i32 0, i32 0
  %301 = getelementptr inbounds %union.anon.6, ptr %300, i32 0, i32 0
  %302 = getelementptr inbounds { double, double }, ptr %301, i32 0, i32 0
  %303 = extractvalue { double, double } %299, 0
  store double %303, ptr %302, align 16
  %304 = getelementptr inbounds { double, double }, ptr %301, i32 0, i32 1
  %305 = extractvalue { double, double } %299, 1
  store double %305, ptr %304, align 8
  %306 = load i8, ptr %44, align 1, !tbaa !13, !range !18, !noundef !19
  %307 = trunc i8 %306 to i1
  br i1 %307, label %308, label %476

308:                                              ; preds = %279
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #8
  store float 0x47EFFFFFE0000000, ptr %48, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #8
  %309 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 6
  %310 = load i32, ptr %27, align 4, !tbaa !9
  %311 = zext i32 %310 to i64
  %312 = call noundef nonnull align 2 dereferenceable(4) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %309, i64 noundef %311)
  store ptr %312, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  %313 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 8
  %314 = load ptr, ptr %49, align 8, !tbaa !5
  %315 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Face", ptr %314, i32 0, i32 0
  %316 = load i16, ptr %315, align 2, !tbaa !20
  %317 = zext i16 %316 to i64
  %318 = call noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %313, i64 noundef %317)
  store ptr %318, ptr %50, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #8
  %319 = load ptr, ptr %50, align 8, !tbaa !5
  store ptr %319, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  %320 = load ptr, ptr %50, align 8, !tbaa !5
  %321 = load ptr, ptr %49, align 8, !tbaa !5
  %322 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Face", ptr %321, i32 0, i32 1
  %323 = load i16, ptr %322, align 2, !tbaa !25
  %324 = zext i16 %323 to i32
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds i8, ptr %320, i64 %325
  store ptr %326, ptr %52, align 8, !tbaa !5
  br label %327

327:                                              ; preds = %472, %308
  %328 = load ptr, ptr %51, align 8, !tbaa !5
  %329 = load ptr, ptr %52, align 8, !tbaa !5
  %330 = icmp ult ptr %328, %329
  br i1 %330, label %332, label %331

331:                                              ; preds = %327
  store i32 10, ptr %22, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  br label %475

332:                                              ; preds = %327
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #8
  %333 = load ptr, ptr %51, align 8, !tbaa !5
  %334 = getelementptr inbounds i8, ptr %333, i64 1
  store ptr %334, ptr %53, align 8, !tbaa !5
  %335 = load ptr, ptr %53, align 8, !tbaa !5
  %336 = load ptr, ptr %52, align 8, !tbaa !5
  %337 = icmp eq ptr %335, %336
  br i1 %337, label %338, label %340

338:                                              ; preds = %332
  %339 = load ptr, ptr %50, align 8, !tbaa !5
  store ptr %339, ptr %53, align 8, !tbaa !5
  br label %340

340:                                              ; preds = %338, %332
  call void @llvm.lifetime.start.p0(i64 16, ptr %54) #8
  %341 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 5
  %342 = load ptr, ptr %51, align 8, !tbaa !5
  %343 = load i8, ptr %342, align 1, !tbaa !12
  %344 = zext i8 %343 to i64
  %345 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %341, i64 noundef %344)
  %346 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %345, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %55, ptr align 16 %346, i64 16, i1 false), !tbaa.struct !11
  %347 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 0
  %348 = load double, ptr %347, align 16
  %349 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 1
  %350 = load double, ptr %349, align 8
  %351 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %348, double %350)
  %352 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %353 = getelementptr inbounds %union.anon.6, ptr %352, i32 0, i32 0
  %354 = getelementptr inbounds { double, double }, ptr %353, i32 0, i32 0
  %355 = extractvalue { double, double } %351, 0
  store double %355, ptr %354, align 16
  %356 = getelementptr inbounds { double, double }, ptr %353, i32 0, i32 1
  %357 = extractvalue { double, double } %351, 1
  store double %357, ptr %356, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %56) #8
  %358 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %85, i32 0, i32 5
  %359 = load ptr, ptr %53, align 8, !tbaa !5
  %360 = load i8, ptr %359, align 1, !tbaa !12
  %361 = zext i8 %360 to i64
  %362 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %358, i64 noundef %361)
  %363 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %362, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %57, ptr align 16 %363, i64 16, i1 false), !tbaa.struct !11
  %364 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 0
  %365 = load double, ptr %364, align 16
  %366 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 1
  %367 = load double, ptr %366, align 8
  %368 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %365, double %367)
  %369 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %370 = getelementptr inbounds %union.anon.6, ptr %369, i32 0, i32 0
  %371 = getelementptr inbounds { double, double }, ptr %370, i32 0, i32 0
  %372 = extractvalue { double, double } %368, 0
  store double %372, ptr %371, align 16
  %373 = getelementptr inbounds { double, double }, ptr %370, i32 0, i32 1
  %374 = extractvalue { double, double } %368, 1
  store double %374, ptr %373, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %58) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %60, ptr align 16 %54, i64 16, i1 false), !tbaa.struct !11
  %375 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %376 = load double, ptr %375, align 16
  %377 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %378 = load double, ptr %377, align 8
  %379 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %376, double %378)
  %380 = getelementptr inbounds %"class.JPH::Vec3", ptr %59, i32 0, i32 0
  %381 = getelementptr inbounds %union.anon.6, ptr %380, i32 0, i32 0
  %382 = getelementptr inbounds { double, double }, ptr %381, i32 0, i32 0
  %383 = extractvalue { double, double } %379, 0
  store double %383, ptr %382, align 16
  %384 = getelementptr inbounds { double, double }, ptr %381, i32 0, i32 1
  %385 = extractvalue { double, double } %379, 1
  store double %385, ptr %384, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %61, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %386 = getelementptr inbounds { double, double }, ptr %61, i32 0, i32 0
  %387 = load double, ptr %386, align 16
  %388 = getelementptr inbounds { double, double }, ptr %61, i32 0, i32 1
  %389 = load double, ptr %388, align 8
  %390 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %59, double %387, double %389)
  %391 = getelementptr inbounds %"class.JPH::Vec3", ptr %58, i32 0, i32 0
  %392 = getelementptr inbounds %union.anon.6, ptr %391, i32 0, i32 0
  %393 = getelementptr inbounds { double, double }, ptr %392, i32 0, i32 0
  %394 = extractvalue { double, double } %390, 0
  store double %394, ptr %393, align 16
  %395 = getelementptr inbounds { double, double }, ptr %392, i32 0, i32 1
  %396 = extractvalue { double, double } %390, 1
  store double %396, ptr %395, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #8
  %397 = load float, ptr %18, align 4, !tbaa !15
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %63, ptr align 16 %54, i64 16, i1 false), !tbaa.struct !11
  %398 = getelementptr inbounds { double, double }, ptr %63, i32 0, i32 0
  %399 = load double, ptr %398, align 16
  %400 = getelementptr inbounds { double, double }, ptr %63, i32 0, i32 1
  %401 = load double, ptr %400, align 8
  %402 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %399, double %401)
  %403 = getelementptr inbounds %"class.JPH::Vec3", ptr %62, i32 0, i32 0
  %404 = getelementptr inbounds %union.anon.6, ptr %403, i32 0, i32 0
  %405 = getelementptr inbounds { double, double }, ptr %404, i32 0, i32 0
  %406 = extractvalue { double, double } %402, 0
  store double %406, ptr %405, align 16
  %407 = getelementptr inbounds { double, double }, ptr %404, i32 0, i32 1
  %408 = extractvalue { double, double } %402, 1
  store double %408, ptr %407, align 8
  %409 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 0
  %410 = load double, ptr %409, align 16
  %411 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 1
  %412 = load double, ptr %411, align 8
  %413 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %58, double %410, double %412)
  %414 = fmul float %397, %413
  %415 = fcmp ogt float %414, 0.000000e+00
  br i1 %415, label %416, label %471

416:                                              ; preds = %340
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %67, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !11
  %417 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 0
  %418 = load double, ptr %417, align 16
  %419 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 1
  %420 = load double, ptr %419, align 8
  %421 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %54, double %418, double %420)
  %422 = getelementptr inbounds %"class.JPH::Vec3", ptr %66, i32 0, i32 0
  %423 = getelementptr inbounds %union.anon.6, ptr %422, i32 0, i32 0
  %424 = getelementptr inbounds { double, double }, ptr %423, i32 0, i32 0
  %425 = extractvalue { double, double } %421, 0
  store double %425, ptr %424, align 16
  %426 = getelementptr inbounds { double, double }, ptr %423, i32 0, i32 1
  %427 = extractvalue { double, double } %421, 1
  store double %427, ptr %426, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !11
  %428 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 0
  %429 = load double, ptr %428, align 16
  %430 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 1
  %431 = load double, ptr %430, align 8
  %432 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %429, double %431)
  %433 = getelementptr inbounds %"class.JPH::Vec3", ptr %68, i32 0, i32 0
  %434 = getelementptr inbounds %union.anon.6, ptr %433, i32 0, i32 0
  %435 = getelementptr inbounds { double, double }, ptr %434, i32 0, i32 0
  %436 = extractvalue { double, double } %432, 0
  store double %436, ptr %435, align 16
  %437 = getelementptr inbounds { double, double }, ptr %434, i32 0, i32 1
  %438 = extractvalue { double, double } %432, 1
  store double %438, ptr %437, align 8
  %439 = getelementptr inbounds { double, double }, ptr %66, i32 0, i32 0
  %440 = load double, ptr %439, align 16
  %441 = getelementptr inbounds { double, double }, ptr %66, i32 0, i32 1
  %442 = load double, ptr %441, align 8
  %443 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %444 = load double, ptr %443, align 16
  %445 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %446 = load double, ptr %445, align 8
  %447 = call { double, double } @_ZN3JPH12ClosestPoint21GetClosestPointOnLineENS_4Vec3ES1_Rj(double %440, double %442, double %444, double %446, ptr noundef nonnull align 4 dereferenceable(4) %64)
  %448 = getelementptr inbounds %"class.JPH::Vec3", ptr %65, i32 0, i32 0
  %449 = getelementptr inbounds %union.anon.6, ptr %448, i32 0, i32 0
  %450 = getelementptr inbounds { double, double }, ptr %449, i32 0, i32 0
  %451 = extractvalue { double, double } %447, 0
  store double %451, ptr %450, align 16
  %452 = getelementptr inbounds { double, double }, ptr %449, i32 0, i32 1
  %453 = extractvalue { double, double } %447, 1
  store double %453, ptr %452, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #8
  %454 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %65)
  store float %454, ptr %70, align 4, !tbaa !15
  %455 = load float, ptr %70, align 4, !tbaa !15
  %456 = load float, ptr %48, align 4, !tbaa !15
  %457 = fcmp olt float %455, %456
  br i1 %457, label %458, label %470

458:                                              ; preds = %416
  call void @llvm.lifetime.start.p0(i64 16, ptr %71) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %72, ptr align 16 %65, i64 16, i1 false), !tbaa.struct !11
  %459 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 0
  %460 = load double, ptr %459, align 16
  %461 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 1
  %462 = load double, ptr %461, align 8
  %463 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %460, double %462)
  %464 = getelementptr inbounds %"class.JPH::Vec3", ptr %71, i32 0, i32 0
  %465 = getelementptr inbounds %union.anon.6, ptr %464, i32 0, i32 0
  %466 = getelementptr inbounds { double, double }, ptr %465, i32 0, i32 0
  %467 = extractvalue { double, double } %463, 0
  store double %467, ptr %466, align 16
  %468 = getelementptr inbounds { double, double }, ptr %465, i32 0, i32 1
  %469 = extractvalue { double, double } %463, 1
  store double %469, ptr %468, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %45, ptr align 16 %71, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #8
  br label %470

470:                                              ; preds = %458, %416
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #8
  br label %471

471:                                              ; preds = %470, %340
  call void @llvm.lifetime.end.p0(i64 16, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #8
  br label %472

472:                                              ; preds = %471
  %473 = load ptr, ptr %51, align 8, !tbaa !5
  %474 = getelementptr inbounds i8, ptr %473, i32 1
  store ptr %474, ptr %51, align 8, !tbaa !5
  br label %327, !llvm.loop !26

475:                                              ; preds = %331
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #8
  br label %476

476:                                              ; preds = %475, %279
  call void @llvm.lifetime.start.p0(i64 16, ptr %73) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %74, ptr align 16 %45, i64 16, i1 false), !tbaa.struct !11
  %477 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 0
  %478 = load double, ptr %477, align 16
  %479 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 1
  %480 = load double, ptr %479, align 8
  %481 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %23, double %478, double %480)
  %482 = getelementptr inbounds %"class.JPH::Vec3", ptr %73, i32 0, i32 0
  %483 = getelementptr inbounds %union.anon.6, ptr %482, i32 0, i32 0
  %484 = getelementptr inbounds { double, double }, ptr %483, i32 0, i32 0
  %485 = extractvalue { double, double } %481, 0
  store double %485, ptr %484, align 16
  %486 = getelementptr inbounds { double, double }, ptr %483, i32 0, i32 1
  %487 = extractvalue { double, double } %481, 1
  store double %487, ptr %486, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %75) #8
  %488 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %73)
  store float %488, ptr %75, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr %76) #8
  %489 = load float, ptr %75, align 4, !tbaa !15
  store float %489, ptr %76, align 4, !tbaa !15
  %490 = load i8, ptr %44, align 1, !tbaa !13, !range !18, !noundef !19
  %491 = trunc i8 %490 to i1
  br i1 %491, label %492, label %495

492:                                              ; preds = %476
  %493 = load float, ptr %76, align 4, !tbaa !15
  %494 = fneg float %493
  store float %494, ptr %76, align 4, !tbaa !15
  br label %503

495:                                              ; preds = %476
  call void @llvm.lifetime.start.p0(i64 16, ptr %77) #8
  %496 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %73)
  %497 = getelementptr inbounds %"class.JPH::Vec3", ptr %77, i32 0, i32 0
  %498 = getelementptr inbounds %union.anon.6, ptr %497, i32 0, i32 0
  %499 = getelementptr inbounds { double, double }, ptr %498, i32 0, i32 0
  %500 = extractvalue { double, double } %496, 0
  store double %500, ptr %499, align 16
  %501 = getelementptr inbounds { double, double }, ptr %498, i32 0, i32 1
  %502 = extractvalue { double, double } %496, 1
  store double %502, ptr %501, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %73, ptr align 16 %77, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %77) #8
  br label %503

503:                                              ; preds = %495, %492
  %504 = load float, ptr %76, align 4, !tbaa !15
  %505 = call noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIterator17UpdatePenetrationEf(ptr noundef nonnull align 8 dereferenceable(80) %20, float noundef %504)
  br i1 %505, label %506, label %546

506:                                              ; preds = %503
  call void @llvm.lifetime.start.p0(i64 16, ptr %78) #8
  %507 = load float, ptr %75, align 4, !tbaa !15
  %508 = fcmp ogt float %507, 0.000000e+00
  br i1 %508, label %509, label %518

509:                                              ; preds = %506
  %510 = load float, ptr %75, align 4, !tbaa !15
  %511 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %73, float noundef %510)
  %512 = getelementptr inbounds %"class.JPH::Vec3", ptr %78, i32 0, i32 0
  %513 = getelementptr inbounds %union.anon.6, ptr %512, i32 0, i32 0
  %514 = getelementptr inbounds { double, double }, ptr %513, i32 0, i32 0
  %515 = extractvalue { double, double } %511, 0
  store double %515, ptr %514, align 16
  %516 = getelementptr inbounds { double, double }, ptr %513, i32 0, i32 1
  %517 = extractvalue { double, double } %511, 1
  store double %517, ptr %516, align 8
  br label %519

518:                                              ; preds = %506
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %78, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  br label %519

519:                                              ; preds = %518, %509
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %73, ptr align 16 %78, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %78) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %79) #8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %80, ptr align 16 %45, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %81, ptr align 16 %73, i64 16, i1 false), !tbaa.struct !11
  %520 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 0
  %521 = load double, ptr %520, align 16
  %522 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 1
  %523 = load double, ptr %522, align 8
  %524 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 0
  %525 = load double, ptr %524, align 16
  %526 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 1
  %527 = load double, ptr %526, align 8
  %528 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %521, double %523, double %525, double %527)
  %529 = getelementptr inbounds %"class.JPH::Plane", ptr %79, i32 0, i32 0
  %530 = getelementptr inbounds %"class.JPH::Vec4", ptr %529, i32 0, i32 0
  %531 = getelementptr inbounds %union.anon.7, ptr %530, i32 0, i32 0
  %532 = getelementptr inbounds { double, double }, ptr %531, i32 0, i32 0
  %533 = extractvalue { double, double } %528, 0
  store double %533, ptr %532, align 16
  %534 = getelementptr inbounds { double, double }, ptr %531, i32 0, i32 1
  %535 = extractvalue { double, double } %528, 1
  store double %535, ptr %534, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %82) #8
  %536 = load ptr, ptr %10, align 8, !tbaa !5
  %537 = call { double, double } @_ZNK3JPH5Plane14GetTransformedERKNS_5Mat44E(ptr noundef nonnull align 16 dereferenceable(16) %79, ptr noundef nonnull align 16 dereferenceable(64) %536)
  %538 = getelementptr inbounds %"class.JPH::Plane", ptr %82, i32 0, i32 0
  %539 = getelementptr inbounds %"class.JPH::Vec4", ptr %538, i32 0, i32 0
  %540 = getelementptr inbounds %union.anon.7, ptr %539, i32 0, i32 0
  %541 = getelementptr inbounds { double, double }, ptr %540, i32 0, i32 0
  %542 = extractvalue { double, double } %537, 0
  store double %542, ptr %541, align 16
  %543 = getelementptr inbounds { double, double }, ptr %540, i32 0, i32 1
  %544 = extractvalue { double, double } %537, 1
  store double %544, ptr %543, align 8
  %545 = load i32, ptr %13, align 4, !tbaa !9
  call void @_ZNK3JPH29CollideSoftBodyVertexIterator12SetCollisionERKNS_5PlaneEi(ptr noundef nonnull align 8 dereferenceable(80) %20, ptr noundef nonnull align 16 dereferenceable(16) %82, i32 noundef %545)
  call void @llvm.lifetime.end.p0(i64 16, ptr %82) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #8
  br label %546

546:                                              ; preds = %519, %503
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %75) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %73) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #8
  br label %547

547:                                              ; preds = %546, %113
  br label %548

548:                                              ; preds = %547
  %549 = call noundef nonnull align 8 dereferenceable(80) ptr @_ZN3JPH29CollideSoftBodyVertexIteratorppEv(ptr noundef nonnull align 8 dereferenceable(80) %20)
  br label %110, !llvm.loop !27

550:                                              ; preds = %112
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 64, ptr %14) #8
  ret void
}

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(64)) #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH29CollideSoftBodyVertexIteratorplEi(ptr dead_on_unwind noalias writable sret(%"class.JPH::CollideSoftBodyVertexIterator") align 8, ptr noundef nonnull align 8 dereferenceable(80), i32 noundef) #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIteratorneERKS0_(ptr noundef nonnull align 8 dereferenceable(80), ptr noundef nonnull align 8 dereferenceable(80)) #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH29CollideSoftBodyVertexIterator10GetInvMassEv(ptr noundef nonnull align 8 dereferenceable(80)) #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH29CollideSoftBodyVertexIterator11GetPositionEv(ptr noundef nonnull align 8 dereferenceable(80)) #3 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH12ClosestPoint21GetClosestPointOnLineENS_4Vec3ES1_Rj(double, double, double, double, ptr noundef nonnull align 4 dereferenceable(4)) #6

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIterator17UpdatePenetrationEf(ptr noundef nonnull align 8 dereferenceable(80), float noundef) #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH29CollideSoftBodyVertexIterator12SetCollisionERKNS_5PlaneEi(ptr noundef nonnull align 8 dereferenceable(80), ptr noundef nonnull align 16 dereferenceable(16), i32 noundef) #3 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(80) ptr @_ZN3JPH29CollideSoftBodyVertexIteratorppEv(ptr noundef nonnull align 8 dereferenceable(80)) #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 = { 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 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { 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 = !{!"int", !7, i64 0}
!11 = !{i64 0, i64 16, !12}
!12 = !{!7, !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"bool", !7, i64 0}
!15 = !{!16, !16, i64 0}
!16 = !{!"float", !7, i64 0}
!17 = !{i64 0, i64 8, !5, i64 8, i64 4, !9, i64 16, i64 8, !5, i64 24, i64 4, !9, i64 32, i64 8, !5, i64 40, i64 4, !9, i64 48, i64 8, !5, i64 56, i64 4, !9, i64 64, i64 8, !5, i64 72, i64 4, !9}
!18 = !{i8 0, i8 2}
!19 = !{}
!20 = !{!21, !22, i64 0}
!21 = !{!"_ZTSN3JPH15ConvexHullShape4FaceE", !22, i64 0, !22, i64 2}
!22 = !{!"short", !7, i64 0}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!21, !22, i64 2}
!26 = distinct !{!26, !24}
!27 = distinct !{!27, !24}


; 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.6 }
%union.anon.6 = type { <4 x float> }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }
%"class.JPH::CollideSoftBodyVertexIterator" = type { %"class.JPH::StridedPtr", %"class.JPH::StridedPtr.32", %"class.JPH::StridedPtr.34", %"class.JPH::StridedPtr.36", %"class.JPH::StridedPtr.38" }
%"class.JPH::StridedPtr" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.32" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.34" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.36" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::StridedPtr.38" = type <{ ptr, i32, [4 x i8] }>
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double, double, double, double) local_unnamed_addr #3 align 2

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

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

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

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

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

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

; Function Attrs: 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 noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #4 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double, double) local_unnamed_addr #6

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 2 dereferenceable(4) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsInsideOutENS_4Vec3E(double, double) local_unnamed_addr #6

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() 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 } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) local_unnamed_addr #1

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_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 @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #7 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZNK3JPH15ConvexHullShape23CollideSoftBodyVerticesERKNS_5Mat44ENS_4Vec3ERKNS_29CollideSoftBodyVertexIteratorEji(ptr noundef nonnull align 16 dereferenceable(272) %0, ptr noundef nonnull align 16 dereferenceable(64) %1, double %2, double %3, ptr noundef nonnull align 8 dereferenceable(80) %4, i32 noundef %5, i32 noundef %6) unnamed_addr #3 align 2 {
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Mat44", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca %"class.JPH::CollideSoftBodyVertexIterator", align 8
  %12 = alloca %"class.JPH::CollideSoftBodyVertexIterator", align 8
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca %"class.JPH::Vec3", align 16
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca i32, align 4
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca %"class.JPH::Vec3", align 16
  %23 = alloca %"class.JPH::Plane", align 16
  %24 = alloca %"class.JPH::Plane", align 16
  store double %2, ptr %8, align 16
  %25 = getelementptr inbounds i8, ptr %8, i64 8
  store double %3, ptr %25, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %9) #8
  call void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %9, ptr noundef nonnull align 16 dereferenceable(64) %1)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #8
  %26 = call { double, double } @_ZNK3JPH4Vec310ReciprocalEv(ptr noundef nonnull align 16 dereferenceable(16) %8)
  %27 = extractvalue { double, double } %26, 0
  store double %27, ptr %10, align 16
  %28 = getelementptr inbounds i8, ptr %10, i64 8
  %29 = extractvalue { double, double } %26, 1
  store double %29, ptr %28, align 8
  %.sroa.0102.0.copyload = load double, ptr %8, align 16
  %.sroa.2103.0.copyload = load double, ptr %25, align 8, !tbaa !5
  %30 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %.sroa.0102.0.copyload, double %.sroa.2103.0.copyload)
  %.sroa.099.0.copyload = load double, ptr %8, align 16
  %.sroa.2100.0.copyload = load double, ptr %25, align 8, !tbaa !5
  %31 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsInsideOutENS_4Vec3E(double %.sroa.099.0.copyload, double %.sroa.2100.0.copyload)
  call void @llvm.lifetime.start.p0(i64 80, ptr nonnull %11) #8
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(80) %11, ptr noundef nonnull align 8 dereferenceable(80) %4, i64 80, i1 false), !tbaa.struct !8
  call void @llvm.lifetime.start.p0(i64 80, ptr nonnull %12) #8
  call void @_ZNK3JPH29CollideSoftBodyVertexIteratorplEi(ptr dead_on_unwind nonnull writable sret(%"class.JPH::CollideSoftBodyVertexIterator") align 8 %12, ptr noundef nonnull align 8 dereferenceable(80) %4, i32 noundef %5)
  %32 = call noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIteratorneERKS0_(ptr noundef nonnull align 8 dereferenceable(80) %11, ptr noundef nonnull align 8 dereferenceable(80) %12)
  br i1 %32, label %.lr.ph154, label %._crit_edge

.lr.ph154:                                        ; preds = %7
  %33 = getelementptr inbounds i8, ptr %13, i64 8
  %34 = getelementptr inbounds i8, ptr %0, i64 208
  %35 = getelementptr inbounds i8, ptr %15, i64 8
  %36 = getelementptr inbounds i8, ptr %14, i64 8
  %37 = getelementptr inbounds i8, ptr %0, i64 160
  %38 = getelementptr inbounds i8, ptr %0, i64 232
  %39 = getelementptr inbounds i8, ptr %0, i64 184
  %40 = getelementptr inbounds i8, ptr %16, i64 8
  %41 = getelementptr inbounds i8, ptr %17, i64 8
  %42 = getelementptr inbounds i8, ptr %19, i64 8
  %43 = getelementptr inbounds i8, ptr %18, i64 8
  %44 = getelementptr inbounds i8, ptr %21, i64 8
  %45 = getelementptr inbounds i8, ptr %22, i64 8
  %46 = getelementptr inbounds i8, ptr %23, i64 8
  %47 = getelementptr inbounds i8, ptr %24, i64 8
  br label %48

._crit_edge:                                      ; preds = %200, %7
  call void @llvm.lifetime.end.p0(i64 80, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 80, ptr nonnull %11) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #8
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %9) #8
  ret void

48:                                               ; preds = %.lr.ph154, %200
  %49 = call noundef float @_ZNK3JPH29CollideSoftBodyVertexIterator10GetInvMassEv(ptr noundef nonnull align 8 dereferenceable(80) %11)
  %50 = fcmp ogt float %49, 0.000000e+00
  br i1 %50, label %51, label %200

51:                                               ; preds = %48
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #8
  %52 = call { double, double } @_ZNK3JPH29CollideSoftBodyVertexIterator11GetPositionEv(ptr noundef nonnull align 8 dereferenceable(80) %11)
  %53 = extractvalue { double, double } %52, 0
  %54 = extractvalue { double, double } %52, 1
  %55 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %9, double %53, double %54)
  %56 = extractvalue { double, double } %55, 0
  store double %56, ptr %13, align 16
  %57 = extractvalue { double, double } %55, 1
  store double %57, ptr %33, align 8
  %58 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %59 = extractvalue { double, double } %58, 0
  %60 = extractvalue { double, double } %58, 1
  br i1 %30, label %63, label %.preheader

.preheader:                                       ; preds = %51
  %61 = call noundef i64 @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %34)
  %62 = and i64 %61, 4294967295
  %.not155 = icmp eq i64 %62, 0
  br i1 %.not155, label %.loopexit127, label %.lr.ph

63:                                               ; preds = %51
  %64 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %34)
  %65 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %34)
  %.not137 = icmp eq ptr %64, %65
  br i1 %.not137, label %.loopexit127, label %.lr.ph143

.lr.ph143:                                        ; preds = %63, %78
  %.0142 = phi float [ %.1, %78 ], [ 0xC7EFFFFFE0000000, %63 ]
  %.sroa.8.0141 = phi double [ %.sroa.8.1, %78 ], [ %60, %63 ]
  %.sroa.092.0140 = phi double [ %.sroa.092.1, %78 ], [ %59, %63 ]
  %.0112139 = phi i32 [ %.1113, %78 ], [ 0, %63 ]
  %.0117138 = phi ptr [ %79, %78 ], [ %64, %63 ]
  %.sroa.078.0.copyload = load double, ptr %13, align 16
  %.sroa.279.0.copyload = load double, ptr %33, align 8, !tbaa !5
  %66 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %.0117138, double %.sroa.078.0.copyload, double %.sroa.279.0.copyload)
  %67 = fcmp ogt float %66, %.0142
  br i1 %67, label %68, label %78

68:                                               ; preds = %.lr.ph143
  %69 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %.0117138)
  %70 = extractvalue { double, double } %69, 0
  %71 = extractvalue { double, double } %69, 1
  %72 = call noundef ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %34)
  %73 = ptrtoint ptr %.0117138 to i64
  %74 = ptrtoint ptr %72 to i64
  %75 = sub i64 %73, %74
  %76 = lshr exact i64 %75, 4
  %77 = trunc i64 %76 to i32
  br label %78

78:                                               ; preds = %68, %.lr.ph143
  %.1113 = phi i32 [ %77, %68 ], [ %.0112139, %.lr.ph143 ]
  %.sroa.092.1 = phi double [ %70, %68 ], [ %.sroa.092.0140, %.lr.ph143 ]
  %.sroa.8.1 = phi double [ %71, %68 ], [ %.sroa.8.0141, %.lr.ph143 ]
  %.1 = phi float [ %66, %68 ], [ %.0142, %.lr.ph143 ]
  %79 = getelementptr inbounds i8, ptr %.0117138, i64 16
  %.not = icmp eq ptr %79, %65
  br i1 %.not, label %.loopexit127, label %.lr.ph143

.lr.ph:                                           ; preds = %.preheader, %107
  %indvars.iv = phi i64 [ %indvars.iv.next, %107 ], [ 0, %.preheader ]
  %.2133 = phi float [ %.3, %107 ], [ 0xC7EFFFFFE0000000, %.preheader ]
  %.sroa.8.2132 = phi double [ %.sroa.8.3, %107 ], [ %60, %.preheader ]
  %.sroa.092.2131 = phi double [ %.sroa.092.3, %107 ], [ %59, %.preheader ]
  %.2114130 = phi i32 [ %.3115, %107 ], [ 0, %.preheader ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #8
  %80 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %34, i64 noundef %indvars.iv)
  %81 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %80)
  %82 = extractvalue { double, double } %81, 0
  %83 = extractvalue { double, double } %81, 1
  %84 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %10, double %82, double %83)
  %85 = extractvalue { double, double } %84, 0
  store double %85, ptr %15, align 16
  %86 = extractvalue { double, double } %84, 1
  store double %86, ptr %35, align 8
  %87 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %15)
  %88 = extractvalue { double, double } %87, 0
  store double %88, ptr %14, align 16
  %89 = extractvalue { double, double } %87, 1
  store double %89, ptr %36, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #8
  %90 = call noundef nonnull align 2 dereferenceable(4) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %39, i64 noundef %indvars.iv)
  %91 = load i16, ptr %90, align 2, !tbaa !13
  %92 = zext i16 %91 to i64
  %93 = call noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %38, i64 noundef %92)
  %94 = load i8, ptr %93, align 1, !tbaa !5
  %95 = zext i8 %94 to i64
  %96 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %37, i64 noundef %95)
  %.sroa.065.0.copyload = load double, ptr %96, align 16
  %.sroa.266.0..sroa_idx = getelementptr inbounds i8, ptr %96, i64 8
  %.sroa.266.0.copyload = load double, ptr %.sroa.266.0..sroa_idx, align 8, !tbaa !5
  %97 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %.sroa.065.0.copyload, double %.sroa.266.0.copyload)
  %98 = extractvalue { double, double } %97, 0
  %99 = extractvalue { double, double } %97, 1
  %100 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %98, double %99)
  %101 = extractvalue { double, double } %100, 0
  %102 = extractvalue { double, double } %100, 1
  %103 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %101, double %102)
  %104 = fcmp ogt float %103, %.2133
  br i1 %104, label %105, label %107

105:                                              ; preds = %.lr.ph
  %.sroa.092.0.copyload = load double, ptr %14, align 16
  %.sroa.8.0.copyload = load double, ptr %36, align 8, !tbaa !5
  %106 = trunc nuw i64 %indvars.iv to i32
  br label %107

107:                                              ; preds = %105, %.lr.ph
  %.3115 = phi i32 [ %106, %105 ], [ %.2114130, %.lr.ph ]
  %.sroa.092.3 = phi double [ %.sroa.092.0.copyload, %105 ], [ %.sroa.092.2131, %.lr.ph ]
  %.sroa.8.3 = phi double [ %.sroa.8.0.copyload, %105 ], [ %.sroa.8.2132, %.lr.ph ]
  %.3 = phi float [ %103, %105 ], [ %.2133, %.lr.ph ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #8
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %108 = call noundef i64 @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %34)
  %109 = and i64 %108, 4294967295
  %110 = icmp ult i64 %indvars.iv.next, %109
  br i1 %110, label %.lr.ph, label %.loopexit127, !llvm.loop !16

.loopexit127:                                     ; preds = %107, %78, %.preheader, %63
  %.4116 = phi i32 [ 0, %63 ], [ 0, %.preheader ], [ %.1113, %78 ], [ %.3115, %107 ]
  %.sroa.092.4 = phi double [ %59, %63 ], [ %59, %.preheader ], [ %.sroa.092.1, %78 ], [ %.sroa.092.3, %107 ]
  %.sroa.8.4 = phi double [ %60, %63 ], [ %60, %.preheader ], [ %.sroa.8.1, %78 ], [ %.sroa.8.3, %107 ]
  %.4 = phi float [ 0xC7EFFFFFE0000000, %63 ], [ 0xC7EFFFFFE0000000, %.preheader ], [ %.1, %78 ], [ %.3, %107 ]
  %111 = fcmp ogt float %.4, 0.000000e+00
  %112 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %.4, double %.sroa.092.4, double %.sroa.8.4)
  %113 = extractvalue { double, double } %112, 0
  %114 = extractvalue { double, double } %112, 1
  %115 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %113, double %114)
  %116 = extractvalue { double, double } %115, 0
  %117 = extractvalue { double, double } %115, 1
  br i1 %111, label %118, label %.loopexit

118:                                              ; preds = %.loopexit127
  %119 = zext i32 %.4116 to i64
  %120 = call noundef nonnull align 2 dereferenceable(4) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %39, i64 noundef %119)
  %121 = load i16, ptr %120, align 2, !tbaa !13
  %122 = zext i16 %121 to i64
  %123 = call noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %38, i64 noundef %122)
  %124 = getelementptr inbounds i8, ptr %120, i64 2
  %125 = load i16, ptr %124, align 2, !tbaa !18
  %126 = zext i16 %125 to i64
  %127 = getelementptr inbounds i8, ptr %123, i64 %126
  %.not156 = icmp eq i16 %125, 0
  br i1 %.not156, label %.loopexit, label %.lr.ph151

.lr.ph151:                                        ; preds = %118, %172
  %.sroa.6.0150 = phi double [ %.sroa.6.2, %172 ], [ %117, %118 ]
  %.sroa.057.0149 = phi double [ %.sroa.057.2, %172 ], [ %116, %118 ]
  %.0120148 = phi ptr [ %128, %172 ], [ %123, %118 ]
  %128 = getelementptr inbounds i8, ptr %.0120148, i64 1
  %129 = icmp eq ptr %128, %127
  %spec.select = select i1 %129, ptr %123, ptr %128
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #8
  %130 = load i8, ptr %.0120148, align 1, !tbaa !5
  %131 = zext i8 %130 to i64
  %132 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %37, i64 noundef %131)
  %.sroa.037.0.copyload = load double, ptr %132, align 16
  %.sroa.238.0..sroa_idx = getelementptr inbounds i8, ptr %132, i64 8
  %.sroa.238.0.copyload = load double, ptr %.sroa.238.0..sroa_idx, align 8, !tbaa !5
  %133 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %.sroa.037.0.copyload, double %.sroa.238.0.copyload)
  %134 = extractvalue { double, double } %133, 0
  store double %134, ptr %16, align 16
  %135 = extractvalue { double, double } %133, 1
  store double %135, ptr %40, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #8
  %136 = load i8, ptr %spec.select, align 1, !tbaa !5
  %137 = zext i8 %136 to i64
  %138 = call noundef nonnull align 16 dereferenceable(32) ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %37, i64 noundef %137)
  %.sroa.035.0.copyload = load double, ptr %138, align 16
  %.sroa.236.0..sroa_idx = getelementptr inbounds i8, ptr %138, i64 8
  %.sroa.236.0.copyload = load double, ptr %.sroa.236.0..sroa_idx, align 8, !tbaa !5
  %139 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %.sroa.035.0.copyload, double %.sroa.236.0.copyload)
  %140 = extractvalue { double, double } %139, 0
  store double %140, ptr %17, align 16
  %141 = extractvalue { double, double } %139, 1
  store double %141, ptr %41, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #8
  %.sroa.033.0.copyload = load double, ptr %16, align 16
  %.sroa.234.0.copyload = load double, ptr %40, align 8, !tbaa !5
  %142 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %17, double %.sroa.033.0.copyload, double %.sroa.234.0.copyload)
  %143 = extractvalue { double, double } %142, 0
  store double %143, ptr %19, align 16
  %144 = extractvalue { double, double } %142, 1
  store double %144, ptr %42, align 8
  %145 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %.sroa.092.4, double %.sroa.8.4)
  %146 = extractvalue { double, double } %145, 0
  store double %146, ptr %18, align 16
  %147 = extractvalue { double, double } %145, 1
  store double %147, ptr %43, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #8
  %.sroa.027.0.copyload = load double, ptr %16, align 16
  %.sroa.228.0.copyload = load double, ptr %40, align 8, !tbaa !5
  %148 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %.sroa.027.0.copyload, double %.sroa.228.0.copyload)
  %149 = extractvalue { double, double } %148, 0
  %150 = extractvalue { double, double } %148, 1
  %151 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %18, double %149, double %150)
  %152 = fneg float %151
  %153 = select i1 %31, float %152, float %151
  %154 = fcmp ogt float %153, 0.000000e+00
  br i1 %154, label %155, label %172

155:                                              ; preds = %.lr.ph151
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %20) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #8
  %.sroa.023.0.copyload = load double, ptr %13, align 16
  %.sroa.224.0.copyload = load double, ptr %33, align 8, !tbaa !5
  %156 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %.sroa.023.0.copyload, double %.sroa.224.0.copyload)
  %157 = extractvalue { double, double } %156, 0
  %158 = extractvalue { double, double } %156, 1
  %.sroa.019.0.copyload = load double, ptr %13, align 16
  %.sroa.220.0.copyload = load double, ptr %33, align 8, !tbaa !5
  %159 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %17, double %.sroa.019.0.copyload, double %.sroa.220.0.copyload)
  %160 = extractvalue { double, double } %159, 0
  %161 = extractvalue { double, double } %159, 1
  %162 = call { double, double } @_ZN3JPH12ClosestPoint21GetClosestPointOnLineENS_4Vec3ES1_Rj(double %157, double %158, double %160, double %161, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %163 = extractvalue { double, double } %162, 0
  store double %163, ptr %21, align 16
  %164 = extractvalue { double, double } %162, 1
  store double %164, ptr %44, align 8
  %165 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %166 = fcmp olt float %165, 0x47EFFFFFE0000000
  br i1 %166, label %167, label %171

167:                                              ; preds = %155
  %.sroa.014.0.copyload = load double, ptr %21, align 16
  %.sroa.215.0.copyload = load double, ptr %44, align 8, !tbaa !5
  %168 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %.sroa.014.0.copyload, double %.sroa.215.0.copyload)
  %169 = extractvalue { double, double } %168, 0
  %170 = extractvalue { double, double } %168, 1
  br label %171

171:                                              ; preds = %167, %155
  %.sroa.057.1 = phi double [ %169, %167 ], [ %.sroa.057.0149, %155 ]
  %.sroa.6.1 = phi double [ %170, %167 ], [ %.sroa.6.0150, %155 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %20) #8
  br label %172

172:                                              ; preds = %171, %.lr.ph151
  %.sroa.057.2 = phi double [ %.sroa.057.1, %171 ], [ %.sroa.057.0149, %.lr.ph151 ]
  %.sroa.6.2 = phi double [ %.sroa.6.1, %171 ], [ %.sroa.6.0150, %.lr.ph151 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #8
  %173 = icmp ult ptr %128, %127
  br i1 %173, label %.lr.ph151, label %.loopexit, !llvm.loop !19

.loopexit:                                        ; preds = %172, %118, %.loopexit127
  %.sroa.057.3 = phi double [ %116, %.loopexit127 ], [ %116, %118 ], [ %.sroa.057.2, %172 ]
  %.sroa.6.3 = phi double [ %117, %.loopexit127 ], [ %117, %118 ], [ %.sroa.6.2, %172 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #8
  %174 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %.sroa.057.3, double %.sroa.6.3)
  %175 = extractvalue { double, double } %174, 0
  store double %175, ptr %22, align 16
  %176 = extractvalue { double, double } %174, 1
  store double %176, ptr %45, align 8
  %177 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %22)
  br i1 %111, label %178, label %180

178:                                              ; preds = %.loopexit
  %179 = fneg float %177
  br label %184

180:                                              ; preds = %.loopexit
  %181 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %22)
  %182 = extractvalue { double, double } %181, 0
  %183 = extractvalue { double, double } %181, 1
  store double %182, ptr %22, align 16
  store double %183, ptr %45, align 8, !tbaa !5
  br label %184

184:                                              ; preds = %180, %178
  %.0118 = phi float [ %179, %178 ], [ %177, %180 ]
  %185 = call noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIterator17UpdatePenetrationEf(ptr noundef nonnull align 8 dereferenceable(80) %11, float noundef %.0118)
  br i1 %185, label %186, label %199

186:                                              ; preds = %184
  %187 = fcmp ogt float %177, 0.000000e+00
  br i1 %187, label %188, label %192

188:                                              ; preds = %186
  %189 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %22, float noundef %177)
  %190 = extractvalue { double, double } %189, 0
  %191 = extractvalue { double, double } %189, 1
  br label %192

192:                                              ; preds = %186, %188
  %.sroa.5.0 = phi double [ %191, %188 ], [ %.sroa.8.4, %186 ]
  %.sroa.03.0 = phi double [ %190, %188 ], [ %.sroa.092.4, %186 ]
  store double %.sroa.03.0, ptr %22, align 16
  store double %.sroa.5.0, ptr %45, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #8
  %193 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.057.3, double %.sroa.6.3, double %.sroa.03.0, double %.sroa.5.0)
  %194 = extractvalue { double, double } %193, 0
  store double %194, ptr %23, align 16
  %195 = extractvalue { double, double } %193, 1
  store double %195, ptr %46, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #8
  %196 = call { double, double } @_ZNK3JPH5Plane14GetTransformedERKNS_5Mat44E(ptr noundef nonnull align 16 dereferenceable(16) %23, ptr noundef nonnull align 16 dereferenceable(64) %1)
  %197 = extractvalue { double, double } %196, 0
  store double %197, ptr %24, align 16
  %198 = extractvalue { double, double } %196, 1
  store double %198, ptr %47, align 8
  call void @_ZNK3JPH29CollideSoftBodyVertexIterator12SetCollisionERKNS_5PlaneEi(ptr noundef nonnull align 8 dereferenceable(80) %11, ptr noundef nonnull align 16 dereferenceable(16) %24, i32 noundef %6)
  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 %199

199:                                              ; preds = %192, %184
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #8
  br label %200

200:                                              ; preds = %48, %199
  %201 = call noundef nonnull align 8 dereferenceable(80) ptr @_ZN3JPH29CollideSoftBodyVertexIteratorppEv(ptr noundef nonnull align 8 dereferenceable(80) %11)
  %202 = call noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIteratorneERKS0_(ptr noundef nonnull align 8 dereferenceable(80) %11, ptr noundef nonnull align 8 dereferenceable(80) %12)
  br i1 %202, label %48, label %._crit_edge, !llvm.loop !20
}

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNK3JPH29CollideSoftBodyVertexIteratorplEi(ptr dead_on_unwind noalias writable sret(%"class.JPH::CollideSoftBodyVertexIterator") align 8, ptr noundef nonnull align 8 dereferenceable(80), i32 noundef) local_unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIteratorneERKS0_(ptr noundef nonnull align 8 dereferenceable(80), ptr noundef nonnull align 8 dereferenceable(80)) local_unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH29CollideSoftBodyVertexIterator10GetInvMassEv(ptr noundef nonnull align 8 dereferenceable(80)) local_unnamed_addr #3 align 2

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 1 dereferenceable(1) ptr @_ZNK3JPH5ArrayIhNS_12STLAllocatorIhEEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #6 align 2

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH29CollideSoftBodyVertexIterator17UpdatePenetrationEf(ptr noundef nonnull align 8 dereferenceable(80), float noundef) local_unnamed_addr #3 align 2

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

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="128" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { 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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{i64 0, i64 8, !9, i64 8, i64 4, !11, i64 16, i64 8, !9, i64 24, i64 4, !11, i64 32, i64 8, !9, i64 40, i64 4, !11, i64 48, i64 8, !9, i64 56, i64 4, !11, i64 64, i64 8, !9, i64 72, i64 4, !11}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !6, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !6, i64 0}
!13 = !{!14, !15, i64 0}
!14 = !{!"_ZTSN3JPH15ConvexHullShape4FaceE", !15, i64 0, !15, i64 2}
!15 = !{!"short", !6, i64 0}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!14, !15, i64 2}
!19 = distinct !{!19, !17}
!20 = distinct !{!20, !17}


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