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

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

229:                                              ; preds = %226
  store i32 1, ptr %33, align 4
  br label %616

230:                                              ; preds = %226, %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
  %231 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %232 = load double, ptr %231, align 16
  %233 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %234 = load double, ptr %233, align 8
  %235 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %236 = load double, ptr %235, align 16
  %237 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %238 = load double, ptr %237, align 8
  call void @_ZN3JPH5AABox14sFromTwoPointsENS_4Vec3ES1_(ptr dead_on_unwind writable sret(%"class.JPH::AABox") align 16 %34, double %232, double %234, double %236, double %238)
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %37, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %239 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 0
  %240 = load double, ptr %239, align 16
  %241 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 1
  %242 = load double, ptr %241, align 8
  call void @_ZN3JPH5AABox11EncapsulateENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(32) %34, double %240, double %242)
  %243 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 7
  %244 = call noundef zeroext i1 @_ZNK3JPH5AABox8OverlapsERKS0_(ptr noundef nonnull align 16 dereferenceable(32) %34, ptr noundef nonnull align 16 dereferenceable(32) %243)
  br i1 %244, label %246, label %245

245:                                              ; preds = %230
  store i32 1, ptr %33, align 4
  br label %615

246:                                              ; preds = %230
  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
  %247 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 0
  %248 = load double, ptr %247, align 16
  %249 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 1
  %250 = load double, ptr %249, align 8
  %251 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 0
  %252 = load double, ptr %251, align 16
  %253 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 1
  %254 = load double, ptr %253, align 8
  %255 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %256 = load double, ptr %255, align 16
  %257 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %258 = load double, ptr %257, align 8
  call void @_ZN3JPH21TriangleConvexSupportC2ENS_4Vec3ES1_S1_(ptr noundef nonnull align 16 dereferenceable(48) %38, double %248, double %250, double %252, double %254, double %256, double %258)
  call void @llvm.lifetime.start.p0(i64 16, ptr %42) #11
  %259 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
  %260 = getelementptr inbounds %"class.JPH::Vec3", ptr %42, i32 0, i32 0
  %261 = getelementptr inbounds %union.anon, ptr %260, i32 0, i32 0
  %262 = getelementptr inbounds { double, double }, ptr %261, i32 0, i32 0
  %263 = extractvalue { double, double } %259, 0
  store double %263, ptr %262, align 16
  %264 = getelementptr inbounds { double, double }, ptr %261, i32 0, i32 1
  %265 = extractvalue { double, double } %259, 1
  store double %265, ptr %264, 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
  %266 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 14
  %267 = load ptr, ptr %266, align 16, !tbaa !31
  %268 = icmp eq ptr %267, null
  br i1 %268, label %269, label %283

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

283:                                              ; preds = %269, %246
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #11
  %284 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 0
  %285 = load ptr, ptr %284, align 16, !tbaa !22
  %286 = getelementptr inbounds %"class.JPH::CollideShapeSettings", ptr %285, i32 0, i32 1
  %287 = load float, ptr %286, align 16, !tbaa !35
  store float %287, ptr %48, align 4, !tbaa !36
  %288 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 14
  %289 = load ptr, ptr %288, align 16, !tbaa !31
  %290 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 14
  %291 = load ptr, ptr %290, align 16, !tbaa !31
  %292 = load ptr, ptr %291, align 8, !tbaa !33
  %293 = getelementptr inbounds ptr, ptr %292, i64 3
  %294 = load ptr, ptr %293, align 8
  %295 = call noundef float %294(ptr noundef nonnull align 8 dereferenceable(8) %291)
  %296 = load float, ptr %48, align 4, !tbaa !36
  %297 = fadd float %295, %296
  %298 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 0
  %299 = load ptr, ptr %298, align 16, !tbaa !22
  %300 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %299, i32 0, i32 2
  %301 = load float, ptr %300, align 4, !tbaa !37
  %302 = 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) %289, float noundef %297, ptr noundef nonnull align 16 dereferenceable(48) %38, float noundef 0.000000e+00, float noundef %301, 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 %302, ptr %46, align 4, !tbaa !38
  %303 = load i32, ptr %46, align 4, !tbaa !38
  %304 = icmp eq i32 %303, 0
  br i1 %304, label %305, label %306

305:                                              ; preds = %283
  store i32 1, ptr %33, align 4
  br label %614

306:                                              ; preds = %283
  %307 = load i32, ptr %46, align 4, !tbaa !38
  %308 = icmp eq i32 %307, 2
  br i1 %308, label %309, label %343

309:                                              ; preds = %306
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #11
  store float 1.000000e+00, ptr %49, align 4, !tbaa !36
  %310 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %48, ptr noundef nonnull align 4 dereferenceable(4) %49)
  %311 = load float, ptr %310, align 4, !tbaa !36
  store float %311, ptr %48, align 4, !tbaa !36
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #11
  %312 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 15
  %313 = load ptr, ptr %312, align 8, !tbaa !40
  %314 = icmp eq ptr %313, null
  br i1 %314, label %315, label %329

315:                                              ; preds = %309
  %316 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 2
  %317 = load ptr, ptr %316, align 16, !tbaa !32
  %318 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 13
  %319 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %50, ptr align 16 %319, i64 16, i1 false), !tbaa.struct !10
  %320 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 0
  %321 = load double, ptr %320, align 16
  %322 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 1
  %323 = load double, ptr %322, align 8
  %324 = load ptr, ptr %317, align 8, !tbaa !33
  %325 = getelementptr inbounds ptr, ptr %324, i64 35
  %326 = load ptr, ptr %325, align 8
  %327 = call noundef ptr %326(ptr noundef nonnull align 8 dereferenceable(44) %317, i32 noundef 1, ptr noundef nonnull align 16 dereferenceable(4160) %318, double %321, double %323)
  %328 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 15
  store ptr %327, ptr %328, align 8, !tbaa !40
  br label %329

329:                                              ; preds = %315, %309
  call void @llvm.lifetime.start.p0(i64 16, ptr %51) #11
  %330 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 15
  %331 = load ptr, ptr %330, align 8, !tbaa !40
  %332 = load float, ptr %48, align 4, !tbaa !36
  call void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12) %51, ptr noundef nonnull align 8 dereferenceable(8) %331, float noundef %332)
  %333 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 0
  %334 = load ptr, ptr %333, align 16, !tbaa !22
  %335 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %334, i32 0, i32 3
  %336 = load float, ptr %335, align 8, !tbaa !41
  %337 = 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) %51, ptr noundef nonnull align 16 dereferenceable(48) %38, float noundef %336, 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 %337, label %339, label %338

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

339:                                              ; preds = %329
  store i32 0, ptr %33, align 4
  br label %340

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

342:                                              ; preds = %340
  br label %343

343:                                              ; preds = %342, %306
  br label %344

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

365:                                              ; preds = %344
  store i32 1, ptr %33, align 4
  br label %613

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

370:                                              ; preds = %366
  %371 = load float, ptr %48, align 4, !tbaa !36
  %372 = load float, ptr %55, align 4, !tbaa !36
  %373 = fdiv float %371, %372
  %374 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %42, float noundef %373)
  %375 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %376 = getelementptr inbounds %union.anon, ptr %375, i32 0, i32 0
  %377 = getelementptr inbounds { double, double }, ptr %376, i32 0, i32 0
  %378 = extractvalue { double, double } %374, 0
  store double %378, ptr %377, align 16
  %379 = getelementptr inbounds { double, double }, ptr %376, i32 0, i32 1
  %380 = extractvalue { double, double } %374, 1
  store double %380, ptr %379, align 8
  %381 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 0
  %382 = load double, ptr %381, align 16
  %383 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 1
  %384 = load double, ptr %383, align 8
  %385 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %43, double %382, double %384)
  br label %386

386:                                              ; preds = %370, %366
  %387 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 0
  %388 = load ptr, ptr %387, align 16, !tbaa !22
  %389 = getelementptr inbounds %"class.JPH::CollideSettingsBase", ptr %388, i32 0, i32 0
  %390 = load i8, ptr %389, align 16, !tbaa !43
  %391 = icmp eq i8 %390, 0
  br i1 %391, label %392, label %448

392:                                              ; preds = %386
  %393 = load i8, ptr %14, align 1, !tbaa !9
  %394 = zext i8 %393 to i32
  %395 = icmp ne i32 %394, 7
  br i1 %395, label %396, label %448

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

414:                                              ; preds = %396
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %63, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !10
  br label %423

415:                                              ; preds = %396
  %416 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %25)
  %417 = getelementptr inbounds %"class.JPH::Vec3", ptr %63, i32 0, i32 0
  %418 = getelementptr inbounds %union.anon, ptr %417, i32 0, i32 0
  %419 = getelementptr inbounds { double, double }, ptr %418, i32 0, i32 0
  %420 = extractvalue { double, double } %416, 0
  store double %420, ptr %419, align 16
  %421 = getelementptr inbounds { double, double }, ptr %418, i32 0, i32 1
  %422 = extractvalue { double, double } %416, 1
  store double %422, ptr %421, align 8
  br label %423

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

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

510:                                              ; preds = %448
  %511 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 2
  %512 = load ptr, ptr %511, align 16, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %78) #11
  call void @llvm.memset.p0.i64(ptr align 4 %78, i8 0, i64 4, i1 false)
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %78) #11
  %513 = invoke { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %42)
          to label %514 unwind label %586

514:                                              ; preds = %510
  %515 = getelementptr inbounds %"class.JPH::Vec3", ptr %79, i32 0, i32 0
  %516 = getelementptr inbounds %union.anon, ptr %515, i32 0, i32 0
  %517 = getelementptr inbounds { double, double }, ptr %516, i32 0, i32 0
  %518 = extractvalue { double, double } %513, 0
  store double %518, ptr %517, align 16
  %519 = getelementptr inbounds { double, double }, ptr %516, i32 0, i32 1
  %520 = extractvalue { double, double } %513, 1
  store double %520, ptr %519, align 8
  %521 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %82, ptr align 16 %521, i64 16, i1 false), !tbaa.struct !10
  %522 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 5
  %523 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %73, i32 0, i32 7
  %524 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 0
  %525 = load double, ptr %524, align 16
  %526 = getelementptr inbounds { double, double }, ptr %79, i32 0, i32 1
  %527 = load double, ptr %526, align 8
  %528 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 0
  %529 = load double, ptr %528, align 16
  %530 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 1
  %531 = load double, ptr %530, align 8
  %532 = load ptr, ptr %512, align 8, !tbaa !33
  %533 = getelementptr inbounds ptr, ptr %532, i64 12
  %534 = load ptr, ptr %533, align 8
  invoke void %534(ptr noundef nonnull align 8 dereferenceable(26) %512, ptr noundef nonnull align 4 dereferenceable(4) %78, double %525, double %527, double %529, double %531, ptr noundef nonnull align 16 dereferenceable(64) %522, ptr noundef nonnull align 16 dereferenceable(528) %523)
          to label %535 unwind label %586

535:                                              ; preds = %514
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #11
  %536 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %73, i32 0, i32 8
  invoke void @_ZN3JPH11StaticArrayINS_4Vec3ELj32EE6resizeEj(ptr noundef nonnull align 16 dereferenceable(528) %536, i32 noundef 3)
          to label %537 unwind label %590

537:                                              ; preds = %535
  call void @llvm.lifetime.start.p0(i64 16, ptr %83) #11
  %538 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %84, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !10
  %539 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 0
  %540 = load double, ptr %539, align 16
  %541 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 1
  %542 = load double, ptr %541, align 8
  %543 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %538, double %540, double %542)
          to label %544 unwind label %594

544:                                              ; preds = %537
  %545 = getelementptr inbounds %"class.JPH::Vec3", ptr %83, i32 0, i32 0
  %546 = getelementptr inbounds %union.anon, ptr %545, i32 0, i32 0
  %547 = getelementptr inbounds { double, double }, ptr %546, i32 0, i32 0
  %548 = extractvalue { double, double } %543, 0
  store double %548, ptr %547, align 16
  %549 = getelementptr inbounds { double, double }, ptr %546, i32 0, i32 1
  %550 = extractvalue { double, double } %543, 1
  store double %550, ptr %549, align 8
  %551 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %73, i32 0, i32 8
  %552 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %551, i32 noundef 0)
          to label %553 unwind label %594

553:                                              ; preds = %544
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %552, 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
  %554 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %86, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !10
  %555 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 0
  %556 = load double, ptr %555, align 16
  %557 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 1
  %558 = load double, ptr %557, align 8
  %559 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %554, double %556, double %558)
          to label %560 unwind label %598

560:                                              ; preds = %553
  %561 = getelementptr inbounds %"class.JPH::Vec3", ptr %85, i32 0, i32 0
  %562 = getelementptr inbounds %union.anon, ptr %561, i32 0, i32 0
  %563 = getelementptr inbounds { double, double }, ptr %562, i32 0, i32 0
  %564 = extractvalue { double, double } %559, 0
  store double %564, ptr %563, align 16
  %565 = getelementptr inbounds { double, double }, ptr %562, i32 0, i32 1
  %566 = extractvalue { double, double } %559, 1
  store double %566, ptr %565, align 8
  %567 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %73, i32 0, i32 8
  %568 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %567, i32 noundef 1)
          to label %569 unwind label %598

569:                                              ; preds = %560
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %568, ptr align 16 %85, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %85) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr %87) #11
  %570 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %88, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !10
  %571 = getelementptr inbounds { double, double }, ptr %88, i32 0, i32 0
  %572 = load double, ptr %571, align 16
  %573 = getelementptr inbounds { double, double }, ptr %88, i32 0, i32 1
  %574 = load double, ptr %573, align 8
  %575 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %570, double %572, double %574)
          to label %576 unwind label %602

576:                                              ; preds = %569
  %577 = getelementptr inbounds %"class.JPH::Vec3", ptr %87, i32 0, i32 0
  %578 = getelementptr inbounds %union.anon, ptr %577, i32 0, i32 0
  %579 = getelementptr inbounds { double, double }, ptr %578, i32 0, i32 0
  %580 = extractvalue { double, double } %575, 0
  store double %580, ptr %579, align 16
  %581 = getelementptr inbounds { double, double }, ptr %578, i32 0, i32 1
  %582 = extractvalue { double, double } %575, 1
  store double %582, ptr %581, align 8
  %583 = getelementptr inbounds %"class.JPH::CollideShapeResult", ptr %73, i32 0, i32 8
  %584 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH11StaticArrayINS_4Vec3ELj32EEixEj(ptr noundef nonnull align 16 dereferenceable(528) %583, i32 noundef 2)
          to label %585 unwind label %602

585:                                              ; preds = %576
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %584, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !10
  call void @llvm.lifetime.end.p0(i64 16, ptr %87) #11
  br label %606

586:                                              ; preds = %514, %510
  %587 = landingpad { ptr, i32 }
          cleanup
  %588 = extractvalue { ptr, i32 } %587, 0
  store ptr %588, ptr %80, align 8
  %589 = extractvalue { ptr, i32 } %587, 1
  store i32 %589, ptr %81, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #11
  br label %619

590:                                              ; preds = %606, %535
  %591 = landingpad { ptr, i32 }
          cleanup
  %592 = extractvalue { ptr, i32 } %591, 0
  store ptr %592, ptr %80, align 8
  %593 = extractvalue { ptr, i32 } %591, 1
  store i32 %593, ptr %81, align 4
  br label %619

594:                                              ; preds = %544, %537
  %595 = landingpad { ptr, i32 }
          cleanup
  %596 = extractvalue { ptr, i32 } %595, 0
  store ptr %596, ptr %80, align 8
  %597 = extractvalue { ptr, i32 } %595, 1
  store i32 %597, ptr %81, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %83) #11
  br label %619

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

602:                                              ; preds = %576, %569
  %603 = landingpad { ptr, i32 }
          cleanup
  %604 = extractvalue { ptr, i32 } %603, 0
  store ptr %604, ptr %80, align 8
  %605 = extractvalue { ptr, i32 } %603, 1
  store i32 %605, ptr %81, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %87) #11
  br label %619

606:                                              ; preds = %585, %448
  %607 = getelementptr inbounds %"class.JPH::CollideConvexVsTriangles", ptr %95, i32 0, i32 1
  %608 = load ptr, ptr %607, align 8, !tbaa !42
  %609 = load ptr, ptr %608, align 8, !tbaa !33
  %610 = getelementptr inbounds ptr, ptr %609, i64 6
  %611 = load ptr, ptr %610, align 8
  invoke void %611(ptr noundef nonnull align 8 dereferenceable(24) %608, ptr noundef nonnull align 16 dereferenceable(1120) %73)
          to label %612 unwind label %590

612:                                              ; preds = %606
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %73) #11
  call void @llvm.lifetime.end.p0(i64 1120, ptr %73) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #11
  store i32 0, ptr %33, align 4
  br label %613

613:                                              ; preds = %612, %365
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #11
  br label %614

614:                                              ; preds = %613, %340, %305
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #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
  br label %615

615:                                              ; preds = %614, %245
  call void @llvm.lifetime.end.p0(i64 32, ptr %34) #11
  br label %616

616:                                              ; preds = %615, %229
  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
  %617 = load i32, ptr %33, align 4
  switch i32 %617, label %625 [
    i32 0, label %618
    i32 1, label %618
  ]

618:                                              ; preds = %616, %616
  ret void

619:                                              ; preds = %602, %598, %594, %590, %586
  call void @_ZN3JPH18CollideShapeResultD2Ev(ptr noundef nonnull align 16 dereferenceable(1120) %73) #11
  call void @llvm.lifetime.end.p0(i64 1120, ptr %73) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr %71) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #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 %620

620:                                              ; preds = %619
  %621 = load ptr, ptr %80, align 8
  %622 = load i32, ptr %81, align 4
  %623 = insertvalue { ptr, i32 } poison, ptr %621, 0
  %624 = insertvalue { ptr, i32 } %623, i32 %622, 1
  resume { ptr, i32 } %624

625:                                              ; preds = %616
  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: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #6

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

72:                                               ; 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 %41, align 8, !tbaa !24
  call void @_ZN3JPH5AABox14sFromTwoPointsENS_4Vec3ES1_(ptr dead_on_unwind nonnull writable sret(%"class.JPH::AABox") align 16 %14, double %34, double %35, 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 %48, 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)
  %73 = getelementptr inbounds i8, ptr %0, i64 192
  %74 = call noundef zeroext i1 @_ZNK3JPH5AABox8OverlapsERKS0_(ptr noundef nonnull align 16 dereferenceable(32) %14, ptr noundef nonnull align 16 dereferenceable(32) %73)
  br i1 %74, label %75, label %241

75:                                               ; preds = %72
  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 %41, align 8, !tbaa !24
  %.sroa.060.0.copyload = load double, ptr %11, align 16
  %.sroa.261.0.copyload = load double, ptr %48, align 8, !tbaa !24
  call void @_ZN3JPH21TriangleConvexSupportC2ENS_4Vec3ES1_S1_(ptr noundef nonnull align 16 dereferenceable(48) %15, double %34, double %35, 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
  %76 = call { double, double } @_ZNK3JPH4Vec3ngEv(ptr noundef nonnull align 16 dereferenceable(16) %12)
  %77 = extractvalue { double, double } %76, 0
  store double %77, ptr %16, align 16
  %78 = getelementptr inbounds i8, ptr %16, i64 8
  %79 = extractvalue { double, double } %76, 1
  store double %79, ptr %78, 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
  %80 = getelementptr inbounds i8, ptr %0, i64 8592
  %81 = load ptr, ptr %80, align 16, !tbaa !25
  %82 = icmp eq ptr %81, null
  br i1 %82, label %83, label %92

83:                                               ; preds = %75
  %84 = getelementptr inbounds i8, ptr %0, i64 16
  %85 = load ptr, ptr %84, align 16, !tbaa !26
  %86 = getelementptr inbounds i8, ptr %0, i64 272
  %87 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.056.0.copyload = load double, ptr %87, 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
  %88 = load ptr, ptr %85, align 8, !tbaa !27
  %89 = getelementptr inbounds i8, ptr %88, i64 280
  %90 = load ptr, ptr %89, align 8
  %91 = call noundef ptr %90(ptr noundef nonnull align 8 dereferenceable(44) %85, i32 noundef 0, ptr noundef nonnull align 16 dereferenceable(4160) %86, double %.sroa.056.0.copyload, double %.sroa.257.0.copyload)
  store ptr %91, ptr %80, align 16, !tbaa !25
  br label %92

92:                                               ; preds = %83, %75
  %93 = phi ptr [ %91, %83 ], [ %81, %75 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %20) #9
  %94 = load ptr, ptr %0, align 16, !tbaa !17
  %95 = getelementptr inbounds i8, ptr %94, i64 32
  %96 = load float, ptr %95, align 16, !tbaa !29
  store float %96, ptr %20, align 4, !tbaa !30
  %97 = load ptr, ptr %93, align 8, !tbaa !27
  %98 = getelementptr inbounds i8, ptr %97, i64 24
  %99 = load ptr, ptr %98, align 8
  %100 = call noundef float %99(ptr noundef nonnull align 8 dereferenceable(8) %93)
  %101 = load float, ptr %20, align 4, !tbaa !30
  %102 = fadd float %100, %101
  %103 = load ptr, ptr %0, align 16, !tbaa !17
  %104 = getelementptr inbounds i8, ptr %103, i64 4
  %105 = load float, ptr %104, align 4, !tbaa !31
  %106 = 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) %93, float noundef %102, ptr noundef nonnull align 16 dereferenceable(48) %15, float noundef 0.000000e+00, float noundef %105, 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 %106, label %129 [
    i32 0, label %240
    i32 2, label %107
  ]

107:                                              ; preds = %92
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %21) #9
  store float 1.000000e+00, ptr %21, align 4, !tbaa !30
  %108 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %20, ptr noundef nonnull align 4 dereferenceable(4) %21)
  %109 = load float, ptr %108, align 4, !tbaa !30
  store float %109, ptr %20, align 4, !tbaa !30
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %21) #9
  %110 = getelementptr inbounds i8, ptr %0, i64 8600
  %111 = load ptr, ptr %110, align 8, !tbaa !32
  %112 = icmp eq ptr %111, null
  br i1 %112, label %113, label %122

113:                                              ; preds = %107
  %114 = getelementptr inbounds i8, ptr %0, i64 16
  %115 = load ptr, ptr %114, align 16, !tbaa !26
  %116 = getelementptr inbounds i8, ptr %0, i64 4432
  %117 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.054.0.copyload = load double, ptr %117, 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
  %118 = load ptr, ptr %115, align 8, !tbaa !27
  %119 = getelementptr inbounds i8, ptr %118, i64 280
  %120 = load ptr, ptr %119, align 8
  %121 = call noundef ptr %120(ptr noundef nonnull align 8 dereferenceable(44) %115, i32 noundef 1, ptr noundef nonnull align 16 dereferenceable(4160) %116, double %.sroa.054.0.copyload, double %.sroa.255.0.copyload)
  store ptr %121, ptr %110, align 8, !tbaa !32
  %.pre = load float, ptr %20, align 4, !tbaa !30
  br label %122

122:                                              ; preds = %113, %107
  %123 = phi float [ %.pre, %113 ], [ %109, %107 ]
  %124 = phi ptr [ %121, %113 ], [ %111, %107 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #9
  call void @_ZN3JPH15AddConvexRadiusINS_11ConvexShape7SupportEEC2ERKS2_f(ptr noundef nonnull align 8 dereferenceable(12) %22, ptr noundef nonnull align 8 dereferenceable(8) %124, float noundef %123)
  %125 = load ptr, ptr %0, align 16, !tbaa !17
  %126 = getelementptr inbounds i8, ptr %125, i64 8
  %127 = load float, ptr %126, align 8, !tbaa !33
  %128 = 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) %22, ptr noundef nonnull align 16 dereferenceable(48) %15, float noundef %127, 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 %22) #9
  br i1 %128, label %129, label %240

129:                                              ; preds = %92, %122
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #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
  %130 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %18, double %.sroa.050.0.copyload, double %.sroa.251.0.copyload)
  %131 = extractvalue { double, double } %130, 0
  store double %131, ptr %23, align 16
  %132 = getelementptr inbounds i8, ptr %23, i64 8
  %133 = extractvalue { double, double } %130, 1
  store double %133, ptr %132, align 8
  %134 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %23)
  %135 = load float, ptr %20, align 4, !tbaa !30
  %136 = fsub float %134, %135
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #9
  %137 = fneg float %136
  %138 = getelementptr inbounds i8, ptr %0, i64 8
  %139 = load ptr, ptr %138, align 8, !tbaa !34
  %140 = call noundef float @_ZNK3JPH18CollisionCollectorINS_18CollideShapeResultENS_36CollisionCollectorTraitsCollideShapeEE19GetEarlyOutFractionEv(ptr noundef nonnull align 8 dereferenceable(24) %139)
  %141 = fcmp ugt float %140, %137
  br i1 %141, label %142, label %240

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

145:                                              ; preds = %142
  %146 = load float, ptr %20, align 4, !tbaa !30
  %147 = fdiv float %146, %143
  %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 = %145, %142
  %153 = load ptr, ptr %0, align 16, !tbaa !17
  %154 = load i8, ptr %153, align 16, !tbaa !35
  %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 %41, align 8, !tbaa !24
  %.sroa.034.0.copyload = load double, ptr %11, align 16
  %.sroa.235.0.copyload = load double, ptr %48, align 8, !tbaa !24
  br i1 %67, label %164, label %163

163:                                              ; preds = %157
  %.sroa.033.0.copyload = load double, ptr %12, align 16
  %.sroa.3.0.copyload = load double, ptr %64, 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 %24, align 16
  %.sroa.445.0..sroa_idx = getelementptr inbounds i8, ptr %24, 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 %34, double %35, 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 %24)
  %170 = extractvalue { double, double } %169, 0
  %171 = extractvalue { double, double } %169, 1
  store double %170, ptr %16, align 16
  store double %171, ptr %78, 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 %78, 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 %25) #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 %26) #9
  %184 = load ptr, ptr %138, align 8, !tbaa !34
  %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 %26, align 4
  call void @_ZN3JPH18CollideShapeResultC2ENS_4Vec3ES1_S1_fRKNS_10SubShapeIDES4_RKNS_6BodyIDE(ptr noundef nonnull align 16 dereferenceable(1120) %25, 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 %136, ptr noundef nonnull align 4 dereferenceable(4) %183, ptr noundef nonnull align 4 dereferenceable(4) %8, ptr noundef nonnull align 4 dereferenceable(4) %26)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %26) #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 !36
  %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 %27) #9
  store i32 0, ptr %27, align 4
  call void @_ZN3JPH10SubShapeIDC2Ev(ptr noundef nonnull align 4 dereferenceable(4) %27) #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 %25, i64 64
  %200 = load ptr, ptr %193, align 8, !tbaa !27
  %201 = getelementptr inbounds i8, ptr %200, i64 96
  %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) %27, 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 %27) #9
  %204 = getelementptr inbounds i8, ptr %25, 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 %34, double %35)
          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 %41, 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 %48, 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 %27) #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 %138, align 8, !tbaa !34
  %236 = load ptr, ptr %235, align 8, !tbaa !27
  %237 = getelementptr inbounds i8, ptr %236, i64 48
  %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) %25)
          to label %239 unwind label %226

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

240:                                              ; preds = %239, %129, %92, %122
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %20) #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
  br label %241

241:                                              ; preds = %72, %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) %25) #9
  call void @llvm.lifetime.end.p0(i64 1120, ptr nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %20) #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: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #5

; 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 = !{!15, !15, i64 0}
!31 = !{!20, !15, i64 4}
!32 = !{!6, !7, i64 8600}
!33 = !{!20, !15, i64 8}
!34 = !{!6, !7, i64 8}
!35 = !{!20, !21, i64 0}
!36 = !{!20, !22, i64 1}


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