; 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> }
%"struct.JPH::AssertLastParam" = type { i8 }
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }
%"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::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"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::Point" = type { %"class.JPH::Vec3", i32, [3 x i32] }

@.str.4 = external hidden unnamed_addr constant [101 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [6 x i8], align 1

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

; 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: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef) #3

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16)) #5 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: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #3

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

; Function Attrs: mustprogress uwtable
define dso_local noundef ptr @_ZNK3JPH15ConvexHullShape18GetSupportFunctionENS_11ConvexShape12ESupportModeERNS1_13SupportBufferENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(272) %0, i32 noundef %1, ptr noundef nonnull align 16 dereferenceable(4160) %2, double %3, double %4) unnamed_addr #5 align 2 {
  %6 = alloca ptr, align 8
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca %"struct.JPH::AssertLastParam", align 1
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Vec3", align 16
  %25 = alloca %"class.JPH::Vec3", align 16
  %26 = alloca %"class.JPH::Vec3", align 16
  %27 = alloca %"class.JPH::Plane", align 16
  %28 = alloca %"class.JPH::Plane", align 16
  %29 = alloca %"class.JPH::Plane", align 16
  %30 = alloca %"class.JPH::Plane", align 16
  %31 = alloca %"struct.JPH::AssertLastParam", align 1
  %32 = alloca %"class.JPH::Plane", align 16
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca %"class.JPH::Vec3", align 16
  %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 float, align 4
  %41 = alloca %"class.JPH::Vec3", align 16
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca %"struct.JPH::AssertLastParam", align 1
  %45 = alloca %"class.JPH::Vec3", align 16
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca %"class.JPH::Vec3", align 16
  %51 = alloca %"class.JPH::Vec3", align 16
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca %"class.JPH::Vec3", align 16
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"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::Plane", align 16
  %62 = alloca %"class.JPH::Plane", align 16
  %63 = alloca %"class.JPH::Vec3", align 16
  %64 = alloca %"class.JPH::Vec3", align 16
  %65 = alloca %"class.JPH::Plane", align 16
  %66 = alloca %"class.JPH::Plane", align 16
  %67 = alloca %"class.JPH::Vec3", align 16
  %68 = alloca %"class.JPH::Vec3", align 16
  %69 = alloca %"class.JPH::Plane", align 16
  %70 = alloca %"class.JPH::Vec3", align 16
  %71 = alloca %"class.JPH::Vec3", align 16
  %72 = alloca %"class.JPH::Vec3", align 16
  %73 = alloca %"class.JPH::Plane", align 16
  %74 = alloca %"class.JPH::Plane", align 16
  %75 = alloca %"class.JPH::Vec3", align 16
  %76 = alloca %"class.JPH::Vec3", align 16
  %77 = alloca %"struct.JPH::AssertLastParam", align 1
  %78 = alloca %"class.JPH::Plane", align 16
  %79 = alloca %"class.JPH::Vec3", align 16
  %80 = alloca %"class.JPH::Vec3", align 16
  %81 = alloca %"class.JPH::Vec3", align 16
  %82 = alloca %"class.JPH::Vec3", align 16
  %83 = alloca %"class.JPH::Vec3", align 16
  %84 = alloca %"struct.JPH::AssertLastParam", align 1
  %85 = getelementptr inbounds { double, double }, ptr %7, i32 0, i32 0
  store double %3, ptr %85, align 16
  %86 = getelementptr inbounds { double, double }, ptr %7, i32 0, i32 1
  store double %4, ptr %86, align 8
  store ptr %0, ptr %8, align 8, !tbaa !5
  store i32 %1, ptr %9, align 4, !tbaa !9
  store ptr %2, ptr %10, align 8, !tbaa !5
  %87 = load ptr, ptr %8, align 8
  %88 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %89 = load float, ptr %88, align 16, !tbaa !11
  %90 = fcmp oeq float %89, 0.000000e+00
  br i1 %90, label %91, label %105

91:                                               ; preds = %5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %11, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %92 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 0
  %93 = load double, ptr %92, align 16
  %94 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 1
  %95 = load double, ptr %94, align 8
  %96 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %93, double %95)
  br i1 %96, label %97, label %99

97:                                               ; preds = %91
  %98 = load ptr, ptr %10, align 8, !tbaa !5
  call void @_ZN3JPH15ConvexHullShape14HullWithConvexC2EPKS0_(ptr noundef nonnull align 8 dereferenceable(16) %98, ptr noundef %87)
  store ptr %98, ptr %6, align 8
  br label %684

99:                                               ; preds = %91
  %100 = load ptr, ptr %10, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %101 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  %102 = load double, ptr %101, align 16
  %103 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  %104 = load double, ptr %103, align 8
  call void @_ZN3JPH15ConvexHullShape20HullWithConvexScaledC2EPKS0_NS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %100, ptr noundef %87, double %102, double %104)
  store ptr %100, ptr %6, align 8
  br label %684

105:                                              ; preds = %5
  %106 = load i32, ptr %9, align 4, !tbaa !9
  switch i32 %106, label %678 [
    i32 1, label %107
    i32 2, label %107
    i32 0, label %121
  ]

107:                                              ; preds = %105, %105
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %13, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %108 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 0
  %109 = load double, ptr %108, align 16
  %110 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 1
  %111 = load double, ptr %110, align 8
  %112 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %109, double %111)
  br i1 %112, label %113, label %115

113:                                              ; preds = %107
  %114 = load ptr, ptr %10, align 8, !tbaa !5
  call void @_ZN3JPH15ConvexHullShape14HullWithConvexC2EPKS0_(ptr noundef nonnull align 8 dereferenceable(16) %114, ptr noundef %87)
  store ptr %114, ptr %6, align 8
  br label %684

115:                                              ; preds = %107
  %116 = load ptr, ptr %10, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %14, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %117 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 0
  %118 = load double, ptr %117, align 16
  %119 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 1
  %120 = load double, ptr %119, align 8
  call void @_ZN3JPH15ConvexHullShape20HullWithConvexScaledC2EPKS0_NS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %116, ptr noundef %87, double %118, double %120)
  store ptr %116, ptr %6, align 8
  br label %684

121:                                              ; preds = %105
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %15, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %122 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 0
  %123 = load double, ptr %122, align 16
  %124 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 1
  %125 = load double, ptr %124, align 8
  %126 = call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %123, double %125)
  br i1 %126, label %127, label %351

127:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  %128 = load ptr, ptr %10, align 8, !tbaa !5
  %129 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %130 = load float, ptr %129, align 16, !tbaa !11
  call void @_ZN3JPH15ConvexHullShape12HullNoConvexC2Ef(ptr noundef nonnull align 16 dereferenceable(4128) %128, float noundef %130)
  store ptr %128, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  %131 = load ptr, ptr %16, align 8, !tbaa !5
  %132 = call noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128) %131)
  store ptr %132, ptr %17, align 8, !tbaa !5
  br label %133

133:                                              ; preds = %127
  %134 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 5
  %135 = call noundef i64 @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %134)
  %136 = icmp ule i64 %135, 256
  br i1 %136, label %140, label %137

137:                                              ; preds = %133
  %138 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef @.str.13, ptr noundef @.str.4, i32 noundef 557, ptr noundef @.str.14)
  br i1 %138, label %139, label %140

139:                                              ; preds = %137
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #7, !srcloc !33
  br label %140

140:                                              ; preds = %139, %137, %133
  br label %141

141:                                              ; preds = %140
  br label %142

142:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  %143 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 5
  store ptr %143, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  %144 = load ptr, ptr %19, align 8, !tbaa !5
  %145 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %144)
  store ptr %145, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #7
  %146 = load ptr, ptr %19, align 8, !tbaa !5
  %147 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %146)
  store ptr %147, ptr %21, align 8, !tbaa !5
  br label %148

148:                                              ; preds = %346, %142
  %149 = load ptr, ptr %20, align 8, !tbaa !5
  %150 = load ptr, ptr %21, align 8, !tbaa !5
  %151 = icmp ne ptr %149, %150
  br i1 %151, label %153, label %152

152:                                              ; preds = %148
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  br label %349

153:                                              ; preds = %148
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %154 = load ptr, ptr %20, align 8, !tbaa !5
  store ptr %154, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #7
  %155 = load ptr, ptr %22, align 8, !tbaa !5
  %156 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %155, i32 0, i32 1
  %157 = load i32, ptr %156, align 16, !tbaa !34
  %158 = icmp eq i32 %157, 1
  br i1 %158, label %159, label %196

159:                                              ; preds = %153
  call void @llvm.lifetime.start.p0(i64 16, ptr %24) #7
  %160 = load ptr, ptr %22, align 8, !tbaa !5
  %161 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %160, i32 0, i32 0
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #7
  %162 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %163 = load ptr, ptr %22, align 8, !tbaa !5
  %164 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %163, i32 0, i32 2
  %165 = getelementptr inbounds [3 x i32], ptr %164, i64 0, i64 0
  %166 = load i32, ptr %165, align 4, !tbaa !36
  %167 = sext i32 %166 to i64
  %168 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %162, i64 noundef %167)
  %169 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %168)
  %170 = getelementptr inbounds %"class.JPH::Vec3", ptr %26, 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
  %176 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %177 = load float, ptr %176, align 16, !tbaa !11
  %178 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %177)
  %179 = getelementptr inbounds %"class.JPH::Vec3", ptr %25, i32 0, i32 0
  %180 = getelementptr inbounds %union.anon.6, ptr %179, i32 0, i32 0
  %181 = getelementptr inbounds { double, double }, ptr %180, i32 0, i32 0
  %182 = extractvalue { double, double } %178, 0
  store double %182, ptr %181, align 16
  %183 = getelementptr inbounds { double, double }, ptr %180, i32 0, i32 1
  %184 = extractvalue { double, double } %178, 1
  store double %184, ptr %183, align 8
  %185 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 0
  %186 = load double, ptr %185, align 16
  %187 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 1
  %188 = load double, ptr %187, align 8
  %189 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %161, double %186, double %188)
  %190 = getelementptr inbounds %"class.JPH::Vec3", ptr %24, i32 0, i32 0
  %191 = getelementptr inbounds %union.anon.6, ptr %190, i32 0, i32 0
  %192 = getelementptr inbounds { double, double }, ptr %191, i32 0, i32 0
  %193 = extractvalue { double, double } %189, 0
  store double %193, ptr %192, align 16
  %194 = getelementptr inbounds { double, double }, ptr %191, i32 0, i32 1
  %195 = extractvalue { double, double } %189, 1
  store double %195, ptr %194, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %23, ptr align 16 %24, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #7
  br label %344

196:                                              ; preds = %153
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #7
  %197 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %198 = load ptr, ptr %22, align 8, !tbaa !5
  %199 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %198, i32 0, i32 2
  %200 = getelementptr inbounds [3 x i32], ptr %199, i64 0, i64 0
  %201 = load i32, ptr %200, align 4, !tbaa !36
  %202 = sext i32 %201 to i64
  %203 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %197, i64 noundef %202)
  %204 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %205 = load float, ptr %204, align 16, !tbaa !11
  %206 = fneg float %205
  %207 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %203, float noundef %206)
  %208 = getelementptr inbounds %"class.JPH::Plane", ptr %27, i32 0, i32 0
  %209 = getelementptr inbounds %"class.JPH::Vec4", ptr %208, i32 0, i32 0
  %210 = getelementptr inbounds %union.anon.7, ptr %209, i32 0, i32 0
  %211 = getelementptr inbounds { double, double }, ptr %210, i32 0, i32 0
  %212 = extractvalue { double, double } %207, 0
  store double %212, ptr %211, align 16
  %213 = getelementptr inbounds { double, double }, ptr %210, i32 0, i32 1
  %214 = extractvalue { double, double } %207, 1
  store double %214, ptr %213, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %28) #7
  %215 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %216 = load ptr, ptr %22, align 8, !tbaa !5
  %217 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %216, i32 0, i32 2
  %218 = getelementptr inbounds [3 x i32], ptr %217, i64 0, i64 1
  %219 = load i32, ptr %218, align 4, !tbaa !36
  %220 = sext i32 %219 to i64
  %221 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %215, i64 noundef %220)
  %222 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %223 = load float, ptr %222, align 16, !tbaa !11
  %224 = fneg float %223
  %225 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %221, float noundef %224)
  %226 = getelementptr inbounds %"class.JPH::Plane", ptr %28, i32 0, i32 0
  %227 = getelementptr inbounds %"class.JPH::Vec4", ptr %226, i32 0, i32 0
  %228 = getelementptr inbounds %union.anon.7, ptr %227, i32 0, i32 0
  %229 = getelementptr inbounds { double, double }, ptr %228, i32 0, i32 0
  %230 = extractvalue { double, double } %225, 0
  store double %230, ptr %229, align 16
  %231 = getelementptr inbounds { double, double }, ptr %228, i32 0, i32 1
  %232 = extractvalue { double, double } %225, 1
  store double %232, ptr %231, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %29) #7
  %233 = load ptr, ptr %22, align 8, !tbaa !5
  %234 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %233, i32 0, i32 1
  %235 = load i32, ptr %234, align 16, !tbaa !34
  %236 = icmp eq i32 %235, 3
  br i1 %236, label %237, label %256

237:                                              ; preds = %196
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #7
  %238 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %239 = load ptr, ptr %22, align 8, !tbaa !5
  %240 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %239, i32 0, i32 2
  %241 = getelementptr inbounds [3 x i32], ptr %240, i64 0, i64 2
  %242 = load i32, ptr %241, align 4, !tbaa !36
  %243 = sext i32 %242 to i64
  %244 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %238, i64 noundef %243)
  %245 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %246 = load float, ptr %245, align 16, !tbaa !11
  %247 = fneg float %246
  %248 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %244, float noundef %247)
  %249 = getelementptr inbounds %"class.JPH::Plane", ptr %30, i32 0, i32 0
  %250 = getelementptr inbounds %"class.JPH::Vec4", ptr %249, i32 0, i32 0
  %251 = getelementptr inbounds %union.anon.7, ptr %250, i32 0, i32 0
  %252 = getelementptr inbounds { double, double }, ptr %251, i32 0, i32 0
  %253 = extractvalue { double, double } %248, 0
  store double %253, ptr %252, align 16
  %254 = getelementptr inbounds { double, double }, ptr %251, i32 0, i32 1
  %255 = extractvalue { double, double } %248, 1
  store double %255, ptr %254, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %29, ptr align 16 %30, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #7
  br label %311

256:                                              ; preds = %196
  br label %257

257:                                              ; preds = %256
  %258 = load ptr, ptr %22, align 8, !tbaa !5
  %259 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %258, i32 0, i32 1
  %260 = load i32, ptr %259, align 16, !tbaa !34
  %261 = icmp eq i32 %260, 2
  br i1 %261, label %265, label %262

262:                                              ; preds = %257
  %263 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef @.str.9, ptr noundef @.str.4, i32 noundef 583)
  br i1 %263, label %264, label %265

264:                                              ; preds = %262
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #7, !srcloc !37
  br label %265

265:                                              ; preds = %264, %262, %257
  br label %266

266:                                              ; preds = %265
  br label %267

267:                                              ; preds = %266
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #7
  %268 = load ptr, ptr %22, align 8, !tbaa !5
  %269 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %268, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %33, ptr align 16 %269, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #7
  %270 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %27)
  %271 = getelementptr inbounds %"class.JPH::Vec3", ptr %35, i32 0, i32 0
  %272 = getelementptr inbounds %union.anon.6, ptr %271, i32 0, i32 0
  %273 = getelementptr inbounds { double, double }, ptr %272, i32 0, i32 0
  %274 = extractvalue { double, double } %270, 0
  store double %274, ptr %273, align 16
  %275 = getelementptr inbounds { double, double }, ptr %272, i32 0, i32 1
  %276 = extractvalue { double, double } %270, 1
  store double %276, ptr %275, align 8
  %277 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %28)
  %278 = getelementptr inbounds %"class.JPH::Vec3", ptr %36, i32 0, i32 0
  %279 = getelementptr inbounds %union.anon.6, ptr %278, i32 0, i32 0
  %280 = getelementptr inbounds { double, double }, ptr %279, i32 0, i32 0
  %281 = extractvalue { double, double } %277, 0
  store double %281, ptr %280, align 16
  %282 = getelementptr inbounds { double, double }, ptr %279, i32 0, i32 1
  %283 = extractvalue { double, double } %277, 1
  store double %283, ptr %282, align 8
  %284 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %285 = load double, ptr %284, align 16
  %286 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %287 = load double, ptr %286, align 8
  %288 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %35, double %285, double %287)
  %289 = getelementptr inbounds %"class.JPH::Vec3", ptr %34, 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 %33, i32 0, i32 0
  %296 = load double, ptr %295, align 16
  %297 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 1
  %298 = load double, ptr %297, align 8
  %299 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 0
  %300 = load double, ptr %299, align 16
  %301 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 1
  %302 = load double, ptr %301, align 8
  %303 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %296, double %298, double %300, double %302)
  %304 = getelementptr inbounds %"class.JPH::Plane", ptr %32, i32 0, i32 0
  %305 = getelementptr inbounds %"class.JPH::Vec4", ptr %304, i32 0, i32 0
  %306 = getelementptr inbounds %union.anon.7, ptr %305, i32 0, i32 0
  %307 = getelementptr inbounds { double, double }, ptr %306, i32 0, i32 0
  %308 = extractvalue { double, double } %303, 0
  store double %308, ptr %307, align 16
  %309 = getelementptr inbounds { double, double }, ptr %306, i32 0, i32 1
  %310 = extractvalue { double, double } %303, 1
  store double %310, ptr %309, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %29, ptr align 16 %32, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #7
  br label %311

311:                                              ; preds = %267, %237
  %312 = call noundef zeroext i1 @_ZN3JPH5Plane16sIntersectPlanesERKS0_S2_S2_RNS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %27, ptr noundef nonnull align 16 dereferenceable(16) %28, ptr noundef nonnull align 16 dereferenceable(16) %29, ptr noundef nonnull align 16 dereferenceable(16) %23)
  br i1 %312, label %343, label %313

313:                                              ; preds = %311
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #7
  %314 = load ptr, ptr %22, align 8, !tbaa !5
  %315 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %314, i32 0, i32 0
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #7
  %316 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %27)
  %317 = getelementptr inbounds %"class.JPH::Vec3", ptr %39, i32 0, i32 0
  %318 = getelementptr inbounds %union.anon.6, ptr %317, i32 0, i32 0
  %319 = getelementptr inbounds { double, double }, ptr %318, i32 0, i32 0
  %320 = extractvalue { double, double } %316, 0
  store double %320, ptr %319, align 16
  %321 = getelementptr inbounds { double, double }, ptr %318, i32 0, i32 1
  %322 = extractvalue { double, double } %316, 1
  store double %322, ptr %321, align 8
  %323 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %324 = load float, ptr %323, align 16, !tbaa !11
  %325 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %39, float noundef %324)
  %326 = getelementptr inbounds %"class.JPH::Vec3", ptr %38, i32 0, i32 0
  %327 = getelementptr inbounds %union.anon.6, ptr %326, i32 0, i32 0
  %328 = getelementptr inbounds { double, double }, ptr %327, i32 0, i32 0
  %329 = extractvalue { double, double } %325, 0
  store double %329, ptr %328, align 16
  %330 = getelementptr inbounds { double, double }, ptr %327, i32 0, i32 1
  %331 = extractvalue { double, double } %325, 1
  store double %331, ptr %330, align 8
  %332 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 0
  %333 = load double, ptr %332, align 16
  %334 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 1
  %335 = load double, ptr %334, align 8
  %336 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %315, double %333, double %335)
  %337 = getelementptr inbounds %"class.JPH::Vec3", ptr %37, i32 0, i32 0
  %338 = getelementptr inbounds %union.anon.6, ptr %337, i32 0, i32 0
  %339 = getelementptr inbounds { double, double }, ptr %338, i32 0, i32 0
  %340 = extractvalue { double, double } %336, 0
  store double %340, ptr %339, align 16
  %341 = getelementptr inbounds { double, double }, ptr %338, i32 0, i32 1
  %342 = extractvalue { double, double } %336, 1
  store double %342, ptr %341, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %23, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #7
  br label %343

343:                                              ; preds = %313, %311
  call void @llvm.lifetime.end.p0(i64 16, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #7
  br label %344

344:                                              ; preds = %343, %159
  %345 = load ptr, ptr %17, align 8, !tbaa !5
  call void @_ZN3JPH11StaticArrayINS_4Vec3ELj256EE9push_backERKS1_(ptr noundef nonnull align 16 dereferenceable(4112) %345, ptr noundef nonnull align 16 dereferenceable(16) %23)
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %346

346:                                              ; preds = %344
  %347 = load ptr, ptr %20, align 8, !tbaa !5
  %348 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %347, i32 1
  store ptr %348, ptr %20, align 8, !tbaa !5
  br label %148

349:                                              ; preds = %152
  %350 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %350, ptr %6, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  br label %684

351:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #7
  %352 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 9
  %353 = load float, ptr %352, align 16, !tbaa !11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %41, ptr align 16 %7, i64 16, i1 false), !tbaa.struct !31
  %354 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %355 = load double, ptr %354, align 16
  %356 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %357 = load double, ptr %356, align 8
  %358 = call noundef float @_ZN3JPH12ScaleHelpers17ScaleConvexRadiusEfNS_4Vec3E(float noundef %353, double %355, double %357)
  store float %358, ptr %40, align 4, !tbaa !38
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #7
  %359 = load ptr, ptr %10, align 8, !tbaa !5
  %360 = load float, ptr %40, align 4, !tbaa !38
  call void @_ZN3JPH15ConvexHullShape12HullNoConvexC2Ef(ptr noundef nonnull align 16 dereferenceable(4128) %359, float noundef %360)
  store ptr %359, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #7
  %361 = load ptr, ptr %42, align 8, !tbaa !5
  %362 = call noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128) %361)
  store ptr %362, ptr %43, align 8, !tbaa !5
  br label %363

363:                                              ; preds = %351
  %364 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 5
  %365 = call noundef i64 @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %364)
  %366 = icmp ule i64 %365, 256
  br i1 %366, label %370, label %367

367:                                              ; preds = %363
  %368 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef @.str.13, ptr noundef @.str.4, i32 noundef 609, ptr noundef @.str.14)
  br i1 %368, label %369, label %370

369:                                              ; preds = %367
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #7, !srcloc !39
  br label %370

370:                                              ; preds = %369, %367, %363
  br label %371

371:                                              ; preds = %370
  br label %372

372:                                              ; preds = %371
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #7
  %373 = call { double, double } @_ZNK3JPH4Vec310ReciprocalEv(ptr noundef nonnull align 16 dereferenceable(16) %7)
  %374 = getelementptr inbounds %"class.JPH::Vec3", ptr %45, i32 0, i32 0
  %375 = getelementptr inbounds %union.anon.6, ptr %374, i32 0, i32 0
  %376 = getelementptr inbounds { double, double }, ptr %375, i32 0, i32 0
  %377 = extractvalue { double, double } %373, 0
  store double %377, ptr %376, align 16
  %378 = getelementptr inbounds { double, double }, ptr %375, i32 0, i32 1
  %379 = extractvalue { double, double } %373, 1
  store double %379, ptr %378, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #7
  %380 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 5
  store ptr %380, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #7
  %381 = load ptr, ptr %46, align 8, !tbaa !5
  %382 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %381)
  store ptr %382, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #7
  %383 = load ptr, ptr %46, align 8, !tbaa !5
  %384 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %383)
  store ptr %384, ptr %48, align 8, !tbaa !5
  br label %385

385:                                              ; preds = %673, %372
  %386 = load ptr, ptr %47, align 8, !tbaa !5
  %387 = load ptr, ptr %48, align 8, !tbaa !5
  %388 = icmp ne ptr %386, %387
  br i1 %388, label %390, label %389

389:                                              ; preds = %385
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #7
  br label %676

390:                                              ; preds = %385
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #7
  %391 = load ptr, ptr %47, align 8, !tbaa !5
  store ptr %391, ptr %49, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %50) #7
  %392 = load ptr, ptr %49, align 8, !tbaa !5
  %393 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %392, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %51, ptr align 16 %393, i64 16, i1 false), !tbaa.struct !31
  %394 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 0
  %395 = load double, ptr %394, align 16
  %396 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 1
  %397 = load double, ptr %396, align 8
  %398 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %7, double %395, double %397)
  %399 = getelementptr inbounds %"class.JPH::Vec3", ptr %50, i32 0, i32 0
  %400 = getelementptr inbounds %union.anon.6, ptr %399, i32 0, i32 0
  %401 = getelementptr inbounds { double, double }, ptr %400, i32 0, i32 0
  %402 = extractvalue { double, double } %398, 0
  store double %402, ptr %401, align 16
  %403 = getelementptr inbounds { double, double }, ptr %400, i32 0, i32 1
  %404 = extractvalue { double, double } %398, 1
  store double %404, ptr %403, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %52) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #7
  %405 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %406 = load ptr, ptr %49, align 8, !tbaa !5
  %407 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %406, i32 0, i32 2
  %408 = getelementptr inbounds [3 x i32], ptr %407, i64 0, i64 0
  %409 = load i32, ptr %408, align 4, !tbaa !36
  %410 = sext i32 %409 to i64
  %411 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %405, i64 noundef %410)
  %412 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %411)
  %413 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %414 = getelementptr inbounds %union.anon.6, ptr %413, i32 0, i32 0
  %415 = getelementptr inbounds { double, double }, ptr %414, i32 0, i32 0
  %416 = extractvalue { double, double } %412, 0
  store double %416, ptr %415, align 16
  %417 = getelementptr inbounds { double, double }, ptr %414, i32 0, i32 1
  %418 = extractvalue { double, double } %412, 1
  store double %418, ptr %417, align 8
  %419 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %420 = load double, ptr %419, align 16
  %421 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %422 = load double, ptr %421, align 8
  %423 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %45, double %420, double %422)
  %424 = getelementptr inbounds %"class.JPH::Vec3", ptr %53, i32 0, i32 0
  %425 = getelementptr inbounds %union.anon.6, ptr %424, i32 0, i32 0
  %426 = getelementptr inbounds { double, double }, ptr %425, i32 0, i32 0
  %427 = extractvalue { double, double } %423, 0
  store double %427, ptr %426, align 16
  %428 = getelementptr inbounds { double, double }, ptr %425, i32 0, i32 1
  %429 = extractvalue { double, double } %423, 1
  store double %429, ptr %428, align 8
  %430 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %53)
  %431 = getelementptr inbounds %"class.JPH::Vec3", ptr %52, i32 0, i32 0
  %432 = getelementptr inbounds %union.anon.6, ptr %431, i32 0, i32 0
  %433 = getelementptr inbounds { double, double }, ptr %432, i32 0, i32 0
  %434 = extractvalue { double, double } %430, 0
  store double %434, ptr %433, align 16
  %435 = getelementptr inbounds { double, double }, ptr %432, i32 0, i32 1
  %436 = extractvalue { double, double } %430, 1
  store double %436, ptr %435, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #7
  %437 = load ptr, ptr %49, align 8, !tbaa !5
  %438 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %437, i32 0, i32 1
  %439 = load i32, ptr %438, align 16, !tbaa !34
  %440 = icmp eq i32 %439, 1
  br i1 %440, label %441, label %461

441:                                              ; preds = %390
  call void @llvm.lifetime.start.p0(i64 16, ptr %56) #7
  %442 = load float, ptr %40, align 4, !tbaa !38
  %443 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %52, float noundef %442)
  %444 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %445 = getelementptr inbounds %union.anon.6, ptr %444, i32 0, i32 0
  %446 = getelementptr inbounds { double, double }, ptr %445, i32 0, i32 0
  %447 = extractvalue { double, double } %443, 0
  store double %447, ptr %446, align 16
  %448 = getelementptr inbounds { double, double }, ptr %445, i32 0, i32 1
  %449 = extractvalue { double, double } %443, 1
  store double %449, ptr %448, align 8
  %450 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 0
  %451 = load double, ptr %450, align 16
  %452 = getelementptr inbounds { double, double }, ptr %57, i32 0, i32 1
  %453 = load double, ptr %452, align 8
  %454 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %50, double %451, double %453)
  %455 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %456 = getelementptr inbounds %union.anon.6, ptr %455, i32 0, i32 0
  %457 = getelementptr inbounds { double, double }, ptr %456, i32 0, i32 0
  %458 = extractvalue { double, double } %454, 0
  store double %458, ptr %457, align 16
  %459 = getelementptr inbounds { double, double }, ptr %456, i32 0, i32 1
  %460 = extractvalue { double, double } %454, 1
  store double %460, ptr %459, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %55, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #7
  br label %671

461:                                              ; preds = %390
  call void @llvm.lifetime.start.p0(i64 16, ptr %58) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #7
  %462 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %463 = load ptr, ptr %49, align 8, !tbaa !5
  %464 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %463, i32 0, i32 2
  %465 = getelementptr inbounds [3 x i32], ptr %464, i64 0, i64 1
  %466 = load i32, ptr %465, align 4, !tbaa !36
  %467 = sext i32 %466 to i64
  %468 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %462, i64 noundef %467)
  %469 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %468)
  %470 = getelementptr inbounds %"class.JPH::Vec3", ptr %60, i32 0, i32 0
  %471 = getelementptr inbounds %union.anon.6, ptr %470, i32 0, i32 0
  %472 = getelementptr inbounds { double, double }, ptr %471, i32 0, i32 0
  %473 = extractvalue { double, double } %469, 0
  store double %473, ptr %472, align 16
  %474 = getelementptr inbounds { double, double }, ptr %471, i32 0, i32 1
  %475 = extractvalue { double, double } %469, 1
  store double %475, ptr %474, align 8
  %476 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %477 = load double, ptr %476, align 16
  %478 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %479 = load double, ptr %478, align 8
  %480 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %45, double %477, double %479)
  %481 = getelementptr inbounds %"class.JPH::Vec3", ptr %59, i32 0, i32 0
  %482 = getelementptr inbounds %union.anon.6, ptr %481, i32 0, i32 0
  %483 = getelementptr inbounds { double, double }, ptr %482, i32 0, i32 0
  %484 = extractvalue { double, double } %480, 0
  store double %484, ptr %483, align 16
  %485 = getelementptr inbounds { double, double }, ptr %482, i32 0, i32 1
  %486 = extractvalue { double, double } %480, 1
  store double %486, ptr %485, align 8
  %487 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %59)
  %488 = getelementptr inbounds %"class.JPH::Vec3", ptr %58, i32 0, i32 0
  %489 = getelementptr inbounds %union.anon.6, ptr %488, i32 0, i32 0
  %490 = getelementptr inbounds { double, double }, ptr %489, i32 0, i32 0
  %491 = extractvalue { double, double } %487, 0
  store double %491, ptr %490, align 16
  %492 = getelementptr inbounds { double, double }, ptr %489, i32 0, i32 1
  %493 = extractvalue { double, double } %487, 1
  store double %493, ptr %492, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %62) #7
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %63, ptr align 16 %50, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %64, ptr align 16 %52, i64 16, i1 false), !tbaa.struct !31
  %494 = getelementptr inbounds { double, double }, ptr %63, i32 0, i32 0
  %495 = load double, ptr %494, align 16
  %496 = getelementptr inbounds { double, double }, ptr %63, i32 0, i32 1
  %497 = load double, ptr %496, align 8
  %498 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 0
  %499 = load double, ptr %498, align 16
  %500 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 1
  %501 = load double, ptr %500, align 8
  %502 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %495, double %497, double %499, double %501)
  %503 = getelementptr inbounds %"class.JPH::Plane", ptr %62, i32 0, i32 0
  %504 = getelementptr inbounds %"class.JPH::Vec4", ptr %503, i32 0, i32 0
  %505 = getelementptr inbounds %union.anon.7, ptr %504, i32 0, i32 0
  %506 = getelementptr inbounds { double, double }, ptr %505, i32 0, i32 0
  %507 = extractvalue { double, double } %502, 0
  store double %507, ptr %506, align 16
  %508 = getelementptr inbounds { double, double }, ptr %505, i32 0, i32 1
  %509 = extractvalue { double, double } %502, 1
  store double %509, ptr %508, align 8
  %510 = load float, ptr %40, align 4, !tbaa !38
  %511 = fneg float %510
  %512 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %62, float noundef %511)
  %513 = getelementptr inbounds %"class.JPH::Plane", ptr %61, i32 0, i32 0
  %514 = getelementptr inbounds %"class.JPH::Vec4", ptr %513, i32 0, i32 0
  %515 = getelementptr inbounds %union.anon.7, ptr %514, i32 0, i32 0
  %516 = getelementptr inbounds { double, double }, ptr %515, i32 0, i32 0
  %517 = extractvalue { double, double } %512, 0
  store double %517, ptr %516, align 16
  %518 = getelementptr inbounds { double, double }, ptr %515, i32 0, i32 1
  %519 = extractvalue { double, double } %512, 1
  store double %519, ptr %518, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %62) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %66) #7
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %67, ptr align 16 %50, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %68, ptr align 16 %58, i64 16, i1 false), !tbaa.struct !31
  %520 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 0
  %521 = load double, ptr %520, align 16
  %522 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 1
  %523 = load double, ptr %522, align 8
  %524 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %525 = load double, ptr %524, align 16
  %526 = getelementptr inbounds { double, double }, ptr %68, 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 %66, 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
  %536 = load float, ptr %40, align 4, !tbaa !38
  %537 = fneg float %536
  %538 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %66, float noundef %537)
  %539 = getelementptr inbounds %"class.JPH::Plane", ptr %65, i32 0, i32 0
  %540 = getelementptr inbounds %"class.JPH::Vec4", ptr %539, i32 0, i32 0
  %541 = getelementptr inbounds %union.anon.7, ptr %540, i32 0, i32 0
  %542 = getelementptr inbounds { double, double }, ptr %541, i32 0, i32 0
  %543 = extractvalue { double, double } %538, 0
  store double %543, ptr %542, align 16
  %544 = getelementptr inbounds { double, double }, ptr %541, i32 0, i32 1
  %545 = extractvalue { double, double } %538, 1
  store double %545, ptr %544, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %66) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %69) #7
  %546 = load ptr, ptr %49, align 8, !tbaa !5
  %547 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %546, i32 0, i32 1
  %548 = load i32, ptr %547, align 16, !tbaa !34
  %549 = icmp eq i32 %548, 3
  br i1 %549, label %550, label %609

550:                                              ; preds = %461
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %71) #7
  %551 = getelementptr inbounds %"class.JPH::ConvexHullShape", ptr %87, i32 0, i32 7
  %552 = load ptr, ptr %49, align 8, !tbaa !5
  %553 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %552, i32 0, i32 2
  %554 = getelementptr inbounds [3 x i32], ptr %553, i64 0, i64 2
  %555 = load i32, ptr %554, align 4, !tbaa !36
  %556 = sext i32 %555 to i64
  %557 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %551, i64 noundef %556)
  %558 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %557)
  %559 = getelementptr inbounds %"class.JPH::Vec3", ptr %72, i32 0, i32 0
  %560 = getelementptr inbounds %union.anon.6, ptr %559, i32 0, i32 0
  %561 = getelementptr inbounds { double, double }, ptr %560, i32 0, i32 0
  %562 = extractvalue { double, double } %558, 0
  store double %562, ptr %561, align 16
  %563 = getelementptr inbounds { double, double }, ptr %560, i32 0, i32 1
  %564 = extractvalue { double, double } %558, 1
  store double %564, ptr %563, align 8
  %565 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 0
  %566 = load double, ptr %565, align 16
  %567 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 1
  %568 = load double, ptr %567, align 8
  %569 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %45, double %566, double %568)
  %570 = getelementptr inbounds %"class.JPH::Vec3", ptr %71, i32 0, i32 0
  %571 = getelementptr inbounds %union.anon.6, ptr %570, i32 0, i32 0
  %572 = getelementptr inbounds { double, double }, ptr %571, i32 0, i32 0
  %573 = extractvalue { double, double } %569, 0
  store double %573, ptr %572, align 16
  %574 = getelementptr inbounds { double, double }, ptr %571, i32 0, i32 1
  %575 = extractvalue { double, double } %569, 1
  store double %575, ptr %574, align 8
  %576 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %71)
  %577 = getelementptr inbounds %"class.JPH::Vec3", ptr %70, i32 0, i32 0
  %578 = getelementptr inbounds %union.anon.6, ptr %577, i32 0, i32 0
  %579 = getelementptr inbounds { double, double }, ptr %578, i32 0, i32 0
  %580 = extractvalue { double, double } %576, 0
  store double %580, ptr %579, align 16
  %581 = getelementptr inbounds { double, double }, ptr %578, i32 0, i32 1
  %582 = extractvalue { double, double } %576, 1
  store double %582, ptr %581, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %73) #7
  call void @llvm.lifetime.start.p0(i64 16, ptr %74) #7
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %75, ptr align 16 %50, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %76, ptr align 16 %70, i64 16, i1 false), !tbaa.struct !31
  %583 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 0
  %584 = load double, ptr %583, align 16
  %585 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 1
  %586 = load double, ptr %585, align 8
  %587 = getelementptr inbounds { double, double }, ptr %76, i32 0, i32 0
  %588 = load double, ptr %587, align 16
  %589 = getelementptr inbounds { double, double }, ptr %76, i32 0, i32 1
  %590 = load double, ptr %589, align 8
  %591 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %584, double %586, double %588, double %590)
  %592 = getelementptr inbounds %"class.JPH::Plane", ptr %74, i32 0, i32 0
  %593 = getelementptr inbounds %"class.JPH::Vec4", ptr %592, i32 0, i32 0
  %594 = getelementptr inbounds %union.anon.7, ptr %593, i32 0, i32 0
  %595 = getelementptr inbounds { double, double }, ptr %594, i32 0, i32 0
  %596 = extractvalue { double, double } %591, 0
  store double %596, ptr %595, align 16
  %597 = getelementptr inbounds { double, double }, ptr %594, i32 0, i32 1
  %598 = extractvalue { double, double } %591, 1
  store double %598, ptr %597, align 8
  %599 = load float, ptr %40, align 4, !tbaa !38
  %600 = fneg float %599
  %601 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %74, float noundef %600)
  %602 = getelementptr inbounds %"class.JPH::Plane", ptr %73, i32 0, i32 0
  %603 = getelementptr inbounds %"class.JPH::Vec4", ptr %602, i32 0, i32 0
  %604 = getelementptr inbounds %union.anon.7, ptr %603, i32 0, i32 0
  %605 = getelementptr inbounds { double, double }, ptr %604, i32 0, i32 0
  %606 = extractvalue { double, double } %601, 0
  store double %606, ptr %605, align 16
  %607 = getelementptr inbounds { double, double }, ptr %604, i32 0, i32 1
  %608 = extractvalue { double, double } %601, 1
  store double %608, ptr %607, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %73, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %74) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %73) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #7
  br label %648

609:                                              ; preds = %461
  br label %610

610:                                              ; preds = %609
  %611 = load ptr, ptr %49, align 8, !tbaa !5
  %612 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %611, i32 0, i32 1
  %613 = load i32, ptr %612, align 16, !tbaa !34
  %614 = icmp eq i32 %613, 2
  br i1 %614, label %618, label %615

615:                                              ; preds = %610
  %616 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef @.str.9, ptr noundef @.str.4, i32 noundef 650)
  br i1 %616, label %617, label %618

617:                                              ; preds = %615
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #7, !srcloc !40
  br label %618

618:                                              ; preds = %617, %615, %610
  br label %619

619:                                              ; preds = %618
  br label %620

620:                                              ; preds = %619
  call void @llvm.lifetime.start.p0(i64 16, ptr %78) #7
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %79, ptr align 16 %50, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %81, ptr align 16 %58, i64 16, i1 false), !tbaa.struct !31
  %621 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 0
  %622 = load double, ptr %621, align 16
  %623 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 1
  %624 = load double, ptr %623, align 8
  %625 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %52, double %622, double %624)
  %626 = getelementptr inbounds %"class.JPH::Vec3", ptr %80, i32 0, i32 0
  %627 = getelementptr inbounds %union.anon.6, ptr %626, i32 0, i32 0
  %628 = getelementptr inbounds { double, double }, ptr %627, i32 0, i32 0
  %629 = extractvalue { double, double } %625, 0
  store double %629, ptr %628, align 16
  %630 = getelementptr inbounds { double, double }, ptr %627, i32 0, i32 1
  %631 = extractvalue { double, double } %625, 1
  store double %631, ptr %630, align 8
  %632 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 0
  %633 = load double, ptr %632, align 16
  %634 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 1
  %635 = load double, ptr %634, align 8
  %636 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 0
  %637 = load double, ptr %636, align 16
  %638 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 1
  %639 = load double, ptr %638, align 8
  %640 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %633, double %635, double %637, double %639)
  %641 = getelementptr inbounds %"class.JPH::Plane", ptr %78, i32 0, i32 0
  %642 = getelementptr inbounds %"class.JPH::Vec4", ptr %641, i32 0, i32 0
  %643 = getelementptr inbounds %union.anon.7, ptr %642, i32 0, i32 0
  %644 = getelementptr inbounds { double, double }, ptr %643, i32 0, i32 0
  %645 = extractvalue { double, double } %640, 0
  store double %645, ptr %644, align 16
  %646 = getelementptr inbounds { double, double }, ptr %643, i32 0, i32 1
  %647 = extractvalue { double, double } %640, 1
  store double %647, ptr %646, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %78, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %78) #7
  br label %648

648:                                              ; preds = %620, %550
  %649 = call noundef zeroext i1 @_ZN3JPH5Plane16sIntersectPlanesERKS0_S2_S2_RNS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %61, ptr noundef nonnull align 16 dereferenceable(16) %65, ptr noundef nonnull align 16 dereferenceable(16) %69, ptr noundef nonnull align 16 dereferenceable(16) %55)
  br i1 %649, label %670, label %650

650:                                              ; preds = %648
  call void @llvm.lifetime.start.p0(i64 16, ptr %82) #7
  %651 = load float, ptr %40, align 4, !tbaa !38
  %652 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %52, float noundef %651)
  %653 = getelementptr inbounds %"class.JPH::Vec3", ptr %83, i32 0, i32 0
  %654 = getelementptr inbounds %union.anon.6, ptr %653, i32 0, i32 0
  %655 = getelementptr inbounds { double, double }, ptr %654, i32 0, i32 0
  %656 = extractvalue { double, double } %652, 0
  store double %656, ptr %655, align 16
  %657 = getelementptr inbounds { double, double }, ptr %654, i32 0, i32 1
  %658 = extractvalue { double, double } %652, 1
  store double %658, ptr %657, align 8
  %659 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 0
  %660 = load double, ptr %659, align 16
  %661 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 1
  %662 = load double, ptr %661, align 8
  %663 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %50, double %660, double %662)
  %664 = getelementptr inbounds %"class.JPH::Vec3", ptr %82, i32 0, i32 0
  %665 = getelementptr inbounds %union.anon.6, ptr %664, i32 0, i32 0
  %666 = getelementptr inbounds { double, double }, ptr %665, i32 0, i32 0
  %667 = extractvalue { double, double } %663, 0
  store double %667, ptr %666, align 16
  %668 = getelementptr inbounds { double, double }, ptr %665, i32 0, i32 1
  %669 = extractvalue { double, double } %663, 1
  store double %669, ptr %668, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %55, ptr align 16 %82, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %82) #7
  br label %670

670:                                              ; preds = %650, %648
  call void @llvm.lifetime.end.p0(i64 16, ptr %69) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %58) #7
  br label %671

671:                                              ; preds = %670, %441
  %672 = load ptr, ptr %43, align 8, !tbaa !5
  call void @_ZN3JPH11StaticArrayINS_4Vec3ELj256EE9push_backERKS1_(ptr noundef nonnull align 16 dereferenceable(4112) %672, ptr noundef nonnull align 16 dereferenceable(16) %55)
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr %50) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #7
  br label %673

673:                                              ; preds = %671
  %674 = load ptr, ptr %47, align 8, !tbaa !5
  %675 = getelementptr inbounds %"struct.JPH::ConvexHullShape::Point", ptr %674, i32 1
  store ptr %675, ptr %47, align 8, !tbaa !5
  br label %385

676:                                              ; preds = %389
  %677 = load ptr, ptr %42, align 8, !tbaa !5
  store ptr %677, ptr %6, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  br label %684

678:                                              ; preds = %105
  br label %679

679:                                              ; preds = %678
  %680 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef @.str.15, ptr noundef @.str.4, i32 noundef 670)
  br i1 %680, label %681, label %682

681:                                              ; preds = %679
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #7, !srcloc !41
  br label %682

682:                                              ; preds = %681, %679
  br label %683

683:                                              ; preds = %682
  store ptr null, ptr %6, align 8
  br label %684

684:                                              ; preds = %683, %676, %349, %115, %113, %99, %97
  %685 = load ptr, ptr %6, align 8
  ret ptr %685
}

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH15ConvexHullShape14HullWithConvexC2EPKS0_(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef) unnamed_addr #5 align 2

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128)) #4 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef float @_ZN3JPH12ScaleHelpers17ScaleConvexRadiusEfNS_4Vec3E(float noundef, double, double) #3

; 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

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 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { alwaysinline mustprogress 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 = { 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 = !{!"_ZTSN3JPH11ConvexShape12ESupportModeE", !7, i64 0}
!11 = !{!12, !23, i64 256}
!12 = !{!"_ZTSN3JPH15ConvexHullShapeE", !13, i64 0, !24, i64 48, !25, i64 64, !26, i64 128, !27, i64 160, !28, i64 184, !29, i64 208, !30, i64 232, !23, i64 256, !23, i64 260, !23, i64 264}
!13 = !{!"_ZTSN3JPH11ConvexShapeE", !14, i64 0, !22, i64 32, !23, i64 40}
!14 = !{!"_ZTSN3JPH5ShapeE", !15, i64 8, !19, i64 16, !20, i64 24, !21, i64 25}
!15 = !{!"_ZTSN3JPH9RefTargetINS_5ShapeEEE", !16, i64 0}
!16 = !{!"_ZTSSt6atomicIjE", !17, i64 0}
!17 = !{!"_ZTSSt13__atomic_baseIjE", !18, i64 0}
!18 = !{!"int", !7, i64 0}
!19 = !{!"long", !7, i64 0}
!20 = !{!"_ZTSN3JPH10EShapeTypeE", !7, i64 0}
!21 = !{!"_ZTSN3JPH13EShapeSubTypeE", !7, i64 0}
!22 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !6, i64 0}
!23 = !{!"float", !7, i64 0}
!24 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!25 = !{!"_ZTSN3JPH5Mat44E", !7, i64 0}
!26 = !{!"_ZTSN3JPH5AABoxE", !24, i64 0, !24, i64 16}
!27 = !{!"_ZTSN3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEE", !19, i64 0, !19, i64 8, !6, i64 16}
!28 = !{!"_ZTSN3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEE", !19, i64 0, !19, i64 8, !6, i64 16}
!29 = !{!"_ZTSN3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEE", !19, i64 0, !19, i64 8, !6, i64 16}
!30 = !{!"_ZTSN3JPH5ArrayIhNS_12STLAllocatorIhEEEE", !19, i64 0, !19, i64 8, !6, i64 16}
!31 = !{i64 0, i64 16, !32}
!32 = !{!7, !7, i64 0}
!33 = !{i64 2158004856}
!34 = !{!35, !18, i64 16}
!35 = !{!"_ZTSN3JPH15ConvexHullShape5PointE", !24, i64 0, !18, i64 16, !7, i64 20}
!36 = !{!18, !18, i64 0}
!37 = !{i64 2158005205}
!38 = !{!23, !23, i64 0}
!39 = !{i64 2158005654}
!40 = !{i64 2158010064}
!41 = !{i64 2158010383}


; 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::Plane" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.7 }
%union.anon.7 = type { <4 x float> }

@.str.4 = external hidden unnamed_addr constant [101 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [6 x i8], align 1

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

; 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: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #4 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: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

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

; Function Attrs: mustprogress uwtable
define dso_local noundef ptr @_ZNK3JPH15ConvexHullShape18GetSupportFunctionENS_11ConvexShape12ESupportModeERNS1_13SupportBufferENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(272) %0, i32 noundef %1, ptr noundef nonnull align 16 dereferenceable(4160) %2, double %3, double %4) unnamed_addr #4 align 2 {
  %6 = alloca %"class.JPH::Vec3", align 16
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Plane", align 16
  %10 = alloca %"class.JPH::Plane", align 16
  %11 = alloca %"class.JPH::Plane", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %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 %"class.JPH::Plane", align 16
  %21 = alloca %"class.JPH::Plane", align 16
  %22 = alloca %"class.JPH::Plane", align 16
  %23 = alloca %"class.JPH::Plane", align 16
  %24 = alloca %"class.JPH::Plane", align 16
  %25 = alloca %"class.JPH::Vec3", align 16
  %26 = alloca %"class.JPH::Plane", align 16
  store double %3, ptr %6, align 16
  %27 = getelementptr inbounds i8, ptr %6, i64 8
  store double %4, ptr %27, align 8
  %28 = getelementptr inbounds i8, ptr %0, i64 256
  %29 = load float, ptr %28, align 16, !tbaa !5
  %30 = fcmp oeq float %29, 0.000000e+00
  br i1 %30, label %31, label %35

31:                                               ; preds = %5
  %32 = tail call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %3, double %4)
  br i1 %32, label %33, label %34

33:                                               ; preds = %31
  tail call void @_ZN3JPH15ConvexHullShape14HullWithConvexC2EPKS0_(ptr noundef nonnull align 8 dereferenceable(16) %2, ptr noundef nonnull %0)
  br label %.loopexit

34:                                               ; preds = %31
  tail call void @_ZN3JPH15ConvexHullShape20HullWithConvexScaledC2EPKS0_NS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %2, ptr noundef nonnull %0, double %3, double %4)
  br label %.loopexit

35:                                               ; preds = %5
  switch i32 %1, label %264 [
    i32 1, label %36
    i32 2, label %36
    i32 0, label %40
  ]

36:                                               ; preds = %35, %35
  %37 = tail call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %3, double %4)
  br i1 %37, label %38, label %39

38:                                               ; preds = %36
  tail call void @_ZN3JPH15ConvexHullShape14HullWithConvexC2EPKS0_(ptr noundef nonnull align 8 dereferenceable(16) %2, ptr noundef nonnull %0)
  br label %.loopexit

39:                                               ; preds = %36
  tail call void @_ZN3JPH15ConvexHullShape20HullWithConvexScaledC2EPKS0_NS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %2, ptr noundef nonnull %0, double %3, double %4)
  br label %.loopexit

40:                                               ; preds = %35
  %41 = tail call noundef zeroext i1 @_ZN3JPH12ScaleHelpers11IsNotScaledENS_4Vec3E(double %3, double %4)
  %42 = load float, ptr %28, align 16, !tbaa !5
  br i1 %41, label %43, label %140

43:                                               ; preds = %40
  tail call void @_ZN3JPH15ConvexHullShape12HullNoConvexC2Ef(ptr noundef nonnull align 16 dereferenceable(4128) %2, float noundef %42)
  %44 = tail call noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128) %2)
  %45 = getelementptr inbounds i8, ptr %0, i64 160
  %46 = tail call noundef i64 @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %45)
  %47 = icmp ult i64 %46, 257
  br i1 %47, label %51, label %48

48:                                               ; preds = %43
  %49 = tail call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef nonnull @.str.13, ptr noundef nonnull @.str.4, i32 noundef 557, ptr noundef nonnull @.str.14)
  br i1 %49, label %50, label %51

50:                                               ; preds = %48
  tail call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #6, !srcloc !28
  br label %51

51:                                               ; preds = %50, %48, %43
  %52 = tail call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %45)
  %53 = tail call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %45)
  %.not121124 = icmp eq ptr %52, %53
  br i1 %.not121124, label %.loopexit, label %.lr.ph127

.lr.ph127:                                        ; preds = %51
  %54 = getelementptr inbounds i8, ptr %0, i64 208
  %55 = getelementptr inbounds i8, ptr %9, i64 8
  %56 = getelementptr inbounds i8, ptr %10, i64 8
  %.sroa.475.0..sroa_idx = getelementptr inbounds i8, ptr %11, i64 8
  %57 = getelementptr inbounds i8, ptr %12, i64 8
  %58 = getelementptr inbounds i8, ptr %13, i64 8
  %.sroa.465.0..sroa_idx = getelementptr inbounds i8, ptr %7, i64 8
  %59 = getelementptr inbounds i8, ptr %8, i64 8
  br label %60

60:                                               ; preds = %.lr.ph127, %138
  %.0117125 = phi ptr [ %52, %.lr.ph127 ], [ %139, %138 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #6
  %61 = getelementptr inbounds i8, ptr %.0117125, i64 16
  %62 = load i32, ptr %61, align 16, !tbaa !29
  %63 = icmp eq i32 %62, 1
  %64 = getelementptr inbounds i8, ptr %.0117125, i64 20
  br i1 %63, label %65, label %79

65:                                               ; preds = %60
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #6
  %66 = load i32, ptr %64, align 4, !tbaa !31
  %67 = sext i32 %66 to i64
  %68 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %54, i64 noundef %67)
  %69 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %68)
  %70 = extractvalue { double, double } %69, 0
  store double %70, ptr %8, align 16
  %71 = extractvalue { double, double } %69, 1
  store double %71, ptr %59, align 8
  %72 = load float, ptr %28, align 16, !tbaa !5
  %73 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %8, float noundef %72)
  %74 = extractvalue { double, double } %73, 0
  %75 = extractvalue { double, double } %73, 1
  %76 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %.0117125, double %74, double %75)
  %77 = extractvalue { double, double } %76, 0
  %78 = extractvalue { double, double } %76, 1
  store double %77, ptr %7, align 16
  store double %78, ptr %.sroa.465.0..sroa_idx, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #6
  br label %138

79:                                               ; preds = %60
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #6
  %80 = load i32, ptr %64, align 4, !tbaa !31
  %81 = sext i32 %80 to i64
  %82 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %54, i64 noundef %81)
  %83 = load float, ptr %28, align 16, !tbaa !5
  %84 = fneg float %83
  %85 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %82, float noundef %84)
  %86 = extractvalue { double, double } %85, 0
  store double %86, ptr %9, align 16
  %87 = extractvalue { double, double } %85, 1
  store double %87, ptr %55, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #6
  %88 = getelementptr inbounds i8, ptr %.0117125, i64 24
  %89 = load i32, ptr %88, align 4, !tbaa !31
  %90 = sext i32 %89 to i64
  %91 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %54, i64 noundef %90)
  %92 = load float, ptr %28, align 16, !tbaa !5
  %93 = fneg float %92
  %94 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %91, float noundef %93)
  %95 = extractvalue { double, double } %94, 0
  store double %95, ptr %10, align 16
  %96 = extractvalue { double, double } %94, 1
  store double %96, ptr %56, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #6
  %97 = load i32, ptr %61, align 16, !tbaa !29
  switch i32 %97, label %108 [
    i32 3, label %98
    i32 2, label %111
  ]

98:                                               ; preds = %79
  %99 = getelementptr inbounds i8, ptr %.0117125, i64 28
  %100 = load i32, ptr %99, align 4, !tbaa !31
  %101 = sext i32 %100 to i64
  %102 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %54, i64 noundef %101)
  %103 = load float, ptr %28, align 16, !tbaa !5
  %104 = fneg float %103
  %105 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %102, float noundef %104)
  %106 = extractvalue { double, double } %105, 0
  %107 = extractvalue { double, double } %105, 1
  store double %106, ptr %11, align 16
  store double %107, ptr %.sroa.475.0..sroa_idx, align 8, !tbaa !32
  br label %124

108:                                              ; preds = %79
  %109 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef nonnull @.str.9, ptr noundef nonnull @.str.4, i32 noundef 583)
  br i1 %109, label %110, label %111

110:                                              ; preds = %108
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #6, !srcloc !33
  br label %111

111:                                              ; preds = %79, %110, %108
  %.sroa.070.0.copyload = load double, ptr %.0117125, align 16
  %.sroa.271.0..sroa_idx = getelementptr inbounds i8, ptr %.0117125, i64 8
  %.sroa.271.0.copyload = load double, ptr %.sroa.271.0..sroa_idx, align 8, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #6
  %112 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %9)
  %113 = extractvalue { double, double } %112, 0
  store double %113, ptr %12, align 16
  %114 = extractvalue { double, double } %112, 1
  store double %114, ptr %57, align 8
  %115 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %10)
  %116 = extractvalue { double, double } %115, 0
  %117 = extractvalue { double, double } %115, 1
  %118 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %116, double %117)
  %119 = extractvalue { double, double } %118, 0
  %120 = extractvalue { double, double } %118, 1
  %121 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.070.0.copyload, double %.sroa.271.0.copyload, double %119, double %120)
  %122 = extractvalue { double, double } %121, 0
  %123 = extractvalue { double, double } %121, 1
  store double %122, ptr %11, align 16
  store double %123, ptr %.sroa.475.0..sroa_idx, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #6
  br label %124

124:                                              ; preds = %111, %98
  %125 = call noundef zeroext i1 @_ZN3JPH5Plane16sIntersectPlanesERKS0_S2_S2_RNS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %9, ptr noundef nonnull align 16 dereferenceable(16) %10, ptr noundef nonnull align 16 dereferenceable(16) %11, ptr noundef nonnull align 16 dereferenceable(16) %7)
  br i1 %125, label %137, label %126

126:                                              ; preds = %124
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #6
  %127 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %9)
  %128 = extractvalue { double, double } %127, 0
  store double %128, ptr %13, align 16
  %129 = extractvalue { double, double } %127, 1
  store double %129, ptr %58, align 8
  %130 = load float, ptr %28, align 16, !tbaa !5
  %131 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %13, float noundef %130)
  %132 = extractvalue { double, double } %131, 0
  %133 = extractvalue { double, double } %131, 1
  %134 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %.0117125, double %132, double %133)
  %135 = extractvalue { double, double } %134, 0
  %136 = extractvalue { double, double } %134, 1
  store double %135, ptr %7, align 16
  store double %136, ptr %.sroa.465.0..sroa_idx, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #6
  br label %137

137:                                              ; preds = %126, %124
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #6
  br label %138

138:                                              ; preds = %137, %65
  call void @_ZN3JPH11StaticArrayINS_4Vec3ELj256EE9push_backERKS1_(ptr noundef nonnull align 16 dereferenceable(4112) %44, ptr noundef nonnull align 16 dereferenceable(16) %7)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #6
  %139 = getelementptr inbounds i8, ptr %.0117125, i64 32
  %.not121 = icmp eq ptr %139, %53
  br i1 %.not121, label %.loopexit, label %60

140:                                              ; preds = %40
  %141 = tail call noundef float @_ZN3JPH12ScaleHelpers17ScaleConvexRadiusEfNS_4Vec3E(float noundef %42, double %3, double %4)
  tail call void @_ZN3JPH15ConvexHullShape12HullNoConvexC2Ef(ptr noundef nonnull align 16 dereferenceable(4128) %2, float noundef %141)
  %142 = tail call noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128) %2)
  %143 = getelementptr inbounds i8, ptr %0, i64 160
  %144 = tail call noundef i64 @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %143)
  %145 = icmp ult i64 %144, 257
  br i1 %145, label %149, label %146

146:                                              ; preds = %140
  %147 = tail call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jS1_NS_15AssertLastParamE(ptr noundef nonnull @.str.13, ptr noundef nonnull @.str.4, i32 noundef 609, ptr noundef nonnull @.str.14)
  br i1 %147, label %148, label %149

148:                                              ; preds = %146
  tail call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #6, !srcloc !34
  br label %149

149:                                              ; preds = %148, %146, %140
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  %150 = call { double, double } @_ZNK3JPH4Vec310ReciprocalEv(ptr noundef nonnull align 16 dereferenceable(16) %6)
  %151 = extractvalue { double, double } %150, 0
  store double %151, ptr %14, align 16
  %152 = getelementptr inbounds i8, ptr %14, i64 8
  %153 = extractvalue { double, double } %150, 1
  store double %153, ptr %152, align 8
  %154 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %143)
  %155 = call noundef ptr @_ZNK3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %143)
  %.not122 = icmp eq ptr %154, %155
  br i1 %.not122, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %149
  %156 = getelementptr inbounds i8, ptr %15, i64 8
  %157 = getelementptr inbounds i8, ptr %0, i64 208
  %158 = getelementptr inbounds i8, ptr %17, i64 8
  %159 = getelementptr inbounds i8, ptr %16, i64 8
  %160 = getelementptr inbounds i8, ptr %19, i64 8
  %161 = getelementptr inbounds i8, ptr %21, i64 8
  %162 = fneg float %141
  %163 = getelementptr inbounds i8, ptr %20, i64 8
  %164 = getelementptr inbounds i8, ptr %23, i64 8
  %165 = getelementptr inbounds i8, ptr %22, i64 8
  %166 = getelementptr inbounds i8, ptr %25, i64 8
  %167 = getelementptr inbounds i8, ptr %26, i64 8
  %.sroa.415.0..sroa_idx = getelementptr inbounds i8, ptr %24, i64 8
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 8
  br label %168

._crit_edge:                                      ; preds = %262, %149
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  br label %.loopexit

168:                                              ; preds = %.lr.ph, %262
  %.0118123 = phi ptr [ %154, %.lr.ph ], [ %263, %262 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #6
  %.sroa.037.0.copyload = load double, ptr %.0118123, align 16
  %.sroa.238.0..sroa_idx = getelementptr inbounds i8, ptr %.0118123, i64 8
  %.sroa.238.0.copyload = load double, ptr %.sroa.238.0..sroa_idx, align 8, !tbaa !32
  %169 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.037.0.copyload, double %.sroa.238.0.copyload)
  %170 = extractvalue { double, double } %169, 0
  store double %170, ptr %15, align 16
  %171 = extractvalue { double, double } %169, 1
  store double %171, ptr %156, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #6
  %172 = getelementptr inbounds i8, ptr %.0118123, i64 20
  %173 = load i32, ptr %172, align 4, !tbaa !31
  %174 = sext i32 %173 to i64
  %175 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %157, i64 noundef %174)
  %176 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %175)
  %177 = extractvalue { double, double } %176, 0
  %178 = extractvalue { double, double } %176, 1
  %179 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %177, double %178)
  %180 = extractvalue { double, double } %179, 0
  store double %180, ptr %17, align 16
  %181 = extractvalue { double, double } %179, 1
  store double %181, ptr %158, align 8
  %182 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %17)
  %183 = extractvalue { double, double } %182, 0
  store double %183, ptr %16, align 16
  %184 = extractvalue { double, double } %182, 1
  store double %184, ptr %159, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #6
  %185 = getelementptr inbounds i8, ptr %.0118123, i64 16
  %186 = load i32, ptr %185, align 16, !tbaa !29
  %187 = icmp eq i32 %186, 1
  br i1 %187, label %188, label %195

188:                                              ; preds = %168
  %189 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %16, float noundef %141)
  %190 = extractvalue { double, double } %189, 0
  %191 = extractvalue { double, double } %189, 1
  %192 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %15, double %190, double %191)
  %193 = extractvalue { double, double } %192, 0
  %194 = extractvalue { double, double } %192, 1
  store double %193, ptr %18, align 16
  store double %194, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !32
  br label %262

195:                                              ; preds = %168
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #6
  %196 = getelementptr inbounds i8, ptr %.0118123, i64 24
  %197 = load i32, ptr %196, align 4, !tbaa !31
  %198 = sext i32 %197 to i64
  %199 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %157, i64 noundef %198)
  %200 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %199)
  %201 = extractvalue { double, double } %200, 0
  %202 = extractvalue { double, double } %200, 1
  %203 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %201, double %202)
  %204 = extractvalue { double, double } %203, 0
  store double %204, ptr %19, align 16
  %205 = extractvalue { double, double } %203, 1
  store double %205, ptr %160, align 8
  %206 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %19)
  %207 = extractvalue { double, double } %206, 0
  %208 = extractvalue { double, double } %206, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #6
  %.sroa.026.0.copyload = load double, ptr %15, align 16
  %.sroa.227.0.copyload = load double, ptr %156, align 8, !tbaa !32
  %.sroa.024.0.copyload = load double, ptr %16, align 16
  %.sroa.225.0.copyload = load double, ptr %159, align 8, !tbaa !32
  %209 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.026.0.copyload, double %.sroa.227.0.copyload, double %.sroa.024.0.copyload, double %.sroa.225.0.copyload)
  %210 = extractvalue { double, double } %209, 0
  store double %210, ptr %21, align 16
  %211 = extractvalue { double, double } %209, 1
  store double %211, ptr %161, align 8
  %212 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %21, float noundef %162)
  %213 = extractvalue { double, double } %212, 0
  store double %213, ptr %20, align 16
  %214 = extractvalue { double, double } %212, 1
  store double %214, ptr %163, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #6
  %.sroa.022.0.copyload = load double, ptr %15, align 16
  %.sroa.223.0.copyload = load double, ptr %156, align 8, !tbaa !32
  %215 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.022.0.copyload, double %.sroa.223.0.copyload, double %207, double %208)
  %216 = extractvalue { double, double } %215, 0
  store double %216, ptr %23, align 16
  %217 = extractvalue { double, double } %215, 1
  store double %217, ptr %164, align 8
  %218 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %23, float noundef %162)
  %219 = extractvalue { double, double } %218, 0
  store double %219, ptr %22, align 16
  %220 = extractvalue { double, double } %218, 1
  store double %220, ptr %165, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #6
  %221 = load i32, ptr %185, align 16, !tbaa !29
  switch i32 %221, label %242 [
    i32 3, label %222
    i32 2, label %245
  ]

222:                                              ; preds = %195
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %25) #6
  %223 = getelementptr inbounds i8, ptr %.0118123, i64 28
  %224 = load i32, ptr %223, align 4, !tbaa !31
  %225 = sext i32 %224 to i64
  %226 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZNK3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %157, i64 noundef %225)
  %227 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %226)
  %228 = extractvalue { double, double } %227, 0
  %229 = extractvalue { double, double } %227, 1
  %230 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %228, double %229)
  %231 = extractvalue { double, double } %230, 0
  store double %231, ptr %25, align 16
  %232 = extractvalue { double, double } %230, 1
  store double %232, ptr %166, align 8
  %233 = call { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
  %234 = extractvalue { double, double } %233, 0
  %235 = extractvalue { double, double } %233, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %25) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #6
  %.sroa.012.0.copyload = load double, ptr %15, align 16
  %.sroa.213.0.copyload = load double, ptr %156, align 8, !tbaa !32
  %236 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.012.0.copyload, double %.sroa.213.0.copyload, double %234, double %235)
  %237 = extractvalue { double, double } %236, 0
  store double %237, ptr %26, align 16
  %238 = extractvalue { double, double } %236, 1
  store double %238, ptr %167, align 8
  %239 = call { double, double } @_ZNK3JPH5Plane6OffsetEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %162)
  %240 = extractvalue { double, double } %239, 0
  %241 = extractvalue { double, double } %239, 1
  store double %240, ptr %24, align 16
  store double %241, ptr %.sroa.415.0..sroa_idx, align 8, !tbaa !32
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #6
  br label %252

242:                                              ; preds = %195
  %243 = call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef nonnull @.str.9, ptr noundef nonnull @.str.4, i32 noundef 650)
  br i1 %243, label %244, label %245

244:                                              ; preds = %242
  call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #6, !srcloc !35
  br label %245

245:                                              ; preds = %195, %244, %242
  %.sroa.06.0.copyload = load double, ptr %15, align 16
  %.sroa.27.0.copyload = load double, ptr %156, align 8, !tbaa !32
  %246 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %207, double %208)
  %247 = extractvalue { double, double } %246, 0
  %248 = extractvalue { double, double } %246, 1
  %249 = call { double, double } @_ZN3JPH5Plane19sFromPointAndNormalENS_4Vec3ES1_(double %.sroa.06.0.copyload, double %.sroa.27.0.copyload, double %247, double %248)
  %250 = extractvalue { double, double } %249, 0
  %251 = extractvalue { double, double } %249, 1
  store double %250, ptr %24, align 16
  store double %251, ptr %.sroa.415.0..sroa_idx, align 8, !tbaa !32
  br label %252

252:                                              ; preds = %245, %222
  %253 = call noundef zeroext i1 @_ZN3JPH5Plane16sIntersectPlanesERKS0_S2_S2_RNS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %20, ptr noundef nonnull align 16 dereferenceable(16) %22, ptr noundef nonnull align 16 dereferenceable(16) %24, ptr noundef nonnull align 16 dereferenceable(16) %18)
  br i1 %253, label %261, label %254

254:                                              ; preds = %252
  %255 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %16, float noundef %141)
  %256 = extractvalue { double, double } %255, 0
  %257 = extractvalue { double, double } %255, 1
  %258 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %15, double %256, double %257)
  %259 = extractvalue { double, double } %258, 0
  %260 = extractvalue { double, double } %258, 1
  store double %259, ptr %18, align 16
  store double %260, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !32
  br label %261

261:                                              ; preds = %254, %252
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #6
  br label %262

262:                                              ; preds = %261, %188
  call void @_ZN3JPH11StaticArrayINS_4Vec3ELj256EE9push_backERKS1_(ptr noundef nonnull align 16 dereferenceable(4112) %142, ptr noundef nonnull align 16 dereferenceable(16) %18)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #6
  %263 = getelementptr inbounds i8, ptr %.0118123, i64 32
  %.not = icmp eq ptr %263, %155
  br i1 %.not, label %._crit_edge, label %168

264:                                              ; preds = %35
  %265 = tail call noundef zeroext i1 @_ZN3JPH23AssertFailedParamHelperEPKcS1_jNS_15AssertLastParamE(ptr noundef nonnull @.str.15, ptr noundef nonnull @.str.4, i32 noundef 670)
  br i1 %265, label %266, label %.loopexit

266:                                              ; preds = %264
  tail call void asm sideeffect "int $$0x3", "~{dirflag},~{fpsr},~{flags}"() #6, !srcloc !36
  br label %.loopexit

.loopexit:                                        ; preds = %138, %51, %266, %264, %._crit_edge, %39, %38, %34, %33
  %.0 = phi ptr [ %2, %33 ], [ %2, %34 ], [ %2, %._crit_edge ], [ %2, %38 ], [ %2, %39 ], [ null, %264 ], [ null, %266 ], [ %2, %51 ], [ %2, %138 ]
  ret ptr %.0
}

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH15ConvexHullShape20HullWithConvexScaledC2EPKS0_NS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32), ptr noundef, double, double) unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH15ConvexHullShape12HullNoConvexC2Ef(ptr noundef nonnull align 16 dereferenceable(4128), float noundef) unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(4112) ptr @_ZN3JPH15ConvexHullShape12HullNoConvex9GetPointsEv(ptr noundef nonnull align 16 dereferenceable(4128)) local_unnamed_addr #3 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef float @_ZN3JPH12ScaleHelpers17ScaleConvexRadiusEfNS_4Vec3E(float noundef, double, double) local_unnamed_addr #2

; 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

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 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { alwaysinline mustprogress 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 = { 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, !20, i64 256}
!6 = !{!"_ZTSN3JPH15ConvexHullShapeE", !7, i64 0, !21, i64 48, !22, i64 64, !23, i64 128, !24, i64 160, !25, i64 184, !26, i64 208, !27, i64 232, !20, i64 256, !20, i64 260, !20, i64 264}
!7 = !{!"_ZTSN3JPH11ConvexShapeE", !8, i64 0, !18, i64 32, !20, i64 40}
!8 = !{!"_ZTSN3JPH5ShapeE", !9, i64 8, !15, i64 16, !16, i64 24, !17, i64 25}
!9 = !{!"_ZTSN3JPH9RefTargetINS_5ShapeEEE", !10, i64 0}
!10 = !{!"_ZTSSt6atomicIjE", !11, i64 0}
!11 = !{!"_ZTSSt13__atomic_baseIjE", !12, i64 0}
!12 = !{!"int", !13, i64 0}
!13 = !{!"omnipotent char", !14, i64 0}
!14 = !{!"Simple C++ TBAA"}
!15 = !{!"long", !13, i64 0}
!16 = !{!"_ZTSN3JPH10EShapeTypeE", !13, i64 0}
!17 = !{!"_ZTSN3JPH13EShapeSubTypeE", !13, i64 0}
!18 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !19, i64 0}
!19 = !{!"any pointer", !13, i64 0}
!20 = !{!"float", !13, i64 0}
!21 = !{!"_ZTSN3JPH4Vec3E", !13, i64 0}
!22 = !{!"_ZTSN3JPH5Mat44E", !13, i64 0}
!23 = !{!"_ZTSN3JPH5AABoxE", !21, i64 0, !21, i64 16}
!24 = !{!"_ZTSN3JPH5ArrayINS_15ConvexHullShape5PointENS_12STLAllocatorIS2_EEEE", !15, i64 0, !15, i64 8, !19, i64 16}
!25 = !{!"_ZTSN3JPH5ArrayINS_15ConvexHullShape4FaceENS_12STLAllocatorIS2_EEEE", !15, i64 0, !15, i64 8, !19, i64 16}
!26 = !{!"_ZTSN3JPH5ArrayINS_5PlaneENS_12STLAllocatorIS1_EEEE", !15, i64 0, !15, i64 8, !19, i64 16}
!27 = !{!"_ZTSN3JPH5ArrayIhNS_12STLAllocatorIhEEEE", !15, i64 0, !15, i64 8, !19, i64 16}
!28 = !{i64 2158004856}
!29 = !{!30, !12, i64 16}
!30 = !{!"_ZTSN3JPH15ConvexHullShape5PointE", !21, i64 0, !12, i64 16, !13, i64 20}
!31 = !{!12, !12, i64 0}
!32 = !{!13, !13, i64 0}
!33 = !{i64 2158005205}
!34 = !{i64 2158005654}
!35 = !{i64 2158010064}
!36 = !{i64 2158010383}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,SROAPass,SimplifyCFGPass,TailCallElimPass