; LLVM IR from zig-gamedev/zphysics :: libs/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.38" = type { %"class.JPH::STLTempAllocator.39", i64, i64, ptr }
%"class.JPH::STLTempAllocator.39" = type { ptr }
%class.anon = type { i8 }
%"class.JPH::CharacterVirtual" = type <{ %"class.JPH::CharacterBase", ptr, ptr, i8, [3 x i8], float, i32, i32, float, float, float, i32, float, float, i8, [3 x i8], float, float, [12 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Vec3", %"class.JPH::Array.2", float, i8, [3 x i8], i64, %"class.JPH::BodyID", [4 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::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Array.2" = type { i64, i64, ptr }
%"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::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, %"class.JPH::BodyID", [4 x i8], ptr, %"class.JPH::SubShapeID", i8, i8, [2 x i8], i64, ptr, i8, i8, i8, [13 x i8] }>

; 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(8) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS_6BodyIDERNS_10SubShapeIDEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #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 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332), 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 @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %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.38", align 8
  %22 = alloca %"class.JPH::STLTempAllocator.39", 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.38", align 8
  %30 = alloca %"class.JPH::STLTempAllocator.39", 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 %1212

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 %1216

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 %1216

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 7
  %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 !36
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #10
  store i32 0, ptr %32, align 4, !tbaa !36
  br label %190

190:                                              ; preds = %1198, %189
  %191 = load i32, ptr %32, align 4, !tbaa !36
  %192 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 7
  %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 %1206

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 %1215

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 %1214

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 %1213

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 !37
  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 !37
  %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 !39
  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 !37
  %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 !39
  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 !37
  %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 !39
  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 %1208

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_16CharacterVirtual10ConstraintEZNKS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_14IgnoredContactENS7_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 = %457, %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 %460

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 %1208

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 %463

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 %462

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 !39
  %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 %454

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 %456

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 !40
  %389 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %388, i32 0, i32 16
  %390 = load i8, ptr %389, align 1, !tbaa !41, !range !44, !noundef !45
  %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 %454

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 !40
  %397 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %396, i32 0, i32 15
  %398 = load i8, ptr %397, align 16, !tbaa !46, !range !44, !noundef !45
  %399 = trunc i8 %398 to i1
  br i1 %399, label %430, 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 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332) %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 %425, 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 !40
  %413 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %412, i32 0, i32 16
  store i8 1, ptr %413, align 1, !tbaa !41
  %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 !40
  %418 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %417, i32 0, i32 6
  %419 = load ptr, ptr %50, align 8, !tbaa !5
  %420 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %419, i32 0, i32 0
  %421 = load ptr, ptr %420, align 16, !tbaa !40
  %422 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %421, i32 0, i32 9
  %423 = invoke noundef nonnull align 4 dereferenceable(8) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS_6BodyIDERNS_10SubShapeIDEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32) %414, ptr noundef nonnull align 4 dereferenceable(4) %418, ptr noundef nonnull align 4 dereferenceable(4) %422)
          to label %424 unwind label %381

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

425:                                              ; preds = %408
  %426 = load ptr, ptr %50, align 8, !tbaa !5
  %427 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %426, i32 0, i32 0
  %428 = load ptr, ptr %427, align 16, !tbaa !40
  %429 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %428, i32 0, i32 15
  store i8 1, ptr %429, align 16, !tbaa !46
  br label %430

430:                                              ; preds = %425, %393
  %431 = load ptr, ptr %50, align 8, !tbaa !5
  %432 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %431, i32 0, i32 0
  %433 = load ptr, ptr %432, align 16, !tbaa !40
  %434 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %433, i32 0, i32 17
  %435 = load i8, ptr %434, align 2, !tbaa !47, !range !44, !noundef !45
  %436 = trunc i8 %435 to i1
  br i1 %436, label %452, label %437

437:                                              ; preds = %430
  call void @llvm.lifetime.start.p0(i64 16, ptr %53) #10
  %438 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %439 unwind label %448

439:                                              ; preds = %437
  %440 = getelementptr inbounds %"class.JPH::Vec3", ptr %53, i32 0, i32 0
  %441 = getelementptr inbounds %union.anon, ptr %440, i32 0, i32 0
  %442 = getelementptr inbounds { double, double }, ptr %441, i32 0, i32 0
  %443 = extractvalue { double, double } %438, 0
  store double %443, ptr %442, align 16
  %444 = getelementptr inbounds { double, double }, ptr %441, i32 0, i32 1
  %445 = extractvalue { double, double } %438, 1
  store double %445, ptr %444, align 8
  %446 = load ptr, ptr %50, align 8, !tbaa !5
  %447 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %446, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %447, ptr align 16 %53, i64 16, i1 false), !tbaa.struct !11
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #10
  br label %452

448:                                              ; preds = %437
  %449 = landingpad { ptr, i32 }
          cleanup
  %450 = extractvalue { ptr, i32 } %449, 0
  store ptr %450, ptr %23, align 8
  %451 = extractvalue { ptr, i32 } %449, 1
  store i32 %451, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %53) #10
  br label %456

452:                                              ; preds = %439, %430
  %453 = load ptr, ptr %50, align 8, !tbaa !5
  store ptr %453, ptr %46, align 8, !tbaa !5
  store i32 10, ptr %33, align 4
  br label %454

454:                                              ; preds = %452, %424, %392, %376
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #10
  %455 = load i32, ptr %33, align 4
  switch i32 %455, label %460 [
    i32 11, label %457
  ]

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

457:                                              ; preds = %454
  %458 = load ptr, ptr %48, align 8, !tbaa !5
  %459 = getelementptr inbounds ptr, ptr %458, i32 1
  store ptr %459, ptr %48, align 8, !tbaa !5
  br label %335

460:                                              ; preds = %454, %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
  %461 = load i32, ptr %33, align 4
  switch i32 %461, label %1195 [
    i32 10, label %464
  ]

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

463:                                              ; preds = %462, %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 %1205

464:                                              ; preds = %460
  %465 = load ptr, ptr %46, align 8, !tbaa !5
  %466 = icmp eq ptr %465, null
  br i1 %466, label %467, label %492

467:                                              ; preds = %464
  %468 = load float, ptr %14, align 4, !tbaa !9
  %469 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %468)
          to label %470 unwind label %488

470:                                              ; preds = %467
  %471 = getelementptr inbounds %"class.JPH::Vec3", ptr %54, i32 0, i32 0
  %472 = getelementptr inbounds %union.anon, ptr %471, i32 0, i32 0
  %473 = getelementptr inbounds { double, double }, ptr %472, i32 0, i32 0
  %474 = extractvalue { double, double } %469, 0
  store double %474, ptr %473, align 16
  %475 = getelementptr inbounds { double, double }, ptr %472, i32 0, i32 1
  %476 = extractvalue { double, double } %469, 1
  store double %476, ptr %475, align 8
  %477 = load ptr, ptr %18, align 8, !tbaa !5
  %478 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %479 = load double, ptr %478, align 16
  %480 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %481 = load double, ptr %480, align 8
  %482 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %477, double %479, double %481)
          to label %483 unwind label %488

483:                                              ; preds = %470
  %484 = load float, ptr %14, align 4, !tbaa !9
  %485 = load ptr, ptr %17, align 8, !tbaa !5
  %486 = load float, ptr %485, align 4, !tbaa !9
  %487 = fadd float %486, %484
  store float %487, ptr %485, align 4, !tbaa !9
  store i32 1, ptr %33, align 4
  br label %1195

488:                                              ; preds = %497, %492, %470, %467
  %489 = landingpad { ptr, i32 }
          cleanup
  %490 = extractvalue { ptr, i32 } %489, 0
  store ptr %490, ptr %23, align 8
  %491 = extractvalue { ptr, i32 } %489, 1
  store i32 %491, ptr %24, align 4
  br label %1205

492:                                              ; preds = %464
  %493 = load ptr, ptr %46, align 8, !tbaa !5
  %494 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %493, i32 0, i32 1
  %495 = load float, ptr %494, align 8, !tbaa !39
  %496 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %26, float noundef %495)
          to label %497 unwind label %488

497:                                              ; preds = %492
  %498 = getelementptr inbounds %"class.JPH::Vec3", ptr %55, i32 0, i32 0
  %499 = getelementptr inbounds %union.anon, ptr %498, i32 0, i32 0
  %500 = getelementptr inbounds { double, double }, ptr %499, i32 0, i32 0
  %501 = extractvalue { double, double } %496, 0
  store double %501, ptr %500, align 16
  %502 = getelementptr inbounds { double, double }, ptr %499, i32 0, i32 1
  %503 = extractvalue { double, double } %496, 1
  store double %503, ptr %502, align 8
  %504 = load ptr, ptr %18, align 8, !tbaa !5
  %505 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 0
  %506 = load double, ptr %505, align 16
  %507 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 1
  %508 = load double, ptr %507, align 8
  %509 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %504, double %506, double %508)
          to label %510 unwind label %488

510:                                              ; preds = %497
  %511 = load ptr, ptr %46, align 8, !tbaa !5
  %512 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %511, i32 0, i32 1
  %513 = load float, ptr %512, align 8, !tbaa !39
  %514 = load float, ptr %14, align 4, !tbaa !9
  %515 = fsub float %514, %513
  store float %515, ptr %14, align 4, !tbaa !9
  %516 = load ptr, ptr %46, align 8, !tbaa !5
  %517 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %516, i32 0, i32 1
  %518 = load float, ptr %517, align 8, !tbaa !39
  %519 = load ptr, ptr %17, align 8, !tbaa !5
  %520 = load float, ptr %519, align 4, !tbaa !9
  %521 = fadd float %520, %518
  store float %521, ptr %519, align 4, !tbaa !9
  %522 = load float, ptr %14, align 4, !tbaa !9
  %523 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 8
  %524 = load float, ptr %523, align 16, !tbaa !48
  %525 = fcmp olt float %522, %524
  br i1 %525, label %526, label %527

526:                                              ; preds = %510
  store i32 1, ptr %33, align 4
  br label %1195

527:                                              ; preds = %510
  %528 = load ptr, ptr %46, align 8, !tbaa !5
  %529 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %528, i32 0, i32 1
  %530 = load float, ptr %529, align 8, !tbaa !39
  %531 = fcmp ogt float %530, 0x3F1A36E2E0000000
  br i1 %531, label %532, label %533

532:                                              ; preds = %527
  store i32 0, ptr %31, align 4, !tbaa !36
  br label %533

533:                                              ; preds = %532, %527
  call void @llvm.lifetime.start.p0(i64 16, ptr %56) #10
  %534 = load ptr, ptr %46, align 8, !tbaa !5
  %535 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %534, i32 0, i32 4
  %536 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %535)
          to label %537 unwind label %638

537:                                              ; preds = %533
  %538 = getelementptr inbounds %"class.JPH::Vec3", ptr %56, i32 0, i32 0
  %539 = getelementptr inbounds %union.anon, ptr %538, i32 0, i32 0
  %540 = getelementptr inbounds { double, double }, ptr %539, i32 0, i32 0
  %541 = extractvalue { double, double } %536, 0
  store double %541, ptr %540, align 16
  %542 = getelementptr inbounds { double, double }, ptr %539, i32 0, i32 1
  %543 = extractvalue { double, double } %536, 1
  store double %543, ptr %542, align 8
  %544 = load ptr, ptr %46, align 8, !tbaa !5
  %545 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %544, i32 0, i32 5
  %546 = load i8, ptr %545, align 16, !tbaa !49, !range !44, !noundef !45
  %547 = trunc i8 %546 to i1
  br i1 %547, label %548, label %656

548:                                              ; preds = %537
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #10
  %549 = 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 %549, i64 16, i1 false), !tbaa.struct !11
  %550 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 0
  %551 = load double, ptr %550, align 16
  %552 = getelementptr inbounds { double, double }, ptr %59, i32 0, i32 1
  %553 = load double, ptr %552, align 8
  %554 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %551, double %553)
          to label %555 unwind label %642

555:                                              ; preds = %548
  %556 = 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 %556, i64 16, i1 false), !tbaa.struct !11
  %557 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %558 = load double, ptr %557, align 16
  %559 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %560 = load double, ptr %559, align 8
  %561 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %554, double %558, double %560)
          to label %562 unwind label %642

562:                                              ; preds = %555
  %563 = getelementptr inbounds %"class.JPH::Vec3", ptr %58, i32 0, i32 0
  %564 = getelementptr inbounds %union.anon, ptr %563, i32 0, i32 0
  %565 = getelementptr inbounds { double, double }, ptr %564, i32 0, i32 0
  %566 = extractvalue { double, double } %561, 0
  store double %566, ptr %565, align 16
  %567 = getelementptr inbounds { double, double }, ptr %564, i32 0, i32 1
  %568 = extractvalue { double, double } %561, 1
  store double %568, ptr %567, align 8
  %569 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 0
  %570 = load double, ptr %569, align 16
  %571 = getelementptr inbounds { double, double }, ptr %58, i32 0, i32 1
  %572 = load double, ptr %571, align 8
  %573 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %570, double %572)
          to label %574 unwind label %642

574:                                              ; preds = %562
  %575 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %576 = getelementptr inbounds %union.anon, ptr %575, i32 0, i32 0
  %577 = getelementptr inbounds { double, double }, ptr %576, i32 0, i32 0
  %578 = extractvalue { double, double } %573, 0
  store double %578, ptr %577, align 16
  %579 = getelementptr inbounds { double, double }, ptr %576, i32 0, i32 1
  %580 = extractvalue { double, double } %573, 1
  store double %580, ptr %579, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %61) #10
  %581 = load ptr, ptr %46, align 8, !tbaa !5
  %582 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %581, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %62, ptr align 16 %582, i64 16, i1 false), !tbaa.struct !11
  %583 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 0
  %584 = load double, ptr %583, align 16
  %585 = getelementptr inbounds { double, double }, ptr %62, i32 0, i32 1
  %586 = load double, ptr %585, align 8
  %587 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %584, double %586)
          to label %588 unwind label %646

588:                                              ; preds = %574
  %589 = getelementptr inbounds %"class.JPH::Vec3", ptr %61, i32 0, i32 0
  %590 = getelementptr inbounds %union.anon, ptr %589, i32 0, i32 0
  %591 = getelementptr inbounds { double, double }, ptr %590, i32 0, i32 0
  %592 = extractvalue { double, double } %587, 0
  store double %592, ptr %591, align 16
  %593 = getelementptr inbounds { double, double }, ptr %590, i32 0, i32 1
  %594 = extractvalue { double, double } %587, 1
  store double %594, ptr %593, 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
  %595 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 0
  %596 = load double, ptr %595, align 16
  %597 = getelementptr inbounds { double, double }, ptr %68, i32 0, i32 1
  %598 = load double, ptr %597, align 8
  %599 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %61, double %596, double %598)
          to label %600 unwind label %650

600:                                              ; preds = %588
  store float %599, ptr %67, align 4, !tbaa !9
  %601 = 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 %602 unwind label %650

602:                                              ; preds = %600
  %603 = load float, ptr %601, 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
  %604 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 0
  %605 = load double, ptr %604, align 16
  %606 = getelementptr inbounds { double, double }, ptr %69, i32 0, i32 1
  %607 = load double, ptr %606, align 8
  %608 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %603, double %605, double %607)
          to label %609 unwind label %650

609:                                              ; preds = %602
  %610 = getelementptr inbounds %"class.JPH::Vec3", ptr %65, 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 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %57)
          to label %617 unwind label %650

617:                                              ; preds = %609
  %618 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %65, float noundef %616)
          to label %619 unwind label %650

619:                                              ; preds = %617
  %620 = getelementptr inbounds %"class.JPH::Vec3", ptr %64, i32 0, i32 0
  %621 = getelementptr inbounds %union.anon, ptr %620, i32 0, i32 0
  %622 = getelementptr inbounds { double, double }, ptr %621, i32 0, i32 0
  %623 = extractvalue { double, double } %618, 0
  store double %623, ptr %622, align 16
  %624 = getelementptr inbounds { double, double }, ptr %621, i32 0, i32 1
  %625 = extractvalue { double, double } %618, 1
  store double %625, ptr %624, align 8
  %626 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 0
  %627 = load double, ptr %626, align 16
  %628 = getelementptr inbounds { double, double }, ptr %64, i32 0, i32 1
  %629 = load double, ptr %628, align 8
  %630 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %627, double %629)
          to label %631 unwind label %650

631:                                              ; preds = %619
  %632 = getelementptr inbounds %"class.JPH::Vec3", ptr %63, i32 0, i32 0
  %633 = getelementptr inbounds %union.anon, ptr %632, i32 0, i32 0
  %634 = getelementptr inbounds { double, double }, ptr %633, i32 0, i32 0
  %635 = extractvalue { double, double } %630, 0
  store double %635, ptr %634, align 16
  %636 = getelementptr inbounds { double, double }, ptr %633, i32 0, i32 1
  %637 = extractvalue { double, double } %630, 1
  store double %637, ptr %636, 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 %656

638:                                              ; preds = %533
  %639 = landingpad { ptr, i32 }
          cleanup
  %640 = extractvalue { ptr, i32 } %639, 0
  store ptr %640, ptr %23, align 8
  %641 = extractvalue { ptr, i32 } %639, 1
  store i32 %641, ptr %24, align 4
  br label %1204

642:                                              ; preds = %562, %555, %548
  %643 = landingpad { ptr, i32 }
          cleanup
  %644 = extractvalue { ptr, i32 } %643, 0
  store ptr %644, ptr %23, align 8
  %645 = extractvalue { ptr, i32 } %643, 1
  store i32 %645, ptr %24, align 4
  br label %655

646:                                              ; preds = %574
  %647 = landingpad { ptr, i32 }
          cleanup
  %648 = extractvalue { ptr, i32 } %647, 0
  store ptr %648, ptr %23, align 8
  %649 = extractvalue { ptr, i32 } %647, 1
  store i32 %649, ptr %24, align 4
  br label %654

650:                                              ; preds = %619, %617, %609, %602, %600, %588
  %651 = landingpad { ptr, i32 }
          cleanup
  %652 = extractvalue { ptr, i32 } %651, 0
  store ptr %652, ptr %23, align 8
  %653 = extractvalue { ptr, i32 } %651, 1
  store i32 %653, 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 %654

654:                                              ; preds = %650, %646
  call void @llvm.lifetime.end.p0(i64 16, ptr %61) #10
  br label %655

655:                                              ; preds = %654, %642
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #10
  br label %1204

656:                                              ; preds = %631, %537
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #10
  %657 = load ptr, ptr %46, align 8, !tbaa !5
  %658 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %657, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %71, ptr align 16 %658, i64 16, i1 false), !tbaa.struct !11
  %659 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 0
  %660 = load double, ptr %659, align 16
  %661 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 1
  %662 = load double, ptr %661, align 8
  %663 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %660, double %662)
          to label %664 unwind label %712

664:                                              ; preds = %656
  %665 = getelementptr inbounds %"class.JPH::Vec3", ptr %70, i32 0, i32 0
  %666 = getelementptr inbounds %union.anon, ptr %665, i32 0, i32 0
  %667 = getelementptr inbounds { double, double }, ptr %666, i32 0, i32 0
  %668 = extractvalue { double, double } %663, 0
  store double %668, ptr %667, align 16
  %669 = getelementptr inbounds { double, double }, ptr %666, i32 0, i32 1
  %670 = extractvalue { double, double } %663, 1
  store double %670, ptr %669, 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
  %671 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 0
  %672 = load double, ptr %671, align 16
  %673 = getelementptr inbounds { double, double }, ptr %74, i32 0, i32 1
  %674 = load double, ptr %673, align 8
  %675 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %70, double %672, double %674)
          to label %676 unwind label %716

676:                                              ; preds = %664
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %75, ptr align 16 %56, i64 16, i1 false), !tbaa.struct !11
  %677 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 0
  %678 = load double, ptr %677, align 16
  %679 = getelementptr inbounds { double, double }, ptr %75, i32 0, i32 1
  %680 = load double, ptr %679, align 8
  %681 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %675, double %678, double %680)
          to label %682 unwind label %716

682:                                              ; preds = %676
  %683 = getelementptr inbounds %"class.JPH::Vec3", ptr %73, i32 0, i32 0
  %684 = getelementptr inbounds %union.anon, ptr %683, i32 0, i32 0
  %685 = getelementptr inbounds { double, double }, ptr %684, i32 0, i32 0
  %686 = extractvalue { double, double } %681, 0
  store double %686, ptr %685, align 16
  %687 = getelementptr inbounds { double, double }, ptr %684, i32 0, i32 1
  %688 = extractvalue { double, double } %681, 1
  store double %688, ptr %687, align 8
  %689 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 0
  %690 = load double, ptr %689, align 16
  %691 = getelementptr inbounds { double, double }, ptr %73, i32 0, i32 1
  %692 = load double, ptr %691, align 8
  %693 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %690, double %692)
          to label %694 unwind label %716

694:                                              ; preds = %682
  %695 = getelementptr inbounds %"class.JPH::Vec3", ptr %72, i32 0, i32 0
  %696 = getelementptr inbounds %union.anon, ptr %695, i32 0, i32 0
  %697 = getelementptr inbounds { double, double }, ptr %696, i32 0, i32 0
  %698 = extractvalue { double, double } %693, 0
  store double %698, ptr %697, align 16
  %699 = getelementptr inbounds { double, double }, ptr %696, i32 0, i32 1
  %700 = extractvalue { double, double } %693, 1
  store double %700, ptr %699, 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
  %701 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %29)
          to label %702 unwind label %720

702:                                              ; preds = %694
  store ptr %701, ptr %78, align 8, !tbaa !5
  br label %703

703:                                              ; preds = %798, %702
  %704 = load ptr, ptr %78, align 8, !tbaa !5
  %705 = invoke noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %29)
          to label %706 unwind label %720

706:                                              ; preds = %703
  %707 = load i32, ptr %31, align 4, !tbaa !36
  %708 = sext i32 %707 to i64
  %709 = getelementptr inbounds ptr, ptr %705, i64 %708
  %710 = icmp ult ptr %704, %709
  br i1 %710, label %724, label %711

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

712:                                              ; preds = %656
  %713 = landingpad { ptr, i32 }
          cleanup
  %714 = extractvalue { ptr, i32 } %713, 0
  store ptr %714, ptr %23, align 8
  %715 = extractvalue { ptr, i32 } %713, 1
  store i32 %715, ptr %24, align 4
  br label %1203

716:                                              ; preds = %682, %676, %664
  %717 = landingpad { ptr, i32 }
          cleanup
  %718 = extractvalue { ptr, i32 } %717, 0
  store ptr %718, ptr %23, align 8
  %719 = extractvalue { ptr, i32 } %717, 1
  store i32 %719, ptr %24, align 4
  br label %1202

720:                                              ; preds = %703, %694
  %721 = landingpad { ptr, i32 }
          cleanup
  %722 = extractvalue { ptr, i32 } %721, 0
  store ptr %722, ptr %23, align 8
  %723 = extractvalue { ptr, i32 } %721, 1
  store i32 %723, ptr %24, align 4
  br label %801

724:                                              ; preds = %706
  %725 = load ptr, ptr %78, align 8, !tbaa !5
  %726 = load ptr, ptr %725, align 8, !tbaa !5
  %727 = load ptr, ptr %46, align 8, !tbaa !5
  %728 = icmp ne ptr %726, %727
  br i1 %728, label %729, label %797

729:                                              ; preds = %724
  call void @llvm.lifetime.start.p0(i64 16, ptr %79) #10
  %730 = load ptr, ptr %78, align 8, !tbaa !5
  %731 = load ptr, ptr %730, align 8, !tbaa !5
  %732 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %731, i32 0, i32 4
  %733 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %732)
          to label %734 unwind label %781

734:                                              ; preds = %729
  %735 = getelementptr inbounds %"class.JPH::Vec3", ptr %79, i32 0, i32 0
  %736 = getelementptr inbounds %union.anon, ptr %735, i32 0, i32 0
  %737 = getelementptr inbounds { double, double }, ptr %736, i32 0, i32 0
  %738 = extractvalue { double, double } %733, 0
  store double %738, ptr %737, align 16
  %739 = getelementptr inbounds { double, double }, ptr %736, i32 0, i32 1
  %740 = extractvalue { double, double } %733, 1
  store double %740, ptr %739, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %80) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr %81) #10
  %741 = load ptr, ptr %78, align 8, !tbaa !5
  %742 = load ptr, ptr %741, align 8, !tbaa !5
  %743 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %742, 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
  %744 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 0
  %745 = load double, ptr %744, align 16
  %746 = getelementptr inbounds { double, double }, ptr %82, i32 0, i32 1
  %747 = load double, ptr %746, align 8
  %748 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %743, double %745, double %747)
          to label %749 unwind label %785

749:                                              ; preds = %734
  %750 = getelementptr inbounds %"class.JPH::Vec3", ptr %81, i32 0, i32 0
  %751 = getelementptr inbounds %union.anon, ptr %750, i32 0, i32 0
  %752 = getelementptr inbounds { double, double }, ptr %751, i32 0, i32 0
  %753 = extractvalue { double, double } %748, 0
  store double %753, ptr %752, align 16
  %754 = getelementptr inbounds { double, double }, ptr %751, i32 0, i32 1
  %755 = extractvalue { double, double } %748, 1
  store double %755, ptr %754, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %83, ptr align 16 %79, i64 16, i1 false), !tbaa.struct !11
  %756 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 0
  %757 = load double, ptr %756, align 16
  %758 = getelementptr inbounds { double, double }, ptr %83, i32 0, i32 1
  %759 = load double, ptr %758, align 8
  %760 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %81, double %757, double %759)
          to label %761 unwind label %785

761:                                              ; preds = %749
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #10
  store float %760, ptr %80, align 4, !tbaa !9
  %762 = load float, ptr %80, align 4, !tbaa !9
  %763 = load float, ptr %76, align 4, !tbaa !9
  %764 = fcmp ogt float %762, %763
  br i1 %764, label %765, label %794

765:                                              ; preds = %761
  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
  %766 = getelementptr inbounds { double, double }, ptr %85, i32 0, i32 0
  %767 = load double, ptr %766, align 16
  %768 = getelementptr inbounds { double, double }, ptr %85, i32 0, i32 1
  %769 = load double, ptr %768, align 8
  %770 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %79, double %767, double %769)
          to label %771 unwind label %789

771:                                              ; preds = %765
  store float %770, ptr %84, align 4, !tbaa !9
  %772 = load float, ptr %84, align 4, !tbaa !9
  %773 = fcmp olt float %772, 0x3FEF7CEDA0000000
  br i1 %773, label %774, label %793

774:                                              ; preds = %771
  %775 = load float, ptr %84, align 4, !tbaa !9
  %776 = fcmp ogt float %775, 0xBFEF7CEDA0000000
  br i1 %776, label %777, label %793

777:                                              ; preds = %774
  %778 = load float, ptr %80, align 4, !tbaa !9
  store float %778, ptr %76, align 4, !tbaa !9
  %779 = load ptr, ptr %78, align 8, !tbaa !5
  %780 = load ptr, ptr %779, align 8, !tbaa !5
  store ptr %780, ptr %77, align 8, !tbaa !5
  br label %793

781:                                              ; preds = %729
  %782 = landingpad { ptr, i32 }
          cleanup
  %783 = extractvalue { ptr, i32 } %782, 0
  store ptr %783, ptr %23, align 8
  %784 = extractvalue { ptr, i32 } %782, 1
  store i32 %784, ptr %24, align 4
  br label %796

785:                                              ; preds = %749, %734
  %786 = landingpad { ptr, i32 }
          cleanup
  %787 = extractvalue { ptr, i32 } %786, 0
  store ptr %787, ptr %23, align 8
  %788 = extractvalue { ptr, i32 } %786, 1
  store i32 %788, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %81) #10
  br label %795

789:                                              ; preds = %765
  %790 = landingpad { ptr, i32 }
          cleanup
  %791 = extractvalue { ptr, i32 } %790, 0
  store ptr %791, ptr %23, align 8
  %792 = extractvalue { ptr, i32 } %790, 1
  store i32 %792, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #10
  br label %795

793:                                              ; preds = %777, %774, %771
  call void @llvm.lifetime.end.p0(i64 4, ptr %84) #10
  br label %794

794:                                              ; preds = %793, %761
  call void @llvm.lifetime.end.p0(i64 4, ptr %80) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #10
  br label %797

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

796:                                              ; preds = %795, %781
  call void @llvm.lifetime.end.p0(i64 16, ptr %79) #10
  br label %801

797:                                              ; preds = %794, %724
  br label %798

798:                                              ; preds = %797
  %799 = load ptr, ptr %78, align 8, !tbaa !5
  %800 = getelementptr inbounds ptr, ptr %799, i32 1
  store ptr %800, ptr %78, align 8, !tbaa !5
  br label %703, !llvm.loop !50

801:                                              ; preds = %796, %720
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #10
  br label %1201

802:                                              ; preds = %711
  %803 = load ptr, ptr %77, align 8, !tbaa !5
  %804 = icmp ne ptr %803, null
  br i1 %804, label %805, label %1045

805:                                              ; preds = %802
  call void @llvm.lifetime.start.p0(i64 16, ptr %86) #10
  %806 = load ptr, ptr %77, align 8, !tbaa !5
  %807 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %806, i32 0, i32 4
  %808 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %807)
          to label %809 unwind label %1008

809:                                              ; preds = %805
  %810 = getelementptr inbounds %"class.JPH::Vec3", ptr %86, i32 0, i32 0
  %811 = getelementptr inbounds %union.anon, ptr %810, i32 0, i32 0
  %812 = getelementptr inbounds { double, double }, ptr %811, i32 0, i32 0
  %813 = extractvalue { double, double } %808, 0
  store double %813, ptr %812, align 16
  %814 = getelementptr inbounds { double, double }, ptr %811, i32 0, i32 1
  %815 = extractvalue { double, double } %808, 1
  store double %815, ptr %814, 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
  %816 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 0
  %817 = load double, ptr %816, align 16
  %818 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 1
  %819 = load double, ptr %818, align 8
  %820 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %56, double %817, double %819)
          to label %821 unwind label %1012

821:                                              ; preds = %809
  %822 = getelementptr inbounds %"class.JPH::Vec3", ptr %88, i32 0, i32 0
  %823 = getelementptr inbounds %union.anon, ptr %822, i32 0, i32 0
  %824 = getelementptr inbounds { double, double }, ptr %823, i32 0, i32 0
  %825 = extractvalue { double, double } %820, 0
  store double %825, ptr %824, align 16
  %826 = getelementptr inbounds { double, double }, ptr %823, i32 0, i32 1
  %827 = extractvalue { double, double } %820, 1
  store double %827, ptr %826, align 8
  %828 = invoke { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %88)
          to label %829 unwind label %1012

829:                                              ; preds = %821
  %830 = getelementptr inbounds %"class.JPH::Vec3", ptr %87, i32 0, i32 0
  %831 = getelementptr inbounds %union.anon, ptr %830, i32 0, i32 0
  %832 = getelementptr inbounds { double, double }, ptr %831, i32 0, i32 0
  %833 = extractvalue { double, double } %828, 0
  store double %833, ptr %832, align 16
  %834 = getelementptr inbounds { double, double }, ptr %831, i32 0, i32 1
  %835 = extractvalue { double, double } %828, 1
  store double %835, ptr %834, 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
  %836 = getelementptr inbounds { double, double }, ptr %91, i32 0, i32 0
  %837 = load double, ptr %836, align 16
  %838 = getelementptr inbounds { double, double }, ptr %91, i32 0, i32 1
  %839 = load double, ptr %838, align 8
  %840 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %72, double %837, double %839)
          to label %841 unwind label %1016

841:                                              ; preds = %829
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %92, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %842 = getelementptr inbounds { double, double }, ptr %92, i32 0, i32 0
  %843 = load double, ptr %842, align 16
  %844 = getelementptr inbounds { double, double }, ptr %92, i32 0, i32 1
  %845 = load double, ptr %844, align 8
  %846 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %840, double %843, double %845)
          to label %847 unwind label %1016

847:                                              ; preds = %841
  %848 = getelementptr inbounds %"class.JPH::Vec3", ptr %90, i32 0, i32 0
  %849 = getelementptr inbounds %union.anon, ptr %848, i32 0, i32 0
  %850 = getelementptr inbounds { double, double }, ptr %849, i32 0, i32 0
  %851 = extractvalue { double, double } %846, 0
  store double %851, ptr %850, align 16
  %852 = getelementptr inbounds { double, double }, ptr %849, i32 0, i32 1
  %853 = extractvalue { double, double } %846, 1
  store double %853, ptr %852, 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
  %854 = load ptr, ptr %46, align 8, !tbaa !5
  %855 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %854, 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
  %856 = getelementptr inbounds { double, double }, ptr %96, i32 0, i32 0
  %857 = load double, ptr %856, align 16
  %858 = getelementptr inbounds { double, double }, ptr %96, i32 0, i32 1
  %859 = load double, ptr %858, align 8
  %860 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %855, double %857, double %859)
          to label %861 unwind label %1020

861:                                              ; preds = %847
  store float %860, ptr %95, align 4, !tbaa !9
  %862 = 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 %863 unwind label %1020

863:                                              ; preds = %861
  %864 = load float, ptr %862, 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
  %865 = getelementptr inbounds { double, double }, ptr %97, i32 0, i32 0
  %866 = load double, ptr %865, align 16
  %867 = getelementptr inbounds { double, double }, ptr %97, i32 0, i32 1
  %868 = load double, ptr %867, align 8
  %869 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %864, double %866, double %868)
          to label %870 unwind label %1020

870:                                              ; preds = %863
  %871 = getelementptr inbounds %"class.JPH::Vec3", ptr %93, i32 0, i32 0
  %872 = getelementptr inbounds %union.anon, ptr %871, i32 0, i32 0
  %873 = getelementptr inbounds { double, double }, ptr %872, i32 0, i32 0
  %874 = extractvalue { double, double } %869, 0
  store double %874, ptr %873, align 16
  %875 = getelementptr inbounds { double, double }, ptr %872, i32 0, i32 1
  %876 = extractvalue { double, double } %869, 1
  store double %876, ptr %875, align 8
  %877 = load ptr, ptr %46, align 8, !tbaa !5
  %878 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %877, i32 0, i32 3
  %879 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 0
  %880 = load double, ptr %879, align 16
  %881 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 1
  %882 = load double, ptr %881, align 8
  %883 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %878, double %880, double %882)
          to label %884 unwind label %1020

884:                                              ; preds = %870
  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
  %885 = load ptr, ptr %77, align 8, !tbaa !5
  %886 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %885, 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
  %887 = getelementptr inbounds { double, double }, ptr %101, i32 0, i32 0
  %888 = load double, ptr %887, align 16
  %889 = getelementptr inbounds { double, double }, ptr %101, i32 0, i32 1
  %890 = load double, ptr %889, align 8
  %891 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %886, double %888, double %890)
          to label %892 unwind label %1024

892:                                              ; preds = %884
  store float %891, ptr %100, align 4, !tbaa !9
  %893 = 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 %894 unwind label %1024

894:                                              ; preds = %892
  %895 = load float, ptr %893, 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
  %896 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 0
  %897 = load double, ptr %896, align 16
  %898 = getelementptr inbounds { double, double }, ptr %102, i32 0, i32 1
  %899 = load double, ptr %898, align 8
  %900 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %895, double %897, double %899)
          to label %901 unwind label %1024

901:                                              ; preds = %894
  %902 = getelementptr inbounds %"class.JPH::Vec3", ptr %98, i32 0, i32 0
  %903 = getelementptr inbounds %union.anon, ptr %902, i32 0, i32 0
  %904 = getelementptr inbounds { double, double }, ptr %903, i32 0, i32 0
  %905 = extractvalue { double, double } %900, 0
  store double %905, ptr %904, align 16
  %906 = getelementptr inbounds { double, double }, ptr %903, i32 0, i32 1
  %907 = extractvalue { double, double } %900, 1
  store double %907, ptr %906, align 8
  %908 = load ptr, ptr %77, align 8, !tbaa !5
  %909 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %908, i32 0, i32 3
  %910 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 0
  %911 = load double, ptr %910, align 16
  %912 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 1
  %913 = load double, ptr %912, align 8
  %914 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %909, double %911, double %913)
          to label %915 unwind label %1024

915:                                              ; preds = %901
  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
  %916 = load ptr, ptr %46, align 8, !tbaa !5
  %917 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %916, i32 0, i32 3
  %918 = load ptr, ptr %46, align 8, !tbaa !5
  %919 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %918, 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
  %920 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 0
  %921 = load double, ptr %920, align 16
  %922 = getelementptr inbounds { double, double }, ptr %105, i32 0, i32 1
  %923 = load double, ptr %922, align 8
  %924 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %919, double %921, double %923)
          to label %925 unwind label %1028

925:                                              ; preds = %915
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %106, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %926 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 0
  %927 = load double, ptr %926, align 16
  %928 = getelementptr inbounds { double, double }, ptr %106, i32 0, i32 1
  %929 = load double, ptr %928, align 8
  %930 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %924, double %927, double %929)
          to label %931 unwind label %1028

931:                                              ; preds = %925
  %932 = getelementptr inbounds %"class.JPH::Vec3", ptr %104, i32 0, i32 0
  %933 = getelementptr inbounds %union.anon, ptr %932, i32 0, i32 0
  %934 = getelementptr inbounds { double, double }, ptr %933, i32 0, i32 0
  %935 = extractvalue { double, double } %930, 0
  store double %935, ptr %934, align 16
  %936 = getelementptr inbounds { double, double }, ptr %933, i32 0, i32 1
  %937 = extractvalue { double, double } %930, 1
  store double %937, ptr %936, align 8
  %938 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 0
  %939 = load double, ptr %938, align 16
  %940 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 1
  %941 = load double, ptr %940, align 8
  %942 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %917, double %939, double %941)
          to label %943 unwind label %1028

943:                                              ; preds = %931
  %944 = getelementptr inbounds %"class.JPH::Vec3", ptr %103, i32 0, i32 0
  %945 = getelementptr inbounds %union.anon, ptr %944, i32 0, i32 0
  %946 = getelementptr inbounds { double, double }, ptr %945, i32 0, i32 0
  %947 = extractvalue { double, double } %942, 0
  store double %947, ptr %946, align 16
  %948 = getelementptr inbounds { double, double }, ptr %945, i32 0, i32 1
  %949 = extractvalue { double, double } %942, 1
  store double %949, ptr %948, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %107) #10
  %950 = load ptr, ptr %77, align 8, !tbaa !5
  %951 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %950, i32 0, i32 3
  %952 = load ptr, ptr %77, align 8, !tbaa !5
  %953 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %952, 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
  %954 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 0
  %955 = load double, ptr %954, align 16
  %956 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 1
  %957 = load double, ptr %956, align 8
  %958 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %953, double %955, double %957)
          to label %959 unwind label %1032

959:                                              ; preds = %943
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %110, ptr align 16 %87, i64 16, i1 false), !tbaa.struct !11
  %960 = getelementptr inbounds { double, double }, ptr %110, i32 0, i32 0
  %961 = load double, ptr %960, align 16
  %962 = getelementptr inbounds { double, double }, ptr %110, i32 0, i32 1
  %963 = load double, ptr %962, align 8
  %964 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %958, double %961, double %963)
          to label %965 unwind label %1032

965:                                              ; preds = %959
  %966 = getelementptr inbounds %"class.JPH::Vec3", ptr %108, i32 0, i32 0
  %967 = getelementptr inbounds %union.anon, ptr %966, i32 0, i32 0
  %968 = getelementptr inbounds { double, double }, ptr %967, i32 0, i32 0
  %969 = extractvalue { double, double } %964, 0
  store double %969, ptr %968, align 16
  %970 = getelementptr inbounds { double, double }, ptr %967, i32 0, i32 1
  %971 = extractvalue { double, double } %964, 1
  store double %971, ptr %970, align 8
  %972 = getelementptr inbounds { double, double }, ptr %108, i32 0, i32 0
  %973 = load double, ptr %972, align 16
  %974 = getelementptr inbounds { double, double }, ptr %108, i32 0, i32 1
  %975 = load double, ptr %974, align 8
  %976 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %951, double %973, double %975)
          to label %977 unwind label %1032

977:                                              ; preds = %965
  %978 = getelementptr inbounds %"class.JPH::Vec3", ptr %107, i32 0, i32 0
  %979 = getelementptr inbounds %union.anon, ptr %978, i32 0, i32 0
  %980 = getelementptr inbounds { double, double }, ptr %979, i32 0, i32 0
  %981 = extractvalue { double, double } %976, 0
  store double %981, ptr %980, align 16
  %982 = getelementptr inbounds { double, double }, ptr %979, i32 0, i32 1
  %983 = extractvalue { double, double } %976, 1
  store double %983, ptr %982, 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
  %984 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 0
  %985 = load double, ptr %984, align 16
  %986 = getelementptr inbounds { double, double }, ptr %113, i32 0, i32 1
  %987 = load double, ptr %986, align 8
  %988 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %90, double %985, double %987)
          to label %989 unwind label %1036

989:                                              ; preds = %977
  %990 = getelementptr inbounds %"class.JPH::Vec3", ptr %112, i32 0, i32 0
  %991 = getelementptr inbounds %union.anon, ptr %990, i32 0, i32 0
  %992 = getelementptr inbounds { double, double }, ptr %991, i32 0, i32 0
  %993 = extractvalue { double, double } %988, 0
  store double %993, ptr %992, align 16
  %994 = getelementptr inbounds { double, double }, ptr %991, i32 0, i32 1
  %995 = extractvalue { double, double } %988, 1
  store double %995, ptr %994, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %114, ptr align 16 %107, i64 16, i1 false), !tbaa.struct !11
  %996 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %997 = load double, ptr %996, align 16
  %998 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %999 = load double, ptr %998, align 8
  %1000 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %112, double %997, double %999)
          to label %1001 unwind label %1036

1001:                                             ; preds = %989
  %1002 = getelementptr inbounds %"class.JPH::Vec3", ptr %111, i32 0, i32 0
  %1003 = getelementptr inbounds %union.anon, ptr %1002, i32 0, i32 0
  %1004 = getelementptr inbounds { double, double }, ptr %1003, i32 0, i32 0
  %1005 = extractvalue { double, double } %1000, 0
  store double %1005, ptr %1004, align 16
  %1006 = getelementptr inbounds { double, double }, ptr %1003, i32 0, i32 1
  %1007 = extractvalue { double, double } %1000, 1
  store double %1007, ptr %1006, 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 %1045

1008:                                             ; preds = %805
  %1009 = landingpad { ptr, i32 }
          cleanup
  %1010 = extractvalue { ptr, i32 } %1009, 0
  store ptr %1010, ptr %23, align 8
  %1011 = extractvalue { ptr, i32 } %1009, 1
  store i32 %1011, ptr %24, align 4
  br label %1044

1012:                                             ; preds = %821, %809
  %1013 = landingpad { ptr, i32 }
          cleanup
  %1014 = extractvalue { ptr, i32 } %1013, 0
  store ptr %1014, ptr %23, align 8
  %1015 = extractvalue { ptr, i32 } %1013, 1
  store i32 %1015, ptr %24, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %88) #10
  br label %1043

1016:                                             ; preds = %841, %829
  %1017 = landingpad { ptr, i32 }
          cleanup
  %1018 = extractvalue { ptr, i32 } %1017, 0
  store ptr %1018, ptr %23, align 8
  %1019 = extractvalue { ptr, i32 } %1017, 1
  store i32 %1019, ptr %24, align 4
  br label %1042

1020:                                             ; preds = %870, %863, %861, %847
  %1021 = landingpad { ptr, i32 }
          cleanup
  %1022 = extractvalue { ptr, i32 } %1021, 0
  store ptr %1022, ptr %23, align 8
  %1023 = extractvalue { ptr, i32 } %1021, 1
  store i32 %1023, 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 %1042

1024:                                             ; preds = %901, %894, %892, %884
  %1025 = landingpad { ptr, i32 }
          cleanup
  %1026 = extractvalue { ptr, i32 } %1025, 0
  store ptr %1026, ptr %23, align 8
  %1027 = extractvalue { ptr, i32 } %1025, 1
  store i32 %1027, 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 %1042

1028:                                             ; preds = %931, %925, %915
  %1029 = landingpad { ptr, i32 }
          cleanup
  %1030 = extractvalue { ptr, i32 } %1029, 0
  store ptr %1030, ptr %23, align 8
  %1031 = extractvalue { ptr, i32 } %1029, 1
  store i32 %1031, ptr %24, align 4
  br label %1041

1032:                                             ; preds = %965, %959, %943
  %1033 = landingpad { ptr, i32 }
          cleanup
  %1034 = extractvalue { ptr, i32 } %1033, 0
  store ptr %1034, ptr %23, align 8
  %1035 = extractvalue { ptr, i32 } %1033, 1
  store i32 %1035, ptr %24, align 4
  br label %1040

1036:                                             ; preds = %989, %977
  %1037 = landingpad { ptr, i32 }
          cleanup
  %1038 = extractvalue { ptr, i32 } %1037, 0
  store ptr %1038, ptr %23, align 8
  %1039 = extractvalue { ptr, i32 } %1037, 1
  store i32 %1039, 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 %1040

1040:                                             ; preds = %1036, %1032
  call void @llvm.lifetime.end.p0(i64 16, ptr %107) #10
  br label %1041

1041:                                             ; preds = %1040, %1028
  call void @llvm.lifetime.end.p0(i64 16, ptr %103) #10
  br label %1042

1042:                                             ; preds = %1041, %1024, %1020, %1016
  call void @llvm.lifetime.end.p0(i64 16, ptr %90) #10
  br label %1043

1043:                                             ; preds = %1042, %1012
  call void @llvm.lifetime.end.p0(i64 16, ptr %87) #10
  br label %1044

1044:                                             ; preds = %1043, %1008
  call void @llvm.lifetime.end.p0(i64 16, ptr %86) #10
  br label %1201

1045:                                             ; preds = %1001, %802
  %1046 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 1
  %1047 = load ptr, ptr %1046, align 16, !tbaa !51
  %1048 = icmp ne ptr %1047, null
  br i1 %1048, label %1049, label %1158

1049:                                             ; preds = %1045
  %1050 = load ptr, ptr %46, align 8, !tbaa !5
  %1051 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1050, i32 0, i32 0
  %1052 = load ptr, ptr %1051, align 16, !tbaa !40
  %1053 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1052, i32 0, i32 8
  %1054 = load ptr, ptr %1053, align 16, !tbaa !52
  %1055 = icmp ne ptr %1054, null
  br i1 %1055, label %1056, label %1109

1056:                                             ; preds = %1049
  %1057 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 1
  %1058 = load ptr, ptr %1057, align 16, !tbaa !51
  %1059 = load ptr, ptr %46, align 8, !tbaa !5
  %1060 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1059, i32 0, i32 0
  %1061 = load ptr, ptr %1060, align 16, !tbaa !40
  %1062 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1061, i32 0, i32 8
  %1063 = load ptr, ptr %1062, align 16, !tbaa !52
  %1064 = load ptr, ptr %46, align 8, !tbaa !5
  %1065 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1064, i32 0, i32 0
  %1066 = load ptr, ptr %1065, align 16, !tbaa !40
  %1067 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1066, i32 0, i32 9
  %1068 = load ptr, ptr %46, align 8, !tbaa !5
  %1069 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1068, i32 0, i32 0
  %1070 = load ptr, ptr %1069, align 16, !tbaa !40
  %1071 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1070, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %115, ptr align 16 %1071, i64 16, i1 false), !tbaa.struct !11
  %1072 = load ptr, ptr %46, align 8, !tbaa !5
  %1073 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1072, i32 0, i32 0
  %1074 = load ptr, ptr %1073, align 16, !tbaa !40
  %1075 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1074, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %116, ptr align 16 %1075, i64 16, i1 false), !tbaa.struct !11
  %1076 = load ptr, ptr %46, align 8, !tbaa !5
  %1077 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1076, i32 0, i32 0
  %1078 = load ptr, ptr %1077, align 16, !tbaa !40
  %1079 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1078, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %117, ptr align 16 %1079, i64 16, i1 false), !tbaa.struct !11
  %1080 = load ptr, ptr %46, align 8, !tbaa !5
  %1081 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1080, i32 0, i32 0
  %1082 = load ptr, ptr %1081, align 16, !tbaa !40
  %1083 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1082, i32 0, i32 14
  %1084 = load ptr, ptr %1083, align 8, !tbaa !53
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %118, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %1085 = getelementptr inbounds { double, double }, ptr %115, i32 0, i32 0
  %1086 = load double, ptr %1085, align 16
  %1087 = getelementptr inbounds { double, double }, ptr %115, i32 0, i32 1
  %1088 = load double, ptr %1087, align 8
  %1089 = getelementptr inbounds { double, double }, ptr %116, i32 0, i32 0
  %1090 = load double, ptr %1089, align 16
  %1091 = getelementptr inbounds { double, double }, ptr %116, i32 0, i32 1
  %1092 = load double, ptr %1091, align 8
  %1093 = getelementptr inbounds { double, double }, ptr %117, i32 0, i32 0
  %1094 = load double, ptr %1093, align 16
  %1095 = getelementptr inbounds { double, double }, ptr %117, i32 0, i32 1
  %1096 = load double, ptr %1095, align 8
  %1097 = getelementptr inbounds { double, double }, ptr %118, i32 0, i32 0
  %1098 = load double, ptr %1097, align 16
  %1099 = getelementptr inbounds { double, double }, ptr %118, i32 0, i32 1
  %1100 = load double, ptr %1099, align 8
  %1101 = load ptr, ptr %1058, align 8, !tbaa !54
  %1102 = getelementptr inbounds ptr, ptr %1101, i64 8
  %1103 = load ptr, ptr %1102, align 8
  invoke void %1103(ptr noundef nonnull align 8 dereferenceable(8) %1058, ptr noundef %126, ptr noundef %1063, ptr noundef nonnull align 4 dereferenceable(4) %1067, double %1086, double %1088, double %1090, double %1092, double %1094, double %1096, ptr noundef %1084, double %1098, double %1100, ptr noundef nonnull align 16 dereferenceable(16) %72)
          to label %1104 unwind label %1105

1104:                                             ; preds = %1056
  br label %1157

1105:                                             ; preds = %1183, %1175, %1170, %1158, %1109, %1056
  %1106 = landingpad { ptr, i32 }
          cleanup
  %1107 = extractvalue { ptr, i32 } %1106, 0
  store ptr %1107, ptr %23, align 8
  %1108 = extractvalue { ptr, i32 } %1106, 1
  store i32 %1108, ptr %24, align 4
  br label %1201

1109:                                             ; preds = %1049
  %1110 = getelementptr inbounds %"class.JPH::CharacterVirtual", ptr %126, i32 0, i32 1
  %1111 = load ptr, ptr %1110, align 16, !tbaa !51
  %1112 = load ptr, ptr %46, align 8, !tbaa !5
  %1113 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1112, i32 0, i32 0
  %1114 = load ptr, ptr %1113, align 16, !tbaa !40
  %1115 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1114, i32 0, i32 6
  %1116 = load ptr, ptr %46, align 8, !tbaa !5
  %1117 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1116, i32 0, i32 0
  %1118 = load ptr, ptr %1117, align 16, !tbaa !40
  %1119 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1118, i32 0, i32 9
  %1120 = load ptr, ptr %46, align 8, !tbaa !5
  %1121 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1120, i32 0, i32 0
  %1122 = load ptr, ptr %1121, align 16, !tbaa !40
  %1123 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1122, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %119, ptr align 16 %1123, i64 16, i1 false), !tbaa.struct !11
  %1124 = load ptr, ptr %46, align 8, !tbaa !5
  %1125 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1124, i32 0, i32 0
  %1126 = load ptr, ptr %1125, align 16, !tbaa !40
  %1127 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1126, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %120, ptr align 16 %1127, i64 16, i1 false), !tbaa.struct !11
  %1128 = load ptr, ptr %46, align 8, !tbaa !5
  %1129 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1128, i32 0, i32 0
  %1130 = load ptr, ptr %1129, align 16, !tbaa !40
  %1131 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1130, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %121, ptr align 16 %1131, i64 16, i1 false), !tbaa.struct !11
  %1132 = load ptr, ptr %46, align 8, !tbaa !5
  %1133 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1132, i32 0, i32 0
  %1134 = load ptr, ptr %1133, align 16, !tbaa !40
  %1135 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Contact", ptr %1134, i32 0, i32 14
  %1136 = load ptr, ptr %1135, align 8, !tbaa !53
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %122, ptr align 16 %26, i64 16, i1 false), !tbaa.struct !11
  %1137 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 0
  %1138 = load double, ptr %1137, align 16
  %1139 = getelementptr inbounds { double, double }, ptr %119, i32 0, i32 1
  %1140 = load double, ptr %1139, align 8
  %1141 = getelementptr inbounds { double, double }, ptr %120, i32 0, i32 0
  %1142 = load double, ptr %1141, align 16
  %1143 = getelementptr inbounds { double, double }, ptr %120, i32 0, i32 1
  %1144 = load double, ptr %1143, align 8
  %1145 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 0
  %1146 = load double, ptr %1145, align 16
  %1147 = getelementptr inbounds { double, double }, ptr %121, i32 0, i32 1
  %1148 = load double, ptr %1147, align 8
  %1149 = getelementptr inbounds { double, double }, ptr %122, i32 0, i32 0
  %1150 = load double, ptr %1149, align 16
  %1151 = getelementptr inbounds { double, double }, ptr %122, i32 0, i32 1
  %1152 = load double, ptr %1151, align 8
  %1153 = load ptr, ptr %1111, align 8, !tbaa !54
  %1154 = getelementptr inbounds ptr, ptr %1153, i64 7
  %1155 = load ptr, ptr %1154, align 8
  invoke void %1155(ptr noundef nonnull align 8 dereferenceable(8) %1111, ptr noundef %126, ptr noundef nonnull align 4 dereferenceable(4) %1115, ptr noundef nonnull align 4 dereferenceable(4) %1119, double %1138, double %1140, double %1142, double %1144, double %1146, double %1148, ptr noundef %1136, double %1150, double %1152, ptr noundef nonnull align 16 dereferenceable(16) %72)
          to label %1156 unwind label %1105

1156:                                             ; preds = %1109
  br label %1157

1157:                                             ; preds = %1156, %1104
  br label %1158

1158:                                             ; preds = %1157, %1045
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %72, i64 16, i1 false), !tbaa.struct !11
  %1159 = load ptr, ptr %46, align 8, !tbaa !5
  %1160 = load i32, ptr %31, align 4, !tbaa !36
  %1161 = sext i32 %1160 to i64
  %1162 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %29, i64 noundef %1161)
          to label %1163 unwind label %1105

1163:                                             ; preds = %1158
  store ptr %1159, ptr %1162, align 8, !tbaa !5
  %1164 = load i32, ptr %31, align 4, !tbaa !36
  %1165 = add nsw i32 %1164, 1
  store i32 %1165, ptr %31, align 4, !tbaa !36
  %1166 = load ptr, ptr %46, align 8, !tbaa !5
  %1167 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1166, i32 0, i32 2
  %1168 = load float, ptr %1167, align 4, !tbaa !37
  %1169 = fcmp olt float %1168, 0x3E45798EE0000000
  br i1 %1169, label %1170, label %1175

1170:                                             ; preds = %1163
  %1171 = invoke noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %26)
          to label %1172 unwind label %1105

1172:                                             ; preds = %1170
  %1173 = fcmp olt float %1171, 0x3E45798EE0000000
  br i1 %1173, label %1174, label %1175

1174:                                             ; preds = %1172
  store i32 1, ptr %33, align 4
  br label %1194

1175:                                             ; preds = %1172, %1163
  %1176 = load ptr, ptr %46, align 8, !tbaa !5
  %1177 = getelementptr inbounds %"struct.JPH::CharacterVirtual::Constraint", ptr %1176, i32 0, i32 3
  %1178 = invoke noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %1177, float noundef 0x3E45798EE0000000)
          to label %1179 unwind label %1105

1179:                                             ; preds = %1175
  br i1 %1178, label %1183, label %1180

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

1183:                                             ; preds = %1179
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %123, ptr align 16 %27, i64 16, i1 false), !tbaa.struct !11
  %1184 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 0
  %1185 = load double, ptr %1184, align 16
  %1186 = getelementptr inbounds { double, double }, ptr %123, i32 0, i32 1
  %1187 = load double, ptr %1186, align 8
  %1188 = invoke noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %1185, double %1187)
          to label %1189 unwind label %1105

1189:                                             ; preds = %1183
  %1190 = fcmp olt float %1188, 0.000000e+00
  br i1 %1190, label %1191, label %1192

1191:                                             ; preds = %1189
  store i32 1, ptr %33, align 4
  br label %1194

1192:                                             ; preds = %1189
  br label %1193

1193:                                             ; preds = %1192, %1180
  store i32 0, ptr %33, align 4
  br label %1194

1194:                                             ; preds = %1193, %1191, %1174
  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 %1195

1195:                                             ; preds = %1194, %526, %483, %460
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  %1196 = load i32, ptr %33, align 4
  switch i32 %1196, label %1206 [
    i32 0, label %1197
  ]

1197:                                             ; preds = %1195
  br label %1198

1198:                                             ; preds = %1197
  %1199 = load i32, ptr %32, align 4, !tbaa !36
  %1200 = add i32 %1199, 1
  store i32 %1200, ptr %32, align 4, !tbaa !36
  br label %190, !llvm.loop !56

1201:                                             ; preds = %1105, %1044, %801
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %76) #10
  br label %1202

1202:                                             ; preds = %1201, %716
  call void @llvm.lifetime.end.p0(i64 16, ptr %72) #10
  br label %1203

1203:                                             ; preds = %1202, %712
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #10
  br label %1204

1204:                                             ; preds = %1203, %655, %638
  call void @llvm.lifetime.end.p0(i64 16, ptr %56) #10
  br label %1205

1205:                                             ; preds = %1204, %488, %463
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  br label %1208

1206:                                             ; preds = %1195, %195
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #10
  %1207 = load i32, ptr %33, align 4
  switch i32 %1207, label %1210 [
    i32 5, label %1209
  ]

1208:                                             ; preds = %1205, %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 %1213

1209:                                             ; preds = %1206
  store i32 0, ptr %33, align 4
  br label %1210

1210:                                             ; preds = %1209, %1206
  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
  %1211 = load i32, ptr %33, align 4
  switch i32 %1211, label %1222 [
    i32 0, label %1212
    i32 1, label %1212
  ]

1212:                                             ; preds = %1210, %1210, %129
  ret void

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

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

1215:                                             ; preds = %1214, %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 %1216

1216:                                             ; preds = %1215, %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 %1217

1217:                                             ; preds = %1216
  %1218 = load ptr, ptr %23, align 8
  %1219 = load i32, ptr %24, align 4
  %1220 = insertvalue { ptr, i32 } poison, ptr %1218, 0
  %1221 = insertvalue { ptr, i32 } %1220, i32 %1219, 1
  resume { ptr, i32 } %1221

1222:                                             ; preds = %1210
  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_16CharacterVirtual10ConstraintEZNKS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_14IgnoredContactENS7_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 172}
!18 = !{!"_ZTSN3JPH16CharacterVirtualE", !19, i64 0, !6, i64 144, !6, i64 152, !32, i64 160, !10, i64 164, !23, i64 168, !23, i64 172, !10, i64 176, !10, i64 180, !10, i64 184, !23, i64 188, !10, i64 192, !10, i64 196, !33, i64 200, !10, i64 204, !10, i64 208, !25, i64 224, !25, i64 240, !34, i64 256, !25, i64 272, !35, i64 288, !10, i64 312, !33, i64 316, !14, i64 320, !29, i64 328}
!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 = !{!"_ZTSN3JPH13EBackFaceModeE", !7, i64 0}
!33 = !{!"bool", !7, i64 0}
!34 = !{!"_ZTSN3JPH4QuatE", !27, i64 0}
!35 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !14, i64 0, !14, i64 8, !6, i64 16}
!36 = !{!23, !23, i64 0}
!37 = !{!38, !10, i64 12}
!38 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !6, i64 0, !10, i64 8, !10, i64 12, !25, i64 16, !26, i64 32, !33, i64 48}
!39 = !{!38, !10, i64 8}
!40 = !{!38, !6, i64 0}
!41 = !{!42, !33, i64 113}
!42 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !25, i64 0, !25, i64 16, !25, i64 32, !25, i64 48, !10, i64 64, !10, i64 68, !29, i64 72, !6, i64 80, !30, i64 88, !43, i64 92, !33, i64 93, !14, i64 96, !6, i64 104, !33, i64 112, !33, i64 113, !33, i64 114}
!43 = !{!"_ZTSN3JPH11EMotionTypeE", !7, i64 0}
!44 = !{i8 0, i8 2}
!45 = !{}
!46 = !{!42, !33, i64 112}
!47 = !{!42, !33, i64 114}
!48 = !{!18, !10, i64 176}
!49 = !{!38, !33, i64 48}
!50 = distinct !{!50, !16}
!51 = !{!18, !6, i64 144}
!52 = !{!42, !6, i64 80}
!53 = !{!42, !6, i64 104}
!54 = !{!55, !55, i64 0}
!55 = !{!"vtable pointer", !8, i64 0}
!56 = distinct !{!56, !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.38" = type { %"class.JPH::STLTempAllocator.39", i64, i64, ptr }
%"class.JPH::STLTempAllocator.39" = 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(8) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS_6BodyIDERNS_10SubShapeIDEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32), ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) 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 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332), 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 @_ZNK3JPH16CharacterVirtual16SolveConstraintsENS_4Vec3EffRNS_5ArrayINS0_10ConstraintENS_16STLTempAllocatorIS3_EEEERNS2_INS0_14IgnoredContactENS4_IS8_EEEERfRS1_RNS_13TempAllocatorE(ptr noundef nonnull align 16 dereferenceable(332) %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.38", align 8
  %13 = alloca %"class.JPH::STLTempAllocator.39", align 8
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::Array.38", align 8
  %16 = alloca %"class.JPH::STLTempAllocator.39", 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 %432

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 %.preheader359 unwind label %47

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

._crit_edge:                                      ; preds = %54, %.preheader359
  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 %435

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

.lr.ph:                                           ; preds = %.preheader359, %54
  %.0262393 = phi i64 [ %55, %54 ], [ 0, %.preheader359 ]
  %51 = invoke noundef nonnull align 16 dereferenceable(49) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %5, i64 noundef %.0262393)
          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 %.0262393)
          to label %54 unwind label %49

54:                                               ; preds = %52
  store ptr %51, ptr %53, align 8, !tbaa !11
  %55 = add nuw i64 %.0262393, 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.5199.0..sroa_idx = getelementptr inbounds i8, ptr %8, i64 8
  store double %60, ptr %.sroa.5199.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 172
  %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
  %.not422 = icmp eq i32 %64, 0
  br i1 %.not422, label %.thread338, label %.lr.ph419

.lr.ph419:                                        ; preds = %.preheader
  %65 = getelementptr inbounds i8, ptr %17, i64 8
  %.sroa.2171.0..sroa_idx = getelementptr inbounds i8, ptr %14, i64 8
  %66 = getelementptr inbounds i8, ptr %0, i64 176
  %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 144
  br label %84

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

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

84:                                               ; preds = %.lr.ph419, %425
  %.0418 = phi float [ %4, %.lr.ph419 ], [ %191, %425 ]
  %.sroa.6.0417 = phi double [ %2, %.lr.ph419 ], [ %.sroa.6.2.ph, %425 ]
  %.sroa.0200.0416 = phi double [ %1, %.lr.ph419 ], [ %.sroa.0200.2.ph, %425 ]
  %.0263415 = phi i32 [ 0, %.lr.ph419 ], [ %411, %425 ]
  %.0266414 = phi i32 [ 0, %.lr.ph419 ], [ %426, %425 ]
  %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)
  %.not394 = icmp eq ptr %85, %86
  br i1 %.not394, label %._crit_edge398, label %.lr.ph397

._crit_edge398:                                   ; 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_16CharacterVirtual10ConstraintEZNKS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_14IgnoredContactENS7_ISB_EEEERfRS5_RNS_13TempAllocatorEE3$_0EEvT_SK_T0_"(ptr noundef %87, ptr noundef %88)
          to label %125 unwind label %128

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

91:                                               ; preds = %.lr.ph397
  %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 %.0272395, i64 16
  %.sroa.0170.0.copyload = load double, ptr %14, align 16
  %.sroa.2171.0.copyload = load double, ptr %.sroa.2171.0..sroa_idx, align 8, !tbaa !5
  %95 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %94, double %.sroa.0170.0.copyload, double %.sroa.2171.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 %.0272395, i64 12
  store float %99, ptr %100, align 4, !tbaa !35
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #11
  %101 = load float, ptr %100, align 4, !tbaa !35
  %102 = fcmp olt float %101, 0x3EB0C6F7A0000000
  br i1 %102, label %103, label %107

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

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

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

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

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

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

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 %.0272395, i64 8
  store float %121, ptr %122, align 8, !tbaa !37
  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 %.0272395, i64 64
  %.not = icmp eq ptr %124, %86
  br i1 %.not, label %._crit_edge398, label %.lr.ph397

125:                                              ; preds = %._crit_edge398
  %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)
  %.not291399 = icmp eq ptr %126, %127
  br i1 %.not291399, label %._crit_edge403, label %.lr.ph402

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

.lr.ph402:                                        ; preds = %125, %169
  %.0276400 = phi ptr [ %170, %169 ], [ %126, %125 ]
  %130 = load ptr, ptr %.0276400, align 8, !tbaa !11
  %131 = getelementptr inbounds i8, ptr %130, i64 8
  %132 = load float, ptr %131, align 8, !tbaa !37
  %133 = fcmp ult float %132, %.0418
  br i1 %133, label %136, label %134

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

.loopexit353:                                     ; preds = %145, %149
  %lpad.loopexit = landingpad { ptr, i32 }
          cleanup
  br label %433

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

136:                                              ; preds = %.lr.ph402
  %137 = load ptr, ptr %130, align 16, !tbaa !38
  %138 = getelementptr inbounds i8, ptr %137, i64 113
  %139 = load i8, ptr %138, align 1, !tbaa !39, !range !42, !noundef !43
  %140 = trunc nuw i8 %139 to i1
  br i1 %140, label %169, label %141

141:                                              ; preds = %136
  %142 = getelementptr inbounds i8, ptr %137, i64 112
  %143 = load i8, ptr %142, align 16, !tbaa !44, !range !42, !noundef !43
  %144 = trunc nuw i8 %143 to i1
  br i1 %144, label %.loopexit, label %145

145:                                              ; preds = %141
  %.sroa.0114.0.copyload = load double, ptr %14, align 16
  %.sroa.2115.0.copyload = load double, ptr %.sroa.2171.0..sroa_idx, align 8, !tbaa !5
  %146 = invoke noundef zeroext i1 @_ZNK3JPH16CharacterVirtual13HandleContactENS_4Vec3ERNS0_10ConstraintEf(ptr noundef nonnull align 16 dereferenceable(332) %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 %.loopexit353

147:                                              ; preds = %145
  %148 = load ptr, ptr %130, align 16, !tbaa !38
  br i1 %146, label %154, label %149

149:                                              ; preds = %147
  %150 = getelementptr inbounds i8, ptr %148, i64 113
  store i8 1, ptr %150, align 1, !tbaa !39
  %151 = getelementptr inbounds i8, ptr %148, i64 72
  %152 = getelementptr inbounds i8, ptr %148, i64 88
  %153 = invoke noundef nonnull align 4 dereferenceable(8) ptr @_ZN3JPH5ArrayINS_16CharacterVirtual14IgnoredContactENS_16STLTempAllocatorIS2_EEE12emplace_backIJRNS_6BodyIDERNS_10SubShapeIDEEEERS2_DpOT_(ptr noundef nonnull align 8 dereferenceable(32) %6, ptr noundef nonnull align 4 dereferenceable(4) %151, ptr noundef nonnull align 4 dereferenceable(4) %152)
          to label %169 unwind label %.loopexit353

154:                                              ; preds = %147
  %155 = getelementptr inbounds i8, ptr %148, i64 112
  store i8 1, ptr %155, align 16, !tbaa !44
  br label %.loopexit

.loopexit:                                        ; preds = %141, %154
  %156 = phi ptr [ %148, %154 ], [ %137, %141 ]
  %157 = getelementptr inbounds i8, ptr %130, i64 8
  %158 = getelementptr inbounds i8, ptr %156, i64 114
  %159 = load i8, ptr %158, align 2, !tbaa !45, !range !42, !noundef !43
  %160 = trunc nuw i8 %159 to i1
  br i1 %160, label %.thread334, label %161

161:                                              ; preds = %.loopexit
  %162 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %163 unwind label %167

163:                                              ; preds = %161
  %164 = extractvalue { double, double } %162, 0
  %165 = extractvalue { double, double } %162, 1
  %166 = getelementptr inbounds i8, ptr %130, i64 16
  store double %164, ptr %166, align 16
  %.sroa.5113.0..sroa_idx = getelementptr inbounds i8, ptr %130, i64 24
  store double %165, ptr %.sroa.5113.0..sroa_idx, align 8, !tbaa !5
  br label %.thread334

167:                                              ; preds = %161
  %168 = landingpad { ptr, i32 }
          cleanup
  br label %433

169:                                              ; preds = %136, %149
  %170 = getelementptr inbounds i8, ptr %.0276400, i64 8
  %.not291 = icmp eq ptr %170, %127
  br i1 %.not291, label %._crit_edge403, label %.lr.ph402

171:                                              ; preds = %134
  %172 = extractvalue { double, double } %135, 0
  %173 = extractvalue { double, double } %135, 1
  %174 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %172, double %173)
  %175 = load float, ptr %7, align 4, !tbaa !8
  %176 = fadd float %.0418, %175
  store float %176, ptr %7, align 4, !tbaa !8
  br label %.thread338

._crit_edge403:                                   ; preds = %125, %169
  %177 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %.0418)
          to label %178 unwind label %.loopexit.split-lp355

178:                                              ; preds = %._crit_edge403
  %179 = extractvalue { double, double } %177, 0
  %180 = extractvalue { double, double } %177, 1
  %181 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %179, double %180)
  %182 = load float, ptr %7, align 4, !tbaa !8
  %183 = fadd float %.0418, %182
  store float %183, ptr %7, align 4, !tbaa !8
  br label %.thread338

.loopexit354:                                     ; preds = %.thread334
  %lpad.loopexit356 = landingpad { ptr, i32 }
          cleanup
  br label %433

.loopexit.split-lp355:                            ; preds = %._crit_edge403
  %lpad.loopexit.split-lp357 = landingpad { ptr, i32 }
          cleanup
  br label %433

.thread334:                                       ; preds = %.loopexit, %163
  %184 = load float, ptr %157, align 8, !tbaa !37
  %185 = invoke { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef %184)
          to label %186 unwind label %.loopexit354

186:                                              ; preds = %.thread334
  %187 = extractvalue { double, double } %185, 0
  %188 = extractvalue { double, double } %185, 1
  %189 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %187, double %188)
  %190 = load float, ptr %157, align 8, !tbaa !37
  %191 = fsub float %.0418, %190
  %192 = load float, ptr %7, align 4, !tbaa !8
  %193 = fadd float %190, %192
  store float %193, ptr %7, align 4, !tbaa !8
  %194 = load float, ptr %66, align 16, !tbaa !46
  %195 = fcmp olt float %191, %194
  br i1 %195, label %.thread338, label %196

196:                                              ; preds = %186
  %197 = load float, ptr %157, align 8, !tbaa !37
  %198 = fcmp ogt float %197, 0x3F1A36E2E0000000
  %.1264 = select i1 %198, i32 0, i32 %.0263415
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #11
  %199 = getelementptr inbounds i8, ptr %130, i64 32
  %200 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %199)
          to label %201 unwind label %238

201:                                              ; preds = %196
  %202 = extractvalue { double, double } %200, 0
  store double %202, ptr %20, align 16
  %203 = extractvalue { double, double } %200, 1
  store double %203, ptr %67, align 8
  %204 = getelementptr inbounds i8, ptr %130, i64 48
  %205 = load i8, ptr %204, align 16, !tbaa !47, !range !42, !noundef !43
  %206 = trunc nuw i8 %205 to i1
  br i1 %206, label %207, label %248

207:                                              ; preds = %201
  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
  %208 = 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
  %209 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %208, double %.sroa.0102.0.copyload, double %.sroa.2103.0.copyload)
          to label %210 unwind label %240

210:                                              ; preds = %207
  %211 = extractvalue { double, double } %209, 0
  %212 = extractvalue { double, double } %209, 1
  %213 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %20, double %211, double %212)
          to label %214 unwind label %240

214:                                              ; preds = %210
  %215 = extractvalue { double, double } %213, 0
  store double %215, ptr %21, align 16
  %216 = extractvalue { double, double } %213, 1
  store double %216, ptr %69, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #11
  %217 = getelementptr inbounds i8, ptr %130, i64 16
  %.sroa.0100.0.copyload = load double, ptr %217, 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
  %218 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.0100.0.copyload, double %.sroa.2101.0.copyload)
          to label %219 unwind label %242

219:                                              ; preds = %214
  %220 = extractvalue { double, double } %218, 0
  store double %220, ptr %22, align 16
  %221 = extractvalue { double, double } %218, 1
  store double %221, 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
  %222 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %22, double %.sroa.094.0.copyload, double %.sroa.295.0.copyload)
  store float %222, ptr %25, align 4, !tbaa !8
  %223 = 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)
  %224 = load float, ptr %223, 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
  %225 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %224, double %.sroa.092.0.copyload, double %.sroa.293.0.copyload)
          to label %226 unwind label %244

226:                                              ; preds = %219
  %227 = extractvalue { double, double } %225, 0
  store double %227, ptr %23, align 16
  %228 = extractvalue { double, double } %225, 1
  store double %228, ptr %71, align 8
  %229 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %230 = invoke { double, double } @_ZNK3JPH4Vec3dvEf(ptr noundef nonnull align 16 dereferenceable(16) %23, float noundef %229)
          to label %231 unwind label %244

231:                                              ; preds = %226
  %232 = extractvalue { double, double } %230, 0
  %233 = extractvalue { double, double } %230, 1
  %234 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %232, double %233)
          to label %235 unwind label %244

235:                                              ; preds = %231
  %236 = extractvalue { double, double } %234, 0
  %237 = extractvalue { double, double } %234, 1
  store double %236, ptr %14, align 16
  store double %237, ptr %.sroa.2171.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 %248

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

240:                                              ; preds = %210, %207
  %241 = landingpad { ptr, i32 }
          cleanup
  br label %247

242:                                              ; preds = %214
  %243 = landingpad { ptr, i32 }
          cleanup
  br label %246

244:                                              ; preds = %231, %226, %219
  %245 = 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 %246

246:                                              ; preds = %244, %242
  %.pn293 = phi { ptr, i32 } [ %245, %244 ], [ %243, %242 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #11
  br label %247

247:                                              ; preds = %246, %240
  %.pn293.pn = phi { ptr, i32 } [ %.pn293, %246 ], [ %241, %240 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #11
  br label %431

248:                                              ; preds = %235, %201
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #11
  %249 = getelementptr inbounds i8, ptr %130, i64 16
  %.sroa.090.0.copyload = load double, ptr %249, 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
  %250 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.090.0.copyload, double %.sroa.291.0.copyload)
          to label %251 unwind label %268

251:                                              ; preds = %248
  %252 = extractvalue { double, double } %250, 0
  store double %252, ptr %26, align 16
  %253 = extractvalue { double, double } %250, 1
  store double %253, 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
  %254 = 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
  %255 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %254, double %.sroa.084.0.copyload, double %.sroa.285.0.copyload)
          to label %256 unwind label %270

256:                                              ; preds = %251
  %257 = extractvalue { double, double } %255, 0
  %258 = extractvalue { double, double } %255, 1
  %259 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %257, double %258)
          to label %260 unwind label %270

260:                                              ; preds = %256
  %261 = extractvalue { double, double } %259, 0
  store double %261, ptr %27, align 16
  %262 = extractvalue { double, double } %259, 1
  store double %262, ptr %73, align 8
  %263 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %264 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %265 = sext i32 %.1264 to i64
  %266 = getelementptr inbounds ptr, ptr %264, i64 %265
  %267 = icmp ult ptr %263, %266
  br i1 %267, label %.lr.ph410, label %._crit_edge411.thread

._crit_edge411:                                   ; preds = %298
  %.not296 = icmp eq ptr %.3284, null
  br i1 %.not296, label %._crit_edge411.thread, label %303

268:                                              ; preds = %248
  %269 = landingpad { ptr, i32 }
          cleanup
  br label %430

270:                                              ; preds = %256, %251
  %271 = landingpad { ptr, i32 }
          cleanup
  br label %429

.lr.ph410:                                        ; preds = %260, %298
  %.0277408 = phi float [ %.3280, %298 ], [ 0.000000e+00, %260 ]
  %.0281407 = phi ptr [ %.3284, %298 ], [ null, %260 ]
  %.0285406 = phi ptr [ %299, %298 ], [ %263, %260 ]
  %272 = load ptr, ptr %.0285406, align 8, !tbaa !11
  %.not305 = icmp eq ptr %272, %130
  br i1 %.not305, label %298, label %273

273:                                              ; preds = %.lr.ph410
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %28) #11
  %274 = getelementptr inbounds i8, ptr %272, i64 32
  %275 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %274)
          to label %276 unwind label %292

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

282:                                              ; preds = %276
  %283 = extractvalue { double, double } %281, 0
  store double %283, ptr %29, align 16
  %284 = extractvalue { double, double } %281, 1
  store double %284, 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
  %285 = 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
  %286 = fcmp ogt float %285, %.0277408
  br i1 %286, label %287, label %296

287:                                              ; preds = %282
  %.sroa.062.0.copyload = load double, ptr %20, align 16
  %.sroa.263.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %288 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %28, double %.sroa.062.0.copyload, double %.sroa.263.0.copyload)
  %289 = call float @llvm.fabs.f32(float %288)
  %or.cond = fcmp olt float %289, 0x3FEF7CEDA0000000
  br i1 %or.cond, label %290, label %296

290:                                              ; preds = %287
  %291 = load ptr, ptr %.0285406, align 8, !tbaa !11
  br label %296

292:                                              ; preds = %273
  %293 = landingpad { ptr, i32 }
          cleanup
  br label %297

294:                                              ; preds = %276
  %295 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %29) #11
  br label %297

296:                                              ; preds = %287, %290, %282
  %.2283 = phi ptr [ %.0281407, %282 ], [ %291, %290 ], [ %.0281407, %287 ]
  %.2279 = phi float [ %.0277408, %282 ], [ %285, %290 ], [ %.0277408, %287 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #11
  br label %298

297:                                              ; preds = %294, %292
  %.pn306 = phi { ptr, i32 } [ %295, %294 ], [ %293, %292 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %28) #11
  br label %429

298:                                              ; preds = %.lr.ph410, %296
  %.3284 = phi ptr [ %.2283, %296 ], [ %.0281407, %.lr.ph410 ]
  %.3280 = phi float [ %.2279, %296 ], [ %.0277408, %.lr.ph410 ]
  %299 = getelementptr inbounds i8, ptr %.0285406, i64 8
  %300 = call noundef ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEE4dataEv(ptr noundef nonnull align 8 dereferenceable(32) %15)
  %301 = getelementptr inbounds ptr, ptr %300, i64 %265
  %302 = icmp ult ptr %299, %301
  br i1 %302, label %.lr.ph410, label %._crit_edge411, !llvm.loop !48

303:                                              ; preds = %._crit_edge411
  %304 = getelementptr inbounds i8, ptr %.3284, i64 32
  %305 = invoke { double, double } @_ZNK3JPH5Plane9GetNormalEv(ptr noundef nonnull align 16 dereferenceable(16) %304)
          to label %306 unwind label %365

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

310:                                              ; preds = %306
  %311 = extractvalue { double, double } %309, 0
  store double %311, ptr %30, align 16
  %312 = extractvalue { double, double } %309, 1
  store double %312, ptr %76, align 8
  %313 = invoke { double, double } @_ZNK3JPH4Vec310NormalizedEv(ptr noundef nonnull align 16 dereferenceable(16) %30)
          to label %314 unwind label %367

314:                                              ; preds = %310
  %315 = extractvalue { double, double } %313, 0
  %316 = extractvalue { double, double } %313, 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
  %317 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %27, double %315, double %316)
  %318 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %317, double %315, double %316)
          to label %319 unwind label %369

319:                                              ; preds = %314
  %320 = extractvalue { double, double } %318, 0
  store double %320, ptr %31, align 16
  %321 = extractvalue { double, double } %318, 1
  store double %321, 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
  %322 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %249, double %307, double %308)
  store float %322, ptr %33, align 4, !tbaa !8
  %323 = 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)
  %324 = load float, ptr %323, align 4, !tbaa !8
  %325 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %324, double %307, double %308)
          to label %326 unwind label %371

326:                                              ; preds = %319
  %327 = extractvalue { double, double } %325, 0
  %328 = extractvalue { double, double } %325, 1
  %329 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %249, double %327, double %328)
  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
  %330 = getelementptr inbounds i8, ptr %.3284, i64 16
  %.sroa.044.0.copyload = load double, ptr %20, align 16
  %.sroa.245.0.copyload = load double, ptr %67, align 8, !tbaa !5
  %331 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %330, double %.sroa.044.0.copyload, double %.sroa.245.0.copyload)
  store float %331, ptr %35, align 4, !tbaa !8
  %332 = 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)
  %333 = load float, ptr %332, 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
  %334 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %333, double %.sroa.042.0.copyload, double %.sroa.243.0.copyload)
          to label %335 unwind label %373

335:                                              ; preds = %326
  %336 = extractvalue { double, double } %334, 0
  %337 = extractvalue { double, double } %334, 1
  %338 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %330, double %336, double %337)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %35) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %34) #11
  %339 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %249, double %315, double %316)
  %340 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %339, double %315, double %316)
          to label %341 unwind label %375

341:                                              ; preds = %335
  %342 = extractvalue { double, double } %340, 0
  %343 = extractvalue { double, double } %340, 1
  %344 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %249, double %342, double %343)
          to label %345 unwind label %375

345:                                              ; preds = %341
  %346 = extractvalue { double, double } %344, 0
  %347 = extractvalue { double, double } %344, 1
  %348 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %330, double %315, double %316)
  %349 = invoke { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %348, double %315, double %316)
          to label %350 unwind label %377

350:                                              ; preds = %345
  %351 = extractvalue { double, double } %349, 0
  %352 = extractvalue { double, double } %349, 1
  %353 = invoke { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %330, double %351, double %352)
          to label %354 unwind label %377

354:                                              ; preds = %350
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %36) #11
  %355 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %31, double %346, double %347)
          to label %356 unwind label %379

356:                                              ; preds = %354
  %357 = extractvalue { double, double } %353, 1
  %358 = extractvalue { double, double } %353, 0
  %359 = extractvalue { double, double } %355, 0
  store double %359, ptr %36, align 16
  %360 = extractvalue { double, double } %355, 1
  store double %360, ptr %78, align 8
  %361 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %36, double %358, double %357)
          to label %362 unwind label %379

362:                                              ; preds = %356
  %363 = extractvalue { double, double } %361, 0
  %364 = extractvalue { double, double } %361, 1
  store double %363, ptr %27, align 16
  store double %364, 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_edge411.thread

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

367:                                              ; preds = %310, %306
  %368 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %30) #11
  br label %429

369:                                              ; preds = %314
  %370 = landingpad { ptr, i32 }
          cleanup
  br label %381

371:                                              ; preds = %319
  %372 = 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 %381

373:                                              ; preds = %326
  %374 = 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 %381

375:                                              ; preds = %341, %335
  %376 = landingpad { ptr, i32 }
          cleanup
  br label %381

377:                                              ; preds = %350, %345
  %378 = landingpad { ptr, i32 }
          cleanup
  br label %381

379:                                              ; preds = %356, %354
  %380 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %36) #11
  br label %381

381:                                              ; preds = %375, %379, %377, %373, %371, %369
  %.pn297.pn.pn = phi { ptr, i32 } [ %374, %373 ], [ %372, %371 ], [ %370, %369 ], [ %376, %375 ], [ %380, %379 ], [ %378, %377 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %31) #11
  br label %429

._crit_edge411.thread:                            ; preds = %260, %362, %._crit_edge411
  %382 = load ptr, ptr %79, align 16, !tbaa !49
  %.not303 = icmp eq ptr %382, null
  br i1 %.not303, label %408, label %383

383:                                              ; preds = %._crit_edge411.thread
  %384 = load ptr, ptr %130, align 16, !tbaa !38
  %385 = getelementptr inbounds i8, ptr %384, i64 80
  %386 = load ptr, ptr %385, align 16, !tbaa !50
  %.not304 = icmp eq ptr %386, null
  br i1 %.not304, label %398, label %387

387:                                              ; preds = %383
  %388 = getelementptr inbounds i8, ptr %384, i64 88
  %.sroa.019.0.copyload = load double, ptr %384, align 16
  %.sroa.220.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 8
  %.sroa.220.0.copyload = load double, ptr %.sroa.220.0..sroa_idx, align 8, !tbaa !5
  %389 = getelementptr inbounds i8, ptr %384, i64 32
  %.sroa.017.0.copyload = load double, ptr %389, align 16
  %.sroa.218.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 40
  %.sroa.218.0.copyload = load double, ptr %.sroa.218.0..sroa_idx, align 8, !tbaa !5
  %390 = getelementptr inbounds i8, ptr %384, i64 16
  %.sroa.015.0.copyload = load double, ptr %390, align 16
  %.sroa.216.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 24
  %.sroa.216.0.copyload = load double, ptr %.sroa.216.0..sroa_idx, align 8, !tbaa !5
  %391 = getelementptr inbounds i8, ptr %384, i64 104
  %392 = load ptr, ptr %391, align 8, !tbaa !51
  %.sroa.013.0.copyload = load double, ptr %14, align 16
  %.sroa.214.0.copyload = load double, ptr %.sroa.2171.0..sroa_idx, align 8, !tbaa !5
  %393 = load ptr, ptr %382, align 8, !tbaa !52
  %394 = getelementptr inbounds i8, ptr %393, i64 64
  %395 = load ptr, ptr %394, align 8
  invoke void %395(ptr noundef nonnull align 8 dereferenceable(8) %382, ptr noundef nonnull %0, ptr noundef nonnull %386, ptr noundef nonnull align 4 dereferenceable(4) %388, double %.sroa.019.0.copyload, double %.sroa.220.0.copyload, double %.sroa.017.0.copyload, double %.sroa.218.0.copyload, double %.sroa.015.0.copyload, double %.sroa.216.0.copyload, ptr noundef %392, double %.sroa.013.0.copyload, double %.sroa.214.0.copyload, ptr noundef nonnull align 16 dereferenceable(16) %27)
          to label %408 unwind label %396

396:                                              ; preds = %408, %398, %387
  %397 = landingpad { ptr, i32 }
          cleanup
  br label %429

398:                                              ; preds = %383
  %399 = getelementptr inbounds i8, ptr %384, i64 72
  %400 = getelementptr inbounds i8, ptr %384, i64 88
  %.sroa.011.0.copyload = load double, ptr %384, align 16
  %.sroa.212.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 8
  %.sroa.212.0.copyload = load double, ptr %.sroa.212.0..sroa_idx, align 8, !tbaa !5
  %401 = getelementptr inbounds i8, ptr %384, i64 32
  %.sroa.09.0.copyload = load double, ptr %401, align 16
  %.sroa.210.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 40
  %.sroa.210.0.copyload = load double, ptr %.sroa.210.0..sroa_idx, align 8, !tbaa !5
  %402 = getelementptr inbounds i8, ptr %384, i64 16
  %.sroa.07.0.copyload = load double, ptr %402, align 16
  %.sroa.28.0..sroa_idx = getelementptr inbounds i8, ptr %384, i64 24
  %.sroa.28.0.copyload = load double, ptr %.sroa.28.0..sroa_idx, align 8, !tbaa !5
  %403 = getelementptr inbounds i8, ptr %384, i64 104
  %404 = load ptr, ptr %403, align 8, !tbaa !51
  %.sroa.05.0.copyload = load double, ptr %14, align 16
  %.sroa.26.0.copyload = load double, ptr %.sroa.2171.0..sroa_idx, align 8, !tbaa !5
  %405 = load ptr, ptr %382, align 8, !tbaa !52
  %406 = getelementptr inbounds i8, ptr %405, i64 56
  %407 = load ptr, ptr %406, align 8
  invoke void %407(ptr noundef nonnull align 8 dereferenceable(8) %382, ptr noundef nonnull %0, ptr noundef nonnull align 4 dereferenceable(4) %399, ptr noundef nonnull align 4 dereferenceable(4) %400, 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 %404, double %.sroa.05.0.copyload, double %.sroa.26.0.copyload, ptr noundef nonnull align 16 dereferenceable(16) %27)
          to label %408 unwind label %396

408:                                              ; preds = %387, %398, %._crit_edge411.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
  %409 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_16CharacterVirtual10ConstraintENS_16STLTempAllocatorIS3_EEEixEm(ptr noundef nonnull align 8 dereferenceable(32) %15, i64 noundef %265)
          to label %410 unwind label %396

410:                                              ; preds = %408
  store ptr %130, ptr %409, align 8, !tbaa !11
  %411 = add nsw i32 %.1264, 1
  %412 = getelementptr inbounds i8, ptr %130, i64 12
  %413 = load float, ptr %412, align 4, !tbaa !35
  %414 = fcmp olt float %413, 0x3E45798EE0000000
  br i1 %414, label %415, label %418

415:                                              ; preds = %410
  %416 = call noundef float @_ZNK3JPH4Vec38LengthSqEv(ptr noundef nonnull align 16 dereferenceable(16) %14)
  %417 = fcmp olt float %416, 0x3E45798EE0000000
  br i1 %417, label %424, label %418

418:                                              ; preds = %415, %410
  %419 = call noundef zeroext i1 @_ZNK3JPH4Vec310IsNearZeroEf(ptr noundef nonnull align 16 dereferenceable(16) %249, float noundef 0x3E45798EE0000000)
  br i1 %419, label %421, label %420

420:                                              ; preds = %418
  %.sroa.0200.0.copyload201 = load double, ptr %249, align 16
  %.sroa.6.0.copyload203 = load double, ptr %.sroa.291.0..sroa_idx, align 8, !tbaa !5
  br label %425

421:                                              ; preds = %418
  %422 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.0200.0416, double %.sroa.6.0417)
  %423 = fcmp olt float %422, 0.000000e+00
  br i1 %423, label %424, label %425

424:                                              ; preds = %415, %421
  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 %.thread338

425:                                              ; preds = %421, %420
  %.sroa.0200.2.ph = phi double [ %.sroa.0200.0.copyload201, %420 ], [ %.sroa.0200.0416, %421 ]
  %.sroa.6.2.ph = phi double [ %.sroa.6.0.copyload203, %420 ], [ %.sroa.6.0417, %421 ]
  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
  %426 = add nuw i32 %.0266414, 1
  %427 = load i32, ptr %61, align 4, !tbaa !15
  %428 = icmp ult i32 %426, %427
  br i1 %428, label %84, label %.thread338, !llvm.loop !54

429:                                              ; preds = %297, %396, %367, %381, %365, %270
  %.pn306.pn.pn = phi { ptr, i32 } [ %271, %270 ], [ %.pn306, %297 ], [ %397, %396 ], [ %366, %365 ], [ %.pn297.pn.pn, %381 ], [ %368, %367 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #11
  br label %430

430:                                              ; preds = %429, %268
  %.pn306.pn.pn.pn = phi { ptr, i32 } [ %.pn306.pn.pn, %429 ], [ %269, %268 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #11
  br label %431

431:                                              ; preds = %430, %247, %238
  %.pn306.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn306.pn.pn.pn, %430 ], [ %.pn293.pn, %247 ], [ %239, %238 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #11
  br label %433

.thread338:                                       ; preds = %425, %186, %.preheader, %171, %178, %424
  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 %432

432:                                              ; preds = %.thread338, %39
  ret void

433:                                              ; preds = %.loopexit354, %.loopexit.split-lp355, %.loopexit353, %.loopexit.split-lp, %128, %116, %105, %167, %431, %82
  %.pn314.pn.pn = phi { ptr, i32 } [ %83, %82 ], [ %129, %128 ], [ %117, %116 ], [ %106, %105 ], [ %.pn306.pn.pn.pn.pn, %431 ], [ %168, %167 ], [ %lpad.loopexit, %.loopexit353 ], [ %lpad.loopexit.split-lp, %.loopexit.split-lp ], [ %lpad.loopexit356, %.loopexit354 ], [ %lpad.loopexit.split-lp357, %.loopexit.split-lp355 ]
  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 %434

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

435:                                              ; preds = %434, %49, %47
  %.pn319 = phi { ptr, i32 } [ %50, %49 ], [ %.pn314.pn.pn.pn, %434 ], [ %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 } %.pn319
}

; 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_16CharacterVirtual10ConstraintEZNKS1_16SolveConstraintsENS_4Vec3EffRNS_5ArrayIS2_NS_16STLTempAllocatorIS2_EEEERNS6_INS1_14IgnoredContactENS7_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 172}
!16 = !{!"_ZTSN3JPH16CharacterVirtualE", !17, i64 0, !12, i64 144, !12, i64 152, !31, i64 160, !9, i64 164, !21, i64 168, !21, i64 172, !9, i64 176, !9, i64 180, !9, i64 184, !21, i64 188, !9, i64 192, !9, i64 196, !32, i64 200, !9, i64 204, !9, i64 208, !23, i64 224, !23, i64 240, !33, i64 256, !23, i64 272, !34, i64 288, !9, i64 312, !32, i64 316, !30, i64 320, !27, i64 328}
!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 = !{!"_ZTSN3JPH13EBackFaceModeE", !6, i64 0}
!32 = !{!"bool", !6, i64 0}
!33 = !{!"_ZTSN3JPH4QuatE", !25, i64 0}
!34 = !{!"_ZTSN3JPH5ArrayINS_16CharacterVirtual7ContactENS_12STLAllocatorIS2_EEEE", !30, i64 0, !30, i64 8, !12, i64 16}
!35 = !{!36, !9, i64 12}
!36 = !{!"_ZTSN3JPH16CharacterVirtual10ConstraintE", !12, i64 0, !9, i64 8, !9, i64 12, !23, i64 16, !24, i64 32, !32, i64 48}
!37 = !{!36, !9, i64 8}
!38 = !{!36, !12, i64 0}
!39 = !{!40, !32, i64 113}
!40 = !{!"_ZTSN3JPH16CharacterVirtual7ContactE", !23, i64 0, !23, i64 16, !23, i64 32, !23, i64 48, !9, i64 64, !9, i64 68, !27, i64 72, !12, i64 80, !28, i64 88, !41, i64 92, !32, i64 93, !30, i64 96, !12, i64 104, !32, i64 112, !32, i64 113, !32, i64 114}
!41 = !{!"_ZTSN3JPH11EMotionTypeE", !6, i64 0}
!42 = !{i8 0, i8 2}
!43 = !{}
!44 = !{!40, !32, i64 112}
!45 = !{!40, !32, i64 114}
!46 = !{!16, !9, i64 176}
!47 = !{!36, !32, i64 48}
!48 = distinct !{!48, !14}
!49 = !{!16, !12, i64 144}
!50 = !{!40, !12, i64 80}
!51 = !{!40, !12, i64 104}
!52 = !{!53, !53, i64 0}
!53 = !{!"vtable pointer", !7, i64 0}
!54 = distinct !{!54, !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