; LLVM IR from jrouwe/JoltPhysics :: Jolt/Physics/Character (CharacterVirtual)

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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Array.37" = type { %"class.JPH::STLTempAllocator.38", i64, i64, ptr }
%"class.JPH::STLTempAllocator.38" = type { ptr }
%class.anon = type { i8 }
%"class.JPH::CharacterVirtual" = type <{ %"class.JPH::CharacterBase", %"class.JPH::CharacterID", [4 x i8], ptr, ptr, i8, [3 x i8], float, i32, i32, float, float, float, i32, float, float, i8, [3 x i8], float, float, [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Vec3", %"class.JPH::Array.2", i32, [4 x i8], %"class.JPH::UnorderedMap", float, i8, [3 x i8], i64, %"class.JPH::BodyID", [12 x i8] }>
%"class.JPH::CharacterBase" = type { ptr, %"class.JPH::RefTarget", ptr, %"class.JPH::RefConst", %"class.JPH::Vec3", %"class.JPH::Plane", float, i32, %"class.JPH::BodyID", %"class.JPH::SubShapeID", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::RefConst.1", i64 }
%"class.JPH::RefTarget" = type { %"struct.std::atomic" }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::RefConst" = type { ptr }
%"class.JPH::Plane" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.0 }
%union.anon.0 = type { <4 x float> }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::RefConst.1" = type { ptr }
%"class.JPH::CharacterID" = type { i32 }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Array.2" = type { i64, i64, ptr }
%"class.JPH::UnorderedMap" = type { %"class.JPH::HashTable.base", [4 x i8] }
%"class.JPH::HashTable.base" = type <{ ptr, ptr, i32, i32, i32 }>
%"class.JPH::BodyID" = type { i32 }
%"struct.JPH::CharacterVirtual::Constraint" = type <{ ptr, float, float, %"class.JPH::Vec3", %"class.JPH::Plane", i8, [15 x i8] }>
%"struct.JPH::CharacterVirtual::Contact" = type <{ %"class.JPH::CharacterVirtual::ContactKey", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, i8, i8, [6 x i8], ptr, i64, ptr, i8, i8, i8, [5 x i8] }>
%"class.JPH::CharacterVirtual::ContactKey" = type { %"class.JPH::BodyID", %"class.JPH::CharacterID", %"class.JPH::SubShapeID" }

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

declare i32 @__gxx_personality_v0(...)

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

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

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS1_7ContactEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 16 dereferenceable(123)) #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #5

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(372), double, double, ptr noundef nonnull align 16 dereferenceable(49), float noundef) #8 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #9

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_10ContactKeyENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %1, double %2, float noundef %3, float noundef %4, ptr noundef nonnull align 8 dereferenceable(32) %5, ptr noundef nonnull align 8 dereferenceable(32) %6, ptr noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 16 dereferenceable(16) %8, ptr noundef nonnull align 8 dereferenceable(8) %9) #8 align 2 personality ptr @__gxx_personality_v0 {
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca ptr, align 8
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca %"class.JPH::Vec3", align 16
  %21 = alloca %"class.JPH::Array.37", align 8
  %22 = alloca %"class.JPH::STLTempAllocator.38", align 8
  %23 = alloca ptr, align 8
  %24 = alloca i32, align 4
  %25 = alloca i64, align 8
  %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::Array.37", align 8
  %30 = alloca %"class.JPH::STLTempAllocator.38", align 8
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca %"class.JPH::Vec3", align 16
  %39 = alloca %"class.JPH::Vec3", align 16
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca float, align 4
  %42 = alloca %"class.JPH::Vec3", align 16
  %43 = alloca float, align 4
  %44 = alloca float, align 4
  %45 = alloca %class.anon, align 1
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca ptr, align 8
  %50 = alloca ptr, align 8
  %51 = alloca %"class.JPH::Vec3", align 16
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca %"class.JPH::Vec3", align 16
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca %"class.JPH::Vec3", align 16
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca %"class.JPH::Vec3", align 16
  %59 = alloca %"class.JPH::Vec3", align 16
  %60 = alloca %"class.JPH::Vec3", align 16
  %61 = alloca %"class.JPH::Vec3", align 16
  %62 = alloca %"class.JPH::Vec3", align 16
  %63 = alloca %"class.JPH::Vec3", align 16
  %64 = alloca %"class.JPH::Vec3", align 16
  %65 = alloca %"class.JPH::Vec3", align 16
  %66 = alloca float, align 4
  %67 = alloca float, align 4
  %68 = alloca %"class.JPH::Vec3", align 16
  %69 = alloca %"class.JPH::Vec3", align 16
  %70 = alloca %"class.JPH::Vec3", align 16
  %71 = alloca %"class.JPH::Vec3", align 16
  %72 = alloca %"class.JPH::Vec3", align 16
  %73 = alloca %"class.JPH::Vec3", align 16
  %74 = alloca %"class.JPH::Vec3", align 16
  %75 = alloca %"class.JPH::Vec3", align 16
  %76 = alloca float, align 4
  %77 = alloca ptr, align 8
  %78 = alloca ptr, align 8
  %79 = alloca %"class.JPH::Vec3", align 16
  %80 = alloca float, align 4
  %81 = alloca %"class.JPH::Vec3", align 16
  %82 = alloca %"class.JPH::Vec3", align 16
  %83 = alloca %"class.JPH::Vec3", align 16
  %84 = alloca float, align 4
  %85 = alloca %"class.JPH::Vec3", align 16
  %86 = alloca %"class.JPH::Vec3", align 16
  %87 = alloca %"class.JPH::Vec3", align 16
  %88 = alloca %"class.JPH::Vec3", align 16
  %89 = alloca %"class.JPH::Vec3", align 16
  %90 = alloca %"class.JPH::Vec3", align 16
  %91 = alloca %"class.JPH::Vec3", align 16
  %92 = alloca %"class.JPH::Vec3", align 16
  %93 = alloca %"class.JPH::Vec3", align 16
  %94 = alloca float, align 4
  %95 = alloca float, align 4
  %96 = alloca %"class.JPH::Vec3", align 16
  %97 = alloca %"class.JPH::Vec3", align 16
  %98 = alloca %"class.JPH::Vec3", align 16
  %99 = alloca float, align 4
  %100 = alloca float, align 4
  %101 = alloca %"class.JPH::Vec3", align 16
  %102 = alloca %"class.JPH::Vec3", align 16
  %103 = alloca %"class.JPH::Vec3", align 16
  %104 = alloca %"class.JPH::Vec3", align 16
  %105 = alloca %"class.JPH::Vec3", align 16
  %106 = alloca %"class.JPH::Vec3", align 16
  %107 = alloca %"class.JPH::Vec3", align 16
  %108 = alloca %"class.JPH::Vec3", align 16
  %109 = alloca %"class.JPH::Vec3", align 16
  %110 = alloca %"class.JPH::Vec3", align 16
  %111 = alloca %"class.JPH::Vec3", align 16
  %112 = alloca %"class.JPH::Vec3", align 16
  %113 = alloca %"class.JPH::Vec3", align 16
  %114 = alloca %"class.JPH::Vec3", align 16
  %115 = alloca %"class.JPH::Vec3", align 16
  %116 = alloca %"class.JPH::Vec3", align 16
  %117 = alloca %"class.JPH::Vec3", align 16
  %118 = alloca %"class.JPH::Vec3", align 16
  %119 = alloca %"class.JPH::Vec3", align 16
  %120 = alloca %"class.JPH::Vec3", align 16
  %121 = alloca %"class.JPH::Vec3", align 16
  %122 = alloca %"class.JPH::Vec3", align 16
  %123 = alloca %"class.JPH::Vec3", align 16
  %124 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 0
  store double %1, ptr %124, align 16
  %125 = getelementptr inbounds { double, double }, ptr %11, i32 0, i32 1
  store double %2, ptr %125, align 8
  store ptr %0, ptr %12, align 8, !tbaa !5
  store float %3, ptr %13, align 4, !tbaa !9
  store float %4, ptr %14, align 4, !tbaa !9
  store ptr %5, ptr %15, align 8, !tbaa !5
  store ptr %6, ptr %16, align 8, !tbaa !5
  store ptr %7, ptr %17, align 8, !tbaa !5
  store ptr %8, ptr %18, align 8, !tbaa !5
  store ptr %9, ptr %19, align 8, !tbaa !5
  %126 = load ptr, ptr %12, align 8
  %127 = load ptr, ptr %15, align 8, !tbaa !5
  %128 = call noundef zeroext i1 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32) %127)
  br i1 %128, label %129, label %141

129:                                              ; preds = %10
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #10
  %130 = load float, ptr %14, align 4, !tbaa !9
  %131 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %11, float noundef %130)
  %132 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %133 = getelementptr inbounds %union.anon, ptr %132, i32 0, i32 0
  %134 = getelementptr inbounds { double, double }, ptr %133, i32 0, i32 0
  %135 = extractvalue { double, double } %131, 0
  store double %135, ptr %134, align 16
  %136 = getelementptr inbounds { double, double }, ptr %133, i32 0, i32 1
  %137 = extractvalue { double, double } %131, 1
  store double %137, ptr %136, align 8
  %138 = load ptr, ptr %18, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %138, ptr align 16 %20, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #10
  %139 = load float, ptr %14, align 4, !tbaa !9
  %140 = load ptr, ptr %17, align 8, !tbaa !5
  store float %139, ptr %140, align 4, !tbaa !9
  br label %1202

141:                                              ; preds = %10
  call void @llvm.lifetime.start.p0(i64 32, ptr %21) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #10
  %142 = load ptr, ptr %19, align 8, !tbaa !5
  call void @_ZN3JPH16STLTempAllocatorIPNS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %22, ptr noundef nonnull align 8 dereferenceable(8) %142)
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEC2ERKS5_(ptr noundef nonnull align 8 dereferenceable(32) %21, ptr noundef nonnull align 8 dereferenceable(8) %22)
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #10
  %143 = load ptr, ptr %15, align 8, !tbaa !5
  %144 = invoke noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %143)
          to label %145 unwind label %153

145:                                              ; preds = %141
  invoke void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE6resizeEm(ptr noundef nonnull align 8 dereferenceable(32) %21, i64 noundef %144)
          to label %146 unwind label %153

146:                                              ; preds = %145
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #10
  store i64 0, ptr %25, align 8, !tbaa !13
  br label %147

147:                                              ; preds = %169, %146
  %148 = load i64, ptr %25, align 8, !tbaa !13
  %149 = invoke noundef i64 @_ZNK3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %21)
          to label %150 unwind label %157

150:                                              ; preds = %147
  %151 = icmp ult i64 %148, %149
  br i1 %151, label %161, label %152

152:                                              ; preds = %150
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #10
  br label %172

153:                                              ; preds = %145, %141
  %154 = landingpad { ptr, i32 }
          cleanup
  %155 = extractvalue { ptr, i32 } %154, 0
  store ptr %155, ptr %23, align 8
  %156 = extractvalue { ptr, i32 } %154, 1
  store i32 %156, ptr %24, align 4
  br label %1206

157:                                              ; preds = %165, %161, %147
  %158 = landingpad { ptr, i32 }
          cleanup
  %159 = extractvalue { ptr, i32 } %158, 0
  store ptr %159, ptr %23, align 8
  %160 = extractvalue { ptr, i32 } %158, 1
  store i32 %160, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #10
  br label %1206

161:                                              ; preds = %150
  %162 = load ptr, ptr %15, align 8, !tbaa !5
  %163 = load i64, ptr %25, align 8, !tbaa !13
  %164 = invoke noundef nonnull align 16 dereferenceable(49) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %162, i64 noundef %163)
          to label %165 unwind label %157

165:                                              ; preds = %161
  %166 = load i64, ptr %25, align 8, !tbaa !13
  %167 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %21, i64 noundef %166)
          to label %168 unwind label %157

168:                                              ; preds = %165
  store ptr %164, ptr %167, align 8, !tbaa !5
  br label %169

169:                                              ; preds = %168
  %170 = load i64, ptr %25, align 8, !tbaa !13
  %171 = add i64 %170, 1
  store i64 %171, ptr %25, align 8, !tbaa !13
  br label %147, !llvm.loop !15

172:                                              ; preds = %152
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %11, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %27, ptr align 16 %11, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.start.p0(i64 16, ptr %28) #10
  %173 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %174 unwind label %196

174:                                              ; preds = %172
  %175 = getelementptr inbounds %"class.JPH::Vec3", ptr %28, i32 0, i32 0
  %176 = getelementptr inbounds %union.anon, ptr %175, i32 0, i32 0
  %177 = getelementptr inbounds { double, double }, ptr %176, i32 0, i32 0
  %178 = extractvalue { double, double } %173, 0
  store double %178, ptr %177, align 16
  %179 = getelementptr inbounds { double, double }, ptr %176, i32 0, i32 1
  %180 = extractvalue { double, double } %173, 1
  store double %180, ptr %179, align 8
  %181 = load ptr, ptr %18, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %181, ptr align 16 %28, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #10
  %182 = load ptr, ptr %17, align 8, !tbaa !5
  store float 0.000000e+00, ptr %182, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %29) #10
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #10
  %183 = load ptr, ptr %19, align 8, !tbaa !5
  invoke void @_ZN3JPH16STLTempAllocatorIPNS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %30, ptr noundef nonnull align 8 dereferenceable(8) %183)
          to label %184 unwind label %200

184:                                              ; preds = %174
  invoke void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEC2ERKS5_(ptr noundef nonnull align 8 dereferenceable(32) %29, ptr noundef nonnull align 8 dereferenceable(8) %30)
          to label %185 unwind label %200

185:                                              ; preds = %184
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #10
  %186 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 9
  %187 = load i32, ptr %186, align 4, !tbaa !17
  %188 = zext i32 %187 to i64
  invoke void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE6resizeEm(ptr noundef nonnull align 8 dereferenceable(32) %29, i64 noundef %188)
          to label %189 unwind label %204

189:                                              ; preds = %185
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #10
  store i32 0, ptr %31, align 4, !tbaa !39
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #10
  store i32 0, ptr %32, align 4, !tbaa !39
  br label %190

190:                                              ; preds = %1188, %189
  %191 = load i32, ptr %32, align 4, !tbaa !39
  %192 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 9
  %193 = load i32, ptr %192, align 4, !tbaa !17
  %194 = icmp ult i32 %191, %193
  br i1 %194, label %208, label %195

195:                                              ; preds = %190
  store i32 5, ptr %33, align 4
  br label %1196

196:                                              ; preds = %172
  %197 = landingpad { ptr, i32 }
          cleanup
  %198 = extractvalue { ptr, i32 } %197, 0
  store ptr %198, ptr %23, align 8
  %199 = extractvalue { ptr, i32 } %197, 1
  store i32 %199, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #10
  br label %1205

200:                                              ; preds = %184, %174
  %201 = landingpad { ptr, i32 }
          cleanup
  %202 = extractvalue { ptr, i32 } %201, 0
  store ptr %202, ptr %23, align 8
  %203 = extractvalue { ptr, i32 } %201, 1
  store i32 %203, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #10
  br label %1204

204:                                              ; preds = %185
  %205 = landingpad { ptr, i32 }
          cleanup
  %206 = extractvalue { ptr, i32 } %205, 0
  store ptr %206, ptr %23, align 8
  %207 = extractvalue { ptr, i32 } %205, 1
  store i32 %207, ptr %24, align 4
  br label %1203

208:                                              ; preds = %190
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #10
  %209 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %209, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #10
  %210 = load ptr, ptr %34, align 8, !tbaa !5
  %211 = invoke noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %210)
          to label %212 unwind label %221

212:                                              ; preds = %208
  store ptr %211, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #10
  %213 = load ptr, ptr %34, align 8, !tbaa !5
  %214 = invoke noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %213)
          to label %215 unwind label %225

215:                                              ; preds = %212
  store ptr %214, ptr %36, align 8, !tbaa !5
  br label %216

216:                                              ; preds = %317, %215
  %217 = load ptr, ptr %35, align 8, !tbaa !5
  %218 = load ptr, ptr %36, align 8, !tbaa !5
  %219 = icmp ne ptr %217, %218
  br i1 %219, label %229, label %220

220:                                              ; preds = %216
  store i32 8, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #10
  br label %323

221:                                              ; preds = %208
  %222 = landingpad { ptr, i32 }
          cleanup
  %223 = extractvalue { ptr, i32 } %222, 0
  store ptr %223, ptr %23, align 8
  %224 = extractvalue { ptr, i32 } %222, 1
  store i32 %224, ptr %24, align 4
  br label %322

225:                                              ; preds = %212
  %226 = landingpad { ptr, i32 }
          cleanup
  %227 = extractvalue { ptr, i32 } %226, 0
  store ptr %227, ptr %23, align 8
  %228 = extractvalue { ptr, i32 } %226, 1
  store i32 %228, ptr %24, align 4
  br label %321

229:                                              ; preds = %216
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #10
  %230 = load ptr, ptr %35, align 8, !tbaa !5
  store ptr %230, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %38) #10
  %231 = load ptr, ptr %37, align 8, !tbaa !5
  %232 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %231, i32 0, i32 4
  %233 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %232)
          to label %234 unwind label %270

234:                                              ; preds = %229
  %235 = getelementptr inbounds %"class.JPH::Vec3", ptr %38, i32 0, i32 0
  %236 = getelementptr inbounds %union.anon, ptr %235, i32 0, i32 0
  %237 = getelementptr inbounds { double, double }, ptr %236, i32 0, i32 0
  %238 = extractvalue { double, double } %233, 0
  store double %238, ptr %237, align 16
  %239 = getelementptr inbounds { double, double }, ptr %236, i32 0, i32 1
  %240 = extractvalue { double, double } %233, 1
  store double %240, ptr %239, align 8
  %241 = load ptr, ptr %37, align 8, !tbaa !5
  %242 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %241, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %40, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %243 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 0
  %244 = load double, ptr %243, align 16
  %245 = getelementptr inbounds { double, double }, ptr %40, i32 0, i32 1
  %246 = load double, ptr %245, align 8
  %247 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %242, double %244, double %246)
          to label %248 unwind label %270

248:                                              ; preds = %234
  %249 = getelementptr inbounds %"class.JPH::Vec3", ptr %39, i32 0, i32 0
  %250 = getelementptr inbounds %union.anon, ptr %249, i32 0, i32 0
  %251 = getelementptr inbounds { double, double }, ptr %250, i32 0, i32 0
  %252 = extractvalue { double, double } %247, 0
  store double %252, ptr %251, align 16
  %253 = getelementptr inbounds { double, double }, ptr %250, i32 0, i32 1
  %254 = extractvalue { double, double } %247, 1
  store double %254, ptr %253, align 8
  %255 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 0
  %256 = load double, ptr %255, align 16
  %257 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 1
  %258 = load double, ptr %257, align 8
  %259 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %38, double %256, double %258)
          to label %260 unwind label %270

260:                                              ; preds = %248
  %261 = load ptr, ptr %37, align 8, !tbaa !5
  %262 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %261, i32 0, i32 2
  store float %259, ptr %262, align 4, !tbaa !40
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #10
  %263 = load ptr, ptr %37, align 8, !tbaa !5
  %264 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %263, i32 0, i32 2
  %265 = load float, ptr %264, align 4, !tbaa !40
  %266 = fcmp olt float %265, 0x3EB0C6F7A0000000
  br i1 %266, label %267, label %274

267:                                              ; preds = %260
  %268 = load ptr, ptr %37, align 8, !tbaa !5
  %269 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %268, i32 0, i32 1
  store float 0x47EFFFFFE0000000, ptr %269, align 8, !tbaa !42
  br label %316

270:                                              ; preds = %248, %234, %229
  %271 = landingpad { ptr, i32 }
          cleanup
  %272 = extractvalue { ptr, i32 } %271, 0
  store ptr %272, ptr %23, align 8
  %273 = extractvalue { ptr, i32 } %271, 1
  store i32 %273, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #10
  br label %320

274:                                              ; preds = %260
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #10
  %275 = load ptr, ptr %37, align 8, !tbaa !5
  %276 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %275, i32 0, i32 4
  %277 = load ptr, ptr %18, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %42, ptr align 16 %277, i64 16, i1 false), !tbaa.struct !11
  %278 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 0
  %279 = load double, ptr %278, align 16
  %280 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 1
  %281 = load double, ptr %280, align 8
  %282 = invoke noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %276, double %279, double %281)
          to label %283 unwind label %295

283:                                              ; preds = %274
  store float %282, ptr %41, align 4, !tbaa !9
  %284 = load float, ptr %41, align 4, !tbaa !9
  %285 = load ptr, ptr %37, align 8, !tbaa !5
  %286 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %285, i32 0, i32 2
  %287 = load float, ptr %286, align 4, !tbaa !40
  %288 = load float, ptr %14, align 4, !tbaa !9
  %289 = fneg float %287
  %290 = call float @llvm.fmuladd.f32(float %289, float %288, float %284)
  %291 = fcmp ogt float %290, 0xBF1A36E2E0000000
  br i1 %291, label %292, label %299

292:                                              ; preds = %283
  %293 = load ptr, ptr %37, align 8, !tbaa !5
  %294 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %293, i32 0, i32 1
  store float 0x47EFFFFFE0000000, ptr %294, align 8, !tbaa !42
  br label %314

295:                                              ; preds = %274
  %296 = landingpad { ptr, i32 }
          cleanup
  %297 = extractvalue { ptr, i32 } %296, 0
  store ptr %297, ptr %23, align 8
  %298 = extractvalue { ptr, i32 } %296, 1
  store i32 %298, ptr %24, align 4
  br label %315

299:                                              ; preds = %283
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #10
  store float 0.000000e+00, ptr %43, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #10
  %300 = load float, ptr %41, align 4, !tbaa !9
  %301 = load ptr, ptr %37, align 8, !tbaa !5
  %302 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %301, i32 0, i32 2
  %303 = load float, ptr %302, align 4, !tbaa !40
  %304 = fdiv float %300, %303
  store float %304, ptr %44, align 4, !tbaa !9
  %305 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %43, ptr noundef nonnull align 4 dereferenceable(4) %44)
          to label %306 unwind label %310

306:                                              ; preds = %299
  %307 = load float, ptr %305, align 4, !tbaa !9
  %308 = load ptr, ptr %37, align 8, !tbaa !5
  %309 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %308, i32 0, i32 1
  store float %307, ptr %309, align 8, !tbaa !42
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #10
  br label %314

310:                                              ; preds = %299
  %311 = landingpad { ptr, i32 }
          cleanup
  %312 = extractvalue { ptr, i32 } %311, 0
  store ptr %312, ptr %23, align 8
  %313 = extractvalue { ptr, i32 } %311, 1
  store i32 %313, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #10
  br label %315

314:                                              ; preds = %306, %292
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #10
  br label %316

315:                                              ; preds = %310, %295
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #10
  br label %320

316:                                              ; preds = %314, %267
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #10
  br label %317

317:                                              ; preds = %316
  %318 = load ptr, ptr %35, align 8, !tbaa !5
  %319 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %318, i32 1
  store ptr %319, ptr %35, align 8, !tbaa !5
  br label %216

320:                                              ; preds = %315, %270
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #10
  br label %321

321:                                              ; preds = %320, %225
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #10
  br label %322

322:                                              ; preds = %321, %221
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #10
  br label %1198

323:                                              ; preds = %220
  %324 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %21)
          to label %325 unwind label %340

325:                                              ; preds = %323
  %326 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %21)
          to label %327 unwind label %340

327:                                              ; preds = %325
  invoke void @"_ZN3JPH9QuickSortIPPNS_16CharacterVirtual10ConstraintEZNS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_10ContactKeyENS7_ISB_EEEERfRS5_RNS_13TempAllocatorEE3$_0EEvT_SK_T0_"(ptr noundef %324, ptr noundef %326)
          to label %328 unwind label %340

328:                                              ; preds = %327
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #10
  store ptr null, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #10
  store ptr %21, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #10
  %329 = load ptr, ptr %47, align 8, !tbaa !5
  %330 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %329)
          to label %331 unwind label %344

331:                                              ; preds = %328
  store ptr %330, ptr %48, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #10
  %332 = load ptr, ptr %47, align 8, !tbaa !5
  %333 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %332)
          to label %334 unwind label %348

334:                                              ; preds = %331
  store ptr %333, ptr %49, align 8, !tbaa !5
  br label %335

335:                                              ; preds = %447, %334
  %336 = load ptr, ptr %48, align 8, !tbaa !5
  %337 = load ptr, ptr %49, align 8, !tbaa !5
  %338 = icmp ne ptr %336, %337
  br i1 %338, label %352, label %339

339:                                              ; preds = %335
  store i32 10, ptr %33, align 4
  br label %450

340:                                              ; preds = %327, %325, %323
  %341 = landingpad { ptr, i32 }
          cleanup
  %342 = extractvalue { ptr, i32 } %341, 0
  store ptr %342, ptr %23, align 8
  %343 = extractvalue { ptr, i32 } %341, 1
  store i32 %343, ptr %24, align 4
  br label %1198

344:                                              ; preds = %328
  %345 = landingpad { ptr, i32 }
          cleanup
  %346 = extractvalue { ptr, i32 } %345, 0
  store ptr %346, ptr %23, align 8
  %347 = extractvalue { ptr, i32 } %345, 1
  store i32 %347, ptr %24, align 4
  br label %453

348:                                              ; preds = %331
  %349 = landingpad { ptr, i32 }
          cleanup
  %350 = extractvalue { ptr, i32 } %349, 0
  store ptr %350, ptr %23, align 8
  %351 = extractvalue { ptr, i32 } %349, 1
  store i32 %351, ptr %24, align 4
  br label %452

352:                                              ; preds = %335
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #10
  %353 = load ptr, ptr %48, align 8, !tbaa !5
  %354 = load ptr, ptr %353, align 8, !tbaa !5
  store ptr %354, ptr %50, align 8, !tbaa !5
  %355 = load ptr, ptr %50, align 8, !tbaa !5
  %356 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %355, i32 0, i32 1
  %357 = load float, ptr %356, align 8, !tbaa !42
  %358 = load float, ptr %14, align 4, !tbaa !9
  %359 = fcmp oge float %357, %358
  br i1 %359, label %360, label %385

360:                                              ; preds = %352
  %361 = load float, ptr %14, align 4, !tbaa !9
  %362 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %361)
          to label %363 unwind label %381

363:                                              ; preds = %360
  %364 = getelementptr inbounds %"class.JPH::Vec3", ptr %51, i32 0, i32 0
  %365 = getelementptr inbounds %union.anon, ptr %364, i32 0, i32 0
  %366 = getelementptr inbounds { double, double }, ptr %365, i32 0, i32 0
  %367 = extractvalue { double, double } %362, 0
  store double %367, ptr %366, align 16
  %368 = getelementptr inbounds { double, double }, ptr %365, i32 0, i32 1
  %369 = extractvalue { double, double } %362, 1
  store double %369, ptr %368, align 8
  %370 = load ptr, ptr %18, align 8, !tbaa !5
  %371 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 0
  %372 = load double, ptr %371, align 16
  %373 = getelementptr inbounds { double, double }, ptr %51, i32 0, i32 1
  %374 = load double, ptr %373, align 8
  %375 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %370, double %372, double %374)
          to label %376 unwind label %381

376:                                              ; preds = %363
  %377 = load float, ptr %14, align 4, !tbaa !9
  %378 = load ptr, ptr %17, align 8, !tbaa !5
  %379 = load float, ptr %378, align 4, !tbaa !9
  %380 = fadd float %379, %377
  store float %380, ptr %378, align 4, !tbaa !9
  store i32 1, ptr %33, align 4
  br label %444

381:                                              ; preds = %409, %400, %363, %360
  %382 = landingpad { ptr, i32 }
          cleanup
  %383 = extractvalue { ptr, i32 } %382, 0
  store ptr %383, ptr %23, align 8
  %384 = extractvalue { ptr, i32 } %382, 1
  store i32 %384, ptr %24, align 4
  br label %446

385:                                              ; preds = %352
  %386 = load ptr, ptr %50, align 8, !tbaa !5
  %387 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %386, i32 0, i32 0
  %388 = load ptr, ptr %387, align 16, !tbaa !43
  %389 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %388, i32 0, i32 15
  %390 = load i8, ptr %389, align 1, !tbaa !44, !range !48, !noundef !49
  %391 = trunc i8 %390 to i1
  br i1 %391, label %392, label %393

392:                                              ; preds = %385
  store i32 11, ptr %33, align 4
  br label %444

393:                                              ; preds = %385
  %394 = load ptr, ptr %50, align 8, !tbaa !5
  %395 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %394, i32 0, i32 0
  %396 = load ptr, ptr %395, align 16, !tbaa !43
  %397 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %396, i32 0, i32 14
  %398 = load i8, ptr %397, align 8, !tbaa !50, !range !48, !noundef !49
  %399 = trunc i8 %398 to i1
  br i1 %399, label %420, label %400

400:                                              ; preds = %393
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %52, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %401 = load ptr, ptr %50, align 8, !tbaa !5
  %402 = load float, ptr %13, align 4, !tbaa !9
  %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 = invoke noundef zeroext i1 @_ZN3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(372) %126, double %404, double %406, ptr noundef nonnull align 16 dereferenceable(49) %401, float noundef %402)
          to label %408 unwind label %381

408:                                              ; preds = %400
  br i1 %407, label %420, label %409

409:                                              ; preds = %408
  %410 = load ptr, ptr %50, align 8, !tbaa !5
  %411 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %410, i32 0, i32 0
  %412 = load ptr, ptr %411, align 16, !tbaa !43
  %413 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %412, i32 0, i32 15
  store i8 1, ptr %413, align 1, !tbaa !44
  %414 = load ptr, ptr %16, align 8, !tbaa !5
  %415 = load ptr, ptr %50, align 8, !tbaa !5
  %416 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %415, i32 0, i32 0
  %417 = load ptr, ptr %416, align 16, !tbaa !43
  %418 = invoke noundef nonnull align 4 dereferenceable(12) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS1_7ContactEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32) %414, ptr noundef nonnull align 16 dereferenceable(123) %417)
          to label %419 unwind label %381

419:                                              ; preds = %409
  store i32 11, ptr %33, align 4
  br label %444

420:                                              ; preds = %408, %393
  %421 = load ptr, ptr %50, align 8, !tbaa !5
  %422 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %421, i32 0, i32 0
  %423 = load ptr, ptr %422, align 16, !tbaa !43
  %424 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %423, i32 0, i32 16
  %425 = load i8, ptr %424, align 2, !tbaa !51, !range !48, !noundef !49
  %426 = trunc i8 %425 to i1
  br i1 %426, label %442, label %427

427:                                              ; preds = %420
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #10
  %428 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %429 unwind label %438

429:                                              ; preds = %427
  %430 = getelementptr inbounds %"class.JPH::Vec3", ptr %53, i32 0, i32 0
  %431 = getelementptr inbounds %union.anon, ptr %430, i32 0, i32 0
  %432 = getelementptr inbounds { double, double }, ptr %431, i32 0, i32 0
  %433 = extractvalue { double, double } %428, 0
  store double %433, ptr %432, align 16
  %434 = getelementptr inbounds { double, double }, ptr %431, i32 0, i32 1
  %435 = extractvalue { double, double } %428, 1
  store double %435, ptr %434, align 8
  %436 = load ptr, ptr %50, align 8, !tbaa !5
  %437 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %436, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %437, ptr align 16 %53, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #10
  br label %442

438:                                              ; preds = %427
  %439 = landingpad { ptr, i32 }
          cleanup
  %440 = extractvalue { ptr, i32 } %439, 0
  store ptr %440, ptr %23, align 8
  %441 = extractvalue { ptr, i32 } %439, 1
  store i32 %441, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #10
  br label %446

442:                                              ; preds = %429, %420
  %443 = load ptr, ptr %50, align 8, !tbaa !5
  store ptr %443, ptr %46, align 8, !tbaa !5
  store i32 10, ptr %33, align 4
  br label %444

444:                                              ; preds = %442, %419, %392, %376
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #10
  %445 = load i32, ptr %33, align 4
  switch i32 %445, label %450 [
    i32 11, label %447
  ]

446:                                              ; preds = %438, %381
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #10
  br label %452

447:                                              ; preds = %444
  %448 = load ptr, ptr %48, align 8, !tbaa !5
  %449 = getelementptr inbounds ptr, ptr %448, i32 1
  store ptr %449, ptr %48, align 8, !tbaa !5
  br label %335

450:                                              ; preds = %444, %339
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #10
  %451 = load i32, ptr %33, align 4
  switch i32 %451, label %1185 [
    i32 10, label %454
  ]

452:                                              ; preds = %446, %348
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #10
  br label %453

453:                                              ; preds = %452, %344
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #10
  br label %1195

454:                                              ; preds = %450
  %455 = load ptr, ptr %46, align 8, !tbaa !5
  %456 = icmp eq ptr %455, null
  br i1 %456, label %457, label %482

457:                                              ; preds = %454
  %458 = load float, ptr %14, align 4, !tbaa !9
  %459 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %458)
          to label %460 unwind label %478

460:                                              ; preds = %457
  %461 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %462 = getelementptr inbounds %union.anon, ptr %461, i32 0, i32 0
  %463 = getelementptr inbounds { double, double }, ptr %462, i32 0, i32 0
  %464 = extractvalue { double, double } %459, 0
  store double %464, ptr %463, align 16
  %465 = getelementptr inbounds { double, double }, ptr %462, i32 0, i32 1
  %466 = extractvalue { double, double } %459, 1
  store double %466, ptr %465, align 8
  %467 = load ptr, ptr %18, align 8, !tbaa !5
  %468 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %469 = load double, ptr %468, align 16
  %470 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %471 = load double, ptr %470, align 8
  %472 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %467, double %469, double %471)
          to label %473 unwind label %478

473:                                              ; preds = %460
  %474 = load float, ptr %14, align 4, !tbaa !9
  %475 = load ptr, ptr %17, align 8, !tbaa !5
  %476 = load float, ptr %475, align 4, !tbaa !9
  %477 = fadd float %476, %474
  store float %477, ptr %475, align 4, !tbaa !9
  store i32 1, ptr %33, align 4
  br label %1185

478:                                              ; preds = %487, %482, %460, %457
  %479 = landingpad { ptr, i32 }
          cleanup
  %480 = extractvalue { ptr, i32 } %479, 0
  store ptr %480, ptr %23, align 8
  %481 = extractvalue { ptr, i32 } %479, 1
  store i32 %481, ptr %24, align 4
  br label %1195

482:                                              ; preds = %454
  %483 = load ptr, ptr %46, align 8, !tbaa !5
  %484 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %483, i32 0, i32 1
  %485 = load float, ptr %484, align 8, !tbaa !42
  %486 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %485)
          to label %487 unwind label %478

487:                                              ; preds = %482
  %488 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %489 = getelementptr inbounds %union.anon, ptr %488, i32 0, i32 0
  %490 = getelementptr inbounds { double, double }, ptr %489, i32 0, i32 0
  %491 = extractvalue { double, double } %486, 0
  store double %491, ptr %490, align 16
  %492 = getelementptr inbounds { double, double }, ptr %489, i32 0, i32 1
  %493 = extractvalue { double, double } %486, 1
  store double %493, ptr %492, align 8
  %494 = load ptr, ptr %18, align 8, !tbaa !5
  %495 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 0
  %496 = load double, ptr %495, align 16
  %497 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 1
  %498 = load double, ptr %497, align 8
  %499 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %494, double %496, double %498)
          to label %500 unwind label %478

500:                                              ; preds = %487
  %501 = load ptr, ptr %46, align 8, !tbaa !5
  %502 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %501, i32 0, i32 1
  %503 = load float, ptr %502, align 8, !tbaa !42
  %504 = load float, ptr %14, align 4, !tbaa !9
  %505 = fsub float %504, %503
  store float %505, ptr %14, align 4, !tbaa !9
  %506 = load ptr, ptr %46, align 8, !tbaa !5
  %507 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %506, i32 0, i32 1
  %508 = load float, ptr %507, align 8, !tbaa !42
  %509 = load ptr, ptr %17, align 8, !tbaa !5
  %510 = load float, ptr %509, align 4, !tbaa !9
  %511 = fadd float %510, %508
  store float %511, ptr %509, align 4, !tbaa !9
  %512 = load float, ptr %14, align 4, !tbaa !9
  %513 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 10
  %514 = load float, ptr %513, align 8, !tbaa !52
  %515 = fcmp olt float %512, %514
  br i1 %515, label %516, label %517

516:                                              ; preds = %500
  store i32 1, ptr %33, align 4
  br label %1185

517:                                              ; preds = %500
  %518 = load ptr, ptr %46, align 8, !tbaa !5
  %519 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %518, i32 0, i32 1
  %520 = load float, ptr %519, align 8, !tbaa !42
  %521 = fcmp ogt float %520, 0x3F1A36E2E0000000
  br i1 %521, label %522, label %523

522:                                              ; preds = %517
  store i32 0, ptr %31, align 4, !tbaa !39
  br label %523

523:                                              ; preds = %522, %517
  call void @llvm.lifetime.start.p0(i64 16, ptr %56) #10
  %524 = load ptr, ptr %46, align 8, !tbaa !5
  %525 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %524, i32 0, i32 4
  %526 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %525)
          to label %527 unwind label %628

527:                                              ; preds = %523
  %528 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %529 = getelementptr inbounds %union.anon, ptr %528, i32 0, i32 0
  %530 = getelementptr inbounds { double, double }, ptr %529, i32 0, i32 0
  %531 = extractvalue { double, double } %526, 0
  store double %531, ptr %530, align 16
  %532 = getelementptr inbounds { double, double }, ptr %529, i32 0, i32 1
  %533 = extractvalue { double, double } %526, 1
  store double %533, ptr %532, align 8
  %534 = load ptr, ptr %46, align 8, !tbaa !5
  %535 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %534, i32 0, i32 5
  %536 = load i8, ptr %535, align 16, !tbaa !53, !range !48, !noundef !49
  %537 = trunc i8 %536 to i1
  br i1 %537, label %538, label %646

538:                                              ; preds = %527
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #10
  %539 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %126, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %59, ptr align 16 %539, i64 16, i1 false), !tbaa.struct !11
  %540 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 0
  %541 = load double, ptr %540, align 16
  %542 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 1
  %543 = load double, ptr %542, align 8
  %544 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %541, double %543)
          to label %545 unwind label %632

545:                                              ; preds = %538
  %546 = getelementptr inbounds %"class.JPH::CharacterBase", ptr %126, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %60, ptr align 16 %546, i64 16, i1 false), !tbaa.struct !11
  %547 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %548 = load double, ptr %547, align 16
  %549 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %550 = load double, ptr %549, align 8
  %551 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %544, double %548, double %550)
          to label %552 unwind label %632

552:                                              ; preds = %545
  %553 = getelementptr inbounds %"class.JPH::Vec3", ptr %58, i32 0, i32 0
  %554 = getelementptr inbounds %union.anon, ptr %553, i32 0, i32 0
  %555 = getelementptr inbounds { double, double }, ptr %554, i32 0, i32 0
  %556 = extractvalue { double, double } %551, 0
  store double %556, ptr %555, align 16
  %557 = getelementptr inbounds { double, double }, ptr %554, i32 0, i32 1
  %558 = extractvalue { double, double } %551, 1
  store double %558, ptr %557, align 8
  %559 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 0
  %560 = load double, ptr %559, align 16
  %561 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 1
  %562 = load double, ptr %561, align 8
  %563 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %560, double %562)
          to label %564 unwind label %632

564:                                              ; preds = %552
  %565 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %566 = getelementptr inbounds %union.anon, ptr %565, i32 0, i32 0
  %567 = getelementptr inbounds { double, double }, ptr %566, i32 0, i32 0
  %568 = extractvalue { double, double } %563, 0
  store double %568, ptr %567, align 16
  %569 = getelementptr inbounds { double, double }, ptr %566, i32 0, i32 1
  %570 = extractvalue { double, double } %563, 1
  store double %570, ptr %569, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #10
  %571 = load ptr, ptr %46, align 8, !tbaa !5
  %572 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %571, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %62, ptr align 16 %572, i64 16, i1 false), !tbaa.struct !11
  %573 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 0
  %574 = load double, ptr %573, align 16
  %575 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 1
  %576 = load double, ptr %575, align 8
  %577 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %574, double %576)
          to label %578 unwind label %636

578:                                              ; preds = %564
  %579 = getelementptr inbounds %"class.JPH::Vec3", ptr %61, i32 0, i32 0
  %580 = getelementptr inbounds %union.anon, ptr %579, i32 0, i32 0
  %581 = getelementptr inbounds { double, double }, ptr %580, i32 0, i32 0
  %582 = extractvalue { double, double } %577, 0
  store double %582, ptr %581, align 16
  %583 = getelementptr inbounds { double, double }, ptr %580, i32 0, i32 1
  %584 = extractvalue { double, double } %577, 1
  store double %584, ptr %583, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %63) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %65) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %66) #10
  store float 0.000000e+00, ptr %66, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %67) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %68, ptr align 16 %57, i64 16, i1 false), !tbaa.struct !11
  %585 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %586 = load double, ptr %585, align 16
  %587 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %588 = load double, ptr %587, align 8
  %589 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %61, double %586, double %588)
          to label %590 unwind label %640

590:                                              ; preds = %578
  store float %589, ptr %67, align 4, !tbaa !9
  %591 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 4 dereferenceable(4) %67)
          to label %592 unwind label %640

592:                                              ; preds = %590
  %593 = load float, ptr %591, align 4, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %69, ptr align 16 %57, i64 16, i1 false), !tbaa.struct !11
  %594 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 0
  %595 = load double, ptr %594, align 16
  %596 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 1
  %597 = load double, ptr %596, align 8
  %598 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %593, double %595, double %597)
          to label %599 unwind label %640

599:                                              ; preds = %592
  %600 = getelementptr inbounds %"class.JPH::Vec3", ptr %65, i32 0, i32 0
  %601 = getelementptr inbounds %union.anon, ptr %600, i32 0, i32 0
  %602 = getelementptr inbounds { double, double }, ptr %601, i32 0, i32 0
  %603 = extractvalue { double, double } %598, 0
  store double %603, ptr %602, align 16
  %604 = getelementptr inbounds { double, double }, ptr %601, i32 0, i32 1
  %605 = extractvalue { double, double } %598, 1
  store double %605, ptr %604, align 8
  %606 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %57)
          to label %607 unwind label %640

607:                                              ; preds = %599
  %608 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %65, float noundef %606)
          to label %609 unwind label %640

609:                                              ; preds = %607
  %610 = getelementptr inbounds %"class.JPH::Vec3", ptr %64, i32 0, i32 0
  %611 = getelementptr inbounds %union.anon, ptr %610, i32 0, i32 0
  %612 = getelementptr inbounds { double, double }, ptr %611, i32 0, i32 0
  %613 = extractvalue { double, double } %608, 0
  store double %613, ptr %612, align 16
  %614 = getelementptr inbounds { double, double }, ptr %611, i32 0, i32 1
  %615 = extractvalue { double, double } %608, 1
  store double %615, ptr %614, align 8
  %616 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 0
  %617 = load double, ptr %616, align 16
  %618 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 1
  %619 = load double, ptr %618, align 8
  %620 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %617, double %619)
          to label %621 unwind label %640

621:                                              ; preds = %609
  %622 = getelementptr inbounds %"class.JPH::Vec3", ptr %63, i32 0, i32 0
  %623 = getelementptr inbounds %union.anon, ptr %622, i32 0, i32 0
  %624 = getelementptr inbounds { double, double }, ptr %623, i32 0, i32 0
  %625 = extractvalue { double, double } %620, 0
  store double %625, ptr %624, align 16
  %626 = getelementptr inbounds { double, double }, ptr %623, i32 0, i32 1
  %627 = extractvalue { double, double } %620, 1
  store double %627, ptr %626, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %63, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 4, ptr %67) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %66) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %63) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #10
  br label %646

628:                                              ; preds = %523
  %629 = landingpad { ptr, i32 }
          cleanup
  %630 = extractvalue { ptr, i32 } %629, 0
  store ptr %630, ptr %23, align 8
  %631 = extractvalue { ptr, i32 } %629, 1
  store i32 %631, ptr %24, align 4
  br label %1194

632:                                              ; preds = %552, %545, %538
  %633 = landingpad { ptr, i32 }
          cleanup
  %634 = extractvalue { ptr, i32 } %633, 0
  store ptr %634, ptr %23, align 8
  %635 = extractvalue { ptr, i32 } %633, 1
  store i32 %635, ptr %24, align 4
  br label %645

636:                                              ; preds = %564
  %637 = landingpad { ptr, i32 }
          cleanup
  %638 = extractvalue { ptr, i32 } %637, 0
  store ptr %638, ptr %23, align 8
  %639 = extractvalue { ptr, i32 } %637, 1
  store i32 %639, ptr %24, align 4
  br label %644

640:                                              ; preds = %609, %607, %599, %592, %590, %578
  %641 = landingpad { ptr, i32 }
          cleanup
  %642 = extractvalue { ptr, i32 } %641, 0
  store ptr %642, ptr %23, align 8
  %643 = extractvalue { ptr, i32 } %641, 1
  store i32 %643, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %67) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %66) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %65) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %63) #10
  br label %644

644:                                              ; preds = %640, %636
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #10
  br label %645

645:                                              ; preds = %644, %632
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #10
  br label %1194

646:                                              ; preds = %621, %527
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #10
  %647 = load ptr, ptr %46, align 8, !tbaa !5
  %648 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %647, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %71, ptr align 16 %648, i64 16, i1 false), !tbaa.struct !11
  %649 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 0
  %650 = load double, ptr %649, align 16
  %651 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 1
  %652 = load double, ptr %651, align 8
  %653 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %650, double %652)
          to label %654 unwind label %702

654:                                              ; preds = %646
  %655 = getelementptr inbounds %"class.JPH::Vec3", ptr %70, i32 0, i32 0
  %656 = getelementptr inbounds %union.anon, ptr %655, i32 0, i32 0
  %657 = getelementptr inbounds { double, double }, ptr %656, i32 0, i32 0
  %658 = extractvalue { double, double } %653, 0
  store double %658, ptr %657, align 16
  %659 = getelementptr inbounds { double, double }, ptr %656, i32 0, i32 1
  %660 = extractvalue { double, double } %653, 1
  store double %660, ptr %659, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %72) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %74, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %661 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 0
  %662 = load double, ptr %661, align 16
  %663 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 1
  %664 = load double, ptr %663, align 8
  %665 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %70, double %662, double %664)
          to label %666 unwind label %706

666:                                              ; preds = %654
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %75, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %667 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 0
  %668 = load double, ptr %667, align 16
  %669 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 1
  %670 = load double, ptr %669, align 8
  %671 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %665, double %668, double %670)
          to label %672 unwind label %706

672:                                              ; preds = %666
  %673 = getelementptr inbounds %"class.JPH::Vec3", ptr %73, i32 0, i32 0
  %674 = getelementptr inbounds %union.anon, ptr %673, i32 0, i32 0
  %675 = getelementptr inbounds { double, double }, ptr %674, i32 0, i32 0
  %676 = extractvalue { double, double } %671, 0
  store double %676, ptr %675, align 16
  %677 = getelementptr inbounds { double, double }, ptr %674, i32 0, i32 1
  %678 = extractvalue { double, double } %671, 1
  store double %678, ptr %677, align 8
  %679 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 0
  %680 = load double, ptr %679, align 16
  %681 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 1
  %682 = load double, ptr %681, align 8
  %683 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %680, double %682)
          to label %684 unwind label %706

684:                                              ; preds = %672
  %685 = getelementptr inbounds %"class.JPH::Vec3", ptr %72, i32 0, i32 0
  %686 = getelementptr inbounds %union.anon, ptr %685, i32 0, i32 0
  %687 = getelementptr inbounds { double, double }, ptr %686, i32 0, i32 0
  %688 = extractvalue { double, double } %683, 0
  store double %688, ptr %687, align 16
  %689 = getelementptr inbounds { double, double }, ptr %686, i32 0, i32 1
  %690 = extractvalue { double, double } %683, 1
  store double %690, ptr %689, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %76) #10
  store float 0.000000e+00, ptr %76, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #10
  store ptr null, ptr %77, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #10
  %691 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %29)
          to label %692 unwind label %710

692:                                              ; preds = %684
  store ptr %691, ptr %78, align 8, !tbaa !5
  br label %693

693:                                              ; preds = %788, %692
  %694 = load ptr, ptr %78, align 8, !tbaa !5
  %695 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %29)
          to label %696 unwind label %710

696:                                              ; preds = %693
  %697 = load i32, ptr %31, align 4, !tbaa !39
  %698 = sext i32 %697 to i64
  %699 = getelementptr inbounds ptr, ptr %695, i64 %698
  %700 = icmp ult ptr %694, %699
  br i1 %700, label %714, label %701

701:                                              ; preds = %696
  store i32 12, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #10
  br label %792

702:                                              ; preds = %646
  %703 = landingpad { ptr, i32 }
          cleanup
  %704 = extractvalue { ptr, i32 } %703, 0
  store ptr %704, ptr %23, align 8
  %705 = extractvalue { ptr, i32 } %703, 1
  store i32 %705, ptr %24, align 4
  br label %1193

706:                                              ; preds = %672, %666, %654
  %707 = landingpad { ptr, i32 }
          cleanup
  %708 = extractvalue { ptr, i32 } %707, 0
  store ptr %708, ptr %23, align 8
  %709 = extractvalue { ptr, i32 } %707, 1
  store i32 %709, ptr %24, align 4
  br label %1192

710:                                              ; preds = %693, %684
  %711 = landingpad { ptr, i32 }
          cleanup
  %712 = extractvalue { ptr, i32 } %711, 0
  store ptr %712, ptr %23, align 8
  %713 = extractvalue { ptr, i32 } %711, 1
  store i32 %713, ptr %24, align 4
  br label %791

714:                                              ; preds = %696
  %715 = load ptr, ptr %78, align 8, !tbaa !5
  %716 = load ptr, ptr %715, align 8, !tbaa !5
  %717 = load ptr, ptr %46, align 8, !tbaa !5
  %718 = icmp ne ptr %716, %717
  br i1 %718, label %719, label %787

719:                                              ; preds = %714
  call void @llvm.lifetime.start.p0(i64 16, ptr %79) #10
  %720 = load ptr, ptr %78, align 8, !tbaa !5
  %721 = load ptr, ptr %720, align 8, !tbaa !5
  %722 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %721, i32 0, i32 4
  %723 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %722)
          to label %724 unwind label %771

724:                                              ; preds = %719
  %725 = getelementptr inbounds %"class.JPH::Vec3", ptr %79, i32 0, i32 0
  %726 = getelementptr inbounds %union.anon, ptr %725, i32 0, i32 0
  %727 = getelementptr inbounds { double, double }, ptr %726, i32 0, i32 0
  %728 = extractvalue { double, double } %723, 0
  store double %728, ptr %727, align 16
  %729 = getelementptr inbounds { double, double }, ptr %726, i32 0, i32 1
  %730 = extractvalue { double, double } %723, 1
  store double %730, ptr %729, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %80) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %81) #10
  %731 = load ptr, ptr %78, align 8, !tbaa !5
  %732 = load ptr, ptr %731, align 8, !tbaa !5
  %733 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %732, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %82, ptr align 16 %72, i64 16, i1 false), !tbaa.struct !11
  %734 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 0
  %735 = load double, ptr %734, align 16
  %736 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 1
  %737 = load double, ptr %736, align 8
  %738 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %733, double %735, double %737)
          to label %739 unwind label %775

739:                                              ; preds = %724
  %740 = getelementptr inbounds %"class.JPH::Vec3", ptr %81, i32 0, i32 0
  %741 = getelementptr inbounds %union.anon, ptr %740, i32 0, i32 0
  %742 = getelementptr inbounds { double, double }, ptr %741, i32 0, i32 0
  %743 = extractvalue { double, double } %738, 0
  store double %743, ptr %742, align 16
  %744 = getelementptr inbounds { double, double }, ptr %741, i32 0, i32 1
  %745 = extractvalue { double, double } %738, 1
  store double %745, ptr %744, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %83, ptr align 16 %79, i64 16, i1 false), !tbaa.struct !11
  %746 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 0
  %747 = load double, ptr %746, align 16
  %748 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 1
  %749 = load double, ptr %748, align 8
  %750 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %81, double %747, double %749)
          to label %751 unwind label %775

751:                                              ; preds = %739
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #10
  store float %750, ptr %80, align 4, !tbaa !9
  %752 = load float, ptr %80, align 4, !tbaa !9
  %753 = load float, ptr %76, align 4, !tbaa !9
  %754 = fcmp ogt float %752, %753
  br i1 %754, label %755, label %784

755:                                              ; preds = %751
  call void @llvm.lifetime.start.p0(i64 4, ptr %84) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %85, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %756 = getelementptr inbounds { double, double }, ptr %85, i32 0, i32 0
  %757 = load double, ptr %756, align 16
  %758 = getelementptr inbounds { double, double }, ptr %85, i32 0, i32 1
  %759 = load double, ptr %758, align 8
  %760 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %79, double %757, double %759)
          to label %761 unwind label %779

761:                                              ; preds = %755
  store float %760, ptr %84, align 4, !tbaa !9
  %762 = load float, ptr %84, align 4, !tbaa !9
  %763 = fcmp olt float %762, 0x3FEF7CEDA0000000
  br i1 %763, label %764, label %783

764:                                              ; preds = %761
  %765 = load float, ptr %84, align 4, !tbaa !9
  %766 = fcmp ogt float %765, 0xBFEF7CEDA0000000
  br i1 %766, label %767, label %783

767:                                              ; preds = %764
  %768 = load float, ptr %80, align 4, !tbaa !9
  store float %768, ptr %76, align 4, !tbaa !9
  %769 = load ptr, ptr %78, align 8, !tbaa !5
  %770 = load ptr, ptr %769, align 8, !tbaa !5
  store ptr %770, ptr %77, align 8, !tbaa !5
  br label %783

771:                                              ; preds = %719
  %772 = landingpad { ptr, i32 }
          cleanup
  %773 = extractvalue { ptr, i32 } %772, 0
  store ptr %773, ptr %23, align 8
  %774 = extractvalue { ptr, i32 } %772, 1
  store i32 %774, ptr %24, align 4
  br label %786

775:                                              ; preds = %739, %724
  %776 = landingpad { ptr, i32 }
          cleanup
  %777 = extractvalue { ptr, i32 } %776, 0
  store ptr %777, ptr %23, align 8
  %778 = extractvalue { ptr, i32 } %776, 1
  store i32 %778, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #10
  br label %785

779:                                              ; preds = %755
  %780 = landingpad { ptr, i32 }
          cleanup
  %781 = extractvalue { ptr, i32 } %780, 0
  store ptr %781, ptr %23, align 8
  %782 = extractvalue { ptr, i32 } %780, 1
  store i32 %782, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #10
  br label %785

783:                                              ; preds = %767, %764, %761
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #10
  br label %784

784:                                              ; preds = %783, %751
  call void @llvm.lifetime.end.p0(i64 4, ptr %80) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #10
  br label %787

785:                                              ; preds = %779, %775
  call void @llvm.lifetime.end.p0(i64 4, ptr %80) #10
  br label %786

786:                                              ; preds = %785, %771
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #10
  br label %791

787:                                              ; preds = %784, %714
  br label %788

788:                                              ; preds = %787
  %789 = load ptr, ptr %78, align 8, !tbaa !5
  %790 = getelementptr inbounds ptr, ptr %789, i32 1
  store ptr %790, ptr %78, align 8, !tbaa !5
  br label %693, !llvm.loop !54

791:                                              ; preds = %786, %710
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #10
  br label %1191

792:                                              ; preds = %701
  %793 = load ptr, ptr %77, align 8, !tbaa !5
  %794 = icmp ne ptr %793, null
  br i1 %794, label %795, label %1035

795:                                              ; preds = %792
  call void @llvm.lifetime.start.p0(i64 16, ptr %86) #10
  %796 = load ptr, ptr %77, align 8, !tbaa !5
  %797 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %796, i32 0, i32 4
  %798 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %797)
          to label %799 unwind label %998

799:                                              ; preds = %795
  %800 = getelementptr inbounds %"class.JPH::Vec3", ptr %86, i32 0, i32 0
  %801 = getelementptr inbounds %union.anon, ptr %800, i32 0, i32 0
  %802 = getelementptr inbounds { double, double }, ptr %801, i32 0, i32 0
  %803 = extractvalue { double, double } %798, 0
  store double %803, ptr %802, align 16
  %804 = getelementptr inbounds { double, double }, ptr %801, i32 0, i32 1
  %805 = extractvalue { double, double } %798, 1
  store double %805, ptr %804, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %87) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %88) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %89, ptr align 16 %86, i64 16, i1 false), !tbaa.struct !11
  %806 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 0
  %807 = load double, ptr %806, align 16
  %808 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 1
  %809 = load double, ptr %808, align 8
  %810 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %807, double %809)
          to label %811 unwind label %1002

811:                                              ; preds = %799
  %812 = getelementptr inbounds %"class.JPH::Vec3", ptr %88, i32 0, i32 0
  %813 = getelementptr inbounds %union.anon, ptr %812, i32 0, i32 0
  %814 = getelementptr inbounds { double, double }, ptr %813, i32 0, i32 0
  %815 = extractvalue { double, double } %810, 0
  store double %815, ptr %814, align 16
  %816 = getelementptr inbounds { double, double }, ptr %813, i32 0, i32 1
  %817 = extractvalue { double, double } %810, 1
  store double %817, ptr %816, align 8
  %818 = invoke { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %88)
          to label %819 unwind label %1002

819:                                              ; preds = %811
  %820 = getelementptr inbounds %"class.JPH::Vec3", ptr %87, i32 0, i32 0
  %821 = getelementptr inbounds %union.anon, ptr %820, i32 0, i32 0
  %822 = getelementptr inbounds { double, double }, ptr %821, i32 0, i32 0
  %823 = extractvalue { double, double } %818, 0
  store double %823, ptr %822, align 16
  %824 = getelementptr inbounds { double, double }, ptr %821, i32 0, i32 1
  %825 = extractvalue { double, double } %818, 1
  store double %825, ptr %824, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %88) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %90) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %91, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %826 = getelementptr inbounds { double, double }, ptr %91, i32 0, i32 0
  %827 = load double, ptr %826, align 16
  %828 = getelementptr inbounds { double, double }, ptr %91, i32 0, i32 1
  %829 = load double, ptr %828, align 8
  %830 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %72, double %827, double %829)
          to label %831 unwind label %1006

831:                                              ; preds = %819
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %92, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %832 = getelementptr inbounds { double, double }, ptr %92, i32 0, i32 0
  %833 = load double, ptr %832, align 16
  %834 = getelementptr inbounds { double, double }, ptr %92, i32 0, i32 1
  %835 = load double, ptr %834, align 8
  %836 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %830, double %833, double %835)
          to label %837 unwind label %1006

837:                                              ; preds = %831
  %838 = getelementptr inbounds %"class.JPH::Vec3", ptr %90, i32 0, i32 0
  %839 = getelementptr inbounds %union.anon, ptr %838, i32 0, i32 0
  %840 = getelementptr inbounds { double, double }, ptr %839, i32 0, i32 0
  %841 = extractvalue { double, double } %836, 0
  store double %841, ptr %840, align 16
  %842 = getelementptr inbounds { double, double }, ptr %839, i32 0, i32 1
  %843 = extractvalue { double, double } %836, 1
  store double %843, ptr %842, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %94) #10
  store float 0.000000e+00, ptr %94, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %95) #10
  %844 = load ptr, ptr %46, align 8, !tbaa !5
  %845 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %844, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %96, ptr align 16 %86, i64 16, i1 false), !tbaa.struct !11
  %846 = getelementptr inbounds { double, double }, ptr %96, i32 0, i32 0
  %847 = load double, ptr %846, align 16
  %848 = getelementptr inbounds { double, double }, ptr %96, i32 0, i32 1
  %849 = load double, ptr %848, align 8
  %850 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %845, double %847, double %849)
          to label %851 unwind label %1010

851:                                              ; preds = %837
  store float %850, ptr %95, align 4, !tbaa !9
  %852 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %94, ptr noundef nonnull align 4 dereferenceable(4) %95)
          to label %853 unwind label %1010

853:                                              ; preds = %851
  %854 = load float, ptr %852, align 4, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %97, ptr align 16 %86, i64 16, i1 false), !tbaa.struct !11
  %855 = getelementptr inbounds { double, double }, ptr %97, i32 0, i32 0
  %856 = load double, ptr %855, align 16
  %857 = getelementptr inbounds { double, double }, ptr %97, i32 0, i32 1
  %858 = load double, ptr %857, align 8
  %859 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %854, double %856, double %858)
          to label %860 unwind label %1010

860:                                              ; preds = %853
  %861 = getelementptr inbounds %"class.JPH::Vec3", ptr %93, i32 0, i32 0
  %862 = getelementptr inbounds %union.anon, ptr %861, i32 0, i32 0
  %863 = getelementptr inbounds { double, double }, ptr %862, i32 0, i32 0
  %864 = extractvalue { double, double } %859, 0
  store double %864, ptr %863, align 16
  %865 = getelementptr inbounds { double, double }, ptr %862, i32 0, i32 1
  %866 = extractvalue { double, double } %859, 1
  store double %866, ptr %865, align 8
  %867 = load ptr, ptr %46, align 8, !tbaa !5
  %868 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %867, i32 0, i32 3
  %869 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 0
  %870 = load double, ptr %869, align 16
  %871 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 1
  %872 = load double, ptr %871, align 8
  %873 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %868, double %870, double %872)
          to label %874 unwind label %1010

874:                                              ; preds = %860
  call void @llvm.lifetime.end.p0(i64 4, ptr %95) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %94) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %99) #10
  store float 0.000000e+00, ptr %99, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %100) #10
  %875 = load ptr, ptr %77, align 8, !tbaa !5
  %876 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %875, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %101, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %877 = getelementptr inbounds { double, double }, ptr %101, i32 0, i32 0
  %878 = load double, ptr %877, align 16
  %879 = getelementptr inbounds { double, double }, ptr %101, i32 0, i32 1
  %880 = load double, ptr %879, align 8
  %881 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %876, double %878, double %880)
          to label %882 unwind label %1014

882:                                              ; preds = %874
  store float %881, ptr %100, align 4, !tbaa !9
  %883 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %99, ptr noundef nonnull align 4 dereferenceable(4) %100)
          to label %884 unwind label %1014

884:                                              ; preds = %882
  %885 = load float, ptr %883, align 4, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %102, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %886 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 0
  %887 = load double, ptr %886, align 16
  %888 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 1
  %889 = load double, ptr %888, align 8
  %890 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %885, double %887, double %889)
          to label %891 unwind label %1014

891:                                              ; preds = %884
  %892 = getelementptr inbounds %"class.JPH::Vec3", ptr %98, i32 0, i32 0
  %893 = getelementptr inbounds %union.anon, ptr %892, i32 0, i32 0
  %894 = getelementptr inbounds { double, double }, ptr %893, i32 0, i32 0
  %895 = extractvalue { double, double } %890, 0
  store double %895, ptr %894, align 16
  %896 = getelementptr inbounds { double, double }, ptr %893, i32 0, i32 1
  %897 = extractvalue { double, double } %890, 1
  store double %897, ptr %896, align 8
  %898 = load ptr, ptr %77, align 8, !tbaa !5
  %899 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %898, i32 0, i32 3
  %900 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 0
  %901 = load double, ptr %900, align 16
  %902 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 1
  %903 = load double, ptr %902, align 8
  %904 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %899, double %901, double %903)
          to label %905 unwind label %1014

905:                                              ; preds = %891
  call void @llvm.lifetime.end.p0(i64 4, ptr %100) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %99) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %103) #10
  %906 = load ptr, ptr %46, align 8, !tbaa !5
  %907 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %906, i32 0, i32 3
  %908 = load ptr, ptr %46, align 8, !tbaa !5
  %909 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %908, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %105, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %910 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 0
  %911 = load double, ptr %910, align 16
  %912 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 1
  %913 = load double, ptr %912, align 8
  %914 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %909, double %911, double %913)
          to label %915 unwind label %1018

915:                                              ; preds = %905
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %106, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %916 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 0
  %917 = load double, ptr %916, align 16
  %918 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 1
  %919 = load double, ptr %918, align 8
  %920 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %914, double %917, double %919)
          to label %921 unwind label %1018

921:                                              ; preds = %915
  %922 = getelementptr inbounds %"class.JPH::Vec3", ptr %104, i32 0, i32 0
  %923 = getelementptr inbounds %union.anon, ptr %922, i32 0, i32 0
  %924 = getelementptr inbounds { double, double }, ptr %923, i32 0, i32 0
  %925 = extractvalue { double, double } %920, 0
  store double %925, ptr %924, align 16
  %926 = getelementptr inbounds { double, double }, ptr %923, i32 0, i32 1
  %927 = extractvalue { double, double } %920, 1
  store double %927, ptr %926, align 8
  %928 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 0
  %929 = load double, ptr %928, align 16
  %930 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 1
  %931 = load double, ptr %930, align 8
  %932 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %907, double %929, double %931)
          to label %933 unwind label %1018

933:                                              ; preds = %921
  %934 = getelementptr inbounds %"class.JPH::Vec3", ptr %103, i32 0, i32 0
  %935 = getelementptr inbounds %union.anon, ptr %934, i32 0, i32 0
  %936 = getelementptr inbounds { double, double }, ptr %935, i32 0, i32 0
  %937 = extractvalue { double, double } %932, 0
  store double %937, ptr %936, align 16
  %938 = getelementptr inbounds { double, double }, ptr %935, i32 0, i32 1
  %939 = extractvalue { double, double } %932, 1
  store double %939, ptr %938, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %107) #10
  %940 = load ptr, ptr %77, align 8, !tbaa !5
  %941 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %940, i32 0, i32 3
  %942 = load ptr, ptr %77, align 8, !tbaa !5
  %943 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %942, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %109, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %944 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 0
  %945 = load double, ptr %944, align 16
  %946 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 1
  %947 = load double, ptr %946, align 8
  %948 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %943, double %945, double %947)
          to label %949 unwind label %1022

949:                                              ; preds = %933
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %110, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %950 = getelementptr inbounds { double, double }, ptr %110, i32 0, i32 0
  %951 = load double, ptr %950, align 16
  %952 = getelementptr inbounds { double, double }, ptr %110, i32 0, i32 1
  %953 = load double, ptr %952, align 8
  %954 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %948, double %951, double %953)
          to label %955 unwind label %1022

955:                                              ; preds = %949
  %956 = getelementptr inbounds %"class.JPH::Vec3", ptr %108, i32 0, i32 0
  %957 = getelementptr inbounds %union.anon, ptr %956, i32 0, i32 0
  %958 = getelementptr inbounds { double, double }, ptr %957, i32 0, i32 0
  %959 = extractvalue { double, double } %954, 0
  store double %959, ptr %958, align 16
  %960 = getelementptr inbounds { double, double }, ptr %957, i32 0, i32 1
  %961 = extractvalue { double, double } %954, 1
  store double %961, ptr %960, align 8
  %962 = getelementptr inbounds { double, double }, ptr %108, i32 0, i32 0
  %963 = load double, ptr %962, align 16
  %964 = getelementptr inbounds { double, double }, ptr %108, i32 0, i32 1
  %965 = load double, ptr %964, align 8
  %966 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %941, double %963, double %965)
          to label %967 unwind label %1022

967:                                              ; preds = %955
  %968 = getelementptr inbounds %"class.JPH::Vec3", ptr %107, i32 0, i32 0
  %969 = getelementptr inbounds %union.anon, ptr %968, i32 0, i32 0
  %970 = getelementptr inbounds { double, double }, ptr %969, i32 0, i32 0
  %971 = extractvalue { double, double } %966, 0
  store double %971, ptr %970, align 16
  %972 = getelementptr inbounds { double, double }, ptr %969, i32 0, i32 1
  %973 = extractvalue { double, double } %966, 1
  store double %973, ptr %972, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %111) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %112) #10
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %113, ptr align 16 %103, i64 16, i1 false), !tbaa.struct !11
  %974 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 0
  %975 = load double, ptr %974, align 16
  %976 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 1
  %977 = load double, ptr %976, align 8
  %978 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %90, double %975, double %977)
          to label %979 unwind label %1026

979:                                              ; preds = %967
  %980 = getelementptr inbounds %"class.JPH::Vec3", ptr %112, i32 0, i32 0
  %981 = getelementptr inbounds %union.anon, ptr %980, i32 0, i32 0
  %982 = getelementptr inbounds { double, double }, ptr %981, i32 0, i32 0
  %983 = extractvalue { double, double } %978, 0
  store double %983, ptr %982, align 16
  %984 = getelementptr inbounds { double, double }, ptr %981, i32 0, i32 1
  %985 = extractvalue { double, double } %978, 1
  store double %985, ptr %984, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %114, ptr align 16 %107, i64 16, i1 false), !tbaa.struct !11
  %986 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %987 = load double, ptr %986, align 16
  %988 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %989 = load double, ptr %988, align 8
  %990 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %112, double %987, double %989)
          to label %991 unwind label %1026

991:                                              ; preds = %979
  %992 = getelementptr inbounds %"class.JPH::Vec3", ptr %111, i32 0, i32 0
  %993 = getelementptr inbounds %union.anon, ptr %992, i32 0, i32 0
  %994 = getelementptr inbounds { double, double }, ptr %993, i32 0, i32 0
  %995 = extractvalue { double, double } %990, 0
  store double %995, ptr %994, align 16
  %996 = getelementptr inbounds { double, double }, ptr %993, i32 0, i32 1
  %997 = extractvalue { double, double } %990, 1
  store double %997, ptr %996, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %72, ptr align 16 %111, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %112) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %111) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %107) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %103) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %90) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %87) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %86) #10
  br label %1035

998:                                              ; preds = %795
  %999 = landingpad { ptr, i32 }
          cleanup
  %1000 = extractvalue { ptr, i32 } %999, 0
  store ptr %1000, ptr %23, align 8
  %1001 = extractvalue { ptr, i32 } %999, 1
  store i32 %1001, ptr %24, align 4
  br label %1034

1002:                                             ; preds = %811, %799
  %1003 = landingpad { ptr, i32 }
          cleanup
  %1004 = extractvalue { ptr, i32 } %1003, 0
  store ptr %1004, ptr %23, align 8
  %1005 = extractvalue { ptr, i32 } %1003, 1
  store i32 %1005, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %88) #10
  br label %1033

1006:                                             ; preds = %831, %819
  %1007 = landingpad { ptr, i32 }
          cleanup
  %1008 = extractvalue { ptr, i32 } %1007, 0
  store ptr %1008, ptr %23, align 8
  %1009 = extractvalue { ptr, i32 } %1007, 1
  store i32 %1009, ptr %24, align 4
  br label %1032

1010:                                             ; preds = %860, %853, %851, %837
  %1011 = landingpad { ptr, i32 }
          cleanup
  %1012 = extractvalue { ptr, i32 } %1011, 0
  store ptr %1012, ptr %23, align 8
  %1013 = extractvalue { ptr, i32 } %1011, 1
  store i32 %1013, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %95) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %94) #10
  br label %1032

1014:                                             ; preds = %891, %884, %882, %874
  %1015 = landingpad { ptr, i32 }
          cleanup
  %1016 = extractvalue { ptr, i32 } %1015, 0
  store ptr %1016, ptr %23, align 8
  %1017 = extractvalue { ptr, i32 } %1015, 1
  store i32 %1017, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %100) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %99) #10
  br label %1032

1018:                                             ; preds = %921, %915, %905
  %1019 = landingpad { ptr, i32 }
          cleanup
  %1020 = extractvalue { ptr, i32 } %1019, 0
  store ptr %1020, ptr %23, align 8
  %1021 = extractvalue { ptr, i32 } %1019, 1
  store i32 %1021, ptr %24, align 4
  br label %1031

1022:                                             ; preds = %955, %949, %933
  %1023 = landingpad { ptr, i32 }
          cleanup
  %1024 = extractvalue { ptr, i32 } %1023, 0
  store ptr %1024, ptr %23, align 8
  %1025 = extractvalue { ptr, i32 } %1023, 1
  store i32 %1025, ptr %24, align 4
  br label %1030

1026:                                             ; preds = %979, %967
  %1027 = landingpad { ptr, i32 }
          cleanup
  %1028 = extractvalue { ptr, i32 } %1027, 0
  store ptr %1028, ptr %23, align 8
  %1029 = extractvalue { ptr, i32 } %1027, 1
  store i32 %1029, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %112) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %111) #10
  br label %1030

1030:                                             ; preds = %1026, %1022
  call void @llvm.lifetime.end.p0(i64 16, ptr %107) #10
  br label %1031

1031:                                             ; preds = %1030, %1018
  call void @llvm.lifetime.end.p0(i64 16, ptr %103) #10
  br label %1032

1032:                                             ; preds = %1031, %1014, %1010, %1006
  call void @llvm.lifetime.end.p0(i64 16, ptr %90) #10
  br label %1033

1033:                                             ; preds = %1032, %1002
  call void @llvm.lifetime.end.p0(i64 16, ptr %87) #10
  br label %1034

1034:                                             ; preds = %1033, %998
  call void @llvm.lifetime.end.p0(i64 16, ptr %86) #10
  br label %1191

1035:                                             ; preds = %991, %792
  %1036 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 3
  %1037 = load ptr, ptr %1036, align 8, !tbaa !55
  %1038 = icmp ne ptr %1037, null
  br i1 %1038, label %1039, label %1148

1039:                                             ; preds = %1035
  %1040 = load ptr, ptr %46, align 8, !tbaa !5
  %1041 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1040, i32 0, i32 0
  %1042 = load ptr, ptr %1041, align 16, !tbaa !43
  %1043 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1042, i32 0, i32 11
  %1044 = load ptr, ptr %1043, align 16, !tbaa !56
  %1045 = icmp ne ptr %1044, null
  br i1 %1045, label %1046, label %1099

1046:                                             ; preds = %1039
  %1047 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 3
  %1048 = load ptr, ptr %1047, align 8, !tbaa !55
  %1049 = load ptr, ptr %46, align 8, !tbaa !5
  %1050 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1049, i32 0, i32 0
  %1051 = load ptr, ptr %1050, align 16, !tbaa !43
  %1052 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1051, i32 0, i32 11
  %1053 = load ptr, ptr %1052, align 16, !tbaa !56
  %1054 = load ptr, ptr %46, align 8, !tbaa !5
  %1055 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1054, i32 0, i32 0
  %1056 = load ptr, ptr %1055, align 16, !tbaa !43
  %1057 = getelementptr inbounds %"class.JPH::CharacterVirtual::ContactKey", ptr %1056, i32 0, i32 2
  %1058 = load ptr, ptr %46, align 8, !tbaa !5
  %1059 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1058, i32 0, i32 0
  %1060 = load ptr, ptr %1059, align 16, !tbaa !43
  %1061 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1060, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %115, ptr align 16 %1061, i64 16, i1 false), !tbaa.struct !11
  %1062 = load ptr, ptr %46, align 8, !tbaa !5
  %1063 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1062, i32 0, i32 0
  %1064 = load ptr, ptr %1063, align 16, !tbaa !43
  %1065 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1064, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %116, ptr align 16 %1065, i64 16, i1 false), !tbaa.struct !11
  %1066 = load ptr, ptr %46, align 8, !tbaa !5
  %1067 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1066, i32 0, i32 0
  %1068 = load ptr, ptr %1067, align 16, !tbaa !43
  %1069 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1068, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %117, ptr align 16 %1069, i64 16, i1 false), !tbaa.struct !11
  %1070 = load ptr, ptr %46, align 8, !tbaa !5
  %1071 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1070, i32 0, i32 0
  %1072 = load ptr, ptr %1071, align 16, !tbaa !43
  %1073 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1072, i32 0, i32 13
  %1074 = load ptr, ptr %1073, align 16, !tbaa !57
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %118, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %1075 = getelementptr inbounds { double, double }, ptr %115, i32 0, i32 0
  %1076 = load double, ptr %1075, align 16
  %1077 = getelementptr inbounds { double, double }, ptr %115, i32 0, i32 1
  %1078 = load double, ptr %1077, align 8
  %1079 = getelementptr inbounds { double, double }, ptr %116, i32 0, i32 0
  %1080 = load double, ptr %1079, align 16
  %1081 = getelementptr inbounds { double, double }, ptr %116, i32 0, i32 1
  %1082 = load double, ptr %1081, align 8
  %1083 = getelementptr inbounds { double, double }, ptr %117, i32 0, i32 0
  %1084 = load double, ptr %1083, align 16
  %1085 = getelementptr inbounds { double, double }, ptr %117, i32 0, i32 1
  %1086 = load double, ptr %1085, align 8
  %1087 = getelementptr inbounds { double, double }, ptr %118, i32 0, i32 0
  %1088 = load double, ptr %1087, align 16
  %1089 = getelementptr inbounds { double, double }, ptr %118, i32 0, i32 1
  %1090 = load double, ptr %1089, align 8
  %1091 = load ptr, ptr %1048, align 8, !tbaa !58
  %1092 = getelementptr inbounds ptr, ptr %1091, i64 12
  %1093 = load ptr, ptr %1092, align 8
  invoke void %1093(ptr noundef nonnull align 8 dereferenceable(8) %1048, ptr noundef %126, ptr noundef %1053, ptr noundef nonnull align 4 dereferenceable(4) %1057, double %1076, double %1078, double %1080, double %1082, double %1084, double %1086, ptr noundef %1074, double %1088, double %1090, ptr noundef nonnull align 16 dereferenceable(16) %72)
          to label %1094 unwind label %1095

1094:                                             ; preds = %1046
  br label %1147

1095:                                             ; preds = %1173, %1165, %1160, %1148, %1099, %1046
  %1096 = landingpad { ptr, i32 }
          cleanup
  %1097 = extractvalue { ptr, i32 } %1096, 0
  store ptr %1097, ptr %23, align 8
  %1098 = extractvalue { ptr, i32 } %1096, 1
  store i32 %1098, ptr %24, align 4
  br label %1191

1099:                                             ; preds = %1039
  %1100 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 3
  %1101 = load ptr, ptr %1100, align 8, !tbaa !55
  %1102 = load ptr, ptr %46, align 8, !tbaa !5
  %1103 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1102, i32 0, i32 0
  %1104 = load ptr, ptr %1103, align 16, !tbaa !43
  %1105 = getelementptr inbounds %"class.JPH::CharacterVirtual::ContactKey", ptr %1104, i32 0, i32 0
  %1106 = load ptr, ptr %46, align 8, !tbaa !5
  %1107 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1106, i32 0, i32 0
  %1108 = load ptr, ptr %1107, align 16, !tbaa !43
  %1109 = getelementptr inbounds %"class.JPH::CharacterVirtual::ContactKey", ptr %1108, i32 0, i32 2
  %1110 = load ptr, ptr %46, align 8, !tbaa !5
  %1111 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1110, i32 0, i32 0
  %1112 = load ptr, ptr %1111, align 16, !tbaa !43
  %1113 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1112, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %119, ptr align 16 %1113, i64 16, i1 false), !tbaa.struct !11
  %1114 = load ptr, ptr %46, align 8, !tbaa !5
  %1115 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1114, i32 0, i32 0
  %1116 = load ptr, ptr %1115, align 16, !tbaa !43
  %1117 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1116, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %120, ptr align 16 %1117, i64 16, i1 false), !tbaa.struct !11
  %1118 = load ptr, ptr %46, align 8, !tbaa !5
  %1119 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1118, i32 0, i32 0
  %1120 = load ptr, ptr %1119, align 16, !tbaa !43
  %1121 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1120, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %121, ptr align 16 %1121, i64 16, i1 false), !tbaa.struct !11
  %1122 = load ptr, ptr %46, align 8, !tbaa !5
  %1123 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1122, i32 0, i32 0
  %1124 = load ptr, ptr %1123, align 16, !tbaa !43
  %1125 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1124, i32 0, i32 13
  %1126 = load ptr, ptr %1125, align 16, !tbaa !57
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %122, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %1127 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 0
  %1128 = load double, ptr %1127, align 16
  %1129 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 1
  %1130 = load double, ptr %1129, align 8
  %1131 = getelementptr inbounds { double, double }, ptr %120, i32 0, i32 0
  %1132 = load double, ptr %1131, align 16
  %1133 = getelementptr inbounds { double, double }, ptr %120, i32 0, i32 1
  %1134 = load double, ptr %1133, align 8
  %1135 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 0
  %1136 = load double, ptr %1135, align 16
  %1137 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 1
  %1138 = load double, ptr %1137, align 8
  %1139 = getelementptr inbounds { double, double }, ptr %122, i32 0, i32 0
  %1140 = load double, ptr %1139, align 16
  %1141 = getelementptr inbounds { double, double }, ptr %122, i32 0, i32 1
  %1142 = load double, ptr %1141, align 8
  %1143 = load ptr, ptr %1101, align 8, !tbaa !58
  %1144 = getelementptr inbounds ptr, ptr %1143, i64 11
  %1145 = load ptr, ptr %1144, align 8
  invoke void %1145(ptr noundef nonnull align 8 dereferenceable(8) %1101, ptr noundef %126, ptr noundef nonnull align 4 dereferenceable(4) %1105, ptr noundef nonnull align 4 dereferenceable(4) %1109, double %1128, double %1130, double %1132, double %1134, double %1136, double %1138, ptr noundef %1126, double %1140, double %1142, ptr noundef nonnull align 16 dereferenceable(16) %72)
          to label %1146 unwind label %1095

1146:                                             ; preds = %1099
  br label %1147

1147:                                             ; preds = %1146, %1094
  br label %1148

1148:                                             ; preds = %1147, %1035
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %72, i64 16, i1 false), !tbaa.struct !11
  %1149 = load ptr, ptr %46, align 8, !tbaa !5
  %1150 = load i32, ptr %31, align 4, !tbaa !39
  %1151 = sext i32 %1150 to i64
  %1152 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %29, i64 noundef %1151)
          to label %1153 unwind label %1095

1153:                                             ; preds = %1148
  store ptr %1149, ptr %1152, align 8, !tbaa !5
  %1154 = load i32, ptr %31, align 4, !tbaa !39
  %1155 = add nsw i32 %1154, 1
  store i32 %1155, ptr %31, align 4, !tbaa !39
  %1156 = load ptr, ptr %46, align 8, !tbaa !5
  %1157 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1156, i32 0, i32 2
  %1158 = load float, ptr %1157, align 4, !tbaa !40
  %1159 = fcmp olt float %1158, 0x3E45798EE0000000
  br i1 %1159, label %1160, label %1165

1160:                                             ; preds = %1153
  %1161 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %26)
          to label %1162 unwind label %1095

1162:                                             ; preds = %1160
  %1163 = fcmp olt float %1161, 0x3E45798EE0000000
  br i1 %1163, label %1164, label %1165

1164:                                             ; preds = %1162
  store i32 1, ptr %33, align 4
  br label %1184

1165:                                             ; preds = %1162, %1153
  %1166 = load ptr, ptr %46, align 8, !tbaa !5
  %1167 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1166, i32 0, i32 3
  %1168 = invoke noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %1167, float noundef 0x3E45798EE0000000)
          to label %1169 unwind label %1095

1169:                                             ; preds = %1165
  br i1 %1168, label %1173, label %1170

1170:                                             ; preds = %1169
  %1171 = load ptr, ptr %46, align 8, !tbaa !5
  %1172 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1171, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %27, ptr align 16 %1172, i64 16, i1 false), !tbaa.struct !11
  br label %1183

1173:                                             ; preds = %1169
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %123, ptr align 16 %27, i64 16, i1 false), !tbaa.struct !11
  %1174 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 0
  %1175 = load double, ptr %1174, align 16
  %1176 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 1
  %1177 = load double, ptr %1176, align 8
  %1178 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %1175, double %1177)
          to label %1179 unwind label %1095

1179:                                             ; preds = %1173
  %1180 = fcmp olt float %1178, 0.000000e+00
  br i1 %1180, label %1181, label %1182

1181:                                             ; preds = %1179
  store i32 1, ptr %33, align 4
  br label %1184

1182:                                             ; preds = %1179
  br label %1183

1183:                                             ; preds = %1182, %1170
  store i32 0, ptr %33, align 4
  br label %1184

1184:                                             ; preds = %1183, %1181, %1164
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %72) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #10
  br label %1185

1185:                                             ; preds = %1184, %516, %473, %450
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  %1186 = load i32, ptr %33, align 4
  switch i32 %1186, label %1196 [
    i32 0, label %1187
  ]

1187:                                             ; preds = %1185
  br label %1188

1188:                                             ; preds = %1187
  %1189 = load i32, ptr %32, align 4, !tbaa !39
  %1190 = add i32 %1189, 1
  store i32 %1190, ptr %32, align 4, !tbaa !39
  br label %190, !llvm.loop !60

1191:                                             ; preds = %1095, %1034, %791
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #10
  br label %1192

1192:                                             ; preds = %1191, %706
  call void @llvm.lifetime.end.p0(i64 16, ptr %72) #10
  br label %1193

1193:                                             ; preds = %1192, %702
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #10
  br label %1194

1194:                                             ; preds = %1193, %645, %628
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #10
  br label %1195

1195:                                             ; preds = %1194, %478, %453
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  br label %1198

1196:                                             ; preds = %1185, %195
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #10
  %1197 = load i32, ptr %33, align 4
  switch i32 %1197, label %1200 [
    i32 5, label %1199
  ]

1198:                                             ; preds = %1195, %340, %322
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #10
  br label %1203

1199:                                             ; preds = %1196
  store i32 0, ptr %33, align 4
  br label %1200

1200:                                             ; preds = %1199, %1196
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #10
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %29) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr %29) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #10
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr %21) #10
  %1201 = load i32, ptr %33, align 4
  switch i32 %1201, label %1212 [
    i32 0, label %1202
    i32 1, label %1202
  ]

1202:                                             ; preds = %1200, %1200, %129
  ret void

1203:                                             ; preds = %1198, %204
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %29) #10
  br label %1204

1204:                                             ; preds = %1203, %200
  call void @llvm.lifetime.end.p0(i64 32, ptr %29) #10
  br label %1205

1205:                                             ; preds = %1204, %196
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #10
  br label %1206

1206:                                             ; preds = %1205, %157, %153
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %21) #10
  call void @llvm.lifetime.end.p0(i64 32, ptr %21) #10
  br label %1207

1207:                                             ; preds = %1206
  %1208 = load ptr, ptr %23, align 8
  %1209 = load i32, ptr %24, align 4
  %1210 = insertvalue { ptr, i32 } poison, ptr %1208, 0
  %1211 = insertvalue { ptr, i32 } %1210, i32 %1209, 1
  resume { ptr, i32 } %1211

1212:                                             ; preds = %1200
  unreachable
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32)) #5 align 2

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE6resizeEm(ptr noundef nonnull align 8 dereferenceable(32), i64 noundef) #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) #5 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @"_ZN3JPH9QuickSortIPPNS_16CharacterVirtual10ConstraintEZNS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_10ContactKeyENS7_ISB_EEEERfRS5_RNS_13TempAllocatorEE3$_0EEvT_SK_T0_"(ptr noundef, ptr noundef) #4

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #5 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{i64 0, i64 16, !12}
!12 = !{!7, !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = !{!18, !23, i64 180}
!18 = !{!"_ZTSN3JPH16CharacterVirtualE", !19, i64 0, !32, i64 144, !6, i64 152, !6, i64 160, !33, i64 168, !10, i64 172, !23, i64 176, !23, i64 180, !10, i64 184, !10, i64 188, !10, i64 192, !23, i64 196, !10, i64 200, !10, i64 204, !34, i64 208, !10, i64 212, !10, i64 216, !25, i64 224, !25, i64 240, !35, i64 256, !25, i64 272, !36, i64 288, !23, i64 312, !37, i64 320, !10, i64 352, !34, i64 356, !14, i64 360, !29, i64 368}
!19 = !{!"_ZTSN3JPH13CharacterBaseE", !20, i64 8, !6, i64 16, !24, i64 24, !25, i64 32, !26, i64 48, !10, i64 64, !28, i64 68, !29, i64 72, !30, i64 76, !25, i64 80, !25, i64 96, !25, i64 112, !31, i64 128, !14, i64 136}
!20 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !21, i64 0}
!21 = !{!"_ZTSSt6atomicIjE", !22, i64 0}
!22 = !{!"_ZTSSt13__atomic_baseIjE", !23, i64 0}
!23 = !{!"int", !7, i64 0}
!24 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !6, i64 0}
!25 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!26 = !{!"_ZTSN3JPH5PlaneE", !27, i64 0}
!27 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!28 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !7, i64 0}
!29 = !{!"_ZTSN3JPH6BodyIDE", !23, i64 0}
!30 = !{!"_ZTSN3JPH10SubShapeIDE", !23, i64 0}
!31 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !6, i64 0}
!32 = !{!"_ZTSN3JPH11CharacterIDE", !23, i64 0}
!33 = !{!"_ZTSN3JPH13EBackFaceModeE", !7, i64 0}
!34 = !{!"bool", !7, i64 0}
!35 = !{!"_ZTSN3JPH4QuatE", !27, i64 0}
!36 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !14, i64 0, !14, i64 8, !6, i64 16}
!37 = !{!"_ZTSN3JPH12UnorderedMapINS_16CharacterVirtual10ContactKeyENS1_20ListenerContactValueENS_4HashIS2_EESt8equal_toIS2_EEE", !38, i64 0}
!38 = !{!"_ZTSN3JPH9HashTableINS_16CharacterVirtual10ContactKeyESt4pairIS2_NS1_20ListenerContactValueEENS_18UnorderedMapDetailIS2_S4_EENS_4HashIS2_EESt8equal_toIS2_EEE", !6, i64 0, !6, i64 8, !23, i64 16, !23, i64 20, !23, i64 24}
!39 = !{!23, !23, i64 0}
!40 = !{!41, !10, i64 12}
!41 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !6, i64 0, !10, i64 8, !10, i64 12, !25, i64 16, !26, i64 32, !34, i64 48}
!42 = !{!41, !10, i64 8}
!43 = !{!41, !6, i64 0}
!44 = !{!45, !34, i64 121}
!45 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !46, i64 0, !25, i64 16, !25, i64 32, !25, i64 48, !25, i64 64, !10, i64 80, !10, i64 84, !47, i64 88, !34, i64 89, !6, i64 96, !14, i64 104, !6, i64 112, !34, i64 120, !34, i64 121, !34, i64 122}
!46 = !{!"_ZTSN3JPH16CharacterVirtual10ContactKeyE", !29, i64 0, !32, i64 4, !30, i64 8}
!47 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!48 = !{i8 0, i8 2}
!49 = !{}
!50 = !{!45, !34, i64 120}
!51 = !{!45, !34, i64 122}
!52 = !{!18, !10, i64 184}
!53 = !{!41, !34, i64 48}
!54 = distinct !{!54, !16}
!55 = !{!18, !6, i64 152}
!56 = !{!45, !6, i64 96}
!57 = !{!45, !6, i64 112}
!58 = !{!59, !59, i64 0}
!59 = !{!"vtable pointer", !8, i64 0}
!60 = distinct !{!60, !16}


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

%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Array.37" = type { %"class.JPH::STLTempAllocator.38", i64, i64, ptr }
%"class.JPH::STLTempAllocator.38" = type { ptr }

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

declare i32 @__gxx_personality_v0(...)

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

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(12) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS1_7ContactEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 16 dereferenceable(123)) local_unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #5

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZN3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(372), double, double, ptr noundef nonnull align 16 dereferenceable(49), float noundef) local_unnamed_addr #8 align 2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #9

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_10ContactKeyENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(372) %0, double %1, double %2, float noundef %3, float noundef %4, ptr noundef nonnull align 8 dereferenceable(32) %5, ptr noundef nonnull align 8 dereferenceable(32) %6, ptr nocapture noundef nonnull align 4 dereferenceable(4) %7, ptr noundef nonnull align 16 dereferenceable(16) %8, ptr noundef nonnull align 8 dereferenceable(8) %9) local_unnamed_addr #8 align 2 personality ptr @__gxx_personality_v0 {
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Array.37", align 8
  %13 = alloca %"class.JPH::STLTempAllocator.38", align 8
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Array.37", align 8
  %16 = alloca %"class.JPH::STLTempAllocator.38", align 8
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %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 float, align 4
  %25 = alloca float, align 4
  %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 %"class.JPH::Vec3", align 16
  %32 = alloca float, align 4
  %33 = alloca float, align 4
  %34 = alloca float, align 4
  %35 = alloca float, align 4
  %36 = alloca %"class.JPH::Vec3", align 16
  store double %1, ptr %11, align 16
  %37 = getelementptr inbounds i8, ptr %11, i64 8
  store double %2, ptr %37, align 8
  %38 = tail call noundef zeroext i1 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32) %5)
  br i1 %38, label %39, label %43

39:                                               ; preds = %10
  %40 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %11, float noundef %4)
  %41 = extractvalue { double, double } %40, 0
  %42 = extractvalue { double, double } %40, 1
  store double %41, ptr %8, align 16
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %8, i64 8
  store double %42, ptr %.sroa.4.0..sroa_idx, align 8, !tbaa !5
  store float %4, ptr %7, align 4, !tbaa !8
  br label %422

43:                                               ; preds = %10
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %12) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #11
  call void @_ZN3JPH16STLTempAllocatorIPNS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %13, ptr noundef nonnull align 8 dereferenceable(8) %9)
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEC2ERKS5_(ptr noundef nonnull align 8 dereferenceable(32) %12, ptr noundef nonnull align 8 dereferenceable(8) %13)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #11
  %44 = call noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %5)
  invoke void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE6resizeEm(ptr noundef nonnull align 8 dereferenceable(32) %12, i64 noundef %44)
          to label %.preheader356 unwind label %47

.preheader356:                                    ; preds = %43
  %45 = call noundef i64 @_ZNK3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  %.not417 = icmp eq i64 %45, 0
  br i1 %.not417, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %54, %.preheader356
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %14, ptr noundef nonnull align 16 dereferenceable(16) %11, i64 16, i1 false), !tbaa.struct !10
  %46 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %58 unwind label %80

47:                                               ; preds = %43
  %48 = landingpad { ptr, i32 }
          cleanup
  br label %425

49:                                               ; preds = %52, %.lr.ph
  %50 = landingpad { ptr, i32 }
          cleanup
  br label %425

.lr.ph:                                           ; preds = %.preheader356, %54
  %.0260389 = phi i64 [ %55, %54 ], [ 0, %.preheader356 ]
  %51 = invoke noundef nonnull align 16 dereferenceable(49) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %5, i64 noundef %.0260389)
          to label %52 unwind label %49

52:                                               ; preds = %.lr.ph
  %53 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %12, i64 noundef %.0260389)
          to label %54 unwind label %49

54:                                               ; preds = %52
  store ptr %51, ptr %53, align 8, !tbaa !11
  %55 = add nuw i64 %.0260389, 1
  %56 = call noundef i64 @_ZNK3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  %57 = icmp ult i64 %55, %56
  br i1 %57, label %.lr.ph, label %._crit_edge, !llvm.loop !13

58:                                               ; preds = %._crit_edge
  %59 = extractvalue { double, double } %46, 0
  %60 = extractvalue { double, double } %46, 1
  store double %59, ptr %8, align 16
  %.sroa.5197.0..sroa_idx = getelementptr inbounds i8, ptr %8, i64 8
  store double %60, ptr %.sroa.5197.0..sroa_idx, align 8, !tbaa !5
  store float 0.000000e+00, ptr %7, align 4, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %15) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #11
  call void @_ZN3JPH16STLTempAllocatorIPNS_16CharacterVirtual10ConstraintEEC2ERNS_13TempAllocatorE(ptr noundef nonnull align 8 dereferenceable(8) %16, ptr noundef nonnull align 8 dereferenceable(8) %9)
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEC2ERKS5_(ptr noundef nonnull align 8 dereferenceable(32) %15, ptr noundef nonnull align 8 dereferenceable(8) %16)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #11
  %61 = getelementptr inbounds i8, ptr %0, i64 180
  %62 = load i32, ptr %61, align 4, !tbaa !15
  %63 = zext i32 %62 to i64
  invoke void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE6resizeEm(ptr noundef nonnull align 8 dereferenceable(32) %15, i64 noundef %63)
          to label %.preheader unwind label %82

.preheader:                                       ; preds = %58
  %64 = load i32, ptr %61, align 4, !tbaa !15
  %.not418 = icmp eq i32 %64, 0
  br i1 %.not418, label %.thread336, label %.lr.ph415

.lr.ph415:                                        ; preds = %.preheader
  %65 = getelementptr inbounds i8, ptr %17, i64 8
  %.sroa.2169.0..sroa_idx = getelementptr inbounds i8, ptr %14, i64 8
  %66 = getelementptr inbounds i8, ptr %0, i64 184
  %67 = getelementptr inbounds i8, ptr %20, i64 8
  %68 = getelementptr inbounds i8, ptr %0, i64 32
  %.sroa.2105.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 40
  %69 = getelementptr inbounds i8, ptr %21, i64 8
  %70 = getelementptr inbounds i8, ptr %22, i64 8
  %71 = getelementptr inbounds i8, ptr %23, i64 8
  %72 = getelementptr inbounds i8, ptr %26, i64 8
  %73 = getelementptr inbounds i8, ptr %27, i64 8
  %74 = getelementptr inbounds i8, ptr %28, i64 8
  %75 = getelementptr inbounds i8, ptr %29, i64 8
  %76 = getelementptr inbounds i8, ptr %30, i64 8
  %77 = getelementptr inbounds i8, ptr %31, i64 8
  %78 = getelementptr inbounds i8, ptr %36, i64 8
  %79 = getelementptr inbounds i8, ptr %0, i64 152
  br label %84

80:                                               ; preds = %._crit_edge
  %81 = landingpad { ptr, i32 }
          cleanup
  br label %424

82:                                               ; preds = %58
  %83 = landingpad { ptr, i32 }
          cleanup
  br label %423

84:                                               ; preds = %.lr.ph415, %415
  %.0414 = phi float [ %4, %.lr.ph415 ], [ %187, %415 ]
  %.sroa.6.0413 = phi double [ %2, %.lr.ph415 ], [ %.sroa.6.2.ph, %415 ]
  %.sroa.0198.0412 = phi double [ %1, %.lr.ph415 ], [ %.sroa.0198.2.ph, %415 ]
  %.0261411 = phi i32 [ 0, %.lr.ph415 ], [ %401, %415 ]
  %.0264410 = phi i32 [ 0, %.lr.ph415 ], [ %416, %415 ]
  %85 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %5)
  %86 = call noundef ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %5)
  %.not390 = icmp eq ptr %85, %86
  br i1 %.not390, label %._crit_edge394, label %.lr.ph393

._crit_edge394:                                   ; preds = %123, %84
  %87 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  %88 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  invoke void @"_ZN3JPH9QuickSortIPPNS_16CharacterVirtual10ConstraintEZNS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_10ContactKeyENS7_ISB_EEEERfRS5_RNS_13TempAllocatorEE3$_0EEvT_SK_T0_"(ptr noundef %87, ptr noundef %88)
          to label %125 unwind label %128

.lr.ph393:                                        ; preds = %84, %123
  %.0270391 = phi ptr [ %124, %123 ], [ %85, %84 ]
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #11
  %89 = getelementptr inbounds i8, ptr %.0270391, i64 32
  %90 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %89)
          to label %91 unwind label %105

91:                                               ; preds = %.lr.ph393
  %92 = extractvalue { double, double } %90, 0
  store double %92, ptr %17, align 16
  %93 = extractvalue { double, double } %90, 1
  store double %93, ptr %65, align 8
  %94 = getelementptr inbounds i8, ptr %.0270391, i64 16
  %.sroa.0168.0.copyload = load double, ptr %14, align 16
  %.sroa.2169.0.copyload = load double, ptr %.sroa.2169.0..sroa_idx, align 8, !tbaa !5
  %95 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %94, double %.sroa.0168.0.copyload, double %.sroa.2169.0.copyload)
          to label %96 unwind label %105

96:                                               ; preds = %91
  %97 = extractvalue { double, double } %95, 0
  %98 = extractvalue { double, double } %95, 1
  %99 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %17, double %97, double %98)
  %100 = getelementptr inbounds i8, ptr %.0270391, i64 12
  store float %99, ptr %100, align 4, !tbaa !38
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #11
  %101 = load float, ptr %100, align 4, !tbaa !38
  %102 = fcmp olt float %101, 0x3EB0C6F7A0000000
  br i1 %102, label %103, label %107

103:                                              ; preds = %96
  %104 = getelementptr inbounds i8, ptr %.0270391, i64 8
  store float 0x47EFFFFFE0000000, ptr %104, align 8, !tbaa !40
  br label %123

105:                                              ; preds = %91, %.lr.ph393
  %106 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #11
  br label %423

107:                                              ; preds = %96
  %.sroa.0164.0.copyload = load double, ptr %8, align 16
  %.sroa.2165.0.copyload = load double, ptr %.sroa.5197.0..sroa_idx, align 8, !tbaa !5
  %108 = invoke noundef float @_ZNK3JPH5Plane14SignedDistanceENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %89, double %.sroa.0164.0.copyload, double %.sroa.2165.0.copyload)
          to label %109 unwind label %116

109:                                              ; preds = %107
  %110 = load float, ptr %100, align 4, !tbaa !38
  %111 = fneg float %110
  %112 = call float @llvm.fmuladd.f32(float %111, float %.0414, float %108)
  %113 = fcmp ogt float %112, 0xBF1A36E2E0000000
  br i1 %113, label %114, label %118

114:                                              ; preds = %109
  %115 = getelementptr inbounds i8, ptr %.0270391, i64 8
  store float 0x47EFFFFFE0000000, ptr %115, align 8, !tbaa !40
  br label %123

116:                                              ; preds = %107
  %117 = landingpad { ptr, i32 }
          cleanup
  br label %423

118:                                              ; preds = %109
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %18) #11
  store float 0.000000e+00, ptr %18, align 4, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %19) #11
  %119 = fdiv float %108, %110
  store float %119, ptr %19, align 4, !tbaa !8
  %120 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %18, ptr noundef nonnull align 4 dereferenceable(4) %19)
  %121 = load float, ptr %120, align 4, !tbaa !8
  %122 = getelementptr inbounds i8, ptr %.0270391, i64 8
  store float %121, ptr %122, align 8, !tbaa !40
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %18) #11
  br label %123

123:                                              ; preds = %114, %118, %103
  %124 = getelementptr inbounds i8, ptr %.0270391, i64 64
  %.not = icmp eq ptr %124, %86
  br i1 %.not, label %._crit_edge394, label %.lr.ph393

125:                                              ; preds = %._crit_edge394
  %126 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  %127 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(32) %12)
  %.not289395 = icmp eq ptr %126, %127
  br i1 %.not289395, label %._crit_edge399, label %.lr.ph398

128:                                              ; preds = %._crit_edge394
  %129 = landingpad { ptr, i32 }
          cleanup
  br label %423

.lr.ph398:                                        ; preds = %125, %165
  %.0274396 = phi ptr [ %166, %165 ], [ %126, %125 ]
  %130 = load ptr, ptr %.0274396, align 8, !tbaa !11
  %131 = getelementptr inbounds i8, ptr %130, i64 8
  %132 = load float, ptr %131, align 8, !tbaa !40
  %133 = fcmp ult float %132, %.0414
  br i1 %133, label %136, label %134

134:                                              ; preds = %.lr.ph398
  %135 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %.0414)
          to label %167 unwind label %.loopexit.split-lp

.loopexit:                                        ; preds = %145, %148
  %lpad.loopexit = landingpad { ptr, i32 }
          cleanup
  br label %423

.loopexit.split-lp:                               ; preds = %134
  %lpad.loopexit.split-lp = landingpad { ptr, i32 }
          cleanup
  br label %423

136:                                              ; preds = %.lr.ph398
  %137 = load ptr, ptr %130, align 16, !tbaa !41
  %138 = getelementptr inbounds i8, ptr %137, i64 121
  %139 = load i8, ptr %138, align 1, !tbaa !42, !range !46, !noundef !47
  %140 = trunc nuw i8 %139 to i1
  br i1 %140, label %165, label %141

141:                                              ; preds = %136
  %142 = getelementptr inbounds i8, ptr %137, i64 120
  %143 = load i8, ptr %142, align 8, !tbaa !48, !range !46, !noundef !47
  %144 = trunc nuw i8 %143 to i1
  br i1 %144, label %151, label %145

145:                                              ; preds = %141
  %.sroa.0114.0.copyload = load double, ptr %14, align 16
  %.sroa.2115.0.copyload = load double, ptr %.sroa.2169.0..sroa_idx, align 8, !tbaa !5
  %146 = invoke noundef zeroext i1 @_ZN3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(372) %0, double %.sroa.0114.0.copyload, double %.sroa.2115.0.copyload, ptr noundef nonnull align 16 dereferenceable(49) %130, float noundef %3)
          to label %147 unwind label %.loopexit

147:                                              ; preds = %145
  %.pre = load ptr, ptr %130, align 16, !tbaa !41
  br i1 %146, label %151, label %148

148:                                              ; preds = %147
  %149 = getelementptr inbounds i8, ptr %.pre, i64 121
  store i8 1, ptr %149, align 1, !tbaa !42
  %150 = invoke noundef nonnull align 4 dereferenceable(12) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ContactKeyENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS1_7ContactEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32) %6, ptr noundef nonnull align 16 dereferenceable(123) %.pre)
          to label %165 unwind label %.loopexit

151:                                              ; preds = %147, %141
  %152 = phi ptr [ %.pre, %147 ], [ %137, %141 ]
  %153 = getelementptr inbounds i8, ptr %130, i64 8
  %154 = getelementptr inbounds i8, ptr %152, i64 122
  %155 = load i8, ptr %154, align 2, !tbaa !49, !range !46, !noundef !47
  %156 = trunc nuw i8 %155 to i1
  br i1 %156, label %.thread332, label %157

157:                                              ; preds = %151
  %158 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %159 unwind label %163

159:                                              ; preds = %157
  %160 = extractvalue { double, double } %158, 0
  %161 = extractvalue { double, double } %158, 1
  %162 = getelementptr inbounds i8, ptr %130, i64 16
  store double %160, ptr %162, align 16
  %.sroa.5113.0..sroa_idx = getelementptr inbounds i8, ptr %130, i64 24
  store double %161, ptr %.sroa.5113.0..sroa_idx, align 8, !tbaa !5
  br label %.thread332

163:                                              ; preds = %157
  %164 = landingpad { ptr, i32 }
          cleanup
  br label %423

165:                                              ; preds = %136, %148
  %166 = getelementptr inbounds i8, ptr %.0274396, i64 8
  %.not289 = icmp eq ptr %166, %127
  br i1 %.not289, label %._crit_edge399, label %.lr.ph398

167:                                              ; preds = %134
  %168 = extractvalue { double, double } %135, 0
  %169 = extractvalue { double, double } %135, 1
  %170 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %168, double %169)
  %171 = load float, ptr %7, align 4, !tbaa !8
  %172 = fadd float %.0414, %171
  store float %172, ptr %7, align 4, !tbaa !8
  br label %.thread336

._crit_edge399:                                   ; preds = %125, %165
  %173 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %.0414)
          to label %174 unwind label %.loopexit.split-lp352

174:                                              ; preds = %._crit_edge399
  %175 = extractvalue { double, double } %173, 0
  %176 = extractvalue { double, double } %173, 1
  %177 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %175, double %176)
  %178 = load float, ptr %7, align 4, !tbaa !8
  %179 = fadd float %.0414, %178
  store float %179, ptr %7, align 4, !tbaa !8
  br label %.thread336

.loopexit351:                                     ; preds = %.thread332
  %lpad.loopexit353 = landingpad { ptr, i32 }
          cleanup
  br label %423

.loopexit.split-lp352:                            ; preds = %._crit_edge399
  %lpad.loopexit.split-lp354 = landingpad { ptr, i32 }
          cleanup
  br label %423

.thread332:                                       ; preds = %151, %159
  %180 = load float, ptr %153, align 8, !tbaa !40
  %181 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %180)
          to label %182 unwind label %.loopexit351

182:                                              ; preds = %.thread332
  %183 = extractvalue { double, double } %181, 0
  %184 = extractvalue { double, double } %181, 1
  %185 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %183, double %184)
  %186 = load float, ptr %153, align 8, !tbaa !40
  %187 = fsub float %.0414, %186
  %188 = load float, ptr %7, align 4, !tbaa !8
  %189 = fadd float %186, %188
  store float %189, ptr %7, align 4, !tbaa !8
  %190 = load float, ptr %66, align 8, !tbaa !50
  %191 = fcmp olt float %187, %190
  br i1 %191, label %.thread336, label %192

192:                                              ; preds = %182
  %193 = load float, ptr %153, align 8, !tbaa !40
  %194 = fcmp ogt float %193, 0x3F1A36E2E0000000
  %.1262 = select i1 %194, i32 0, i32 %.0261411
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #11
  %195 = getelementptr inbounds i8, ptr %130, i64 32
  %196 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %195)
          to label %197 unwind label %234

197:                                              ; preds = %192
  %198 = extractvalue { double, double } %196, 0
  store double %198, ptr %20, align 16
  %199 = extractvalue { double, double } %196, 1
  store double %199, ptr %67, align 8
  %200 = getelementptr inbounds i8, ptr %130, i64 48
  %201 = load i8, ptr %200, align 16, !tbaa !51, !range !46, !noundef !47
  %202 = trunc nuw i8 %201 to i1
  br i1 %202, label %203, label %244

203:                                              ; preds = %197
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #11
  %.sroa.0104.0.copyload = load double, ptr %68, align 16
  %.sroa.2105.0.copyload = load double, ptr %.sroa.2105.0..sroa_idx, align 8, !tbaa !5
  %204 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %.sroa.0104.0.copyload, double %.sroa.2105.0.copyload)
  %.sroa.0102.0.copyload = load double, ptr %68, align 16
  %.sroa.2103.0.copyload = load double, ptr %.sroa.2105.0..sroa_idx, align 8, !tbaa !5
  %205 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %204, double %.sroa.0102.0.copyload, double %.sroa.2103.0.copyload)
          to label %206 unwind label %236

206:                                              ; preds = %203
  %207 = extractvalue { double, double } %205, 0
  %208 = extractvalue { double, double } %205, 1
  %209 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %207, double %208)
          to label %210 unwind label %236

210:                                              ; preds = %206
  %211 = extractvalue { double, double } %209, 0
  store double %211, ptr %21, align 16
  %212 = extractvalue { double, double } %209, 1
  store double %212, ptr %69, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #11
  %213 = getelementptr inbounds i8, ptr %130, i64 16
  %.sroa.0100.0.copyload = load double, ptr %213, align 16
  %.sroa.2101.0..sroa_idx = getelementptr inbounds i8, ptr %130, i64 24
  %.sroa.2101.0.copyload = load double, ptr %.sroa.2101.0..sroa_idx, align 8, !tbaa !5
  %214 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.0100.0.copyload, double %.sroa.2101.0.copyload)
          to label %215 unwind label %238

215:                                              ; preds = %210
  %216 = extractvalue { double, double } %214, 0
  store double %216, ptr %22, align 16
  %217 = extractvalue { double, double } %214, 1
  store double %217, ptr %70, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %24) #11
  store float 0.000000e+00, ptr %24, align 4, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %25) #11
  %.sroa.094.0.copyload = load double, ptr %21, align 16
  %.sroa.295.0.copyload = load double, ptr %69, align 8, !tbaa !5
  %218 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %22, double %.sroa.094.0.copyload, double %.sroa.295.0.copyload)
  store float %218, ptr %25, align 4, !tbaa !8
  %219 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %24, ptr noundef nonnull align 4 dereferenceable(4) %25)
  %220 = load float, ptr %219, align 4, !tbaa !8
  %.sroa.092.0.copyload = load double, ptr %21, align 16
  %.sroa.293.0.copyload = load double, ptr %69, align 8, !tbaa !5
  %221 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %220, double %.sroa.092.0.copyload, double %.sroa.293.0.copyload)
          to label %222 unwind label %240

222:                                              ; preds = %215
  %223 = extractvalue { double, double } %221, 0
  store double %223, ptr %23, align 16
  %224 = extractvalue { double, double } %221, 1
  store double %224, ptr %71, align 8
  %225 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %226 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %23, float noundef %225)
          to label %227 unwind label %240

227:                                              ; preds = %222
  %228 = extractvalue { double, double } %226, 0
  %229 = extractvalue { double, double } %226, 1
  %230 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %228, double %229)
          to label %231 unwind label %240

231:                                              ; preds = %227
  %232 = extractvalue { double, double } %230, 0
  %233 = extractvalue { double, double } %230, 1
  store double %232, ptr %14, align 16
  store double %233, ptr %.sroa.2169.0..sroa_idx, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %25) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %24) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #11
  br label %244

234:                                              ; preds = %192
  %235 = landingpad { ptr, i32 }
          cleanup
  br label %421

236:                                              ; preds = %206, %203
  %237 = landingpad { ptr, i32 }
          cleanup
  br label %243

238:                                              ; preds = %210
  %239 = landingpad { ptr, i32 }
          cleanup
  br label %242

240:                                              ; preds = %227, %222, %215
  %241 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %25) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %24) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #11
  br label %242

242:                                              ; preds = %240, %238
  %.pn291 = phi { ptr, i32 } [ %241, %240 ], [ %239, %238 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #11
  br label %243

243:                                              ; preds = %242, %236
  %.pn291.pn = phi { ptr, i32 } [ %.pn291, %242 ], [ %237, %236 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #11
  br label %421

244:                                              ; preds = %231, %197
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #11
  %245 = getelementptr inbounds i8, ptr %130, i64 16
  %.sroa.090.0.copyload = load double, ptr %245, align 16
  %.sroa.291.0..sroa_idx = getelementptr inbounds i8, ptr %130, i64 24
  %.sroa.291.0.copyload = load double, ptr %.sroa.291.0..sroa_idx, align 8, !tbaa !5
  %246 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.090.0.copyload, double %.sroa.291.0.copyload)
          to label %247 unwind label %264

247:                                              ; preds = %244
  %248 = extractvalue { double, double } %246, 0
  store double %248, ptr %26, align 16
  %249 = extractvalue { double, double } %246, 1
  store double %249, ptr %72, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %27) #11
  %.sroa.086.0.copyload = load double, ptr %20, align 16
  %.sroa.287.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %250 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %.sroa.086.0.copyload, double %.sroa.287.0.copyload)
  %.sroa.084.0.copyload = load double, ptr %20, align 16
  %.sroa.285.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %251 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %250, double %.sroa.084.0.copyload, double %.sroa.285.0.copyload)
          to label %252 unwind label %266

252:                                              ; preds = %247
  %253 = extractvalue { double, double } %251, 0
  %254 = extractvalue { double, double } %251, 1
  %255 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %253, double %254)
          to label %256 unwind label %266

256:                                              ; preds = %252
  %257 = extractvalue { double, double } %255, 0
  store double %257, ptr %27, align 16
  %258 = extractvalue { double, double } %255, 1
  store double %258, ptr %73, align 8
  %259 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %260 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %261 = sext i32 %.1262 to i64
  %262 = getelementptr inbounds ptr, ptr %260, i64 %261
  %263 = icmp ult ptr %259, %262
  br i1 %263, label %.lr.ph406, label %._crit_edge407.thread

._crit_edge407:                                   ; preds = %294
  %.not294 = icmp eq ptr %.3282, null
  br i1 %.not294, label %._crit_edge407.thread, label %299

264:                                              ; preds = %244
  %265 = landingpad { ptr, i32 }
          cleanup
  br label %420

266:                                              ; preds = %252, %247
  %267 = landingpad { ptr, i32 }
          cleanup
  br label %419

.lr.ph406:                                        ; preds = %256, %294
  %.0275404 = phi float [ %.3278, %294 ], [ 0.000000e+00, %256 ]
  %.0279403 = phi ptr [ %.3282, %294 ], [ null, %256 ]
  %.0283402 = phi ptr [ %295, %294 ], [ %259, %256 ]
  %268 = load ptr, ptr %.0283402, align 8, !tbaa !11
  %.not303 = icmp eq ptr %268, %130
  br i1 %.not303, label %294, label %269

269:                                              ; preds = %.lr.ph406
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %28) #11
  %270 = getelementptr inbounds i8, ptr %268, i64 32
  %271 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %270)
          to label %272 unwind label %288

272:                                              ; preds = %269
  %273 = extractvalue { double, double } %271, 0
  store double %273, ptr %28, align 16
  %274 = extractvalue { double, double } %271, 1
  store double %274, ptr %74, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %29) #11
  %275 = load ptr, ptr %.0283402, align 8, !tbaa !11
  %276 = getelementptr inbounds i8, ptr %275, i64 16
  %.sroa.067.0.copyload = load double, ptr %27, align 16
  %.sroa.268.0.copyload = load double, ptr %73, align 8, !tbaa !5
  %277 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %276, double %.sroa.067.0.copyload, double %.sroa.268.0.copyload)
          to label %278 unwind label %290

278:                                              ; preds = %272
  %279 = extractvalue { double, double } %277, 0
  store double %279, ptr %29, align 16
  %280 = extractvalue { double, double } %277, 1
  store double %280, ptr %75, align 8
  %.sroa.065.0.copyload = load double, ptr %28, align 16
  %.sroa.266.0.copyload = load double, ptr %74, align 8, !tbaa !5
  %281 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %29, double %.sroa.065.0.copyload, double %.sroa.266.0.copyload)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %29) #11
  %282 = fcmp ogt float %281, %.0275404
  br i1 %282, label %283, label %292

283:                                              ; preds = %278
  %.sroa.062.0.copyload = load double, ptr %20, align 16
  %.sroa.263.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %284 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %28, double %.sroa.062.0.copyload, double %.sroa.263.0.copyload)
  %285 = call float @llvm.fabs.f32(float %284)
  %or.cond = fcmp olt float %285, 0x3FEF7CEDA0000000
  br i1 %or.cond, label %286, label %292

286:                                              ; preds = %283
  %287 = load ptr, ptr %.0283402, align 8, !tbaa !11
  br label %292

288:                                              ; preds = %269
  %289 = landingpad { ptr, i32 }
          cleanup
  br label %293

290:                                              ; preds = %272
  %291 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %29) #11
  br label %293

292:                                              ; preds = %283, %286, %278
  %.2281 = phi ptr [ %.0279403, %278 ], [ %287, %286 ], [ %.0279403, %283 ]
  %.2277 = phi float [ %.0275404, %278 ], [ %281, %286 ], [ %.0275404, %283 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #11
  br label %294

293:                                              ; preds = %290, %288
  %.pn304 = phi { ptr, i32 } [ %291, %290 ], [ %289, %288 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #11
  br label %419

294:                                              ; preds = %.lr.ph406, %292
  %.3282 = phi ptr [ %.2281, %292 ], [ %.0279403, %.lr.ph406 ]
  %.3278 = phi float [ %.2277, %292 ], [ %.0275404, %.lr.ph406 ]
  %295 = getelementptr inbounds i8, ptr %.0283402, i64 8
  %296 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %297 = getelementptr inbounds ptr, ptr %296, i64 %261
  %298 = icmp ult ptr %295, %297
  br i1 %298, label %.lr.ph406, label %._crit_edge407, !llvm.loop !52

299:                                              ; preds = %._crit_edge407
  %300 = getelementptr inbounds i8, ptr %.3282, i64 32
  %301 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %300)
          to label %302 unwind label %361

302:                                              ; preds = %299
  %303 = extractvalue { double, double } %301, 0
  %304 = extractvalue { double, double } %301, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %30) #11
  %305 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %303, double %304)
          to label %306 unwind label %363

306:                                              ; preds = %302
  %307 = extractvalue { double, double } %305, 0
  store double %307, ptr %30, align 16
  %308 = extractvalue { double, double } %305, 1
  store double %308, ptr %76, align 8
  %309 = invoke { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %30)
          to label %310 unwind label %363

310:                                              ; preds = %306
  %311 = extractvalue { double, double } %309, 0
  %312 = extractvalue { double, double } %309, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %31) #11
  %313 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %311, double %312)
  %314 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %313, double %311, double %312)
          to label %315 unwind label %365

315:                                              ; preds = %310
  %316 = extractvalue { double, double } %314, 0
  store double %316, ptr %31, align 16
  %317 = extractvalue { double, double } %314, 1
  store double %317, ptr %77, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #11
  store float 0.000000e+00, ptr %32, align 4, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %33) #11
  %318 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %245, double %303, double %304)
  store float %318, ptr %33, align 4, !tbaa !8
  %319 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %32, ptr noundef nonnull align 4 dereferenceable(4) %33)
  %320 = load float, ptr %319, align 4, !tbaa !8
  %321 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %320, double %303, double %304)
          to label %322 unwind label %367

322:                                              ; preds = %315
  %323 = extractvalue { double, double } %321, 0
  %324 = extractvalue { double, double } %321, 1
  %325 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %245, double %323, double %324)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %33) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %34) #11
  store float 0.000000e+00, ptr %34, align 4, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %35) #11
  %326 = getelementptr inbounds i8, ptr %.3282, i64 16
  %.sroa.044.0.copyload = load double, ptr %20, align 16
  %.sroa.245.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %327 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %326, double %.sroa.044.0.copyload, double %.sroa.245.0.copyload)
  store float %327, ptr %35, align 4, !tbaa !8
  %328 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %34, ptr noundef nonnull align 4 dereferenceable(4) %35)
  %329 = load float, ptr %328, align 4, !tbaa !8
  %.sroa.042.0.copyload = load double, ptr %20, align 16
  %.sroa.243.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %330 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %329, double %.sroa.042.0.copyload, double %.sroa.243.0.copyload)
          to label %331 unwind label %369

331:                                              ; preds = %322
  %332 = extractvalue { double, double } %330, 0
  %333 = extractvalue { double, double } %330, 1
  %334 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %326, double %332, double %333)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %35) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %34) #11
  %335 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %245, double %311, double %312)
  %336 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %335, double %311, double %312)
          to label %337 unwind label %371

337:                                              ; preds = %331
  %338 = extractvalue { double, double } %336, 0
  %339 = extractvalue { double, double } %336, 1
  %340 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %245, double %338, double %339)
          to label %341 unwind label %371

341:                                              ; preds = %337
  %342 = extractvalue { double, double } %340, 0
  %343 = extractvalue { double, double } %340, 1
  %344 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %326, double %311, double %312)
  %345 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %344, double %311, double %312)
          to label %346 unwind label %373

346:                                              ; preds = %341
  %347 = extractvalue { double, double } %345, 0
  %348 = extractvalue { double, double } %345, 1
  %349 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %326, double %347, double %348)
          to label %350 unwind label %373

350:                                              ; preds = %346
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %36) #11
  %351 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %31, double %342, double %343)
          to label %352 unwind label %375

352:                                              ; preds = %350
  %353 = extractvalue { double, double } %349, 1
  %354 = extractvalue { double, double } %349, 0
  %355 = extractvalue { double, double } %351, 0
  store double %355, ptr %36, align 16
  %356 = extractvalue { double, double } %351, 1
  store double %356, ptr %78, align 8
  %357 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %36, double %354, double %353)
          to label %358 unwind label %375

358:                                              ; preds = %352
  %359 = extractvalue { double, double } %357, 0
  %360 = extractvalue { double, double } %357, 1
  store double %359, ptr %27, align 16
  store double %360, ptr %73, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %36) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #11
  br label %._crit_edge407.thread

361:                                              ; preds = %299
  %362 = landingpad { ptr, i32 }
          cleanup
  br label %419

363:                                              ; preds = %306, %302
  %364 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #11
  br label %419

365:                                              ; preds = %310
  %366 = landingpad { ptr, i32 }
          cleanup
  br label %377

367:                                              ; preds = %315
  %368 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %33) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #11
  br label %377

369:                                              ; preds = %322
  %370 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %35) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %34) #11
  br label %377

371:                                              ; preds = %337, %331
  %372 = landingpad { ptr, i32 }
          cleanup
  br label %377

373:                                              ; preds = %346, %341
  %374 = landingpad { ptr, i32 }
          cleanup
  br label %377

375:                                              ; preds = %352, %350
  %376 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %36) #11
  br label %377

377:                                              ; preds = %371, %375, %373, %369, %367, %365
  %.pn295.pn.pn = phi { ptr, i32 } [ %370, %369 ], [ %368, %367 ], [ %366, %365 ], [ %372, %371 ], [ %376, %375 ], [ %374, %373 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #11
  br label %419

._crit_edge407.thread:                            ; preds = %256, %358, %._crit_edge407
  %378 = load ptr, ptr %79, align 8, !tbaa !53
  %.not301 = icmp eq ptr %378, null
  br i1 %.not301, label %398, label %379

379:                                              ; preds = %._crit_edge407.thread
  %380 = load ptr, ptr %130, align 16, !tbaa !41
  %381 = getelementptr inbounds i8, ptr %380, i64 96
  %382 = load ptr, ptr %381, align 16, !tbaa !54
  %.not302 = icmp eq ptr %382, null
  %383 = getelementptr inbounds i8, ptr %380, i64 8
  %384 = getelementptr inbounds i8, ptr %380, i64 16
  %.sroa.011.0.copyload = load double, ptr %384, align 16
  %.sroa.212.0..sroa_idx = getelementptr inbounds i8, ptr %380, i64 24
  %.sroa.212.0.copyload = load double, ptr %.sroa.212.0..sroa_idx, align 8, !tbaa !5
  %385 = getelementptr inbounds i8, ptr %380, i64 48
  %.sroa.09.0.copyload = load double, ptr %385, align 16
  %.sroa.210.0..sroa_idx = getelementptr inbounds i8, ptr %380, i64 56
  %.sroa.210.0.copyload = load double, ptr %.sroa.210.0..sroa_idx, align 8, !tbaa !5
  %386 = getelementptr inbounds i8, ptr %380, i64 32
  %.sroa.07.0.copyload = load double, ptr %386, align 16
  %.sroa.28.0..sroa_idx = getelementptr inbounds i8, ptr %380, i64 40
  %.sroa.28.0.copyload = load double, ptr %.sroa.28.0..sroa_idx, align 8, !tbaa !5
  %387 = getelementptr inbounds i8, ptr %380, i64 112
  %388 = load ptr, ptr %387, align 16, !tbaa !55
  %.sroa.05.0.copyload = load double, ptr %14, align 16
  %.sroa.26.0.copyload = load double, ptr %.sroa.2169.0..sroa_idx, align 8, !tbaa !5
  %389 = load ptr, ptr %378, align 8, !tbaa !56
  br i1 %.not302, label %395, label %390

390:                                              ; preds = %379
  %391 = getelementptr inbounds i8, ptr %389, i64 96
  %392 = load ptr, ptr %391, align 8
  invoke void %392(ptr noundef nonnull align 8 dereferenceable(8) %378, ptr noundef nonnull %0, ptr noundef nonnull %382, ptr noundef nonnull align 4 dereferenceable(4) %383, double %.sroa.011.0.copyload, double %.sroa.212.0.copyload, double %.sroa.09.0.copyload, double %.sroa.210.0.copyload, double %.sroa.07.0.copyload, double %.sroa.28.0.copyload, ptr noundef %388, double %.sroa.05.0.copyload, double %.sroa.26.0.copyload, ptr noundef nonnull align 16 dereferenceable(16) %27)
          to label %398 unwind label %393

393:                                              ; preds = %398, %395, %390
  %394 = landingpad { ptr, i32 }
          cleanup
  br label %419

395:                                              ; preds = %379
  %396 = getelementptr inbounds i8, ptr %389, i64 88
  %397 = load ptr, ptr %396, align 8
  invoke void %397(ptr noundef nonnull align 8 dereferenceable(8) %378, ptr noundef nonnull %0, ptr noundef nonnull align 4 dereferenceable(4) %380, ptr noundef nonnull align 4 dereferenceable(4) %383, double %.sroa.011.0.copyload, double %.sroa.212.0.copyload, double %.sroa.09.0.copyload, double %.sroa.210.0.copyload, double %.sroa.07.0.copyload, double %.sroa.28.0.copyload, ptr noundef %388, double %.sroa.05.0.copyload, double %.sroa.26.0.copyload, ptr noundef nonnull align 16 dereferenceable(16) %27)
          to label %398 unwind label %393

398:                                              ; preds = %390, %395, %._crit_edge407.thread
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %14, ptr noundef nonnull align 16 dereferenceable(16) %27, i64 16, i1 false), !tbaa.struct !10
  %399 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %15, i64 noundef %261)
          to label %400 unwind label %393

400:                                              ; preds = %398
  store ptr %130, ptr %399, align 8, !tbaa !11
  %401 = add nsw i32 %.1262, 1
  %402 = getelementptr inbounds i8, ptr %130, i64 12
  %403 = load float, ptr %402, align 4, !tbaa !38
  %404 = fcmp olt float %403, 0x3E45798EE0000000
  br i1 %404, label %405, label %408

405:                                              ; preds = %400
  %406 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %14)
  %407 = fcmp olt float %406, 0x3E45798EE0000000
  br i1 %407, label %414, label %408

408:                                              ; preds = %405, %400
  %409 = call noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %245, float noundef 0x3E45798EE0000000)
  br i1 %409, label %411, label %410

410:                                              ; preds = %408
  %.sroa.0198.0.copyload199 = load double, ptr %245, align 16
  %.sroa.6.0.copyload201 = load double, ptr %.sroa.291.0..sroa_idx, align 8, !tbaa !5
  br label %415

411:                                              ; preds = %408
  %412 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.0198.0412, double %.sroa.6.0413)
  %413 = fcmp olt float %412, 0.000000e+00
  br i1 %413, label %414, label %415

414:                                              ; preds = %405, %411
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #11
  br label %.thread336

415:                                              ; preds = %411, %410
  %.sroa.0198.2.ph = phi double [ %.sroa.0198.0.copyload199, %410 ], [ %.sroa.0198.0412, %411 ]
  %.sroa.6.2.ph = phi double [ %.sroa.6.0.copyload201, %410 ], [ %.sroa.6.0413, %411 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #11
  %416 = add nuw i32 %.0264410, 1
  %417 = load i32, ptr %61, align 4, !tbaa !15
  %418 = icmp ult i32 %416, %417
  br i1 %418, label %84, label %.thread336, !llvm.loop !58

419:                                              ; preds = %293, %393, %363, %377, %361, %266
  %.pn304.pn.pn = phi { ptr, i32 } [ %267, %266 ], [ %.pn304, %293 ], [ %394, %393 ], [ %362, %361 ], [ %.pn295.pn.pn, %377 ], [ %364, %363 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #11
  br label %420

420:                                              ; preds = %419, %264
  %.pn304.pn.pn.pn = phi { ptr, i32 } [ %.pn304.pn.pn, %419 ], [ %265, %264 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #11
  br label %421

421:                                              ; preds = %420, %243, %234
  %.pn304.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn304.pn.pn.pn, %420 ], [ %.pn291.pn, %243 ], [ %235, %234 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #11
  br label %423

.thread336:                                       ; preds = %415, %182, %.preheader, %167, %174, %414
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %15) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #11
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %12) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %12) #11
  br label %422

422:                                              ; preds = %.thread336, %39
  ret void

423:                                              ; preds = %.loopexit351, %.loopexit.split-lp352, %.loopexit, %.loopexit.split-lp, %128, %116, %105, %163, %421, %82
  %.pn312.pn.pn = phi { ptr, i32 } [ %83, %82 ], [ %129, %128 ], [ %117, %116 ], [ %106, %105 ], [ %.pn304.pn.pn.pn.pn, %421 ], [ %164, %163 ], [ %lpad.loopexit, %.loopexit ], [ %lpad.loopexit.split-lp, %.loopexit.split-lp ], [ %lpad.loopexit353, %.loopexit351 ], [ %lpad.loopexit.split-lp354, %.loopexit.split-lp352 ]
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %15) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %15) #11
  br label %424

424:                                              ; preds = %423, %80
  %.pn312.pn.pn.pn = phi { ptr, i32 } [ %.pn312.pn.pn, %423 ], [ %81, %80 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #11
  br label %425

425:                                              ; preds = %424, %49, %47
  %.pn317 = phi { ptr, i32 } [ %50, %49 ], [ %.pn312.pn.pn.pn, %424 ], [ %48, %47 ]
  call void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32) %12) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %12) #11
  resume { ptr, i32 } %.pn317
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE5emptyEv(ptr noundef nonnull align 8 dereferenceable(32)) local_unnamed_addr #5 align 2

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) local_unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(32)) local_unnamed_addr #5 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @"_ZN3JPH9QuickSortIPPNS_16CharacterVirtual10ConstraintEZNS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_10ContactKeyENS7_ISB_EEEERfRS5_RNS_13TempAllocatorEE3$_0EEvT_SK_T0_"(ptr noundef, ptr noundef) local_unnamed_addr #4

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEED2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #5 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fabs.f32(float) #10

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"float", !6, i64 0}
!10 = !{i64 0, i64 16, !5}
!11 = !{!12, !12, i64 0}
!12 = !{!"any pointer", !6, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!16, !21, i64 180}
!16 = !{!"_ZTSN3JPH16CharacterVirtualE", !17, i64 0, !31, i64 144, !12, i64 152, !12, i64 160, !32, i64 168, !9, i64 172, !21, i64 176, !21, i64 180, !9, i64 184, !9, i64 188, !9, i64 192, !21, i64 196, !9, i64 200, !9, i64 204, !33, i64 208, !9, i64 212, !9, i64 216, !23, i64 224, !23, i64 240, !34, i64 256, !23, i64 272, !35, i64 288, !21, i64 312, !36, i64 320, !9, i64 352, !33, i64 356, !30, i64 360, !27, i64 368}
!17 = !{!"_ZTSN3JPH13CharacterBaseE", !18, i64 8, !12, i64 16, !22, i64 24, !23, i64 32, !24, i64 48, !9, i64 64, !26, i64 68, !27, i64 72, !28, i64 76, !23, i64 80, !23, i64 96, !23, i64 112, !29, i64 128, !30, i64 136}
!18 = !{!"_ZTSN3JPH9RefTargetINS_13CharacterBaseEEE", !19, i64 0}
!19 = !{!"_ZTSSt6atomicIjE", !20, i64 0}
!20 = !{!"_ZTSSt13__atomic_baseIjE", !21, i64 0}
!21 = !{!"int", !6, i64 0}
!22 = !{!"_ZTSN3JPH8RefConstINS_5ShapeEEE", !12, i64 0}
!23 = !{!"_ZTSN3JPH4Vec3E", !6, i64 0}
!24 = !{!"_ZTSN3JPH5PlaneE", !25, i64 0}
!25 = !{!"_ZTSN3JPH4Vec4E", !6, i64 0}
!26 = !{!"_ZTSN3JPH13CharacterBase12EGroundStateE", !6, i64 0}
!27 = !{!"_ZTSN3JPH6BodyIDE", !21, i64 0}
!28 = !{!"_ZTSN3JPH10SubShapeIDE", !21, i64 0}
!29 = !{!"_ZTSN3JPH8RefConstINS_15PhysicsMaterialEEE", !12, i64 0}
!30 = !{!"long", !6, i64 0}
!31 = !{!"_ZTSN3JPH11CharacterIDE", !21, i64 0}
!32 = !{!"_ZTSN3JPH13EBackFaceModeE", !6, i64 0}
!33 = !{!"bool", !6, i64 0}
!34 = !{!"_ZTSN3JPH4QuatE", !25, i64 0}
!35 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !30, i64 0, !30, i64 8, !12, i64 16}
!36 = !{!"_ZTSN3JPH12UnorderedMapINS_16CharacterVirtual10ContactKeyENS1_20ListenerContactValueENS_4HashIS2_EESt8equal_toIS2_EEE", !37, i64 0}
!37 = !{!"_ZTSN3JPH9HashTableINS_16CharacterVirtual10ContactKeyESt4pairIS2_NS1_20ListenerContactValueEENS_18UnorderedMapDetailIS2_S4_EENS_4HashIS2_EESt8equal_toIS2_EEE", !12, i64 0, !12, i64 8, !21, i64 16, !21, i64 20, !21, i64 24}
!38 = !{!39, !9, i64 12}
!39 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !12, i64 0, !9, i64 8, !9, i64 12, !23, i64 16, !24, i64 32, !33, i64 48}
!40 = !{!39, !9, i64 8}
!41 = !{!39, !12, i64 0}
!42 = !{!43, !33, i64 121}
!43 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !44, i64 0, !23, i64 16, !23, i64 32, !23, i64 48, !23, i64 64, !9, i64 80, !9, i64 84, !45, i64 88, !33, i64 89, !12, i64 96, !30, i64 104, !12, i64 112, !33, i64 120, !33, i64 121, !33, i64 122}
!44 = !{!"_ZTSN3JPH16CharacterVirtual10ContactKeyE", !27, i64 0, !31, i64 4, !28, i64 8}
!45 = !{!"_ZTSN3JPH11EMotionTypeE", !6, i64 0}
!46 = !{i8 0, i8 2}
!47 = !{}
!48 = !{!43, !33, i64 120}
!49 = !{!43, !33, i64 122}
!50 = !{!16, !9, i64 184}
!51 = !{!39, !33, i64 48}
!52 = distinct !{!52, !14}
!53 = !{!16, !12, i64 152}
!54 = !{!43, !12, i64 96}
!55 = !{!43, !12, i64 112}
!56 = !{!57, !57, i64 0}
!57 = !{!"vtable pointer", !7, i64 0}
!58 = distinct !{!58, !14}


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