; LLVM IR from zig-gamedev/zphysics :: libs/Jolt/Physics/Collision (CollideConvexVsTriangles)

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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::AABox" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"struct.JPH::TriangleConvexSupport" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::EPAPenetrationDepth" = type { %"class.JPH::GJKClosestPoint", float, [12 x i8] }
%"class.JPH::GJKClosestPoint" = type <{ [4 x %"class.JPH::Vec3"], [4 x %"class.JPH::Vec3"], [4 x %"class.JPH::Vec3"], i32, [12 x i8] }>
%"struct.JPH::AddConvexRadius" = type <{ ptr, float, [4 x i8] }>
%"class.JPH::CollideShapeResult" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, %"class.JPH::SubShapeID", %"class.JPH::SubShapeID", %"class.JPH::BodyID", %"class.JPH::StaticArray", %"class.JPH::StaticArray" }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::StaticArray" = type { i32, [12 x i8], [32 x %"struct.JPH::StaticArray<JPH::Vec3, 32>::Storage"] }
%"struct.JPH::StaticArray<JPH::Vec3, 32>::Storage" = type { [16 x i8] }
%"class.JPH::CollideConvexVsTriangles" = type { ptr, ptr, ptr, %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Mat44", %"class.JPH::Mat44", %"class.JPH::AABox", %"class.JPH::AABox", %"class.JPH::SubShapeID", float, [8 x i8], %"class.JPH::ConvexShape::SupportBuffer", %"class.JPH::ConvexShape::SupportBuffer", ptr, ptr }
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::ConvexShape::SupportBuffer" = type { [4160 x i8] }
%"class.JPH::CollideShapeSettings" = type <{ %"class.JPH::CollideSettingsBase", float, i8, [11 x i8] }>
%"class.JPH::CollideSettingsBase" = type { i8, i8, float, float, %"class.JPH::Vec3" }

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

declare i32 @__gxx_personality_v0(...)

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24CollideConvexVsTriangles7CollideENS_4Vec3ES1_S1_hRKNS_10SubShapeIDE(ptr noundef nonnull align 16 dereferenceable(8608) %0, double %1, double %2, double %3, double %4, double %5, double %6, i8 noundef zeroext %7, ptr noundef nonnull align 4 dereferenceable(4) %8) #2 align 2 personality ptr @__gxx_personality_v0 {
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca ptr, align 8
  %14 = alloca i8, align 1
  %15 = alloca ptr, align 8
  %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::Vec3", align 16
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca %"class.JPH::Vec3", align 16
  %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::Vec3", align 16
  %28 = alloca %"class.JPH::Vec3", align 16
  %29 = alloca %"class.JPH::Vec3", align 16
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca i8, align 1
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca i32, align 4
  %34 = alloca %"class.JPH::AABox", 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 %"struct.JPH::TriangleConvexSupport", align 16
  %39 = alloca %"class.JPH::Vec3", align 16
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca %"class.JPH::Vec3", align 16
  %42 = alloca %"class.JPH::Vec3", align 16
  %43 = alloca %"class.JPH::Vec3", align 16
  %44 = alloca %"class.JPH::Vec3", align 16
  %45 = alloca %"class.JPH::EPAPenetrationDepth", align 16
  %46 = alloca i32, align 4
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = alloca %"class.JPH::Vec3", align 16
  %49 = alloca %"struct.JPH::AddConvexRadius", align 8
  %50 = alloca float, align 4
  %51 = alloca %"class.JPH::Vec3", align 16
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca float, align 4
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca %"class.JPH::Vec3", align 16
  %59 = alloca %"class.JPH::Vec3", align 16
  %60 = alloca %"class.JPH::Vec3", align 16
  %61 = alloca %"class.JPH::Vec3", align 16
  %62 = alloca %"class.JPH::Vec3", align 16
  %63 = alloca %"class.JPH::Vec3", align 16
  %64 = alloca %"class.JPH::Vec3", align 16
  %65 = alloca %"class.JPH::Vec3", align 16
  %66 = alloca %"class.JPH::Vec3", align 16
  %67 = alloca %"class.JPH::Vec3", align 16
  %68 = alloca %"class.JPH::Vec3", align 16
  %69 = alloca %"class.JPH::Vec3", align 16
  %70 = alloca %"class.JPH::Vec3", align 16
  %71 = alloca %"class.JPH::CollideShapeResult", align 16
  %72 = alloca %"class.JPH::Vec3", align 16
  %73 = alloca %"class.JPH::Vec3", align 16
  %74 = alloca %"class.JPH::Vec3", align 16
  %75 = alloca %"class.JPH::BodyID", align 4
  %76 = alloca %"class.JPH::SubShapeID", align 4
  %77 = alloca %"class.JPH::Vec3", align 16
  %78 = alloca ptr, align 8
  %79 = alloca i32, align 4
  %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 %"class.JPH::Vec3", align 16
  %85 = alloca %"class.JPH::Vec3", align 16
  %86 = alloca %"class.JPH::Vec3", align 16
  %87 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 0
  store double %1, ptr %87, align 16
  %88 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 1
  store double %2, ptr %88, align 8
  %89 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 0
  store double %3, ptr %89, align 16
  %90 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 1
  store double %4, ptr %90, align 8
  %91 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  store double %5, ptr %91, align 16
  %92 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  store double %6, ptr %92, align 8
  store ptr %0, ptr %13, align 8, !tbaa !5
  store i8 %7, ptr %14, align 1, !tbaa !9
  store ptr %8, ptr %15, align 8, !tbaa !5
  %93 = load ptr, ptr %13, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %16) #11
  %94 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 6
  %95 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %18, ptr align 16 %10, i64 16, i1 false), !tbaa.struct !10
  %96 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 0
  %97 = load double, ptr %96, align 16
  %98 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 1
  %99 = load double, ptr %98, align 8
  %100 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %95, double %97, double %99)
  %101 = getelementptr inbounds %"class.JPH::Vec3", ptr %17, i32 0, i32 0
  %102 = getelementptr inbounds %union.anon, ptr %101, i32 0, i32 0
  %103 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 0
  %104 = extractvalue { double, double } %100, 0
  store double %104, ptr %103, align 16
  %105 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 1
  %106 = extractvalue { double, double } %100, 1
  store double %106, ptr %105, align 8
  %107 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  %108 = load double, ptr %107, align 16
  %109 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  %110 = load double, ptr %109, align 8
  %111 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %94, double %108, double %110)
  %112 = getelementptr inbounds %"class.JPH::Vec3", ptr %16, i32 0, i32 0
  %113 = getelementptr inbounds %union.anon, ptr %112, i32 0, i32 0
  %114 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 0
  %115 = extractvalue { double, double } %111, 0
  store double %115, ptr %114, align 16
  %116 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 1
  %117 = extractvalue { double, double } %111, 1
  store double %117, ptr %116, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #11
  %118 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 6
  %119 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %21, ptr align 16 %11, i64 16, i1 false), !tbaa.struct !10
  %120 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 0
  %121 = load double, ptr %120, align 16
  %122 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 1
  %123 = load double, ptr %122, align 8
  %124 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %119, double %121, double %123)
  %125 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %126 = getelementptr inbounds %union.anon, ptr %125, i32 0, i32 0
  %127 = getelementptr inbounds { double, double }, ptr %126, i32 0, i32 0
  %128 = extractvalue { double, double } %124, 0
  store double %128, ptr %127, align 16
  %129 = getelementptr inbounds { double, double }, ptr %126, i32 0, i32 1
  %130 = extractvalue { double, double } %124, 1
  store double %130, ptr %129, align 8
  %131 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 0
  %132 = load double, ptr %131, align 16
  %133 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 1
  %134 = load double, ptr %133, align 8
  %135 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %118, double %132, double %134)
  %136 = getelementptr inbounds %"class.JPH::Vec3", ptr %19, i32 0, i32 0
  %137 = getelementptr inbounds %union.anon, ptr %136, i32 0, i32 0
  %138 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 0
  %139 = extractvalue { double, double } %135, 0
  store double %139, ptr %138, align 16
  %140 = getelementptr inbounds { double, double }, ptr %137, i32 0, i32 1
  %141 = extractvalue { double, double } %135, 1
  store double %141, ptr %140, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %22) #11
  %142 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 6
  %143 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %24, ptr align 16 %12, i64 16, i1 false), !tbaa.struct !10
  %144 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 0
  %145 = load double, ptr %144, align 16
  %146 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 1
  %147 = load double, ptr %146, align 8
  %148 = call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %143, double %145, double %147)
  %149 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %150 = getelementptr inbounds %union.anon, ptr %149, i32 0, i32 0
  %151 = getelementptr inbounds { double, double }, ptr %150, i32 0, i32 0
  %152 = extractvalue { double, double } %148, 0
  store double %152, ptr %151, align 16
  %153 = getelementptr inbounds { double, double }, ptr %150, i32 0, i32 1
  %154 = extractvalue { double, double } %148, 1
  store double %154, ptr %153, align 8
  %155 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 0
  %156 = load double, ptr %155, align 16
  %157 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 1
  %158 = load double, ptr %157, align 8
  %159 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %142, double %156, double %158)
  %160 = getelementptr inbounds %"class.JPH::Vec3", ptr %22, i32 0, i32 0
  %161 = getelementptr inbounds %union.anon, ptr %160, i32 0, i32 0
  %162 = getelementptr inbounds { double, double }, ptr %161, i32 0, i32 0
  %163 = extractvalue { double, double } %159, 0
  store double %163, ptr %162, align 16
  %164 = getelementptr inbounds { double, double }, ptr %161, i32 0, i32 1
  %165 = extractvalue { double, double } %159, 1
  store double %165, ptr %164, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #11
  %166 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 10
  %167 = load float, ptr %166, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %28, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  %168 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 0
  %169 = load double, ptr %168, align 16
  %170 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 1
  %171 = load double, ptr %170, align 8
  %172 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %169, double %171)
  %173 = getelementptr inbounds %"class.JPH::Vec3", ptr %27, i32 0, i32 0
  %174 = getelementptr inbounds %union.anon, ptr %173, i32 0, i32 0
  %175 = getelementptr inbounds { double, double }, ptr %174, i32 0, i32 0
  %176 = extractvalue { double, double } %172, 0
  store double %176, ptr %175, align 16
  %177 = getelementptr inbounds { double, double }, ptr %174, i32 0, i32 1
  %178 = extractvalue { double, double } %172, 1
  store double %178, ptr %177, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %30, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  %179 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 0
  %180 = load double, ptr %179, align 16
  %181 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 1
  %182 = load double, ptr %181, align 8
  %183 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %22, double %180, double %182)
  %184 = getelementptr inbounds %"class.JPH::Vec3", ptr %29, i32 0, i32 0
  %185 = getelementptr inbounds %union.anon, ptr %184, i32 0, i32 0
  %186 = getelementptr inbounds { double, double }, ptr %185, i32 0, i32 0
  %187 = extractvalue { double, double } %183, 0
  store double %187, ptr %186, align 16
  %188 = getelementptr inbounds { double, double }, ptr %185, i32 0, i32 1
  %189 = extractvalue { double, double } %183, 1
  store double %189, ptr %188, align 8
  %190 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 0
  %191 = load double, ptr %190, align 16
  %192 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 1
  %193 = load double, ptr %192, align 8
  %194 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %191, double %193)
  %195 = getelementptr inbounds %"class.JPH::Vec3", ptr %26, i32 0, i32 0
  %196 = getelementptr inbounds %union.anon, ptr %195, i32 0, i32 0
  %197 = getelementptr inbounds { double, double }, ptr %196, i32 0, i32 0
  %198 = extractvalue { double, double } %194, 0
  store double %198, ptr %197, align 16
  %199 = getelementptr inbounds { double, double }, ptr %196, i32 0, i32 1
  %200 = extractvalue { double, double } %194, 1
  store double %200, ptr %199, align 8
  %201 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 0
  %202 = load double, ptr %201, align 16
  %203 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 1
  %204 = load double, ptr %203, align 8
  %205 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %167, double %202, double %204)
  %206 = getelementptr inbounds %"class.JPH::Vec3", ptr %25, i32 0, i32 0
  %207 = getelementptr inbounds %union.anon, ptr %206, i32 0, i32 0
  %208 = getelementptr inbounds { double, double }, ptr %207, i32 0, i32 0
  %209 = extractvalue { double, double } %205, 0
  store double %209, ptr %208, align 16
  %210 = getelementptr inbounds { double, double }, ptr %207, i32 0, i32 1
  %211 = extractvalue { double, double } %205, 1
  store double %211, ptr %210, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #11
  call void @llvm.lifetime.start.p0(i64 1, ptr %31) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %32, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  %212 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 0
  %213 = load double, ptr %212, align 16
  %214 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 1
  %215 = load double, ptr %214, align 8
  %216 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %25, double %213, double %215)
  %217 = fcmp ogt float %216, 0.000000e+00
  %218 = zext i1 %217 to i8
  store i8 %218, ptr %31, align 1, !tbaa !20
  %219 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %220 = load ptr, ptr %219, align 16, !tbaa !22
  %221 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %220, i32 0, i32 2
  %222 = load i8, ptr %221, align 4, !tbaa !23
  %223 = icmp eq i8 %222, 0
  br i1 %223, label %224, label %228

224:                                              ; preds = %9
  %225 = load i8, ptr %31, align 1, !tbaa !20, !range !29, !noundef !30
  %226 = trunc i8 %225 to i1
  br i1 %226, label %227, label %228

227:                                              ; preds = %224
  store i32 1, ptr %33, align 4
  br label %620

228:                                              ; preds = %224, %9
  call void @llvm.lifetime.start.p0(i64 32, ptr %34) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %35, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %36, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !10
  %229 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %230 = load double, ptr %229, align 16
  %231 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %232 = load double, ptr %231, align 8
  %233 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %234 = load double, ptr %233, align 16
  %235 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %236 = load double, ptr %235, align 8
  call void @_ZN3JPH5AABox14sFromTwoPointsENS_4Vec3ES1_(ptr dead_on_unwind writable sret(%"class.JPH::AABox") align 16 %34, double %230, double %232, double %234, double %236)
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %37, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %237 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 0
  %238 = load double, ptr %237, align 16
  %239 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 1
  %240 = load double, ptr %239, align 8
  call void @_ZN3JPH5AABox11EncapsulateENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %34, double %238, double %240)
  %241 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 7
  %242 = call noundef zeroext i1 @_ZNK3JPH5AABox8OverlapsERKS0_(ptr noundef nonnull align 16 dereferenceable(32) %34, ptr noundef nonnull align 16 dereferenceable(32) %241)
  br i1 %242, label %244, label %243

243:                                              ; preds = %228
  store i32 1, ptr %33, align 4
  br label %619

244:                                              ; preds = %228
  call void @llvm.lifetime.start.p0(i64 48, ptr %38) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %39, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %40, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %41, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %245 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 0
  %246 = load double, ptr %245, align 16
  %247 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 1
  %248 = load double, ptr %247, align 8
  %249 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 0
  %250 = load double, ptr %249, align 16
  %251 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 1
  %252 = load double, ptr %251, align 8
  %253 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %254 = load double, ptr %253, align 16
  %255 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %256 = load double, ptr %255, align 8
  call void @_ZN3JPH21TriangleConvexSupportC2ENS_4Vec3ES1_S1_(ptr noundef nonnull align 16 dereferenceable(48) %38, double %246, double %248, double %250, double %252, double %254, double %256)
  call void @llvm.lifetime.start.p0(i64 16, ptr %42) #11
  %257 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
  %258 = getelementptr inbounds %"class.JPH::Vec3", ptr %42, i32 0, i32 0
  %259 = getelementptr inbounds %union.anon, ptr %258, i32 0, i32 0
  %260 = getelementptr inbounds { double, double }, ptr %259, i32 0, i32 0
  %261 = extractvalue { double, double } %257, 0
  store double %261, ptr %260, align 16
  %262 = getelementptr inbounds { double, double }, ptr %259, i32 0, i32 1
  %263 = extractvalue { double, double } %257, 1
  store double %263, ptr %262, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #11
  call void @llvm.lifetime.start.p0(i64 224, ptr %45) #11
  call void @_ZN3JPH19EPAPenetrationDepthC2Ev(ptr noundef nonnull align 16 dereferenceable(212) %45) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #11
  %264 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 14
  %265 = load ptr, ptr %264, align 16, !tbaa !31
  %266 = icmp eq ptr %265, null
  br i1 %266, label %267, label %281

267:                                              ; preds = %244
  %268 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 2
  %269 = load ptr, ptr %268, align 16, !tbaa !32
  %270 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 12
  %271 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %271, i64 16, i1 false), !tbaa.struct !10
  %272 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %273 = load double, ptr %272, align 16
  %274 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %275 = load double, ptr %274, align 8
  %276 = load ptr, ptr %269, align 8, !tbaa !33
  %277 = getelementptr inbounds ptr, ptr %276, i64 34
  %278 = load ptr, ptr %277, align 8
  %279 = call noundef ptr %278(ptr noundef nonnull align 8 dereferenceable(44) %269, i32 noundef 0, ptr noundef nonnull align 16 dereferenceable(4160) %270, double %273, double %275)
  %280 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 14
  store ptr %279, ptr %280, align 16, !tbaa !31
  br label %281

281:                                              ; preds = %267, %244
  %282 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 14
  %283 = load ptr, ptr %282, align 16, !tbaa !31
  %284 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 14
  %285 = load ptr, ptr %284, align 16, !tbaa !31
  %286 = load ptr, ptr %285, align 8, !tbaa !33
  %287 = getelementptr inbounds ptr, ptr %286, i64 3
  %288 = load ptr, ptr %287, align 8
  %289 = call noundef float %288(ptr noundef nonnull align 8 dereferenceable(8) %285)
  %290 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %291 = load ptr, ptr %290, align 16, !tbaa !22
  %292 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %291, i32 0, i32 1
  %293 = load float, ptr %292, align 16, !tbaa !35
  %294 = fadd float %289, %293
  %295 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %296 = load ptr, ptr %295, align 16, !tbaa !22
  %297 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %296, i32 0, i32 2
  %298 = load float, ptr %297, align 4, !tbaa !36
  %299 = call noundef i32 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepGJKINS_11ConvexShape7SupportENS_21TriangleConvexSupportEEENS0_7EStatusERKT_fRKT0_ffRNS_4Vec3ESD_SD_(ptr noundef nonnull align 16 dereferenceable(212) %45, ptr noundef nonnull align 8 dereferenceable(8) %283, float noundef %294, ptr noundef nonnull align 16 dereferenceable(48) %38, float noundef 0.000000e+00, float noundef %298, ptr noundef nonnull align 16 dereferenceable(16) %42, ptr noundef nonnull align 16 dereferenceable(16) %43, ptr noundef nonnull align 16 dereferenceable(16) %44)
  store i32 %299, ptr %46, align 4, !tbaa !37
  %300 = load i32, ptr %46, align 4, !tbaa !37
  %301 = icmp eq i32 %300, 0
  br i1 %301, label %302, label %303

302:                                              ; preds = %281
  store i32 1, ptr %33, align 4
  br label %618

303:                                              ; preds = %281
  %304 = load i32, ptr %46, align 4, !tbaa !37
  %305 = icmp eq i32 %304, 2
  br i1 %305, label %306, label %341

306:                                              ; preds = %303
  %307 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 15
  %308 = load ptr, ptr %307, align 8, !tbaa !39
  %309 = icmp eq ptr %308, null
  br i1 %309, label %310, label %324

310:                                              ; preds = %306
  %311 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 2
  %312 = load ptr, ptr %311, align 16, !tbaa !32
  %313 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 13
  %314 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %48, ptr align 16 %314, i64 16, i1 false), !tbaa.struct !10
  %315 = getelementptr inbounds { double, double }, ptr %48, i32 0, i32 0
  %316 = load double, ptr %315, align 16
  %317 = getelementptr inbounds { double, double }, ptr %48, i32 0, i32 1
  %318 = load double, ptr %317, align 8
  %319 = load ptr, ptr %312, align 8, !tbaa !33
  %320 = getelementptr inbounds ptr, ptr %319, i64 34
  %321 = load ptr, ptr %320, align 8
  %322 = call noundef ptr %321(ptr noundef nonnull align 8 dereferenceable(44) %312, i32 noundef 1, ptr noundef nonnull align 16 dereferenceable(4160) %313, double %316, double %318)
  %323 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 15
  store ptr %322, ptr %323, align 8, !tbaa !39
  br label %324

324:                                              ; preds = %310, %306
  call void @llvm.lifetime.start.p0(i64 16, ptr %49) #11
  %325 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 15
  %326 = load ptr, ptr %325, align 8, !tbaa !39
  %327 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %328 = load ptr, ptr %327, align 16, !tbaa !22
  %329 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %328, i32 0, i32 1
  %330 = load float, ptr %329, align 16, !tbaa !35
  call void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12) %49, ptr noundef nonnull align 8 dereferenceable(8) %326, float noundef %330)
  %331 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %332 = load ptr, ptr %331, align 16, !tbaa !22
  %333 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %332, i32 0, i32 3
  %334 = load float, ptr %333, align 8, !tbaa !40
  %335 = call noundef zeroext i1 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepEPAINS_15AddConvexRadiusINS_11ConvexShape7SupportEEENS_21TriangleConvexSupportEEEbRKT_RKT0_fRNS_4Vec3ESE_SE_(ptr noundef nonnull align 16 dereferenceable(212) %45, ptr noundef nonnull align 8 dereferenceable(12) %49, ptr noundef nonnull align 16 dereferenceable(48) %38, float noundef %334, ptr noundef nonnull align 16 dereferenceable(16) %42, ptr noundef nonnull align 16 dereferenceable(16) %43, ptr noundef nonnull align 16 dereferenceable(16) %44)
  br i1 %335, label %337, label %336

336:                                              ; preds = %324
  store i32 1, ptr %33, align 4
  br label %338

337:                                              ; preds = %324
  store i32 0, ptr %33, align 4
  br label %338

338:                                              ; preds = %337, %336
  call void @llvm.lifetime.end.p0(i64 16, ptr %49) #11
  %339 = load i32, ptr %33, align 4
  switch i32 %339, label %618 [
    i32 0, label %340
  ]

340:                                              ; preds = %338
  br label %341

341:                                              ; preds = %340, %303
  br label %342

342:                                              ; preds = %341
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %51) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %52, ptr align 16 %43, i64 16, i1 false), !tbaa.struct !10
  %343 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 0
  %344 = load double, ptr %343, align 16
  %345 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 1
  %346 = load double, ptr %345, align 8
  %347 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %44, double %344, double %346)
  %348 = getelementptr inbounds %"class.JPH::Vec3", ptr %51, i32 0, i32 0
  %349 = getelementptr inbounds %union.anon, ptr %348, i32 0, i32 0
  %350 = getelementptr inbounds { double, double }, ptr %349, i32 0, i32 0
  %351 = extractvalue { double, double } %347, 0
  store double %351, ptr %350, align 16
  %352 = getelementptr inbounds { double, double }, ptr %349, i32 0, i32 1
  %353 = extractvalue { double, double } %347, 1
  store double %353, ptr %352, align 8
  %354 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %51)
  %355 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %356 = load ptr, ptr %355, align 16, !tbaa !22
  %357 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %356, i32 0, i32 1
  %358 = load float, ptr %357, align 16, !tbaa !35
  %359 = fsub float %354, %358
  call void @llvm.lifetime.end.p0(i64 16, ptr %51) #11
  store float %359, ptr %50, align 4, !tbaa !41
  %360 = load float, ptr %50, align 4, !tbaa !41
  %361 = fneg float %360
  %362 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 1
  %363 = load ptr, ptr %362, align 8, !tbaa !42
  %364 = call noundef float @_ZNK3JPH18CollisionCollectorINS_18CollideShapeResultENS_36CollisionCollectorTraitsCollideShapeEE19GetEarlyOutFractionEv(ptr noundef nonnull align 8 dereferenceable(24) %363)
  %365 = fcmp oge float %361, %364
  br i1 %365, label %366, label %367

366:                                              ; preds = %342
  store i32 1, ptr %33, align 4
  br label %617

367:                                              ; preds = %342
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #11
  %368 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %42)
  store float %368, ptr %53, align 4, !tbaa !41
  %369 = load float, ptr %53, align 4, !tbaa !41
  %370 = fcmp ogt float %369, 0.000000e+00
  br i1 %370, label %371, label %390

371:                                              ; preds = %367
  %372 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %373 = load ptr, ptr %372, align 16, !tbaa !22
  %374 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %373, i32 0, i32 1
  %375 = load float, ptr %374, align 16, !tbaa !35
  %376 = load float, ptr %53, align 4, !tbaa !41
  %377 = fdiv float %375, %376
  %378 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %42, float noundef %377)
  %379 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %380 = getelementptr inbounds %union.anon, ptr %379, i32 0, i32 0
  %381 = getelementptr inbounds { double, double }, ptr %380, i32 0, i32 0
  %382 = extractvalue { double, double } %378, 0
  store double %382, ptr %381, align 16
  %383 = getelementptr inbounds { double, double }, ptr %380, i32 0, i32 1
  %384 = extractvalue { double, double } %378, 1
  store double %384, ptr %383, align 8
  %385 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %386 = load double, ptr %385, align 16
  %387 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %388 = load double, ptr %387, align 8
  %389 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %43, double %386, double %388)
  br label %390

390:                                              ; preds = %371, %367
  %391 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %392 = load ptr, ptr %391, align 16, !tbaa !22
  %393 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %392, i32 0, i32 0
  %394 = load i8, ptr %393, align 16, !tbaa !43
  %395 = icmp eq i8 %394, 0
  br i1 %395, label %396, label %452

396:                                              ; preds = %390
  %397 = load i8, ptr %14, align 1, !tbaa !9
  %398 = zext i8 %397 to i32
  %399 = icmp ne i32 %398, 7
  br i1 %399, label %400, label %452

400:                                              ; preds = %396
  call void @llvm.lifetime.start.p0(i64 16, ptr %55) #11
  %401 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  %402 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %403 = load ptr, ptr %402, align 16, !tbaa !22
  %404 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %403, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %56, ptr align 16 %404, i64 16, i1 false), !tbaa.struct !10
  %405 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 0
  %406 = load double, ptr %405, align 16
  %407 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 1
  %408 = load double, ptr %407, align 8
  %409 = call { double, double } @_ZNK3JPH5Mat4421Multiply3x3TransposedENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %401, double %406, double %408)
  %410 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %411 = getelementptr inbounds %union.anon, ptr %410, i32 0, i32 0
  %412 = getelementptr inbounds { double, double }, ptr %411, i32 0, i32 0
  %413 = extractvalue { double, double } %409, 0
  store double %413, ptr %412, align 16
  %414 = getelementptr inbounds { double, double }, ptr %411, i32 0, i32 1
  %415 = extractvalue { double, double } %409, 1
  store double %415, ptr %414, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %58, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %59, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %60, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %416 = load i8, ptr %31, align 1, !tbaa !20, !range !29, !noundef !30
  %417 = trunc i8 %416 to i1
  br i1 %417, label %418, label %419

418:                                              ; preds = %400
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %61, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !10
  br label %427

419:                                              ; preds = %400
  %420 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
  %421 = getelementptr inbounds %"class.JPH::Vec3", ptr %61, i32 0, i32 0
  %422 = getelementptr inbounds %union.anon, ptr %421, i32 0, i32 0
  %423 = getelementptr inbounds { double, double }, ptr %422, i32 0, i32 0
  %424 = extractvalue { double, double } %420, 0
  store double %424, ptr %423, align 16
  %425 = getelementptr inbounds { double, double }, ptr %422, i32 0, i32 1
  %426 = extractvalue { double, double } %420, 1
  store double %426, ptr %425, align 8
  br label %427

427:                                              ; preds = %419, %418
  %428 = load i8, ptr %14, align 1, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %62, ptr align 16 %44, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %63, ptr align 16 %42, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %64, ptr align 16 %55, i64 16, i1 false), !tbaa.struct !10
  %429 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 0
  %430 = load double, ptr %429, align 16
  %431 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 1
  %432 = load double, ptr %431, align 8
  %433 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 0
  %434 = load double, ptr %433, align 16
  %435 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 1
  %436 = load double, ptr %435, align 8
  %437 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %438 = load double, ptr %437, align 16
  %439 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %440 = load double, ptr %439, align 8
  %441 = getelementptr inbounds { double, double }, ptr %61, i32 0, i32 0
  %442 = load double, ptr %441, align 16
  %443 = getelementptr inbounds { double, double }, ptr %61, i32 0, i32 1
  %444 = load double, ptr %443, align 8
  %445 = call { double, double } @_ZN3JPH11ActiveEdgesL9FixNormalENS_4Vec3ES1_S1_S1_hS1_S1_S1_(double %430, double %432, double %434, double %436, double %438, double %440, double %442, double %444, i8 noundef zeroext %428, ptr noundef byval(%"class.JPH::Vec3") align 16 %62, ptr noundef byval(%"class.JPH::Vec3") align 16 %63, ptr noundef byval(%"class.JPH::Vec3") align 16 %64)
  %446 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %447 = getelementptr inbounds %union.anon, ptr %446, i32 0, i32 0
  %448 = getelementptr inbounds { double, double }, ptr %447, i32 0, i32 0
  %449 = extractvalue { double, double } %445, 0
  store double %449, ptr %448, align 16
  %450 = getelementptr inbounds { double, double }, ptr %447, i32 0, i32 1
  %451 = extractvalue { double, double } %445, 1
  store double %451, ptr %450, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %42, ptr align 16 %57, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %55) #11
  br label %452

452:                                              ; preds = %427, %396, %390
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #11
  %453 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %66, ptr align 16 %43, i64 16, i1 false), !tbaa.struct !10
  %454 = getelementptr inbounds { double, double }, ptr %66, i32 0, i32 0
  %455 = load double, ptr %454, align 16
  %456 = getelementptr inbounds { double, double }, ptr %66, i32 0, i32 1
  %457 = load double, ptr %456, align 8
  %458 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %453, double %455, double %457)
  %459 = getelementptr inbounds %"class.JPH::Vec3", ptr %65, i32 0, i32 0
  %460 = getelementptr inbounds %union.anon, ptr %459, i32 0, i32 0
  %461 = getelementptr inbounds { double, double }, ptr %460, i32 0, i32 0
  %462 = extractvalue { double, double } %458, 0
  store double %462, ptr %461, align 16
  %463 = getelementptr inbounds { double, double }, ptr %460, i32 0, i32 1
  %464 = extractvalue { double, double } %458, 1
  store double %464, ptr %463, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %43, ptr align 16 %65, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %67) #11
  %465 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %68, ptr align 16 %44, i64 16, i1 false), !tbaa.struct !10
  %466 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %467 = load double, ptr %466, align 16
  %468 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %469 = load double, ptr %468, align 8
  %470 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %465, double %467, double %469)
  %471 = getelementptr inbounds %"class.JPH::Vec3", ptr %67, i32 0, i32 0
  %472 = getelementptr inbounds %union.anon, ptr %471, i32 0, i32 0
  %473 = getelementptr inbounds { double, double }, ptr %472, i32 0, i32 0
  %474 = extractvalue { double, double } %470, 0
  store double %474, ptr %473, align 16
  %475 = getelementptr inbounds { double, double }, ptr %472, i32 0, i32 1
  %476 = extractvalue { double, double } %470, 1
  store double %476, ptr %475, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %44, ptr align 16 %67, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %67) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %69) #11
  %477 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %70, ptr align 16 %42, i64 16, i1 false), !tbaa.struct !10
  %478 = getelementptr inbounds { double, double }, ptr %70, i32 0, i32 0
  %479 = load double, ptr %478, align 16
  %480 = getelementptr inbounds { double, double }, ptr %70, i32 0, i32 1
  %481 = load double, ptr %480, align 8
  %482 = call { double, double } @_ZNK3JPH5Mat4411Multiply3x3ENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %477, double %479, double %481)
  %483 = getelementptr inbounds %"class.JPH::Vec3", ptr %69, i32 0, i32 0
  %484 = getelementptr inbounds %union.anon, ptr %483, i32 0, i32 0
  %485 = getelementptr inbounds { double, double }, ptr %484, i32 0, i32 0
  %486 = extractvalue { double, double } %482, 0
  store double %486, ptr %485, align 16
  %487 = getelementptr inbounds { double, double }, ptr %484, i32 0, i32 1
  %488 = extractvalue { double, double } %482, 1
  store double %488, ptr %487, align 8
  call void @llvm.lifetime.start.p0(i64 1120, ptr %71) #11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %72, ptr align 16 %43, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %73, ptr align 16 %44, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %74, ptr align 16 %69, i64 16, i1 false), !tbaa.struct !10
  %489 = load float, ptr %50, align 4, !tbaa !41
  %490 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 9
  %491 = load ptr, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %75) #11
  %492 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 1
  %493 = load ptr, ptr %492, align 8, !tbaa !42
  %494 = call noundef ptr @_ZNK3JPH18CollisionCollectorINS_18CollideShapeResultENS_36CollisionCollectorTraitsCollideShapeEE10GetContextEv(ptr noundef nonnull align 8 dereferenceable(24) %493)
  %495 = call i32 @_ZN3JPH16TransformedShape10sGetBodyIDEPKS0_(ptr noundef %494)
  %496 = getelementptr inbounds %"class.JPH::BodyID", ptr %75, i32 0, i32 0
  store i32 %495, ptr %496, align 4
  %497 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 0
  %498 = load double, ptr %497, align 16
  %499 = getelementptr inbounds { double, double }, ptr %72, i32 0, i32 1
  %500 = load double, ptr %499, align 8
  %501 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 0
  %502 = load double, ptr %501, align 16
  %503 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 1
  %504 = load double, ptr %503, align 8
  %505 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 0
  %506 = load double, ptr %505, align 16
  %507 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 1
  %508 = load double, ptr %507, align 8
  call void @_ZN3JPH18CollideShapeResultC2ENS_4Vec3ES1_S1_fRKNS_10SubShapeIDES4_RKNS_6BodyIDE(ptr noundef nonnull align 16 dereferenceable(1120) %71, double %498, double %500, double %502, double %504, double %506, double %508, float noundef %489, ptr noundef nonnull align 4 dereferenceable(4) %490, ptr noundef nonnull align 4 dereferenceable(4) %491, ptr noundef nonnull align 4 dereferenceable(4) %75)
  call void @llvm.lifetime.end.p0(i64 4, ptr %75) #11
  %509 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 0
  %510 = load ptr, ptr %509, align 16, !tbaa !22
  %511 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %510, i32 0, i32 1
  %512 = load i8, ptr %511, align 1, !tbaa !44
  %513 = icmp eq i8 %512, 0
  br i1 %513, label %514, label %610

514:                                              ; preds = %452
  %515 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 2
  %516 = load ptr, ptr %515, align 16, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %76) #11
  call void @llvm.memset.p0.i64(ptr align 4 %76, i8 0, i64 4, i1 false)
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %76) #11
  %517 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %42)
          to label %518 unwind label %590

518:                                              ; preds = %514
  %519 = getelementptr inbounds %"class.JPH::Vec3", ptr %77, i32 0, i32 0
  %520 = getelementptr inbounds %union.anon, ptr %519, i32 0, i32 0
  %521 = getelementptr inbounds { double, double }, ptr %520, i32 0, i32 0
  %522 = extractvalue { double, double } %517, 0
  store double %522, ptr %521, align 16
  %523 = getelementptr inbounds { double, double }, ptr %520, i32 0, i32 1
  %524 = extractvalue { double, double } %517, 1
  store double %524, ptr %523, align 8
  %525 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %80, ptr align 16 %525, i64 16, i1 false), !tbaa.struct !10
  %526 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  %527 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %71, i32 0, i32 7
  %528 = getelementptr inbounds { double, double }, ptr %77, i32 0, i32 0
  %529 = load double, ptr %528, align 16
  %530 = getelementptr inbounds { double, double }, ptr %77, i32 0, i32 1
  %531 = load double, ptr %530, align 8
  %532 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 0
  %533 = load double, ptr %532, align 16
  %534 = getelementptr inbounds { double, double }, ptr %80, i32 0, i32 1
  %535 = load double, ptr %534, align 8
  %536 = load ptr, ptr %516, align 8, !tbaa !33
  %537 = getelementptr inbounds ptr, ptr %536, i64 11
  %538 = load ptr, ptr %537, align 8
  invoke void %538(ptr noundef nonnull align 8 dereferenceable(26) %516, ptr noundef nonnull align 4 dereferenceable(4) %76, double %529, double %531, double %533, double %535, ptr noundef nonnull align 16 dereferenceable(64) %526, ptr noundef nonnull align 16 dereferenceable(528) %527)
          to label %539 unwind label %590

539:                                              ; preds = %518
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #11
  %540 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %71, i32 0, i32 8
  invoke void @_ZN3JPH11StaticArrayINS_4Vec3ELj32EE6resizeEj(ptr noundef nonnull align 16 dereferenceable(528) %540, i32 noundef 3)
          to label %541 unwind label %594

541:                                              ; preds = %539
  call void @llvm.lifetime.start.p0(i64 16, ptr %81) #11
  %542 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %82, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  %543 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 0
  %544 = load double, ptr %543, align 16
  %545 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 1
  %546 = load double, ptr %545, align 8
  %547 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %542, double %544, double %546)
          to label %548 unwind label %598

548:                                              ; preds = %541
  %549 = getelementptr inbounds %"class.JPH::Vec3", ptr %81, i32 0, i32 0
  %550 = getelementptr inbounds %union.anon, ptr %549, i32 0, i32 0
  %551 = getelementptr inbounds { double, double }, ptr %550, i32 0, i32 0
  %552 = extractvalue { double, double } %547, 0
  store double %552, ptr %551, align 16
  %553 = getelementptr inbounds { double, double }, ptr %550, i32 0, i32 1
  %554 = extractvalue { double, double } %547, 1
  store double %554, ptr %553, align 8
  %555 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %71, i32 0, i32 8
  %556 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %555, i32 noundef 0)
          to label %557 unwind label %598

557:                                              ; preds = %548
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %556, ptr align 16 %81, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %83) #11
  %558 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %84, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !10
  %559 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 0
  %560 = load double, ptr %559, align 16
  %561 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 1
  %562 = load double, ptr %561, align 8
  %563 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %558, double %560, double %562)
          to label %564 unwind label %602

564:                                              ; preds = %557
  %565 = getelementptr inbounds %"class.JPH::Vec3", ptr %83, i32 0, i32 0
  %566 = getelementptr inbounds %union.anon, ptr %565, i32 0, i32 0
  %567 = getelementptr inbounds { double, double }, ptr %566, i32 0, i32 0
  %568 = extractvalue { double, double } %563, 0
  store double %568, ptr %567, align 16
  %569 = getelementptr inbounds { double, double }, ptr %566, i32 0, i32 1
  %570 = extractvalue { double, double } %563, 1
  store double %570, ptr %569, align 8
  %571 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %71, i32 0, i32 8
  %572 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %571, i32 noundef 1)
          to label %573 unwind label %602

573:                                              ; preds = %564
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %572, ptr align 16 %83, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %83) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %85) #11
  %574 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %86, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %575 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 0
  %576 = load double, ptr %575, align 16
  %577 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 1
  %578 = load double, ptr %577, align 8
  %579 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %574, double %576, double %578)
          to label %580 unwind label %606

580:                                              ; preds = %573
  %581 = getelementptr inbounds %"class.JPH::Vec3", ptr %85, i32 0, i32 0
  %582 = getelementptr inbounds %union.anon, ptr %581, i32 0, i32 0
  %583 = getelementptr inbounds { double, double }, ptr %582, i32 0, i32 0
  %584 = extractvalue { double, double } %579, 0
  store double %584, ptr %583, align 16
  %585 = getelementptr inbounds { double, double }, ptr %582, i32 0, i32 1
  %586 = extractvalue { double, double } %579, 1
  store double %586, ptr %585, align 8
  %587 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %71, i32 0, i32 8
  %588 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %587, i32 noundef 2)
          to label %589 unwind label %606

589:                                              ; preds = %580
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %588, ptr align 16 %85, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %85) #11
  br label %610

590:                                              ; preds = %518, %514
  %591 = landingpad { ptr, i32 }
          cleanup
  %592 = extractvalue { ptr, i32 } %591, 0
  store ptr %592, ptr %78, align 8
  %593 = extractvalue { ptr, i32 } %591, 1
  store i32 %593, ptr %79, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #11
  br label %623

594:                                              ; preds = %610, %539
  %595 = landingpad { ptr, i32 }
          cleanup
  %596 = extractvalue { ptr, i32 } %595, 0
  store ptr %596, ptr %78, align 8
  %597 = extractvalue { ptr, i32 } %595, 1
  store i32 %597, ptr %79, align 4
  br label %623

598:                                              ; preds = %548, %541
  %599 = landingpad { ptr, i32 }
          cleanup
  %600 = extractvalue { ptr, i32 } %599, 0
  store ptr %600, ptr %78, align 8
  %601 = extractvalue { ptr, i32 } %599, 1
  store i32 %601, ptr %79, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #11
  br label %623

602:                                              ; preds = %564, %557
  %603 = landingpad { ptr, i32 }
          cleanup
  %604 = extractvalue { ptr, i32 } %603, 0
  store ptr %604, ptr %78, align 8
  %605 = extractvalue { ptr, i32 } %603, 1
  store i32 %605, ptr %79, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %83) #11
  br label %623

606:                                              ; preds = %580, %573
  %607 = landingpad { ptr, i32 }
          cleanup
  %608 = extractvalue { ptr, i32 } %607, 0
  store ptr %608, ptr %78, align 8
  %609 = extractvalue { ptr, i32 } %607, 1
  store i32 %609, ptr %79, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %85) #11
  br label %623

610:                                              ; preds = %589, %452
  %611 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %93, i32 0, i32 1
  %612 = load ptr, ptr %611, align 8, !tbaa !42
  %613 = load ptr, ptr %612, align 8, !tbaa !33
  %614 = getelementptr inbounds ptr, ptr %613, i64 5
  %615 = load ptr, ptr %614, align 8
  invoke void %615(ptr noundef nonnull align 8 dereferenceable(24) %612, ptr noundef nonnull align 16 dereferenceable(1120) %71)
          to label %616 unwind label %594

616:                                              ; preds = %610
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %71) #11
  call void @llvm.lifetime.end.p0(i64 1120, ptr %71) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %69) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #11
  store i32 0, ptr %33, align 4
  br label %617

617:                                              ; preds = %616, %366
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #11
  br label %618

618:                                              ; preds = %617, %338, %302
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #11
  call void @llvm.lifetime.end.p0(i64 224, ptr %45) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %38) #11
  br label %619

619:                                              ; preds = %618, %243
  call void @llvm.lifetime.end.p0(i64 32, ptr %34) #11
  br label %620

620:                                              ; preds = %619, %227
  call void @llvm.lifetime.end.p0(i64 1, ptr %31) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %16) #11
  %621 = load i32, ptr %33, align 4
  switch i32 %621, label %629 [
    i32 0, label %622
    i32 1, label %622
  ]

622:                                              ; preds = %620, %620
  ret void

623:                                              ; preds = %606, %602, %598, %594, %590
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %71) #11
  call void @llvm.lifetime.end.p0(i64 1120, ptr %71) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %69) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #11
  call void @llvm.lifetime.end.p0(i64 224, ptr %45) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %38) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %31) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %16) #11
  br label %624

624:                                              ; preds = %623
  %625 = load ptr, ptr %78, align 8
  %626 = load i32, ptr %79, align 4
  %627 = insertvalue { ptr, i32 } poison, ptr %625, 0
  %628 = insertvalue { ptr, i32 } %627, i32 %626, 1
  resume { ptr, i32 } %628

629:                                              ; preds = %620
  unreachable
}

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH19EPAPenetrationDepthC2Ev(ptr noundef nonnull align 16 dereferenceable(212)) unnamed_addr #6 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef i32 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepGJKINS_11ConvexShape7SupportENS_21TriangleConvexSupportEEENS0_7EStatusERKT_fRKT0_ffRNS_4Vec3ESD_SD_(ptr noundef nonnull align 16 dereferenceable(212), ptr noundef nonnull align 8 dereferenceable(8), float noundef, ptr noundef nonnull align 16 dereferenceable(48), float noundef, float noundef, ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 8 dereferenceable(8), float noundef) unnamed_addr #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepEPAINS_15AddConvexRadiusINS_11ConvexShape7SupportEEENS_21TriangleConvexSupportEEEbRKT_RKT0_fRNS_4Vec3ESE_SE_(ptr noundef nonnull align 16 dereferenceable(212), ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 16 dereferenceable(48), float noundef, ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) #2 align 2

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden { double, double } @_ZN3JPH11ActiveEdgesL9FixNormalENS_4Vec3ES1_S1_S1_hS1_S1_S1_(double, double, double, double, double, double, double, double, i8 noundef zeroext, ptr noundef byval(%"class.JPH::Vec3") align 16, ptr noundef byval(%"class.JPH::Vec3") align 16, ptr noundef byval(%"class.JPH::Vec3") align 16) #9

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local i32 @_ZN3JPH16TransformedShape10sGetBodyIDEPKS0_(ptr noundef) #9 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH18CollideShapeResultC2ENS_4Vec3ES1_S1_fRKNS_10SubShapeIDES4_RKNS_6BodyIDE(ptr noundef nonnull align 16 dereferenceable(1120), double, double, double, double, double, double, float noundef, ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) unnamed_addr #5 align 2

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH11StaticArrayINS_4Vec3ELj32EE6resizeEj(ptr noundef nonnull align 16 dereferenceable(528), i32 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528), i32 noundef) #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120)) unnamed_addr #6 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = !{i64 0, i64 16, !9}
!11 = !{!12, !18, i64 260}
!12 = !{!"_ZTSN3JPH24CollideConvexVsTrianglesE", !6, i64 0, !6, i64 8, !6, i64 16, !13, i64 32, !13, i64 48, !14, i64 64, !14, i64 128, !15, i64 192, !15, i64 224, !16, i64 256, !18, i64 260, !19, i64 272, !19, i64 4432, !6, i64 8592, !6, i64 8600}
!13 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!14 = !{!"_ZTSN3JPH5Mat44E", !7, i64 0}
!15 = !{!"_ZTSN3JPH5AABoxE", !13, i64 0, !13, i64 16}
!16 = !{!"_ZTSN3JPH10SubShapeIDE", !17, i64 0}
!17 = !{!"int", !7, i64 0}
!18 = !{!"float", !7, i64 0}
!19 = !{!"_ZTSN3JPH11ConvexShape13SupportBufferE", !7, i64 0}
!20 = !{!21, !21, i64 0}
!21 = !{!"bool", !7, i64 0}
!22 = !{!12, !6, i64 0}
!23 = !{!24, !28, i64 36}
!24 = !{!"_ZTSN3JPH20CollideShapeSettingsE", !25, i64 0, !18, i64 32, !28, i64 36}
!25 = !{!"_ZTSN3JPH19CollideSettingsBaseE", !26, i64 0, !27, i64 1, !18, i64 4, !18, i64 8, !13, i64 16}
!26 = !{!"_ZTSN3JPH15EActiveEdgeModeE", !7, i64 0}
!27 = !{!"_ZTSN3JPH17ECollectFacesModeE", !7, i64 0}
!28 = !{!"_ZTSN3JPH13EBackFaceModeE", !7, i64 0}
!29 = !{i8 0, i8 2}
!30 = !{}
!31 = !{!12, !6, i64 8592}
!32 = !{!12, !6, i64 16}
!33 = !{!34, !34, i64 0}
!34 = !{!"vtable pointer", !8, i64 0}
!35 = !{!24, !18, i64 32}
!36 = !{!25, !18, i64 4}
!37 = !{!38, !38, i64 0}
!38 = !{!"_ZTSN3JPH19EPAPenetrationDepth7EStatusE", !7, i64 0}
!39 = !{!12, !6, i64 8600}
!40 = !{!25, !18, i64 8}
!41 = !{!18, !18, i64 0}
!42 = !{!12, !6, i64 8}
!43 = !{!25, !26, i64 0}
!44 = !{!25, !27, i64 1}


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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::AABox" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"struct.JPH::TriangleConvexSupport" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::EPAPenetrationDepth" = type { %"class.JPH::GJKClosestPoint", float, [12 x i8] }
%"class.JPH::GJKClosestPoint" = type <{ [4 x %"class.JPH::Vec3"], [4 x %"class.JPH::Vec3"], [4 x %"class.JPH::Vec3"], i32, [12 x i8] }>
%"struct.JPH::AddConvexRadius" = type <{ ptr, float, [4 x i8] }>
%"class.JPH::CollideShapeResult" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, %"class.JPH::SubShapeID", %"class.JPH::SubShapeID", %"class.JPH::BodyID", %"class.JPH::StaticArray", %"class.JPH::StaticArray" }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::StaticArray" = type { i32, [12 x i8], [32 x %"struct.JPH::StaticArray<JPH::Vec3, 32>::Storage"] }
%"struct.JPH::StaticArray<JPH::Vec3, 32>::Storage" = type { [16 x i8] }

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

declare i32 @__gxx_personality_v0(...)

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24CollideConvexVsTriangles7CollideENS_4Vec3ES1_S1_hRKNS_10SubShapeIDE(ptr noundef nonnull align 16 dereferenceable(8608) %0, double %1, double %2, double %3, double %4, double %5, double %6, i8 noundef zeroext %7, ptr noundef nonnull align 4 dereferenceable(4) %8) local_unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %10 = alloca %"class.JPH::Vec3", align 16
  %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::AABox", align 16
  %15 = alloca %"struct.JPH::TriangleConvexSupport", 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::EPAPenetrationDepth", align 16
  %20 = alloca %"struct.JPH::AddConvexRadius", align 8
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca %"class.JPH::Vec3", align 16
  %23 = alloca %"class.JPH::CollideShapeResult", align 16
  %24 = alloca %"class.JPH::BodyID", align 4
  %25 = alloca %"class.JPH::SubShapeID", align 4
  %26 = getelementptr inbounds i8, ptr %0, i64 128
  %27 = getelementptr inbounds i8, ptr %0, i64 48
  %28 = tail call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %1, double %2)
  %29 = extractvalue { double, double } %28, 0
  %30 = extractvalue { double, double } %28, 1
  %31 = tail call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %26, double %29, double %30)
  %32 = extractvalue { double, double } %31, 0
  %33 = extractvalue { double, double } %31, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #9
  %34 = tail call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %3, double %4)
  %35 = extractvalue { double, double } %34, 0
  %36 = extractvalue { double, double } %34, 1
  %37 = tail call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %26, double %35, double %36)
  %38 = extractvalue { double, double } %37, 0
  store double %38, ptr %10, align 16
  %39 = getelementptr inbounds i8, ptr %10, i64 8
  %40 = extractvalue { double, double } %37, 1
  store double %40, ptr %39, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #9
  %41 = tail call { double, double } @_ZNK3JPH4Vec3mlES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %5, double %6)
  %42 = extractvalue { double, double } %41, 0
  %43 = extractvalue { double, double } %41, 1
  %44 = tail call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %26, double %42, double %43)
  %45 = extractvalue { double, double } %44, 0
  store double %45, ptr %11, align 16
  %46 = getelementptr inbounds i8, ptr %11, i64 8
  %47 = extractvalue { double, double } %44, 1
  store double %47, ptr %46, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #9
  %48 = getelementptr inbounds i8, ptr %0, i64 260
  %49 = load float, ptr %48, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #9
  %50 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %10, double %32, double %33)
  %51 = extractvalue { double, double } %50, 0
  store double %51, ptr %13, align 16
  %52 = getelementptr inbounds i8, ptr %13, i64 8
  %53 = extractvalue { double, double } %50, 1
  store double %53, ptr %52, align 8
  %54 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %11, double %32, double %33)
  %55 = extractvalue { double, double } %54, 0
  %56 = extractvalue { double, double } %54, 1
  %57 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %55, double %56)
  %58 = extractvalue { double, double } %57, 0
  %59 = extractvalue { double, double } %57, 1
  %60 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %49, double %58, double %59)
  %61 = extractvalue { double, double } %60, 0
  store double %61, ptr %12, align 16
  %62 = getelementptr inbounds i8, ptr %12, i64 8
  %63 = extractvalue { double, double } %60, 1
  store double %63, ptr %62, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #9
  %64 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %32, double %33)
  %65 = fcmp ule float %64, 0.000000e+00
  %66 = load ptr, ptr %0, align 16, !tbaa !17
  %67 = getelementptr inbounds i8, ptr %66, i64 36
  %68 = load i8, ptr %67, align 4, !tbaa !18
  %69 = icmp ne i8 %68, 0
  %brmerge = or i1 %65, %69
  br i1 %brmerge, label %70, label %242

70:                                               ; preds = %9
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %14) #9
  %.sroa.068.0.copyload = load double, ptr %10, align 16
  %.sroa.269.0.copyload = load double, ptr %39, align 8, !tbaa !24
  call void @_ZN3JPH5AABox14sFromTwoPointsENS_4Vec3ES1_(ptr dead_on_unwind nonnull writable sret(%"class.JPH::AABox") align 16 %14, double %32, double %33, double %.sroa.068.0.copyload, double %.sroa.269.0.copyload)
  %.sroa.066.0.copyload = load double, ptr %11, align 16
  %.sroa.267.0.copyload = load double, ptr %46, align 8, !tbaa !24
  call void @_ZN3JPH5AABox11EncapsulateENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %14, double %.sroa.066.0.copyload, double %.sroa.267.0.copyload)
  %71 = getelementptr inbounds i8, ptr %0, i64 192
  %72 = call noundef zeroext i1 @_ZNK3JPH5AABox8OverlapsERKS0_(ptr noundef nonnull align 16 dereferenceable(32) %14, ptr noundef nonnull align 16 dereferenceable(32) %71)
  br i1 %72, label %73, label %241

73:                                               ; preds = %70
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %15) #9
  %.sroa.062.0.copyload = load double, ptr %10, align 16
  %.sroa.263.0.copyload = load double, ptr %39, align 8, !tbaa !24
  %.sroa.060.0.copyload = load double, ptr %11, align 16
  %.sroa.261.0.copyload = load double, ptr %46, align 8, !tbaa !24
  call void @_ZN3JPH21TriangleConvexSupportC2ENS_4Vec3ES1_S1_(ptr noundef nonnull align 16 dereferenceable(48) %15, double %32, double %33, double %.sroa.062.0.copyload, double %.sroa.263.0.copyload, double %.sroa.060.0.copyload, double %.sroa.261.0.copyload)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #9
  %74 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %12)
  %75 = extractvalue { double, double } %74, 0
  store double %75, ptr %16, align 16
  %76 = getelementptr inbounds i8, ptr %16, i64 8
  %77 = extractvalue { double, double } %74, 1
  store double %77, ptr %76, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #9
  call void @llvm.lifetime.start.p0(i64 224, ptr nonnull %19) #9
  call void @_ZN3JPH19EPAPenetrationDepthC2Ev(ptr noundef nonnull align 16 dereferenceable(212) %19) #9
  %78 = getelementptr inbounds i8, ptr %0, i64 8592
  %79 = load ptr, ptr %78, align 16, !tbaa !25
  %80 = icmp eq ptr %79, null
  br i1 %80, label %81, label %90

81:                                               ; preds = %73
  %82 = getelementptr inbounds i8, ptr %0, i64 16
  %83 = load ptr, ptr %82, align 16, !tbaa !26
  %84 = getelementptr inbounds i8, ptr %0, i64 272
  %85 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.056.0.copyload = load double, ptr %85, align 16
  %.sroa.257.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.257.0.copyload = load double, ptr %.sroa.257.0..sroa_idx, align 8, !tbaa !24
  %86 = load ptr, ptr %83, align 8, !tbaa !27
  %87 = getelementptr inbounds i8, ptr %86, i64 272
  %88 = load ptr, ptr %87, align 8
  %89 = call noundef ptr %88(ptr noundef nonnull align 8 dereferenceable(44) %83, i32 noundef 0, ptr noundef nonnull align 16 dereferenceable(4160) %84, double %.sroa.056.0.copyload, double %.sroa.257.0.copyload)
  store ptr %89, ptr %78, align 16, !tbaa !25
  br label %90

90:                                               ; preds = %81, %73
  %91 = phi ptr [ %89, %81 ], [ %79, %73 ]
  %92 = load ptr, ptr %91, align 8, !tbaa !27
  %93 = getelementptr inbounds i8, ptr %92, i64 24
  %94 = load ptr, ptr %93, align 8
  %95 = call noundef float %94(ptr noundef nonnull align 8 dereferenceable(8) %91)
  %96 = load ptr, ptr %0, align 16, !tbaa !17
  %97 = getelementptr inbounds i8, ptr %96, i64 32
  %98 = load float, ptr %97, align 16, !tbaa !29
  %99 = fadd float %95, %98
  %100 = getelementptr inbounds i8, ptr %96, i64 4
  %101 = load float, ptr %100, align 4, !tbaa !30
  %102 = call noundef i32 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepGJKINS_11ConvexShape7SupportENS_21TriangleConvexSupportEEENS0_7EStatusERKT_fRKT0_ffRNS_4Vec3ESD_SD_(ptr noundef nonnull align 16 dereferenceable(212) %19, ptr noundef nonnull align 8 dereferenceable(8) %91, float noundef %99, ptr noundef nonnull align 16 dereferenceable(48) %15, float noundef 0.000000e+00, float noundef %101, ptr noundef nonnull align 16 dereferenceable(16) %16, ptr noundef nonnull align 16 dereferenceable(16) %17, ptr noundef nonnull align 16 dereferenceable(16) %18)
  switch i32 %102, label %125 [
    i32 0, label %240
    i32 2, label %103
  ]

103:                                              ; preds = %90
  %104 = getelementptr inbounds i8, ptr %0, i64 8600
  %105 = load ptr, ptr %104, align 8, !tbaa !31
  %106 = icmp eq ptr %105, null
  br i1 %106, label %107, label %116

107:                                              ; preds = %103
  %108 = getelementptr inbounds i8, ptr %0, i64 16
  %109 = load ptr, ptr %108, align 16, !tbaa !26
  %110 = getelementptr inbounds i8, ptr %0, i64 4432
  %111 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.054.0.copyload = load double, ptr %111, align 16
  %.sroa.255.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.255.0.copyload = load double, ptr %.sroa.255.0..sroa_idx, align 8, !tbaa !24
  %112 = load ptr, ptr %109, align 8, !tbaa !27
  %113 = getelementptr inbounds i8, ptr %112, i64 272
  %114 = load ptr, ptr %113, align 8
  %115 = call noundef ptr %114(ptr noundef nonnull align 8 dereferenceable(44) %109, i32 noundef 1, ptr noundef nonnull align 16 dereferenceable(4160) %110, double %.sroa.054.0.copyload, double %.sroa.255.0.copyload)
  store ptr %115, ptr %104, align 8, !tbaa !31
  br label %116

116:                                              ; preds = %107, %103
  %117 = phi ptr [ %115, %107 ], [ %105, %103 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #9
  %118 = load ptr, ptr %0, align 16, !tbaa !17
  %119 = getelementptr inbounds i8, ptr %118, i64 32
  %120 = load float, ptr %119, align 16, !tbaa !29
  call void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12) %20, ptr noundef nonnull align 8 dereferenceable(8) %117, float noundef %120)
  %121 = load ptr, ptr %0, align 16, !tbaa !17
  %122 = getelementptr inbounds i8, ptr %121, i64 8
  %123 = load float, ptr %122, align 8, !tbaa !32
  %124 = call noundef zeroext i1 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepEPAINS_15AddConvexRadiusINS_11ConvexShape7SupportEEENS_21TriangleConvexSupportEEEbRKT_RKT0_fRNS_4Vec3ESE_SE_(ptr noundef nonnull align 16 dereferenceable(212) %19, ptr noundef nonnull align 8 dereferenceable(12) %20, ptr noundef nonnull align 16 dereferenceable(48) %15, float noundef %123, ptr noundef nonnull align 16 dereferenceable(16) %16, ptr noundef nonnull align 16 dereferenceable(16) %17, ptr noundef nonnull align 16 dereferenceable(16) %18)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #9
  br i1 %124, label %125, label %240

125:                                              ; preds = %90, %116
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #9
  %.sroa.050.0.copyload = load double, ptr %17, align 16
  %.sroa.251.0..sroa_idx = getelementptr inbounds i8, ptr %17, i64 8
  %.sroa.251.0.copyload = load double, ptr %.sroa.251.0..sroa_idx, align 8, !tbaa !24
  %126 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %18, double %.sroa.050.0.copyload, double %.sroa.251.0.copyload)
  %127 = extractvalue { double, double } %126, 0
  store double %127, ptr %21, align 16
  %128 = getelementptr inbounds i8, ptr %21, i64 8
  %129 = extractvalue { double, double } %126, 1
  store double %129, ptr %128, align 8
  %130 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %131 = load ptr, ptr %0, align 16, !tbaa !17
  %132 = getelementptr inbounds i8, ptr %131, i64 32
  %133 = load float, ptr %132, align 16, !tbaa !29
  %134 = fsub float %130, %133
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #9
  %135 = fneg float %134
  %136 = getelementptr inbounds i8, ptr %0, i64 8
  %137 = load ptr, ptr %136, align 8, !tbaa !33
  %138 = call noundef float @_ZNK3JPH18CollisionCollectorINS_18CollideShapeResultENS_36CollisionCollectorTraitsCollideShapeEE19GetEarlyOutFractionEv(ptr noundef nonnull align 8 dereferenceable(24) %137)
  %139 = fcmp ugt float %138, %135
  br i1 %139, label %140, label %240

140:                                              ; preds = %125
  %141 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %16)
  %142 = fcmp ogt float %141, 0.000000e+00
  br i1 %142, label %143, label %152

143:                                              ; preds = %140
  %144 = load ptr, ptr %0, align 16, !tbaa !17
  %145 = getelementptr inbounds i8, ptr %144, i64 32
  %146 = load float, ptr %145, align 16, !tbaa !29
  %147 = fdiv float %146, %141
  %148 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %16, float noundef %147)
  %149 = extractvalue { double, double } %148, 0
  %150 = extractvalue { double, double } %148, 1
  %151 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %17, double %149, double %150)
  br label %152

152:                                              ; preds = %143, %140
  %153 = load ptr, ptr %0, align 16, !tbaa !17
  %154 = load i8, ptr %153, align 16, !tbaa !34
  %155 = icmp eq i8 %154, 0
  %156 = icmp ne i8 %7, 7
  %or.cond = and i1 %156, %155
  br i1 %or.cond, label %157, label %172

157:                                              ; preds = %152
  %158 = getelementptr inbounds i8, ptr %0, i64 64
  %159 = getelementptr inbounds i8, ptr %153, i64 16
  %.sroa.042.0.copyload = load double, ptr %159, align 16
  %.sroa.243.0..sroa_idx = getelementptr inbounds i8, ptr %153, i64 24
  %.sroa.243.0.copyload = load double, ptr %.sroa.243.0..sroa_idx, align 8, !tbaa !24
  %160 = call { double, double } @_ZNK3JPH5Mat4421Multiply3x3TransposedENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %158, double %.sroa.042.0.copyload, double %.sroa.243.0.copyload)
  %161 = extractvalue { double, double } %160, 0
  %162 = extractvalue { double, double } %160, 1
  %.sroa.036.0.copyload = load double, ptr %10, align 16
  %.sroa.237.0.copyload = load double, ptr %39, align 8, !tbaa !24
  %.sroa.034.0.copyload = load double, ptr %11, align 16
  %.sroa.235.0.copyload = load double, ptr %46, align 8, !tbaa !24
  br i1 %65, label %164, label %163

163:                                              ; preds = %157
  %.sroa.033.0.copyload = load double, ptr %12, align 16
  %.sroa.3.0.copyload = load double, ptr %62, align 8, !tbaa !24
  br label %168

164:                                              ; preds = %157
  %165 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %12)
  %166 = extractvalue { double, double } %165, 0
  %167 = extractvalue { double, double } %165, 1
  br label %168

168:                                              ; preds = %164, %163
  %.sroa.033.0 = phi double [ %.sroa.033.0.copyload, %163 ], [ %166, %164 ]
  %.sroa.3.0 = phi double [ %.sroa.3.0.copyload, %163 ], [ %167, %164 ]
  store double %161, ptr %22, align 16
  %.sroa.445.0..sroa_idx = getelementptr inbounds i8, ptr %22, i64 8
  store double %162, ptr %.sroa.445.0..sroa_idx, align 8, !tbaa !24
  %169 = call { double, double } @_ZN3JPH11ActiveEdgesL9FixNormalENS_4Vec3ES1_S1_S1_hS1_S1_S1_(double %32, double %33, double %.sroa.036.0.copyload, double %.sroa.237.0.copyload, double %.sroa.034.0.copyload, double %.sroa.235.0.copyload, double %.sroa.033.0, double %.sroa.3.0, i8 noundef zeroext %7, ptr noundef nonnull byval(%"class.JPH::Vec3") align 16 %18, ptr noundef nonnull byval(%"class.JPH::Vec3") align 16 %16, ptr noundef nonnull byval(%"class.JPH::Vec3") align 16 %22)
  %170 = extractvalue { double, double } %169, 0
  %171 = extractvalue { double, double } %169, 1
  store double %170, ptr %16, align 16
  store double %171, ptr %76, align 8, !tbaa !24
  br label %172

172:                                              ; preds = %168, %152
  %173 = getelementptr inbounds i8, ptr %0, i64 64
  %.sroa.029.0.copyload = load double, ptr %17, align 16
  %.sroa.230.0.copyload = load double, ptr %.sroa.251.0..sroa_idx, align 8, !tbaa !24
  %174 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %.sroa.029.0.copyload, double %.sroa.230.0.copyload)
  %175 = extractvalue { double, double } %174, 0
  %176 = extractvalue { double, double } %174, 1
  store double %175, ptr %17, align 16
  store double %176, ptr %.sroa.251.0..sroa_idx, align 8, !tbaa !24
  %.sroa.026.0.copyload = load double, ptr %18, align 16
  %.sroa.227.0..sroa_idx = getelementptr inbounds i8, ptr %18, i64 8
  %.sroa.227.0.copyload = load double, ptr %.sroa.227.0..sroa_idx, align 8, !tbaa !24
  %177 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %.sroa.026.0.copyload, double %.sroa.227.0.copyload)
  %178 = extractvalue { double, double } %177, 0
  %179 = extractvalue { double, double } %177, 1
  store double %178, ptr %18, align 16
  store double %179, ptr %.sroa.227.0..sroa_idx, align 8, !tbaa !24
  %.sroa.022.0.copyload = load double, ptr %16, align 16
  %.sroa.223.0.copyload = load double, ptr %76, align 8, !tbaa !24
  %180 = call { double, double } @_ZNK3JPH5Mat4411Multiply3x3ENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %.sroa.022.0.copyload, double %.sroa.223.0.copyload)
  %181 = extractvalue { double, double } %180, 0
  %182 = extractvalue { double, double } %180, 1
  call void @llvm.lifetime.start.p0(i64 1120, ptr nonnull %23) #9
  %.sroa.020.0.copyload = load double, ptr %17, align 16
  %.sroa.221.0.copyload = load double, ptr %.sroa.251.0..sroa_idx, align 8, !tbaa !24
  %.sroa.018.0.copyload = load double, ptr %18, align 16
  %.sroa.219.0.copyload = load double, ptr %.sroa.227.0..sroa_idx, align 8, !tbaa !24
  %183 = getelementptr inbounds i8, ptr %0, i64 256
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %24) #9
  %184 = load ptr, ptr %136, align 8, !tbaa !33
  %185 = call noundef ptr @_ZNK3JPH18CollisionCollectorINS_18CollideShapeResultENS_36CollisionCollectorTraitsCollideShapeEE10GetContextEv(ptr noundef nonnull align 8 dereferenceable(24) %184)
  %186 = call i32 @_ZN3JPH16TransformedShape10sGetBodyIDEPKS0_(ptr noundef %185)
  store i32 %186, ptr %24, align 4
  call void @_ZN3JPH18CollideShapeResultC2ENS_4Vec3ES1_S1_fRKNS_10SubShapeIDES4_RKNS_6BodyIDE(ptr noundef nonnull align 16 dereferenceable(1120) %23, double %.sroa.020.0.copyload, double %.sroa.221.0.copyload, double %.sroa.018.0.copyload, double %.sroa.219.0.copyload, double %181, double %182, float noundef %134, ptr noundef nonnull align 4 dereferenceable(4) %183, ptr noundef nonnull align 4 dereferenceable(4) %8, ptr noundef nonnull align 4 dereferenceable(4) %24)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %24) #9
  %187 = load ptr, ptr %0, align 16, !tbaa !17
  %188 = getelementptr inbounds i8, ptr %187, i64 1
  %189 = load i8, ptr %188, align 1, !tbaa !35
  %190 = icmp eq i8 %189, 0
  br i1 %190, label %191, label %234

191:                                              ; preds = %172
  %192 = getelementptr inbounds i8, ptr %0, i64 16
  %193 = load ptr, ptr %192, align 16, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %25) #9
  store i32 0, ptr %25, align 4
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %25) #9
  %194 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %16)
          to label %195 unwind label %224

195:                                              ; preds = %191
  %196 = extractvalue { double, double } %194, 0
  %197 = extractvalue { double, double } %194, 1
  %198 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.012.0.copyload = load double, ptr %198, align 16
  %.sroa.213.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %.sroa.213.0.copyload = load double, ptr %.sroa.213.0..sroa_idx, align 8, !tbaa !24
  %199 = getelementptr inbounds i8, ptr %23, i64 64
  %200 = load ptr, ptr %193, align 8, !tbaa !27
  %201 = getelementptr inbounds i8, ptr %200, i64 88
  %202 = load ptr, ptr %201, align 8
  invoke void %202(ptr noundef nonnull align 8 dereferenceable(26) %193, ptr noundef nonnull align 4 dereferenceable(4) %25, double %196, double %197, double %.sroa.012.0.copyload, double %.sroa.213.0.copyload, ptr noundef nonnull align 16 dereferenceable(64) %173, ptr noundef nonnull align 16 dereferenceable(528) %199)
          to label %203 unwind label %224

203:                                              ; preds = %195
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %25) #9
  %204 = getelementptr inbounds i8, ptr %23, i64 592
  invoke void @_ZN3JPH11StaticArrayINS_4Vec3ELj32EE6resizeEj(ptr noundef nonnull align 16 dereferenceable(528) %204, i32 noundef 3)
          to label %205 unwind label %226

205:                                              ; preds = %203
  %206 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %32, double %33)
          to label %207 unwind label %228

207:                                              ; preds = %205
  %208 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %204, i32 noundef 0)
          to label %209 unwind label %228

209:                                              ; preds = %207
  %210 = extractvalue { double, double } %206, 1
  %211 = extractvalue { double, double } %206, 0
  store double %211, ptr %208, align 16
  %.sroa.511.0..sroa_idx = getelementptr inbounds i8, ptr %208, i64 8
  store double %210, ptr %.sroa.511.0..sroa_idx, align 8, !tbaa !24
  %.sroa.04.0.copyload = load double, ptr %10, align 16
  %.sroa.25.0.copyload = load double, ptr %39, align 8, !tbaa !24
  %212 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %.sroa.04.0.copyload, double %.sroa.25.0.copyload)
          to label %213 unwind label %230

213:                                              ; preds = %209
  %214 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %204, i32 noundef 1)
          to label %215 unwind label %230

215:                                              ; preds = %213
  %216 = extractvalue { double, double } %212, 1
  %217 = extractvalue { double, double } %212, 0
  store double %217, ptr %214, align 16
  %.sroa.57.0..sroa_idx = getelementptr inbounds i8, ptr %214, i64 8
  store double %216, ptr %.sroa.57.0..sroa_idx, align 8, !tbaa !24
  %.sroa.0.0.copyload = load double, ptr %11, align 16
  %.sroa.2.0.copyload = load double, ptr %46, align 8, !tbaa !24
  %218 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %173, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload)
          to label %219 unwind label %232

219:                                              ; preds = %215
  %220 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %204, i32 noundef 2)
          to label %221 unwind label %232

221:                                              ; preds = %219
  %222 = extractvalue { double, double } %218, 1
  %223 = extractvalue { double, double } %218, 0
  store double %223, ptr %220, align 16
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %220, i64 8
  store double %222, ptr %.sroa.5.0..sroa_idx, align 8, !tbaa !24
  br label %234

224:                                              ; preds = %195, %191
  %225 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %25) #9
  br label %243

226:                                              ; preds = %234, %203
  %227 = landingpad { ptr, i32 }
          cleanup
  br label %243

228:                                              ; preds = %207, %205
  %229 = landingpad { ptr, i32 }
          cleanup
  br label %243

230:                                              ; preds = %213, %209
  %231 = landingpad { ptr, i32 }
          cleanup
  br label %243

232:                                              ; preds = %219, %215
  %233 = landingpad { ptr, i32 }
          cleanup
  br label %243

234:                                              ; preds = %221, %172
  %235 = load ptr, ptr %136, align 8, !tbaa !33
  %236 = load ptr, ptr %235, align 8, !tbaa !27
  %237 = getelementptr inbounds i8, ptr %236, i64 40
  %238 = load ptr, ptr %237, align 8
  invoke void %238(ptr noundef nonnull align 8 dereferenceable(24) %235, ptr noundef nonnull align 16 dereferenceable(1120) %23)
          to label %239 unwind label %226

239:                                              ; preds = %234
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %23) #9
  call void @llvm.lifetime.end.p0(i64 1120, ptr nonnull %23) #9
  br label %240

240:                                              ; preds = %239, %125, %90, %116
  call void @llvm.lifetime.end.p0(i64 224, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %15) #9
  br label %241

241:                                              ; preds = %70, %240
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %14) #9
  br label %242

242:                                              ; preds = %9, %241
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #9
  ret void

243:                                              ; preds = %232, %230, %228, %226, %224
  %.pn = phi { ptr, i32 } [ %227, %226 ], [ %233, %232 ], [ %231, %230 ], [ %229, %228 ], [ %225, %224 ]
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %23) #9
  call void @llvm.lifetime.end.p0(i64 1120, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 224, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #9
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #9
  resume { ptr, i32 } %.pn
}

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH5AABox11EncapsulateENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32), double, double) local_unnamed_addr #1 align 2

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH19EPAPenetrationDepthC2Ev(ptr noundef nonnull align 16 dereferenceable(212)) unnamed_addr #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef i32 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepGJKINS_11ConvexShape7SupportENS_21TriangleConvexSupportEEENS0_7EStatusERKT_fRKT0_ffRNS_4Vec3ESD_SD_(ptr noundef nonnull align 16 dereferenceable(212), ptr noundef nonnull align 8 dereferenceable(8), float noundef, ptr noundef nonnull align 16 dereferenceable(48), float noundef, float noundef, ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 8 dereferenceable(8), float noundef) unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH19EPAPenetrationDepth26GetPenetrationDepthStepEPAINS_15AddConvexRadiusINS_11ConvexShape7SupportEEENS_21TriangleConvexSupportEEEbRKT_RKT0_fRNS_4Vec3ESE_SE_(ptr noundef nonnull align 16 dereferenceable(212), ptr noundef nonnull align 8 dereferenceable(12), ptr noundef nonnull align 16 dereferenceable(48), float noundef, ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #1 align 2

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden { double, double } @_ZN3JPH11ActiveEdgesL9FixNormalENS_4Vec3ES1_S1_S1_hS1_S1_S1_(double, double, double, double, double, double, double, double, i8 noundef zeroext, ptr noundef byval(%"class.JPH::Vec3") align 16, ptr noundef byval(%"class.JPH::Vec3") align 16, ptr noundef byval(%"class.JPH::Vec3") align 16) local_unnamed_addr #8

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local i32 @_ZN3JPH16TransformedShape10sGetBodyIDEPKS0_(ptr noundef) local_unnamed_addr #8 align 2

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH11StaticArrayINS_4Vec3ELj32EE6resizeEj(ptr noundef nonnull align 16 dereferenceable(528), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528), i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120)) unnamed_addr #5 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !15, i64 260}
!6 = !{!"_ZTSN3JPH24CollideConvexVsTrianglesE", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 32, !10, i64 48, !11, i64 64, !11, i64 128, !12, i64 192, !12, i64 224, !13, i64 256, !15, i64 260, !16, i64 272, !16, i64 4432, !7, i64 8592, !7, i64 8600}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!11 = !{!"_ZTSN3JPH5Mat44E", !8, i64 0}
!12 = !{!"_ZTSN3JPH5AABoxE", !10, i64 0, !10, i64 16}
!13 = !{!"_ZTSN3JPH10SubShapeIDE", !14, i64 0}
!14 = !{!"int", !8, i64 0}
!15 = !{!"float", !8, i64 0}
!16 = !{!"_ZTSN3JPH11ConvexShape13SupportBufferE", !8, i64 0}
!17 = !{!6, !7, i64 0}
!18 = !{!19, !23, i64 36}
!19 = !{!"_ZTSN3JPH20CollideShapeSettingsE", !20, i64 0, !15, i64 32, !23, i64 36}
!20 = !{!"_ZTSN3JPH19CollideSettingsBaseE", !21, i64 0, !22, i64 1, !15, i64 4, !15, i64 8, !10, i64 16}
!21 = !{!"_ZTSN3JPH15EActiveEdgeModeE", !8, i64 0}
!22 = !{!"_ZTSN3JPH17ECollectFacesModeE", !8, i64 0}
!23 = !{!"_ZTSN3JPH13EBackFaceModeE", !8, i64 0}
!24 = !{!8, !8, i64 0}
!25 = !{!6, !7, i64 8592}
!26 = !{!6, !7, i64 16}
!27 = !{!28, !28, i64 0}
!28 = !{!"vtable pointer", !9, i64 0}
!29 = !{!19, !15, i64 32}
!30 = !{!20, !15, i64 4}
!31 = !{!6, !7, i64 8600}
!32 = !{!20, !15, i64 8}
!33 = !{!6, !7, i64 8}
!34 = !{!20, !21, i64 0}
!35 = !{!20, !22, i64 1}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,MemCpyOptPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass