; LLVM IR from zig-gamedev/zphysics :: libs/Jolt/Physics/SoftBody (SoftBodyMotionProperties)

; 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.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::SoftBodyUpdateContext" = type <{ ptr, ptr, ptr, [8 x i8], %"class.JPH::Mat44", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, %"struct.std::atomic.44", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"struct.std::atomic", %"class.JPH::Vec3", i32, [12 x i8] }>
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon }
%union.anon = type { <4 x float> }
%"struct.std::atomic.44" = type { i32 }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::SoftBodyMotionProperties" = type { %"class.JPH::MotionProperties.base", %"class.JPH::RefConst", %"class.JPH::Array", %"class.JPH::Array.1", %"class.JPH::Array.4", %"class.JPH::AABox", %"class.JPH::AABox", i32, float, float, i8, i8, i8, i8 }
%"class.JPH::MotionProperties.base" = type <{ %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Float3", %"class.JPH::Float3", float, float, float, float, float, float, i32, i32, i8, i8, i8, i8, i8, [3 x i8], [3 x %"class.JPH::Sphere"], float, i8, i8 }>
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Float3" = type { float, float, float }
%"class.JPH::Sphere" = type { %"class.JPH::Float3", float }
%"class.JPH::RefConst" = type { ptr }
%"class.JPH::Array" = type { i64, i64, ptr }
%"class.JPH::Array.1" = type { i64, i64, ptr }
%"class.JPH::Array.4" = type { i64, i64, ptr }
%"class.JPH::AABox" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::SoftBodySharedSettings" = type { %"class.JPH::RefTarget", %"class.JPH::Array.8", %"class.JPH::Array.11", %"class.JPH::Array.14", %"class.JPH::Array.17", %"class.JPH::Array.20", %"class.JPH::Array.23", %"class.JPH::Array.26", %"class.JPH::Array.29", %"class.JPH::Array.32", float, %"class.JPH::Array.35", %"class.JPH::Array.38", %"class.JPH::Array.41" }
%"class.JPH::RefTarget" = type { %"struct.std::atomic" }
%"class.JPH::Array.8" = type { i64, i64, ptr }
%"class.JPH::Array.11" = type { i64, i64, ptr }
%"class.JPH::Array.14" = type { i64, i64, ptr }
%"class.JPH::Array.17" = type { i64, i64, ptr }
%"class.JPH::Array.20" = type { i64, i64, ptr }
%"class.JPH::Array.23" = type { i64, i64, ptr }
%"class.JPH::Array.26" = type { i64, i64, ptr }
%"class.JPH::Array.29" = type { i64, i64, ptr }
%"class.JPH::Array.32" = type { i64, i64, ptr }
%"class.JPH::Array.35" = type { i64, i64, ptr }
%"class.JPH::Array.38" = type { i64, i64, ptr }
%"class.JPH::Array.41" = type { i64, i64, ptr }
%"class.JPH::SoftBodyVertex" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Plane", i32, i8, float, float }
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }
%"struct.JPH::SoftBodyMotionProperties::CollidingShape" = type { %"class.JPH::Mat44", %"class.JPH::RefConst.61", %"class.JPH::BodyID", i8, i8, float, float, float, float, i8, %"class.JPH::Mat44", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::RefConst.61" = type { ptr }
%"class.JPH::BodyID" = type { i32 }

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

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

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

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

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

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

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

; 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 } @_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: 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 nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #5 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 uwtable
declare dso_local noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16)) #6 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24SoftBodyMotionProperties44ApplyCollisionConstraintsAndUpdateVelocitiesERKNS_21SoftBodyUpdateContextE(ptr noundef nonnull align 16 dereferenceable(352) %0, ptr noundef nonnull align 16 dereferenceable(180) %1) #7 align 2 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca float, align 4
  %6 = alloca float, align 4
  %7 = alloca float, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca float, align 4
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca ptr, align 8
  %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 float, align 4
  %32 = alloca float, align 4
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca float, align 4
  %36 = alloca %"class.JPH::Vec3", align 16
  %37 = alloca %"class.JPH::Vec3", align 16
  %38 = alloca float, align 4
  %39 = alloca %"class.JPH::Vec3", align 16
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca float, align 4
  %42 = alloca float, align 4
  %43 = alloca %"class.JPH::Vec3", align 16
  %44 = alloca %"class.JPH::Vec3", align 16
  %45 = alloca float, align 4
  %46 = alloca %"class.JPH::Vec3", align 16
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = alloca %"class.JPH::Vec3", align 16
  %49 = alloca %"class.JPH::Vec3", align 16
  %50 = alloca %"class.JPH::Vec3", align 16
  %51 = alloca %"class.JPH::Vec3", align 16
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca %"class.JPH::Vec3", align 16
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca %"class.JPH::Vec3", align 16
  %59 = alloca %"class.JPH::Vec3", align 16
  %60 = alloca %"class.JPH::Vec3", align 16
  %61 = alloca float, align 4
  %62 = alloca %"class.JPH::Vec3", align 16
  %63 = alloca float, align 4
  %64 = alloca float, align 4
  %65 = alloca %"class.JPH::Vec3", align 16
  %66 = alloca float, align 4
  %67 = alloca %"class.JPH::Vec3", align 16
  %68 = alloca %"class.JPH::Vec3", align 16
  %69 = alloca %"class.JPH::Vec3", align 16
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  %70 = load ptr, ptr %3, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #9
  %71 = load ptr, ptr %4, align 8, !tbaa !5
  %72 = getelementptr inbounds %"class.JPH::SoftBodyUpdateContext", ptr %71, i32 0, i32 8
  %73 = load float, ptr %72, align 4, !tbaa !9
  store float %73, ptr %5, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #9
  %74 = load ptr, ptr %4, align 8, !tbaa !5
  %75 = getelementptr inbounds %"class.JPH::SoftBodyUpdateContext", ptr %74, i32 0, i32 5
  %76 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %75)
  %77 = fmul float -2.000000e+00, %76
  %78 = load float, ptr %5, align 4, !tbaa !20
  %79 = fmul float %77, %78
  store float %79, ptr %6, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #9
  %80 = getelementptr inbounds %"class.JPH::SoftBodyMotionProperties", ptr %70, i32 0, i32 1
  %81 = call noundef ptr @_ZNK3JPH8RefConstINS_22SoftBodySharedSettingsEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %80)
  %82 = getelementptr inbounds %"class.JPH::SoftBodySharedSettings", ptr %81, i32 0, i32 10
  %83 = load float, ptr %82, align 8, !tbaa !21
  store float %83, ptr %7, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #9
  %84 = getelementptr inbounds %"class.JPH::SoftBodyMotionProperties", ptr %70, i32 0, i32 2
  store ptr %84, ptr %8, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  %85 = load ptr, ptr %8, align 8, !tbaa !5
  %86 = call noundef ptr @_ZN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %85)
  store ptr %86, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #9
  %87 = load ptr, ptr %8, align 8, !tbaa !5
  %88 = call noundef ptr @_ZN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %87)
  store ptr %88, ptr %10, align 8, !tbaa !5
  br label %89

89:                                               ; preds = %568, %2
  %90 = load ptr, ptr %9, align 8, !tbaa !5
  %91 = load ptr, ptr %10, align 8, !tbaa !5
  %92 = icmp ne ptr %90, %91
  br i1 %92, label %94, label %93

93:                                               ; preds = %89
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #9
  br label %571

94:                                               ; preds = %89
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #9
  %95 = load ptr, ptr %9, align 8, !tbaa !5
  store ptr %95, ptr %11, align 8, !tbaa !5
  %96 = load ptr, ptr %11, align 8, !tbaa !5
  %97 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %96, i32 0, i32 7
  %98 = load float, ptr %97, align 4, !tbaa !37
  %99 = fcmp ogt float %98, 0.000000e+00
  br i1 %99, label %100, label %567

100:                                              ; preds = %94
  call void @llvm.lifetime.start.p0(i64 16, ptr %12) #9
  %101 = load ptr, ptr %11, align 8, !tbaa !5
  %102 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %101, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %102, i64 16, i1 false), !tbaa.struct !42
  call void @llvm.lifetime.start.p0(i64 16, ptr %13) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #9
  %103 = load ptr, ptr %11, align 8, !tbaa !5
  %104 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %103, i32 0, i32 1
  %105 = load ptr, ptr %11, align 8, !tbaa !5
  %106 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %105, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %15, ptr align 16 %106, i64 16, i1 false), !tbaa.struct !42
  %107 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 0
  %108 = load double, ptr %107, align 16
  %109 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 1
  %110 = load double, ptr %109, align 8
  %111 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %104, double %108, double %110)
  %112 = getelementptr inbounds %"class.JPH::Vec3", ptr %14, i32 0, i32 0
  %113 = getelementptr inbounds %union.anon.0, ptr %112, i32 0, i32 0
  %114 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 0
  %115 = extractvalue { double, double } %111, 0
  store double %115, ptr %114, align 16
  %116 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 1
  %117 = extractvalue { double, double } %111, 1
  store double %117, ptr %116, align 8
  %118 = load float, ptr %5, align 4, !tbaa !20
  %119 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %118)
  %120 = getelementptr inbounds %"class.JPH::Vec3", ptr %13, i32 0, i32 0
  %121 = getelementptr inbounds %union.anon.0, ptr %120, i32 0, i32 0
  %122 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 0
  %123 = extractvalue { double, double } %119, 0
  store double %123, ptr %122, align 16
  %124 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 1
  %125 = extractvalue { double, double } %119, 1
  store double %125, ptr %124, align 8
  %126 = load ptr, ptr %11, align 8, !tbaa !5
  %127 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %126, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %127, ptr align 16 %13, i64 16, i1 false), !tbaa.struct !42
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %13) #9
  %128 = load ptr, ptr %11, align 8, !tbaa !5
  %129 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %128, i32 0, i32 4
  %130 = load i32, ptr %129, align 16, !tbaa !44
  %131 = icmp sge i32 %130, 0
  br i1 %131, label %132, label %566

132:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #9
  %133 = load ptr, ptr %11, align 8, !tbaa !5
  %134 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %133, i32 0, i32 3
  %135 = load ptr, ptr %11, align 8, !tbaa !5
  %136 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %135, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %17, ptr align 16 %136, i64 16, i1 false), !tbaa.struct !42
  %137 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  %138 = load double, ptr %137, align 16
  %139 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  %140 = load double, ptr %139, align 8
  %141 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %134, double %138, double %140)
  %142 = fneg float %141
  %143 = load float, ptr %7, align 4, !tbaa !20
  %144 = fadd float %142, %143
  store float %144, ptr %16, align 4, !tbaa !20
  %145 = load float, ptr %16, align 4, !tbaa !20
  %146 = fcmp ogt float %145, 0.000000e+00
  br i1 %146, label %147, label %565

147:                                              ; preds = %132
  %148 = load ptr, ptr %11, align 8, !tbaa !5
  %149 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %148, i32 0, i32 5
  store i8 1, ptr %149, align 4, !tbaa !45
  %150 = getelementptr inbounds %"class.JPH::SoftBodyMotionProperties", ptr %70, i32 0, i32 11
  store i8 1, ptr %150, align 1, !tbaa !46
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #9
  %151 = getelementptr inbounds %"class.JPH::SoftBodyMotionProperties", ptr %70, i32 0, i32 3
  %152 = load ptr, ptr %11, align 8, !tbaa !5
  %153 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %152, i32 0, i32 4
  %154 = load i32, ptr %153, align 16, !tbaa !44
  %155 = sext i32 %154 to i64
  %156 = call noundef nonnull align 16 dereferenceable(240) ptr @_ZN3JPH5ArrayINS_24SoftBodyMotionProperties14CollidingShapeENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %151, i64 noundef %155)
  store ptr %156, ptr %18, align 8, !tbaa !5
  %157 = load ptr, ptr %18, align 8, !tbaa !5
  %158 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %157, i32 0, i32 4
  %159 = load i8, ptr %158, align 1, !tbaa !60, !range !64, !noundef !65
  %160 = trunc i8 %159 to i1
  br i1 %160, label %564, label %161

161:                                              ; preds = %147
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #9
  %162 = load ptr, ptr %11, align 8, !tbaa !5
  %163 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %162, i32 0, i32 3
  %164 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %163)
  %165 = getelementptr inbounds %"class.JPH::Vec3", ptr %19, i32 0, i32 0
  %166 = getelementptr inbounds %union.anon.0, ptr %165, i32 0, i32 0
  %167 = getelementptr inbounds { double, double }, ptr %166, i32 0, i32 0
  %168 = extractvalue { double, double } %164, 0
  store double %168, ptr %167, align 16
  %169 = getelementptr inbounds { double, double }, ptr %166, i32 0, i32 1
  %170 = extractvalue { double, double } %164, 1
  store double %170, ptr %169, align 8
  %171 = load float, ptr %16, align 4, !tbaa !20
  %172 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %19, float noundef %171)
  %173 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %174 = getelementptr inbounds %union.anon.0, ptr %173, i32 0, i32 0
  %175 = getelementptr inbounds { double, double }, ptr %174, i32 0, i32 0
  %176 = extractvalue { double, double } %172, 0
  store double %176, ptr %175, align 16
  %177 = getelementptr inbounds { double, double }, ptr %174, i32 0, i32 1
  %178 = extractvalue { double, double } %172, 1
  store double %178, ptr %177, align 8
  %179 = load ptr, ptr %11, align 8, !tbaa !5
  %180 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %179, i32 0, i32 1
  %181 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 0
  %182 = load double, ptr %181, align 16
  %183 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 1
  %184 = load double, ptr %183, align 8
  %185 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %180, double %182, double %184)
  %186 = load ptr, ptr %18, align 8, !tbaa !5
  %187 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %186, i32 0, i32 3
  %188 = load i8, ptr %187, align 4, !tbaa !66
  %189 = icmp eq i8 %188, 2
  br i1 %189, label %190, label %459

190:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #9
  %191 = load ptr, ptr %11, align 8, !tbaa !5
  %192 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %191, i32 0, i32 1
  %193 = load ptr, ptr %18, align 8, !tbaa !5
  %194 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %193, i32 0, i32 0
  %195 = call { double, double } @_ZNK3JPH5Mat4414GetTranslationEv(ptr noundef nonnull align 16 dereferenceable(64) %194)
  %196 = getelementptr inbounds %"class.JPH::Vec3", ptr %22, i32 0, i32 0
  %197 = getelementptr inbounds %union.anon.0, ptr %196, i32 0, i32 0
  %198 = getelementptr inbounds { double, double }, ptr %197, i32 0, i32 0
  %199 = extractvalue { double, double } %195, 0
  store double %199, ptr %198, align 16
  %200 = getelementptr inbounds { double, double }, ptr %197, i32 0, i32 1
  %201 = extractvalue { double, double } %195, 1
  store double %201, ptr %200, align 8
  %202 = getelementptr inbounds { double, double }, ptr %22, i32 0, i32 0
  %203 = load double, ptr %202, align 16
  %204 = getelementptr inbounds { double, double }, ptr %22, i32 0, i32 1
  %205 = load double, ptr %204, align 8
  %206 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %192, double %203, double %205)
  %207 = getelementptr inbounds %"class.JPH::Vec3", ptr %21, i32 0, i32 0
  %208 = getelementptr inbounds %union.anon.0, ptr %207, i32 0, i32 0
  %209 = getelementptr inbounds { double, double }, ptr %208, i32 0, i32 0
  %210 = extractvalue { double, double } %206, 0
  store double %210, ptr %209, align 16
  %211 = getelementptr inbounds { double, double }, ptr %208, i32 0, i32 1
  %212 = extractvalue { double, double } %206, 1
  store double %212, ptr %211, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #9
  %213 = load ptr, ptr %18, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %24, ptr align 16 %21, i64 16, i1 false), !tbaa.struct !42
  %214 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 0
  %215 = load double, ptr %214, align 16
  %216 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 1
  %217 = load double, ptr %216, align 8
  %218 = call { double, double } @_ZNK3JPH24SoftBodyMotionProperties14CollidingShape16GetPointVelocityENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(240) %213, double %215, double %217)
  %219 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %220 = getelementptr inbounds %union.anon.0, ptr %219, i32 0, i32 0
  %221 = getelementptr inbounds { double, double }, ptr %220, i32 0, i32 0
  %222 = extractvalue { double, double } %218, 0
  store double %222, ptr %221, align 16
  %223 = getelementptr inbounds { double, double }, ptr %220, i32 0, i32 1
  %224 = extractvalue { double, double } %218, 1
  store double %224, ptr %223, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #9
  %225 = load ptr, ptr %11, align 8, !tbaa !5
  %226 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %225, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !42
  %227 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 0
  %228 = load double, ptr %227, align 16
  %229 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 1
  %230 = load double, ptr %229, align 8
  %231 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %226, double %228, double %230)
  %232 = getelementptr inbounds %"class.JPH::Vec3", ptr %25, i32 0, i32 0
  %233 = getelementptr inbounds %union.anon.0, ptr %232, i32 0, i32 0
  %234 = getelementptr inbounds { double, double }, ptr %233, i32 0, i32 0
  %235 = extractvalue { double, double } %231, 0
  store double %235, ptr %234, align 16
  %236 = getelementptr inbounds { double, double }, ptr %233, i32 0, i32 1
  %237 = extractvalue { double, double } %231, 1
  store double %237, ptr %236, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %28, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !42
  %238 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 0
  %239 = load double, ptr %238, align 16
  %240 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 1
  %241 = load double, ptr %240, align 8
  %242 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %239, double %241)
  %243 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %19, float noundef %242)
  %244 = getelementptr inbounds %"class.JPH::Vec3", ptr %27, i32 0, i32 0
  %245 = getelementptr inbounds %union.anon.0, ptr %244, i32 0, i32 0
  %246 = getelementptr inbounds { double, double }, ptr %245, i32 0, i32 0
  %247 = extractvalue { double, double } %243, 0
  store double %247, ptr %246, align 16
  %248 = getelementptr inbounds { double, double }, ptr %245, i32 0, i32 1
  %249 = extractvalue { double, double } %243, 1
  store double %249, ptr %248, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %29) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %30, ptr align 16 %27, i64 16, i1 false), !tbaa.struct !42
  %250 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 0
  %251 = load double, ptr %250, align 16
  %252 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 1
  %253 = load double, ptr %252, align 8
  %254 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %25, double %251, double %253)
  %255 = getelementptr inbounds %"class.JPH::Vec3", ptr %29, i32 0, i32 0
  %256 = getelementptr inbounds %union.anon.0, ptr %255, i32 0, i32 0
  %257 = getelementptr inbounds { double, double }, ptr %256, i32 0, i32 0
  %258 = extractvalue { double, double } %254, 0
  store double %258, ptr %257, align 16
  %259 = getelementptr inbounds { double, double }, ptr %256, i32 0, i32 1
  %260 = extractvalue { double, double } %254, 1
  store double %260, ptr %259, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #9
  %261 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %29)
  store float %261, ptr %31, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #9
  %262 = load ptr, ptr %18, align 8, !tbaa !5
  %263 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %262, i32 0, i32 8
  %264 = load float, ptr %263, align 4, !tbaa !67
  %265 = load ptr, ptr %11, align 8, !tbaa !5
  %266 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %265, i32 0, i32 7
  %267 = load float, ptr %266, align 4, !tbaa !37
  %268 = fmul float %264, %267
  store float %268, ptr %32, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 16, ptr %33) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %34, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !42
  %269 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 0
  %270 = load double, ptr %269, align 16
  %271 = getelementptr inbounds { double, double }, ptr %34, i32 0, i32 1
  %272 = load double, ptr %271, align 8
  %273 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %21, double %270, double %272)
  %274 = getelementptr inbounds %"class.JPH::Vec3", ptr %33, i32 0, i32 0
  %275 = getelementptr inbounds %union.anon.0, ptr %274, i32 0, i32 0
  %276 = getelementptr inbounds { double, double }, ptr %275, i32 0, i32 0
  %277 = extractvalue { double, double } %273, 0
  store double %277, ptr %276, align 16
  %278 = getelementptr inbounds { double, double }, ptr %275, i32 0, i32 1
  %279 = extractvalue { double, double } %273, 1
  store double %279, ptr %278, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #9
  %280 = load ptr, ptr %18, align 8, !tbaa !5
  %281 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %280, i32 0, i32 5
  %282 = load float, ptr %281, align 16, !tbaa !68
  %283 = load ptr, ptr %18, align 8, !tbaa !5
  %284 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %283, i32 0, i32 10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %37, ptr align 16 %33, i64 16, i1 false), !tbaa.struct !42
  %285 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 0
  %286 = load double, ptr %285, align 16
  %287 = getelementptr inbounds { double, double }, ptr %37, i32 0, i32 1
  %288 = load double, ptr %287, align 8
  %289 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %284, double %286, double %288)
  %290 = getelementptr inbounds %"class.JPH::Vec3", ptr %36, i32 0, i32 0
  %291 = getelementptr inbounds %union.anon.0, ptr %290, i32 0, i32 0
  %292 = getelementptr inbounds { double, double }, ptr %291, i32 0, i32 0
  %293 = extractvalue { double, double } %289, 0
  store double %293, ptr %292, align 16
  %294 = getelementptr inbounds { double, double }, ptr %291, i32 0, i32 1
  %295 = extractvalue { double, double } %289, 1
  store double %295, ptr %294, align 8
  %296 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %297 = load double, ptr %296, align 16
  %298 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %299 = load double, ptr %298, align 8
  %300 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %33, double %297, double %299)
  %301 = fadd float %282, %300
  store float %301, ptr %35, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #9
  %302 = load float, ptr %32, align 4, !tbaa !20
  %303 = load float, ptr %35, align 4, !tbaa !20
  %304 = fadd float %302, %303
  store float %304, ptr %38, align 4, !tbaa !20
  %305 = load float, ptr %38, align 4, !tbaa !20
  %306 = fcmp ogt float %305, 0.000000e+00
  br i1 %306, label %307, label %458

307:                                              ; preds = %190
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #9
  %308 = load float, ptr %31, align 4, !tbaa !20
  %309 = fcmp ogt float %308, 0.000000e+00
  br i1 %309, label %310, label %329

310:                                              ; preds = %307
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #9
  %311 = load ptr, ptr %18, align 8, !tbaa !5
  %312 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %311, i32 0, i32 6
  %313 = load float, ptr %312, align 4, !tbaa !69
  %314 = load float, ptr %16, align 4, !tbaa !20
  %315 = fmul float %313, %314
  %316 = load float, ptr %31, align 4, !tbaa !20
  %317 = load float, ptr %5, align 4, !tbaa !20
  %318 = fmul float %316, %317
  %319 = fdiv float %315, %318
  store float %319, ptr %41, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #9
  store float 1.000000e+00, ptr %42, align 4, !tbaa !20
  %320 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %41, ptr noundef nonnull align 4 dereferenceable(4) %42)
  %321 = load float, ptr %320, align 4, !tbaa !20
  %322 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %29, float noundef %321)
  %323 = getelementptr inbounds %"class.JPH::Vec3", ptr %40, i32 0, i32 0
  %324 = getelementptr inbounds %union.anon.0, ptr %323, i32 0, i32 0
  %325 = getelementptr inbounds { double, double }, ptr %324, i32 0, i32 0
  %326 = extractvalue { double, double } %322, 0
  store double %326, ptr %325, align 16
  %327 = getelementptr inbounds { double, double }, ptr %324, i32 0, i32 1
  %328 = extractvalue { double, double } %322, 1
  store double %328, ptr %327, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %39, ptr align 16 %40, i64 16, i1 false), !tbaa.struct !42
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #9
  br label %337

329:                                              ; preds = %307
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #9
  %330 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %331 = getelementptr inbounds %"class.JPH::Vec3", ptr %43, i32 0, i32 0
  %332 = getelementptr inbounds %union.anon.0, ptr %331, i32 0, i32 0
  %333 = getelementptr inbounds { double, double }, ptr %332, i32 0, i32 0
  %334 = extractvalue { double, double } %330, 0
  store double %334, ptr %333, align 16
  %335 = getelementptr inbounds { double, double }, ptr %332, i32 0, i32 1
  %336 = extractvalue { double, double } %330, 1
  store double %336, ptr %335, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %39, ptr align 16 %43, i64 16, i1 false), !tbaa.struct !42
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #9
  br label %337

337:                                              ; preds = %329, %310
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %44, ptr align 16 %27, i64 16, i1 false), !tbaa.struct !42
  %338 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 0
  %339 = load double, ptr %338, align 16
  %340 = getelementptr inbounds { double, double }, ptr %44, i32 0, i32 1
  %341 = load double, ptr %340, align 8
  %342 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %39, double %339, double %341)
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %46) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !42
  %343 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %344 = load double, ptr %343, align 16
  %345 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %346 = load double, ptr %345, align 8
  %347 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %344, double %346)
  %348 = getelementptr inbounds %"class.JPH::Vec3", ptr %46, i32 0, i32 0
  %349 = getelementptr inbounds %union.anon.0, ptr %348, i32 0, i32 0
  %350 = getelementptr inbounds { double, double }, ptr %349, i32 0, i32 0
  %351 = extractvalue { double, double } %347, 0
  store double %351, ptr %350, align 16
  %352 = getelementptr inbounds { double, double }, ptr %349, i32 0, i32 1
  %353 = extractvalue { double, double } %347, 1
  store double %353, ptr %352, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %48, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !42
  %354 = getelementptr inbounds { double, double }, ptr %48, i32 0, i32 0
  %355 = load double, ptr %354, align 16
  %356 = getelementptr inbounds { double, double }, ptr %48, i32 0, i32 1
  %357 = load double, ptr %356, align 8
  %358 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %46, double %355, double %357)
  call void @llvm.lifetime.end.p0(i64 16, ptr %46) #9
  store float %358, ptr %45, align 4, !tbaa !20
  %359 = load float, ptr %45, align 4, !tbaa !20
  %360 = load float, ptr %6, align 4, !tbaa !20
  %361 = fcmp olt float %359, %360
  br i1 %361, label %362, label %384

362:                                              ; preds = %337
  %363 = load ptr, ptr %18, align 8, !tbaa !5
  %364 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %363, i32 0, i32 7
  %365 = load float, ptr %364, align 8, !tbaa !70
  %366 = load float, ptr %45, align 4, !tbaa !20
  %367 = fmul float %365, %366
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %50, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !42
  %368 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 0
  %369 = load double, ptr %368, align 16
  %370 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 1
  %371 = load double, ptr %370, align 8
  %372 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %367, double %369, double %371)
  %373 = getelementptr inbounds %"class.JPH::Vec3", ptr %49, i32 0, i32 0
  %374 = getelementptr inbounds %union.anon.0, ptr %373, i32 0, i32 0
  %375 = getelementptr inbounds { double, double }, ptr %374, i32 0, i32 0
  %376 = extractvalue { double, double } %372, 0
  store double %376, ptr %375, align 16
  %377 = getelementptr inbounds { double, double }, ptr %374, i32 0, i32 1
  %378 = extractvalue { double, double } %372, 1
  store double %378, ptr %377, align 8
  %379 = getelementptr inbounds { double, double }, ptr %49, i32 0, i32 0
  %380 = load double, ptr %379, align 16
  %381 = getelementptr inbounds { double, double }, ptr %49, i32 0, i32 1
  %382 = load double, ptr %381, align 8
  %383 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %39, double %380, double %382)
  br label %384

384:                                              ; preds = %362, %337
  call void @llvm.lifetime.start.p0(i64 16, ptr %51) #9
  %385 = load float, ptr %38, align 4, !tbaa !20
  %386 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %39, float noundef %385)
  %387 = getelementptr inbounds %"class.JPH::Vec3", ptr %51, i32 0, i32 0
  %388 = getelementptr inbounds %union.anon.0, ptr %387, i32 0, i32 0
  %389 = getelementptr inbounds { double, double }, ptr %388, i32 0, i32 0
  %390 = extractvalue { double, double } %386, 0
  store double %390, ptr %389, align 16
  %391 = getelementptr inbounds { double, double }, ptr %388, i32 0, i32 1
  %392 = extractvalue { double, double } %386, 1
  store double %392, ptr %391, align 8
  %393 = load float, ptr %32, align 4, !tbaa !20
  %394 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %51, float noundef %393)
  %395 = getelementptr inbounds %"class.JPH::Vec3", ptr %52, i32 0, i32 0
  %396 = getelementptr inbounds %union.anon.0, ptr %395, i32 0, i32 0
  %397 = getelementptr inbounds { double, double }, ptr %396, i32 0, i32 0
  %398 = extractvalue { double, double } %394, 0
  store double %398, ptr %397, align 16
  %399 = getelementptr inbounds { double, double }, ptr %396, i32 0, i32 1
  %400 = extractvalue { double, double } %394, 1
  store double %400, ptr %399, align 8
  %401 = load ptr, ptr %11, align 8, !tbaa !5
  %402 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %401, i32 0, i32 2
  %403 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 0
  %404 = load double, ptr %403, align 16
  %405 = getelementptr inbounds { double, double }, ptr %52, i32 0, i32 1
  %406 = load double, ptr %405, align 8
  %407 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %402, double %404, double %406)
  %408 = load ptr, ptr %18, align 8, !tbaa !5
  %409 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %408, i32 0, i32 5
  %410 = load float, ptr %409, align 16, !tbaa !68
  %411 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %51, float noundef %410)
  %412 = getelementptr inbounds %"class.JPH::Vec3", ptr %53, i32 0, i32 0
  %413 = getelementptr inbounds %union.anon.0, ptr %412, i32 0, i32 0
  %414 = getelementptr inbounds { double, double }, ptr %413, i32 0, i32 0
  %415 = extractvalue { double, double } %411, 0
  store double %415, ptr %414, align 16
  %416 = getelementptr inbounds { double, double }, ptr %413, i32 0, i32 1
  %417 = extractvalue { double, double } %411, 1
  store double %417, ptr %416, align 8
  %418 = load ptr, ptr %18, align 8, !tbaa !5
  %419 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %418, i32 0, i32 11
  %420 = getelementptr inbounds { double, double }, ptr %53, i32 0, i32 0
  %421 = load double, ptr %420, align 16
  %422 = getelementptr inbounds { double, double }, ptr %53, i32 0, i32 1
  %423 = load double, ptr %422, align 8
  %424 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %419, double %421, double %423)
  %425 = load ptr, ptr %18, align 8, !tbaa !5
  %426 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %425, i32 0, i32 10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %56, ptr align 16 %51, i64 16, i1 false), !tbaa.struct !42
  %427 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 0
  %428 = load double, ptr %427, align 16
  %429 = getelementptr inbounds { double, double }, ptr %56, i32 0, i32 1
  %430 = load double, ptr %429, align 8
  %431 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %21, double %428, double %430)
  %432 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %433 = getelementptr inbounds %union.anon.0, ptr %432, i32 0, i32 0
  %434 = getelementptr inbounds { double, double }, ptr %433, i32 0, i32 0
  %435 = extractvalue { double, double } %431, 0
  store double %435, ptr %434, align 16
  %436 = getelementptr inbounds { double, double }, ptr %433, i32 0, i32 1
  %437 = extractvalue { double, double } %431, 1
  store double %437, ptr %436, align 8
  %438 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 0
  %439 = load double, ptr %438, align 16
  %440 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 1
  %441 = load double, ptr %440, align 8
  %442 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %426, double %439, double %441)
  %443 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %444 = getelementptr inbounds %union.anon.0, ptr %443, i32 0, i32 0
  %445 = getelementptr inbounds { double, double }, ptr %444, i32 0, i32 0
  %446 = extractvalue { double, double } %442, 0
  store double %446, ptr %445, align 16
  %447 = getelementptr inbounds { double, double }, ptr %444, i32 0, i32 1
  %448 = extractvalue { double, double } %442, 1
  store double %448, ptr %447, align 8
  %449 = load ptr, ptr %18, align 8, !tbaa !5
  %450 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %449, i32 0, i32 12
  %451 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %452 = load double, ptr %451, align 16
  %453 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %454 = load double, ptr %453, align 8
  %455 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %450, double %452, double %454)
  %456 = load ptr, ptr %18, align 8, !tbaa !5
  %457 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %456, i32 0, i32 9
  store i8 1, ptr %457, align 16, !tbaa !71
  call void @llvm.lifetime.end.p0(i64 16, ptr %51) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #9
  br label %458

458:                                              ; preds = %384, %190
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #9
  br label %563

459:                                              ; preds = %161
  %460 = load ptr, ptr %18, align 8, !tbaa !5
  %461 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %460, i32 0, i32 8
  %462 = load float, ptr %461, align 4, !tbaa !67
  %463 = fcmp ogt float %462, 0.000000e+00
  br i1 %463, label %464, label %562

464:                                              ; preds = %459
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #9
  %465 = load ptr, ptr %11, align 8, !tbaa !5
  %466 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %465, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %58, ptr align 16 %466, i64 16, i1 false), !tbaa.struct !42
  %467 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 0
  %468 = load double, ptr %467, align 16
  %469 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 1
  %470 = load double, ptr %469, align 8
  %471 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %468, double %470)
  %472 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %19, float noundef %471)
  %473 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %474 = getelementptr inbounds %union.anon.0, ptr %473, i32 0, i32 0
  %475 = getelementptr inbounds { double, double }, ptr %474, i32 0, i32 0
  %476 = extractvalue { double, double } %472, 0
  store double %476, ptr %475, align 16
  %477 = getelementptr inbounds { double, double }, ptr %474, i32 0, i32 1
  %478 = extractvalue { double, double } %472, 1
  store double %478, ptr %477, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #9
  %479 = load ptr, ptr %11, align 8, !tbaa !5
  %480 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %479, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %60, ptr align 16 %57, i64 16, i1 false), !tbaa.struct !42
  %481 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %482 = load double, ptr %481, align 16
  %483 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %484 = load double, ptr %483, align 8
  %485 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %480, double %482, double %484)
  %486 = getelementptr inbounds %"class.JPH::Vec3", ptr %59, i32 0, i32 0
  %487 = getelementptr inbounds %union.anon.0, ptr %486, i32 0, i32 0
  %488 = getelementptr inbounds { double, double }, ptr %487, i32 0, i32 0
  %489 = extractvalue { double, double } %485, 0
  store double %489, ptr %488, align 16
  %490 = getelementptr inbounds { double, double }, ptr %487, i32 0, i32 1
  %491 = extractvalue { double, double } %485, 1
  store double %491, ptr %490, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #9
  %492 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %59)
  store float %492, ptr %61, align 4, !tbaa !20
  %493 = load float, ptr %61, align 4, !tbaa !20
  %494 = fcmp ogt float %493, 0.000000e+00
  br i1 %494, label %495, label %521

495:                                              ; preds = %464
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #9
  %496 = load ptr, ptr %18, align 8, !tbaa !5
  %497 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %496, i32 0, i32 6
  %498 = load float, ptr %497, align 4, !tbaa !69
  %499 = load float, ptr %16, align 4, !tbaa !20
  %500 = fmul float %498, %499
  %501 = load float, ptr %61, align 4, !tbaa !20
  %502 = load float, ptr %5, align 4, !tbaa !20
  %503 = fmul float %501, %502
  %504 = fdiv float %500, %503
  store float %504, ptr %63, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #9
  store float 1.000000e+00, ptr %64, align 4, !tbaa !20
  %505 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %63, ptr noundef nonnull align 4 dereferenceable(4) %64)
  %506 = load float, ptr %505, align 4, !tbaa !20
  %507 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %59, float noundef %506)
  %508 = getelementptr inbounds %"class.JPH::Vec3", ptr %62, i32 0, i32 0
  %509 = getelementptr inbounds %union.anon.0, ptr %508, i32 0, i32 0
  %510 = getelementptr inbounds { double, double }, ptr %509, i32 0, i32 0
  %511 = extractvalue { double, double } %507, 0
  store double %511, ptr %510, align 16
  %512 = getelementptr inbounds { double, double }, ptr %509, i32 0, i32 1
  %513 = extractvalue { double, double } %507, 1
  store double %513, ptr %512, align 8
  %514 = load ptr, ptr %11, align 8, !tbaa !5
  %515 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %514, i32 0, i32 2
  %516 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 0
  %517 = load double, ptr %516, align 16
  %518 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 1
  %519 = load double, ptr %518, align 8
  %520 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %515, double %517, double %519)
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #9
  br label %521

521:                                              ; preds = %495, %464
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %65, ptr align 16 %57, i64 16, i1 false), !tbaa.struct !42
  %522 = load ptr, ptr %11, align 8, !tbaa !5
  %523 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %522, i32 0, i32 2
  %524 = getelementptr inbounds { double, double }, ptr %65, i32 0, i32 0
  %525 = load double, ptr %524, align 16
  %526 = getelementptr inbounds { double, double }, ptr %65, i32 0, i32 1
  %527 = load double, ptr %526, align 8
  %528 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %523, double %525, double %527)
  call void @llvm.lifetime.start.p0(i64 4, ptr %66) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %67, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !42
  %529 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 0
  %530 = load double, ptr %529, align 16
  %531 = getelementptr inbounds { double, double }, ptr %67, i32 0, i32 1
  %532 = load double, ptr %531, align 8
  %533 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %530, double %532)
  store float %533, ptr %66, align 4, !tbaa !20
  %534 = load float, ptr %66, align 4, !tbaa !20
  %535 = load float, ptr %6, align 4, !tbaa !20
  %536 = fcmp olt float %534, %535
  br i1 %536, label %537, label %561

537:                                              ; preds = %521
  %538 = load ptr, ptr %18, align 8, !tbaa !5
  %539 = getelementptr inbounds %"struct.JPH::SoftBodyMotionProperties::CollidingShape", ptr %538, i32 0, i32 7
  %540 = load float, ptr %539, align 8, !tbaa !70
  %541 = load float, ptr %66, align 4, !tbaa !20
  %542 = fmul float %540, %541
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %19, i64 16, i1 false), !tbaa.struct !42
  %543 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 0
  %544 = load double, ptr %543, align 16
  %545 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 1
  %546 = load double, ptr %545, align 8
  %547 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %542, double %544, double %546)
  %548 = getelementptr inbounds %"class.JPH::Vec3", ptr %68, i32 0, i32 0
  %549 = getelementptr inbounds %union.anon.0, ptr %548, i32 0, i32 0
  %550 = getelementptr inbounds { double, double }, ptr %549, i32 0, i32 0
  %551 = extractvalue { double, double } %547, 0
  store double %551, ptr %550, align 16
  %552 = getelementptr inbounds { double, double }, ptr %549, i32 0, i32 1
  %553 = extractvalue { double, double } %547, 1
  store double %553, ptr %552, align 8
  %554 = load ptr, ptr %11, align 8, !tbaa !5
  %555 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %554, i32 0, i32 2
  %556 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %557 = load double, ptr %556, align 16
  %558 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %559 = load double, ptr %558, align 8
  %560 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %555, double %557, double %559)
  br label %561

561:                                              ; preds = %537, %521
  call void @llvm.lifetime.end.p0(i64 4, ptr %66) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #9
  br label %562

562:                                              ; preds = %561, %459
  br label %563

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

564:                                              ; preds = %563, %147
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #9
  br label %565

565:                                              ; preds = %564, %132
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #9
  br label %566

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

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

568:                                              ; preds = %567
  %569 = load ptr, ptr %9, align 8, !tbaa !5
  %570 = getelementptr inbounds %"class.JPH::SoftBodyVertex", ptr %569, i32 1
  store ptr %570, ptr %9, align 8, !tbaa !5
  br label %89

571:                                              ; preds = %93
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #9
  ret void
}

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

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

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

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

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

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #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 = { 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 = { 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, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !13, i64 132}
!10 = !{!"_ZTSN3JPH21SoftBodyUpdateContextE", !6, i64 0, !6, i64 8, !6, i64 16, !11, i64 32, !12, i64 96, !12, i64 112, !13, i64 128, !13, i64 132, !14, i64 136, !16, i64 140, !16, i64 144, !16, i64 148, !16, i64 152, !16, i64 156, !12, i64 160, !19, i64 176}
!11 = !{!"_ZTSN3JPH5Mat44E", !7, i64 0}
!12 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!13 = !{!"float", !7, i64 0}
!14 = !{!"_ZTSSt6atomicIN3JPH21SoftBodyUpdateContext6EStateEE", !15, i64 0}
!15 = !{!"_ZTSN3JPH21SoftBodyUpdateContext6EStateE", !7, i64 0}
!16 = !{!"_ZTSSt6atomicIjE", !17, i64 0}
!17 = !{!"_ZTSSt13__atomic_baseIjE", !18, i64 0}
!18 = !{!"int", !7, i64 0}
!19 = !{!"_ZTSN3JPH9ECanSleepE", !7, i64 0}
!20 = !{!13, !13, i64 0}
!21 = !{!22, !13, i64 224}
!22 = !{!"_ZTSN3JPH22SoftBodySharedSettingsE", !23, i64 0, !24, i64 8, !26, i64 32, !27, i64 56, !28, i64 80, !29, i64 104, !30, i64 128, !31, i64 152, !32, i64 176, !33, i64 200, !13, i64 224, !34, i64 232, !35, i64 256, !36, i64 280}
!23 = !{!"_ZTSN3JPH9RefTargetINS_22SoftBodySharedSettingsEEE", !16, i64 0}
!24 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings6VertexENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!25 = !{!"long", !7, i64 0}
!26 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings4FaceENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!27 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings4EdgeENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!28 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings12DihedralBendENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!29 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings6VolumeENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!30 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings7SkinnedENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!31 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings7InvBindENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!32 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings3LRAENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!33 = !{!"_ZTSN3JPH5ArrayINS_8RefConstINS_15PhysicsMaterialEEENS_12STLAllocatorIS3_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!34 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings16ClosestKinematicENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!35 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings11UpdateGroupENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!36 = !{!"_ZTSN3JPH5ArrayIjNS_12STLAllocatorIjEEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!37 = !{!38, !13, i64 76}
!38 = !{!"_ZTSN3JPH14SoftBodyVertexE", !12, i64 0, !12, i64 16, !12, i64 32, !39, i64 48, !18, i64 64, !41, i64 68, !13, i64 72, !13, i64 76}
!39 = !{!"_ZTSN3JPH5PlaneE", !40, i64 0}
!40 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!41 = !{!"bool", !7, i64 0}
!42 = !{i64 0, i64 16, !43}
!43 = !{!7, !7, i64 0}
!44 = !{!38, !18, i64 64}
!45 = !{!38, !41, i64 68}
!46 = !{!47, !41, i64 349}
!47 = !{!"_ZTSN3JPH24SoftBodyMotionPropertiesE", !48, i64 0, !55, i64 184, !56, i64 192, !57, i64 216, !58, i64 240, !59, i64 272, !59, i64 304, !18, i64 336, !13, i64 340, !13, i64 344, !41, i64 348, !41, i64 349, !41, i64 350, !41, i64 351}
!48 = !{!"_ZTSN3JPH16MotionPropertiesE", !12, i64 0, !12, i64 16, !12, i64 32, !49, i64 48, !50, i64 64, !50, i64 76, !13, i64 88, !13, i64 92, !13, i64 96, !13, i64 100, !13, i64 104, !13, i64 108, !18, i64 112, !18, i64 116, !51, i64 120, !41, i64 121, !52, i64 122, !7, i64 123, !7, i64 124, !7, i64 128, !13, i64 176, !53, i64 180, !54, i64 181}
!49 = !{!"_ZTSN3JPH4QuatE", !40, i64 0}
!50 = !{!"_ZTSN3JPH6Float3E", !13, i64 0, !13, i64 4, !13, i64 8}
!51 = !{!"_ZTSN3JPH14EMotionQualityE", !7, i64 0}
!52 = !{!"_ZTSN3JPH12EAllowedDOFsE", !7, i64 0}
!53 = !{!"_ZTSN3JPH9EBodyTypeE", !7, i64 0}
!54 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!55 = !{!"_ZTSN3JPH8RefConstINS_22SoftBodySharedSettingsEEE", !6, i64 0}
!56 = !{!"_ZTSN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!57 = !{!"_ZTSN3JPH5ArrayINS_24SoftBodyMotionProperties14CollidingShapeENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!58 = !{!"_ZTSN3JPH5ArrayINS_24SoftBodyMotionProperties9SkinStateENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!59 = !{!"_ZTSN3JPH5AABoxE", !12, i64 0, !12, i64 16}
!60 = !{!61, !41, i64 77}
!61 = !{!"_ZTSN3JPH24SoftBodyMotionProperties14CollidingShapeE", !11, i64 0, !62, i64 64, !63, i64 72, !54, i64 76, !41, i64 77, !13, i64 80, !13, i64 84, !13, i64 88, !13, i64 92, !41, i64 96, !11, i64 112, !12, i64 176, !12, i64 192, !12, i64 208, !12, i64 224}
!62 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !6, i64 0}
!63 = !{!"_ZTSN3JPH6BodyIDE", !18, i64 0}
!64 = !{i8 0, i8 2}
!65 = !{}
!66 = !{!61, !54, i64 76}
!67 = !{!61, !13, i64 92}
!68 = !{!61, !13, i64 80}
!69 = !{!61, !13, i64 84}
!70 = !{!61, !13, i64 88}
!71 = !{!61, !41, i64 96}


; 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.0 }
%union.anon.0 = type { <4 x float> }

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

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24SoftBodyMotionProperties44ApplyCollisionConstraintsAndUpdateVelocitiesERKNS_21SoftBodyUpdateContextE(ptr noundef nonnull align 16 dereferenceable(352) %0, ptr noundef nonnull align 16 dereferenceable(180) %1) local_unnamed_addr #7 align 2 {
  %3 = alloca %"class.JPH::Vec3", align 16
  %4 = alloca %"class.JPH::Vec3", align 16
  %5 = alloca %"class.JPH::Vec3", align 16
  %6 = alloca %"class.JPH::Vec3", align 16
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca float, align 4
  %12 = alloca float, align 4
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca float, align 4
  %17 = alloca float, align 4
  %18 = getelementptr inbounds i8, ptr %1, i64 132
  %19 = load float, ptr %18, align 4, !tbaa !5
  %20 = getelementptr inbounds i8, ptr %1, i64 96
  %21 = tail call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %20)
  %22 = fmul float %21, -2.000000e+00
  %23 = fmul float %19, %22
  %24 = getelementptr inbounds i8, ptr %0, i64 184
  %25 = tail call noundef ptr @_ZNK3JPH8RefConstINS_22SoftBodySharedSettingsEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %24)
  %26 = getelementptr inbounds i8, ptr %25, i64 224
  %27 = load float, ptr %26, align 8, !tbaa !19
  %28 = getelementptr inbounds i8, ptr %0, i64 192
  %29 = tail call noundef ptr @_ZN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %28)
  %30 = tail call noundef ptr @_ZN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %28)
  %.not141 = icmp eq ptr %29, %30
  br i1 %.not141, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %2
  %31 = getelementptr inbounds i8, ptr %4, i64 8
  %32 = getelementptr inbounds i8, ptr %0, i64 349
  %33 = getelementptr inbounds i8, ptr %0, i64 216
  %34 = getelementptr inbounds i8, ptr %5, i64 8
  %35 = getelementptr inbounds i8, ptr %15, i64 8
  %36 = getelementptr inbounds i8, ptr %6, i64 8
  %37 = getelementptr inbounds i8, ptr %7, i64 8
  %38 = getelementptr inbounds i8, ptr %8, i64 8
  %39 = getelementptr inbounds i8, ptr %9, i64 8
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %10, i64 8
  %40 = getelementptr inbounds i8, ptr %13, i64 8
  %41 = getelementptr inbounds i8, ptr %14, i64 8
  br label %42

._crit_edge:                                      ; preds = %217, %2
  ret void

42:                                               ; preds = %.lr.ph, %217
  %.0142 = phi ptr [ %29, %.lr.ph ], [ %218, %217 ]
  %43 = getelementptr inbounds i8, ptr %.0142, i64 76
  %44 = load float, ptr %43, align 4, !tbaa !35
  %45 = fcmp ogt float %44, 0.000000e+00
  br i1 %45, label %46, label %217

46:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3) #9
  %47 = getelementptr inbounds i8, ptr %.0142, i64 32
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %3, ptr noundef nonnull align 16 dereferenceable(16) %47, i64 16, i1 false), !tbaa.struct !40
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %4) #9
  %48 = getelementptr inbounds i8, ptr %.0142, i64 16
  %.sroa.094.0.copyload = load double, ptr %.0142, align 16
  %.sroa.295.0..sroa_idx = getelementptr inbounds i8, ptr %.0142, i64 8
  %.sroa.295.0.copyload = load double, ptr %.sroa.295.0..sroa_idx, align 8, !tbaa !41
  %49 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %48, double %.sroa.094.0.copyload, double %.sroa.295.0.copyload)
  %50 = extractvalue { double, double } %49, 0
  store double %50, ptr %4, align 16
  %51 = extractvalue { double, double } %49, 1
  store double %51, ptr %31, align 8
  %52 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %4, float noundef %19)
  %53 = extractvalue { double, double } %52, 0
  %54 = extractvalue { double, double } %52, 1
  store double %53, ptr %47, align 16
  %.sroa.497.0..sroa_idx = getelementptr inbounds i8, ptr %.0142, i64 40
  store double %54, ptr %.sroa.497.0..sroa_idx, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #9
  %55 = getelementptr inbounds i8, ptr %.0142, i64 64
  %56 = load i32, ptr %55, align 16, !tbaa !42
  %57 = icmp sgt i32 %56, -1
  br i1 %57, label %58, label %216

58:                                               ; preds = %46
  %59 = getelementptr inbounds i8, ptr %.0142, i64 48
  %.sroa.088.0.copyload = load double, ptr %48, align 16
  %.sroa.289.0..sroa_idx = getelementptr inbounds i8, ptr %.0142, i64 24
  %.sroa.289.0.copyload = load double, ptr %.sroa.289.0..sroa_idx, align 8, !tbaa !41
  %60 = call noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %59, double %.sroa.088.0.copyload, double %.sroa.289.0.copyload)
  %61 = fsub float %27, %60
  %62 = fcmp ogt float %61, 0.000000e+00
  br i1 %62, label %63, label %216

63:                                               ; preds = %58
  %64 = getelementptr inbounds i8, ptr %.0142, i64 68
  store i8 1, ptr %64, align 4, !tbaa !43
  store i8 1, ptr %32, align 1, !tbaa !44
  %65 = load i32, ptr %55, align 16, !tbaa !42
  %66 = sext i32 %65 to i64
  %67 = call noundef nonnull align 16 dereferenceable(240) ptr @_ZN3JPH5ArrayINS_24SoftBodyMotionProperties14CollidingShapeENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %33, i64 noundef %66)
  %68 = getelementptr inbounds i8, ptr %67, i64 77
  %69 = load i8, ptr %68, align 1, !tbaa !58, !range !62, !noundef !63
  %70 = trunc nuw i8 %69 to i1
  br i1 %70, label %216, label %71

71:                                               ; preds = %63
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #9
  %72 = call { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %59)
  %73 = extractvalue { double, double } %72, 0
  store double %73, ptr %5, align 16
  %74 = extractvalue { double, double } %72, 1
  store double %74, ptr %34, align 8
  %75 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %5, float noundef %61)
  %76 = extractvalue { double, double } %75, 0
  %77 = extractvalue { double, double } %75, 1
  %78 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %48, double %76, double %77)
  %79 = getelementptr inbounds i8, ptr %67, i64 76
  %80 = load i8, ptr %79, align 4, !tbaa !64
  %81 = icmp eq i8 %80, 2
  br i1 %81, label %82, label %176

82:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #9
  %83 = call { double, double } @_ZNK3JPH5Mat4414GetTranslationEv(ptr noundef nonnull align 16 dereferenceable(64) %67)
  %84 = extractvalue { double, double } %83, 0
  %85 = extractvalue { double, double } %83, 1
  %86 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %48, double %84, double %85)
  %87 = extractvalue { double, double } %86, 0
  store double %87, ptr %6, align 16
  %88 = extractvalue { double, double } %86, 1
  store double %88, ptr %36, align 8
  %89 = call { double, double } @_ZNK3JPH24SoftBodyMotionProperties14CollidingShape16GetPointVelocityENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(240) %67, double %87, double %88)
  %90 = extractvalue { double, double } %89, 0
  %91 = extractvalue { double, double } %89, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #9
  %92 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %90, double %91)
  %93 = extractvalue { double, double } %92, 0
  store double %93, ptr %7, align 16
  %94 = extractvalue { double, double } %92, 1
  store double %94, ptr %37, align 8
  %95 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %5, double %93, double %94)
  %96 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %5, float noundef %95)
  %97 = extractvalue { double, double } %96, 0
  %98 = extractvalue { double, double } %96, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #9
  %99 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %7, double %97, double %98)
  %100 = extractvalue { double, double } %99, 0
  store double %100, ptr %8, align 16
  %101 = extractvalue { double, double } %99, 1
  store double %101, ptr %38, align 8
  %102 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %8)
  %103 = getelementptr inbounds i8, ptr %67, i64 92
  %104 = load float, ptr %103, align 4, !tbaa !65
  %105 = load float, ptr %43, align 4, !tbaa !35
  %106 = fmul float %104, %105
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #9
  %.sroa.049.0.copyload = load double, ptr %5, align 16
  %.sroa.250.0.copyload = load double, ptr %34, align 8, !tbaa !41
  %107 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.049.0.copyload, double %.sroa.250.0.copyload)
  %108 = extractvalue { double, double } %107, 0
  store double %108, ptr %9, align 16
  %109 = extractvalue { double, double } %107, 1
  store double %109, ptr %39, align 8
  %110 = getelementptr inbounds i8, ptr %67, i64 80
  %111 = load float, ptr %110, align 16, !tbaa !66
  %112 = getelementptr inbounds i8, ptr %67, i64 112
  %113 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %112, double %108, double %109)
  %114 = extractvalue { double, double } %113, 0
  %115 = extractvalue { double, double } %113, 1
  %116 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %9, double %114, double %115)
  %117 = fadd float %111, %116
  %118 = fadd float %106, %117
  %119 = fcmp ogt float %118, 0.000000e+00
  br i1 %119, label %120, label %175

120:                                              ; preds = %82
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #9
  %121 = fcmp ogt float %102, 0.000000e+00
  br i1 %121, label %122, label %133

122:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #9
  %123 = getelementptr inbounds i8, ptr %67, i64 84
  %124 = load float, ptr %123, align 4, !tbaa !67
  %125 = fmul float %61, %124
  %126 = fmul float %19, %102
  %127 = fdiv float %125, %126
  store float %127, ptr %11, align 4, !tbaa !68
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #9
  store float 1.000000e+00, ptr %12, align 4, !tbaa !68
  %128 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %11, ptr noundef nonnull align 4 dereferenceable(4) %12)
  %129 = load float, ptr %128, align 4, !tbaa !68
  %130 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %8, float noundef %129)
  %131 = extractvalue { double, double } %130, 0
  %132 = extractvalue { double, double } %130, 1
  store double %131, ptr %10, align 16
  store double %132, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !41
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #9
  br label %137

133:                                              ; preds = %120
  %134 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %135 = extractvalue { double, double } %134, 0
  %136 = extractvalue { double, double } %134, 1
  store double %135, ptr %10, align 16
  store double %136, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !41
  br label %137

137:                                              ; preds = %133, %122
  %138 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %10, double %97, double %98)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #9
  %139 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %3, double %90, double %91)
  %140 = extractvalue { double, double } %139, 0
  store double %140, ptr %13, align 16
  %141 = extractvalue { double, double } %139, 1
  store double %141, ptr %40, align 8
  %.sroa.031.0.copyload = load double, ptr %5, align 16
  %.sroa.232.0.copyload = load double, ptr %34, align 8, !tbaa !41
  %142 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %.sroa.031.0.copyload, double %.sroa.232.0.copyload)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #9
  %143 = fcmp olt float %142, %23
  br i1 %143, label %144, label %152

144:                                              ; preds = %137
  %145 = getelementptr inbounds i8, ptr %67, i64 88
  %146 = load float, ptr %145, align 8, !tbaa !69
  %147 = fmul float %142, %146
  %.sroa.027.0.copyload = load double, ptr %5, align 16
  %.sroa.228.0.copyload = load double, ptr %34, align 8, !tbaa !41
  %148 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %147, double %.sroa.027.0.copyload, double %.sroa.228.0.copyload)
  %149 = extractvalue { double, double } %148, 0
  %150 = extractvalue { double, double } %148, 1
  %151 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %10, double %149, double %150)
  br label %152

152:                                              ; preds = %144, %137
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #9
  %153 = call { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %10, float noundef %118)
  %154 = extractvalue { double, double } %153, 0
  store double %154, ptr %14, align 16
  %155 = extractvalue { double, double } %153, 1
  store double %155, ptr %41, align 8
  %156 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %106)
  %157 = extractvalue { double, double } %156, 0
  %158 = extractvalue { double, double } %156, 1
  %159 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %157, double %158)
  %160 = load float, ptr %110, align 16, !tbaa !66
  %161 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %160)
  %162 = extractvalue { double, double } %161, 0
  %163 = extractvalue { double, double } %161, 1
  %164 = getelementptr inbounds i8, ptr %67, i64 176
  %165 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %164, double %162, double %163)
  %.sroa.017.0.copyload = load double, ptr %14, align 16
  %.sroa.218.0.copyload = load double, ptr %41, align 8, !tbaa !41
  %166 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.017.0.copyload, double %.sroa.218.0.copyload)
  %167 = extractvalue { double, double } %166, 0
  %168 = extractvalue { double, double } %166, 1
  %169 = call { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %112, double %167, double %168)
  %170 = extractvalue { double, double } %169, 0
  %171 = extractvalue { double, double } %169, 1
  %172 = getelementptr inbounds i8, ptr %67, i64 192
  %173 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %172, double %170, double %171)
  %174 = getelementptr inbounds i8, ptr %67, i64 96
  store i8 1, ptr %174, align 16, !tbaa !70
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #9
  br label %175

175:                                              ; preds = %152, %82
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #9
  br label %215

176:                                              ; preds = %71
  %177 = getelementptr inbounds i8, ptr %67, i64 92
  %178 = load float, ptr %177, align 4, !tbaa !65
  %179 = fcmp ogt float %178, 0.000000e+00
  br i1 %179, label %180, label %215

180:                                              ; preds = %176
  %.sroa.014.0.copyload = load double, ptr %47, align 16
  %.sroa.215.0.copyload = load double, ptr %.sroa.497.0..sroa_idx, align 8, !tbaa !41
  %181 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %5, double %.sroa.014.0.copyload, double %.sroa.215.0.copyload)
  %182 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %5, float noundef %181)
  %183 = extractvalue { double, double } %182, 0
  %184 = extractvalue { double, double } %182, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #9
  %185 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %183, double %184)
  %186 = extractvalue { double, double } %185, 0
  store double %186, ptr %15, align 16
  %187 = extractvalue { double, double } %185, 1
  store double %187, ptr %35, align 8
  %188 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %15)
  %189 = fcmp ogt float %188, 0.000000e+00
  br i1 %189, label %190, label %202

190:                                              ; preds = %180
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %16) #9
  %191 = getelementptr inbounds i8, ptr %67, i64 84
  %192 = load float, ptr %191, align 4, !tbaa !67
  %193 = fmul float %61, %192
  %194 = fmul float %19, %188
  %195 = fdiv float %193, %194
  store float %195, ptr %16, align 4, !tbaa !68
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %17) #9
  store float 1.000000e+00, ptr %17, align 4, !tbaa !68
  %196 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %16, ptr noundef nonnull align 4 dereferenceable(4) %17)
  %197 = load float, ptr %196, align 4, !tbaa !68
  %198 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %15, float noundef %197)
  %199 = extractvalue { double, double } %198, 0
  %200 = extractvalue { double, double } %198, 1
  %201 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %199, double %200)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %16) #9
  br label %202

202:                                              ; preds = %190, %180
  %203 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %183, double %184)
  %.sroa.03.0.copyload = load double, ptr %5, align 16
  %.sroa.24.0.copyload = load double, ptr %34, align 8, !tbaa !41
  %204 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %3, double %.sroa.03.0.copyload, double %.sroa.24.0.copyload)
  %205 = fcmp olt float %204, %23
  br i1 %205, label %206, label %214

206:                                              ; preds = %202
  %207 = getelementptr inbounds i8, ptr %67, i64 88
  %208 = load float, ptr %207, align 8, !tbaa !69
  %209 = fmul float %204, %208
  %.sroa.0.0.copyload = load double, ptr %5, align 16
  %.sroa.2.0.copyload = load double, ptr %34, align 8, !tbaa !41
  %210 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %209, double %.sroa.0.0.copyload, double %.sroa.2.0.copyload)
  %211 = extractvalue { double, double } %210, 0
  %212 = extractvalue { double, double } %210, 1
  %213 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %47, double %211, double %212)
  br label %214

214:                                              ; preds = %206, %202
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #9
  br label %215

215:                                              ; preds = %176, %214, %175
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #9
  br label %216

216:                                              ; preds = %58, %215, %63, %46
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3) #9
  br label %217

217:                                              ; preds = %216, %42
  %218 = getelementptr inbounds i8, ptr %.0142, i64 80
  %.not = icmp eq ptr %218, %30
  br i1 %.not, label %._crit_edge, label %42
}

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

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

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

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

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #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 = { 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 = { 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, !12, i64 132}
!6 = !{!"_ZTSN3JPH21SoftBodyUpdateContextE", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 32, !11, i64 96, !11, i64 112, !12, i64 128, !12, i64 132, !13, i64 136, !15, i64 140, !15, i64 144, !15, i64 148, !15, i64 152, !15, i64 156, !11, i64 160, !18, i64 176}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTSN3JPH5Mat44E", !8, i64 0}
!11 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!12 = !{!"float", !8, i64 0}
!13 = !{!"_ZTSSt6atomicIN3JPH21SoftBodyUpdateContext6EStateEE", !14, i64 0}
!14 = !{!"_ZTSN3JPH21SoftBodyUpdateContext6EStateE", !8, i64 0}
!15 = !{!"_ZTSSt6atomicIjE", !16, i64 0}
!16 = !{!"_ZTSSt13__atomic_baseIjE", !17, i64 0}
!17 = !{!"int", !8, i64 0}
!18 = !{!"_ZTSN3JPH9ECanSleepE", !8, i64 0}
!19 = !{!20, !12, i64 224}
!20 = !{!"_ZTSN3JPH22SoftBodySharedSettingsE", !21, i64 0, !22, i64 8, !24, i64 32, !25, i64 56, !26, i64 80, !27, i64 104, !28, i64 128, !29, i64 152, !30, i64 176, !31, i64 200, !12, i64 224, !32, i64 232, !33, i64 256, !34, i64 280}
!21 = !{!"_ZTSN3JPH9RefTargetINS_22SoftBodySharedSettingsEEE", !15, i64 0}
!22 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings6VertexENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!23 = !{!"long", !8, i64 0}
!24 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings4FaceENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!25 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings4EdgeENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!26 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings12DihedralBendENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!27 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings6VolumeENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!28 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings7SkinnedENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!29 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings7InvBindENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!30 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings3LRAENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!31 = !{!"_ZTSN3JPH5ArrayINS_8RefConstINS_15PhysicsMaterialEEENS_12STLAllocatorIS3_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!32 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings16ClosestKinematicENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!33 = !{!"_ZTSN3JPH5ArrayINS_22SoftBodySharedSettings11UpdateGroupENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!34 = !{!"_ZTSN3JPH5ArrayIjNS_12STLAllocatorIjEEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!35 = !{!36, !12, i64 76}
!36 = !{!"_ZTSN3JPH14SoftBodyVertexE", !11, i64 0, !11, i64 16, !11, i64 32, !37, i64 48, !17, i64 64, !39, i64 68, !12, i64 72, !12, i64 76}
!37 = !{!"_ZTSN3JPH5PlaneE", !38, i64 0}
!38 = !{!"_ZTSN3JPH4Vec4E", !8, i64 0}
!39 = !{!"bool", !8, i64 0}
!40 = !{i64 0, i64 16, !41}
!41 = !{!8, !8, i64 0}
!42 = !{!36, !17, i64 64}
!43 = !{!36, !39, i64 68}
!44 = !{!45, !39, i64 349}
!45 = !{!"_ZTSN3JPH24SoftBodyMotionPropertiesE", !46, i64 0, !53, i64 184, !54, i64 192, !55, i64 216, !56, i64 240, !57, i64 272, !57, i64 304, !17, i64 336, !12, i64 340, !12, i64 344, !39, i64 348, !39, i64 349, !39, i64 350, !39, i64 351}
!46 = !{!"_ZTSN3JPH16MotionPropertiesE", !11, i64 0, !11, i64 16, !11, i64 32, !47, i64 48, !48, i64 64, !48, i64 76, !12, i64 88, !12, i64 92, !12, i64 96, !12, i64 100, !12, i64 104, !12, i64 108, !17, i64 112, !17, i64 116, !49, i64 120, !39, i64 121, !50, i64 122, !8, i64 123, !8, i64 124, !8, i64 128, !12, i64 176, !51, i64 180, !52, i64 181}
!47 = !{!"_ZTSN3JPH4QuatE", !38, i64 0}
!48 = !{!"_ZTSN3JPH6Float3E", !12, i64 0, !12, i64 4, !12, i64 8}
!49 = !{!"_ZTSN3JPH14EMotionQualityE", !8, i64 0}
!50 = !{!"_ZTSN3JPH12EAllowedDOFsE", !8, i64 0}
!51 = !{!"_ZTSN3JPH9EBodyTypeE", !8, i64 0}
!52 = !{!"_ZTSN3JPH11EMotionTypeE", !8, i64 0}
!53 = !{!"_ZTSN3JPH8RefConstINS_22SoftBodySharedSettingsEEE", !7, i64 0}
!54 = !{!"_ZTSN3JPH5ArrayINS_14SoftBodyVertexENS_12STLAllocatorIS1_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!55 = !{!"_ZTSN3JPH5ArrayINS_24SoftBodyMotionProperties14CollidingShapeENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!56 = !{!"_ZTSN3JPH5ArrayINS_24SoftBodyMotionProperties9SkinStateENS_12STLAllocatorIS2_EEEE", !23, i64 0, !23, i64 8, !7, i64 16}
!57 = !{!"_ZTSN3JPH5AABoxE", !11, i64 0, !11, i64 16}
!58 = !{!59, !39, i64 77}
!59 = !{!"_ZTSN3JPH24SoftBodyMotionProperties14CollidingShapeE", !10, i64 0, !60, i64 64, !61, i64 72, !52, i64 76, !39, i64 77, !12, i64 80, !12, i64 84, !12, i64 88, !12, i64 92, !39, i64 96, !10, i64 112, !11, i64 176, !11, i64 192, !11, i64 208, !11, i64 224}
!60 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !7, i64 0}
!61 = !{!"_ZTSN3JPH6BodyIDE", !17, i64 0}
!62 = !{i8 0, i8 2}
!63 = !{}
!64 = !{!59, !52, i64 76}
!65 = !{!59, !12, i64 92}
!66 = !{!59, !12, i64 80}
!67 = !{!59, !12, i64 84}
!68 = !{!12, !12, i64 0}
!69 = !{!59, !12, i64 88}
!70 = !{!59, !39, i64 96}


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