; LLVM IR from jrouwe/JoltPhysics :: Jolt/Physics/Constraints (SixDOFConstraint)

; 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::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.4 }
%union.anon.4 = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::SixDOFConstraint" = type { %"class.JPH::TwoBodyConstraint", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", %"class.JPH::Quat", i8, i8, i8, i8, i8, i8, [6 x float], [6 x float], [3 x %"class.JPH::SpringSettings"], [6 x %"class.JPH::MotorSettings"], [6 x float], [6 x i32], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Quat", [3 x %"class.JPH::Vec3"], [3 x %"class.JPH::Vec3"], [3 x float], [3 x %"class.JPH::AxisConstraintPart"], %"class.JPH::PointConstraintPart", %"class.JPH::SwingTwistConstraintPart", %"class.JPH::RotationEulerConstraintPart", [3 x %"class.JPH::AxisConstraintPart"], [3 x %"class.JPH::AngleConstraintPart"] }
%"class.JPH::TwoBodyConstraint" = type { %"class.JPH::Constraint", ptr, ptr }
%"class.JPH::Constraint" = type { ptr, %"class.JPH::RefTarget.3", i32, i32, i8, i8, i8, i64 }
%"class.JPH::RefTarget.3" = type { %"struct.std::atomic" }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::SpringSettings" = type { i8, %union.anon.2, float }
%union.anon.2 = type { float }
%"class.JPH::MotorSettings" = type { %"class.JPH::SpringSettings", float, float, float, float }
%"class.JPH::PointConstraintPart" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Mat44", %"class.JPH::Mat44", %"class.JPH::Mat44", %"class.JPH::Vec3" }
%"class.JPH::SwingTwistConstraintPart" = type { i8, i8, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::AngleConstraintPart", %"class.JPH::AngleConstraintPart", %"class.JPH::AngleConstraintPart" }
%"class.JPH::AngleConstraintPart" = type { %"class.JPH::Vec3", %"class.JPH::Vec3", float, %"class.JPH::SpringPart", float }
%"class.JPH::SpringPart" = type { float, float }
%"class.JPH::RotationEulerConstraintPart" = type { %"class.JPH::Mat44", %"class.JPH::Mat44", %"class.JPH::Mat44", %"class.JPH::Vec3" }
%"class.JPH::AxisConstraintPart" = type { %"class.JPH::Float3", %"class.JPH::Float3", %"class.JPH::Float3", %"class.JPH::Float3", float, %"class.JPH::SpringPart", float }
%"class.JPH::Float3" = type { float, float, float }
%"class.JPH::SixDOFConstraintSettings" = type <{ %"class.JPH::TwoBodyConstraintSettings", i32, [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", [6 x float], i8, [3 x i8], [6 x float], [6 x float], [3 x %"class.JPH::SpringSettings"], [6 x %"class.JPH::MotorSettings"], [8 x i8] }>
%"class.JPH::TwoBodyConstraintSettings" = type { %"class.JPH::ConstraintSettings" }
%"class.JPH::ConstraintSettings" = type { %"class.JPH::SerializableObject", %"class.JPH::RefTarget", i8, i32, i32, i32, float, i64 }
%"class.JPH::SerializableObject" = type { ptr }
%"class.JPH::RefTarget" = type { %"struct.std::atomic" }

@_ZTVN3JPH16SixDOFConstraintE = external dso_local unnamed_addr constant { [20 x ptr] }, align 8
@constinit = external hidden constant [6 x i32], align 4

; 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: mustprogress uwtable
define dso_local void @_ZN3JPH16SixDOFConstraintC2ERNS_4BodyES2_RKNS_24SixDOFConstraintSettingsE(ptr noundef nonnull align 16 dereferenceable(1856) %0, ptr noundef nonnull align 16 dereferenceable(122) %1, ptr noundef nonnull align 16 dereferenceable(122) %2, ptr noundef nonnull align 16 dereferenceable(432) %3) unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Mat44", align 16
  %14 = alloca %"class.JPH::Vec4", align 16
  %15 = alloca %"class.JPH::Vec3", align 16
  %16 = alloca %"class.JPH::Vec4", align 16
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca %"class.JPH::Vec4", align 16
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca %"class.JPH::Vec4", align 16
  %21 = alloca %"class.JPH::Quat", align 16
  %22 = alloca %"class.JPH::Vec3", align 16
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Mat44", align 16
  %25 = alloca %"class.JPH::Vec4", align 16
  %26 = alloca %"class.JPH::Vec3", align 16
  %27 = alloca %"class.JPH::Vec4", align 16
  %28 = alloca %"class.JPH::Vec3", align 16
  %29 = alloca %"class.JPH::Vec4", align 16
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca %"class.JPH::Vec4", align 16
  %32 = alloca %"class.JPH::Quat", align 16
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca %"class.JPH::Mat44", align 16
  %35 = alloca %"class.JPH::Vec3", align 16
  %36 = alloca %"class.JPH::Quat", align 16
  %37 = alloca %"class.JPH::Quat", align 16
  %38 = alloca %"class.JPH::Quat", align 16
  %39 = alloca %"class.JPH::Quat", align 16
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca %"class.JPH::Mat44", align 16
  %42 = alloca %"class.JPH::Vec3", align 16
  %43 = alloca %"class.JPH::Quat", align 16
  %44 = alloca %"class.JPH::Quat", align 16
  %45 = alloca %"class.JPH::Quat", align 16
  %46 = alloca %"class.JPH::Quat", align 16
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = alloca %"class.JPH::Vec3", align 16
  %49 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  store ptr %3, ptr %8, align 8, !tbaa !5
  %50 = load ptr, ptr %5, align 8
  %51 = load ptr, ptr %6, align 8, !tbaa !5
  %52 = load ptr, ptr %7, align 8, !tbaa !5
  %53 = load ptr, ptr %8, align 8, !tbaa !5
  call void @_ZN3JPH17TwoBodyConstraintC2ERNS_4BodyES2_RKNS_25TwoBodyConstraintSettingsE(ptr noundef nonnull align 8 dereferenceable(48) %50, ptr noundef nonnull align 16 dereferenceable(122) %51, ptr noundef nonnull align 16 dereferenceable(122) %52, ptr noundef nonnull align 8 dereferenceable(40) %53)
  store ptr getelementptr inbounds inrange(-16, 144) ({ [20 x ptr] }, ptr @_ZTVN3JPH16SixDOFConstraintE, i32 0, i32 0, i32 2), ptr %50, align 16, !tbaa !9
  %54 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 1
  %55 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 2
  %56 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 3
  %57 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 4
  %58 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 5
  store i8 0, ptr %58, align 16, !tbaa !11
  %59 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 6
  store i8 0, ptr %59, align 1, !tbaa !32
  %60 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 7
  store i8 0, ptr %60, align 2, !tbaa !33
  %61 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 8
  store i8 0, ptr %61, align 1, !tbaa !34
  %62 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 9
  store i8 0, ptr %62, align 4, !tbaa !35
  %63 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 10
  store i8 0, ptr %63, align 1, !tbaa !36
  %64 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 13
  %65 = getelementptr inbounds [3 x %"class.JPH::SpringSettings"], ptr %64, i32 0, i32 0
  %66 = getelementptr inbounds %"class.JPH::SpringSettings", ptr %65, i64 3
  br label %67

67:                                               ; preds = %67, %4
  %68 = phi ptr [ %65, %4 ], [ %69, %67 ]
  call void @_ZN3JPH14SpringSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %68) #9
  %69 = getelementptr inbounds %"class.JPH::SpringSettings", ptr %68, i64 1
  %70 = icmp eq ptr %69, %66
  br i1 %70, label %71, label %67

71:                                               ; preds = %67
  %72 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 14
  %73 = getelementptr inbounds [6 x %"class.JPH::MotorSettings"], ptr %72, i32 0, i32 0
  %74 = getelementptr inbounds %"class.JPH::MotorSettings", ptr %73, i64 6
  br label %75

75:                                               ; preds = %77, %71
  %76 = phi ptr [ %73, %71 ], [ %78, %77 ]
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %76)
          to label %77 unwind label %388

77:                                               ; preds = %75
  %78 = getelementptr inbounds %"class.JPH::MotorSettings", ptr %76, i64 1
  %79 = icmp eq ptr %78, %74
  br i1 %79, label %80, label %75

80:                                               ; preds = %77
  %81 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 16
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %81, ptr align 4 @constinit, i64 24, i1 false), !tbaa.struct !37
  %82 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 17
  %83 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %84 unwind label %388

84:                                               ; preds = %80
  %85 = getelementptr inbounds %"class.JPH::Vec3", ptr %82, i32 0, i32 0
  %86 = getelementptr inbounds %union.anon, ptr %85, i32 0, i32 0
  %87 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 0
  %88 = extractvalue { double, double } %83, 0
  store double %88, ptr %87, align 16
  %89 = getelementptr inbounds { double, double }, ptr %86, i32 0, i32 1
  %90 = extractvalue { double, double } %83, 1
  store double %90, ptr %89, align 8
  %91 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 18
  %92 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %93 unwind label %388

93:                                               ; preds = %84
  %94 = getelementptr inbounds %"class.JPH::Vec3", ptr %91, i32 0, i32 0
  %95 = getelementptr inbounds %union.anon, ptr %94, i32 0, i32 0
  %96 = getelementptr inbounds { double, double }, ptr %95, i32 0, i32 0
  %97 = extractvalue { double, double } %92, 0
  store double %97, ptr %96, align 16
  %98 = getelementptr inbounds { double, double }, ptr %95, i32 0, i32 1
  %99 = extractvalue { double, double } %92, 1
  store double %99, ptr %98, align 8
  %100 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 19
  %101 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %102 unwind label %388

102:                                              ; preds = %93
  %103 = getelementptr inbounds %"class.JPH::Vec3", ptr %100, i32 0, i32 0
  %104 = getelementptr inbounds %union.anon, ptr %103, i32 0, i32 0
  %105 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 0
  %106 = extractvalue { double, double } %101, 0
  store double %106, ptr %105, align 16
  %107 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 1
  %108 = extractvalue { double, double } %101, 1
  store double %108, ptr %107, align 8
  %109 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 20
  %110 = invoke { double, double } @_ZN3JPH4Quat9sIdentityEv()
          to label %111 unwind label %388

111:                                              ; preds = %102
  %112 = getelementptr inbounds %"class.JPH::Quat", ptr %109, i32 0, i32 0
  %113 = getelementptr inbounds %"class.JPH::Vec4", ptr %112, i32 0, i32 0
  %114 = getelementptr inbounds %union.anon.4, ptr %113, i32 0, i32 0
  %115 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %116 = extractvalue { double, double } %110, 0
  store double %116, ptr %115, align 16
  %117 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %118 = extractvalue { double, double } %110, 1
  store double %118, ptr %117, align 8
  %119 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 21
  %120 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 22
  %121 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 24
  %122 = getelementptr inbounds [3 x %"class.JPH::AxisConstraintPart"], ptr %121, i32 0, i32 0
  %123 = getelementptr inbounds %"class.JPH::AxisConstraintPart", ptr %122, i64 3
  br label %124

124:                                              ; preds = %124, %111
  %125 = phi ptr [ %122, %111 ], [ %126, %124 ]
  call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %125) #9
  %126 = getelementptr inbounds %"class.JPH::AxisConstraintPart", ptr %125, i64 1
  %127 = icmp eq ptr %126, %123
  br i1 %127, label %128, label %124

128:                                              ; preds = %124
  %129 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 25
  invoke void @_ZN3JPH19PointConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(240) %129)
          to label %130 unwind label %388

130:                                              ; preds = %128
  %131 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 26
  call void @_ZN3JPH24SwingTwistConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(272) %131) #9
  %132 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 27
  invoke void @_ZN3JPH27RotationEulerConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(208) %132)
          to label %133 unwind label %388

133:                                              ; preds = %130
  %134 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 28
  %135 = getelementptr inbounds [3 x %"class.JPH::AxisConstraintPart"], ptr %134, i32 0, i32 0
  %136 = getelementptr inbounds %"class.JPH::AxisConstraintPart", ptr %135, i64 3
  br label %137

137:                                              ; preds = %137, %133
  %138 = phi ptr [ %135, %133 ], [ %139, %137 ]
  call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %138) #9
  %139 = getelementptr inbounds %"class.JPH::AxisConstraintPart", ptr %138, i64 1
  %140 = icmp eq ptr %139, %136
  br i1 %140, label %141, label %137

141:                                              ; preds = %137
  %142 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 29
  %143 = getelementptr inbounds [3 x %"class.JPH::AngleConstraintPart"], ptr %142, i32 0, i32 0
  %144 = getelementptr inbounds %"class.JPH::AngleConstraintPart", ptr %143, i64 3
  br label %145

145:                                              ; preds = %145, %141
  %146 = phi ptr [ %143, %141 ], [ %147, %145 ]
  call void @_ZN3JPH19AngleConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(48) %146) #9
  %147 = getelementptr inbounds %"class.JPH::AngleConstraintPart", ptr %146, i64 1
  %148 = icmp eq ptr %147, %144
  br i1 %148, label %149, label %145

149:                                              ; preds = %145
  %150 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 26
  %151 = load ptr, ptr %8, align 8, !tbaa !5
  %152 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %151, i32 0, i32 10
  %153 = load i8, ptr %152, align 8, !tbaa !39
  invoke void @_ZN3JPH24SwingTwistConstraintPart12SetSwingTypeENS_10ESwingTypeE(ptr noundef nonnull align 16 dereferenceable(272) %150, i8 noundef zeroext %153)
          to label %154 unwind label %388

154:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 16, ptr %11) #9
  %155 = load ptr, ptr %8, align 8, !tbaa !5
  %156 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %155, i32 0, i32 4
  %157 = load ptr, ptr %8, align 8, !tbaa !5
  %158 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %157, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %158, i64 16, i1 false), !tbaa.struct !46
  %159 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  %160 = load double, ptr %159, align 16
  %161 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  %162 = load double, ptr %161, align 8
  %163 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %156, double %160, double %162)
          to label %164 unwind label %392

164:                                              ; preds = %154
  %165 = getelementptr inbounds %"class.JPH::Vec3", ptr %11, i32 0, i32 0
  %166 = getelementptr inbounds %union.anon, ptr %165, i32 0, i32 0
  %167 = getelementptr inbounds { double, double }, ptr %166, i32 0, i32 0
  %168 = extractvalue { double, double } %163, 0
  store double %168, ptr %167, align 16
  %169 = getelementptr inbounds { double, double }, ptr %166, i32 0, i32 1
  %170 = extractvalue { double, double } %163, 1
  store double %170, ptr %169, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr %13) #9
  %171 = load ptr, ptr %8, align 8, !tbaa !5
  %172 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %171, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %15, ptr align 16 %172, i64 16, i1 false), !tbaa.struct !46
  %173 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 0
  %174 = load double, ptr %173, align 16
  %175 = getelementptr inbounds { double, double }, ptr %15, i32 0, i32 1
  %176 = load double, ptr %175, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %14, double %174, double %176, float noundef 0.000000e+00)
          to label %177 unwind label %396

177:                                              ; preds = %164
  %178 = load ptr, ptr %8, align 8, !tbaa !5
  %179 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %178, i32 0, i32 5
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %17, ptr align 16 %179, i64 16, i1 false), !tbaa.struct !46
  %180 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 0
  %181 = load double, ptr %180, align 16
  %182 = getelementptr inbounds { double, double }, ptr %17, i32 0, i32 1
  %183 = load double, ptr %182, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %16, double %181, double %183, float noundef 0.000000e+00)
          to label %184 unwind label %396

184:                                              ; preds = %177
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %19, ptr align 16 %11, i64 16, i1 false), !tbaa.struct !46
  %185 = getelementptr inbounds { double, double }, ptr %19, i32 0, i32 0
  %186 = load double, ptr %185, align 16
  %187 = getelementptr inbounds { double, double }, ptr %19, i32 0, i32 1
  %188 = load double, ptr %187, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %18, double %186, double %188, float noundef 0.000000e+00)
          to label %189 unwind label %396

189:                                              ; preds = %184
  invoke void @_ZN3JPH4Vec4C2Effff(ptr noundef nonnull align 16 dereferenceable(16) %20, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %190 unwind label %396

190:                                              ; preds = %189
  %191 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 0
  %192 = load double, ptr %191, align 16
  %193 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 1
  %194 = load double, ptr %193, align 8
  %195 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 0
  %196 = load double, ptr %195, align 16
  %197 = getelementptr inbounds { double, double }, ptr %16, i32 0, i32 1
  %198 = load double, ptr %197, align 8
  %199 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 0
  %200 = load double, ptr %199, align 16
  %201 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 1
  %202 = load double, ptr %201, align 8
  %203 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 0
  %204 = load double, ptr %203, align 16
  %205 = getelementptr inbounds { double, double }, ptr %20, i32 0, i32 1
  %206 = load double, ptr %205, align 8
  invoke void @_ZN3JPH5Mat44C2ENS_4Vec4ES1_S1_S1_(ptr noundef nonnull align 16 dereferenceable(64) %13, double %192, double %194, double %196, double %198, double %200, double %202, double %204, double %206)
          to label %207 unwind label %396

207:                                              ; preds = %190
  call void @llvm.lifetime.start.p0(i64 16, ptr %21) #9
  %208 = invoke { double, double } @_ZNK3JPH5Mat4413GetQuaternionEv(ptr noundef nonnull align 16 dereferenceable(64) %13)
          to label %209 unwind label %400

209:                                              ; preds = %207
  %210 = getelementptr inbounds %"class.JPH::Quat", ptr %21, i32 0, i32 0
  %211 = getelementptr inbounds %"class.JPH::Vec4", ptr %210, i32 0, i32 0
  %212 = getelementptr inbounds %union.anon.4, ptr %211, i32 0, i32 0
  %213 = getelementptr inbounds { double, double }, ptr %212, i32 0, i32 0
  %214 = extractvalue { double, double } %208, 0
  store double %214, ptr %213, align 16
  %215 = getelementptr inbounds { double, double }, ptr %212, i32 0, i32 1
  %216 = extractvalue { double, double } %208, 1
  store double %216, ptr %215, align 8
  %217 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %217, ptr align 16 %21, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %22) #9
  %218 = load ptr, ptr %8, align 8, !tbaa !5
  %219 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %218, i32 0, i32 7
  %220 = load ptr, ptr %8, align 8, !tbaa !5
  %221 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %220, i32 0, i32 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %23, ptr align 16 %221, i64 16, i1 false), !tbaa.struct !46
  %222 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 0
  %223 = load double, ptr %222, align 16
  %224 = getelementptr inbounds { double, double }, ptr %23, i32 0, i32 1
  %225 = load double, ptr %224, align 8
  %226 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %219, double %223, double %225)
          to label %227 unwind label %404

227:                                              ; preds = %209
  %228 = getelementptr inbounds %"class.JPH::Vec3", ptr %22, i32 0, i32 0
  %229 = getelementptr inbounds %union.anon, ptr %228, i32 0, i32 0
  %230 = getelementptr inbounds { double, double }, ptr %229, i32 0, i32 0
  %231 = extractvalue { double, double } %226, 0
  store double %231, ptr %230, align 16
  %232 = getelementptr inbounds { double, double }, ptr %229, i32 0, i32 1
  %233 = extractvalue { double, double } %226, 1
  store double %233, ptr %232, align 8
  call void @llvm.lifetime.start.p0(i64 64, ptr %24) #9
  %234 = load ptr, ptr %8, align 8, !tbaa !5
  %235 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %234, i32 0, i32 7
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %26, ptr align 16 %235, i64 16, i1 false), !tbaa.struct !46
  %236 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 0
  %237 = load double, ptr %236, align 16
  %238 = getelementptr inbounds { double, double }, ptr %26, i32 0, i32 1
  %239 = load double, ptr %238, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %25, double %237, double %239, float noundef 0.000000e+00)
          to label %240 unwind label %408

240:                                              ; preds = %227
  %241 = load ptr, ptr %8, align 8, !tbaa !5
  %242 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %241, i32 0, i32 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %28, ptr align 16 %242, i64 16, i1 false), !tbaa.struct !46
  %243 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 0
  %244 = load double, ptr %243, align 16
  %245 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 1
  %246 = load double, ptr %245, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %27, double %244, double %246, float noundef 0.000000e+00)
          to label %247 unwind label %408

247:                                              ; preds = %240
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %30, ptr align 16 %22, i64 16, i1 false), !tbaa.struct !46
  %248 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 0
  %249 = load double, ptr %248, align 16
  %250 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 1
  %251 = load double, ptr %250, align 8
  invoke void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %29, double %249, double %251, float noundef 0.000000e+00)
          to label %252 unwind label %408

252:                                              ; preds = %247
  invoke void @_ZN3JPH4Vec4C2Effff(ptr noundef nonnull align 16 dereferenceable(16) %31, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %253 unwind label %408

253:                                              ; preds = %252
  %254 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 0
  %255 = load double, ptr %254, align 16
  %256 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 1
  %257 = load double, ptr %256, align 8
  %258 = getelementptr inbounds { double, double }, ptr %27, i32 0, i32 0
  %259 = load double, ptr %258, align 16
  %260 = getelementptr inbounds { double, double }, ptr %27, i32 0, i32 1
  %261 = load double, ptr %260, align 8
  %262 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 0
  %263 = load double, ptr %262, align 16
  %264 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 1
  %265 = load double, ptr %264, align 8
  %266 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 0
  %267 = load double, ptr %266, align 16
  %268 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 1
  %269 = load double, ptr %268, align 8
  invoke void @_ZN3JPH5Mat44C2ENS_4Vec4ES1_S1_S1_(ptr noundef nonnull align 16 dereferenceable(64) %24, double %255, double %257, double %259, double %261, double %263, double %265, double %267, double %269)
          to label %270 unwind label %408

270:                                              ; preds = %253
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #9
  %271 = invoke { double, double } @_ZNK3JPH5Mat4413GetQuaternionEv(ptr noundef nonnull align 16 dereferenceable(64) %24)
          to label %272 unwind label %412

272:                                              ; preds = %270
  %273 = getelementptr inbounds %"class.JPH::Quat", ptr %32, i32 0, i32 0
  %274 = getelementptr inbounds %"class.JPH::Vec4", ptr %273, i32 0, i32 0
  %275 = getelementptr inbounds %union.anon.4, ptr %274, i32 0, i32 0
  %276 = getelementptr inbounds { double, double }, ptr %275, i32 0, i32 0
  %277 = extractvalue { double, double } %271, 0
  store double %277, ptr %276, align 16
  %278 = getelementptr inbounds { double, double }, ptr %275, i32 0, i32 1
  %279 = extractvalue { double, double } %271, 1
  store double %279, ptr %278, align 8
  %280 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %280, ptr align 16 %32, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #9
  %281 = load ptr, ptr %8, align 8, !tbaa !5
  %282 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %281, i32 0, i32 1
  %283 = load i32, ptr %282, align 8, !tbaa !47
  %284 = icmp eq i32 %283, 1
  br i1 %284, label %285, label %432

285:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 16, ptr %33) #9
  call void @llvm.lifetime.start.p0(i64 64, ptr %34) #9
  %286 = load ptr, ptr %6, align 8, !tbaa !5
  invoke void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %34, ptr noundef nonnull align 16 dereferenceable(122) %286)
          to label %287 unwind label %416

287:                                              ; preds = %285
  %288 = load ptr, ptr %8, align 8, !tbaa !5
  %289 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %288, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %35, ptr align 16 %289, i64 16, i1 false), !tbaa.struct !46
  %290 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %291 = load double, ptr %290, align 16
  %292 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %293 = load double, ptr %292, align 8
  %294 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %34, double %291, double %293)
          to label %295 unwind label %416

295:                                              ; preds = %287
  %296 = getelementptr inbounds %"class.JPH::Vec3", ptr %33, i32 0, i32 0
  %297 = getelementptr inbounds %union.anon, ptr %296, i32 0, i32 0
  %298 = getelementptr inbounds { double, double }, ptr %297, i32 0, i32 0
  %299 = extractvalue { double, double } %294, 0
  store double %299, ptr %298, align 16
  %300 = getelementptr inbounds { double, double }, ptr %297, i32 0, i32 1
  %301 = extractvalue { double, double } %294, 1
  store double %301, ptr %300, align 8
  %302 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %302, ptr align 16 %33, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 64, ptr %34) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %38) #9
  %303 = load ptr, ptr %6, align 8, !tbaa !5
  %304 = invoke { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %303)
          to label %305 unwind label %420

305:                                              ; preds = %295
  %306 = getelementptr inbounds %"class.JPH::Quat", ptr %38, i32 0, i32 0
  %307 = getelementptr inbounds %"class.JPH::Vec4", ptr %306, i32 0, i32 0
  %308 = getelementptr inbounds %union.anon.4, ptr %307, i32 0, i32 0
  %309 = getelementptr inbounds { double, double }, ptr %308, i32 0, i32 0
  %310 = extractvalue { double, double } %304, 0
  store double %310, ptr %309, align 16
  %311 = getelementptr inbounds { double, double }, ptr %308, i32 0, i32 1
  %312 = extractvalue { double, double } %304, 1
  store double %312, ptr %311, align 8
  %313 = invoke { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %38)
          to label %314 unwind label %420

314:                                              ; preds = %305
  %315 = getelementptr inbounds %"class.JPH::Quat", ptr %37, i32 0, i32 0
  %316 = getelementptr inbounds %"class.JPH::Vec4", ptr %315, i32 0, i32 0
  %317 = getelementptr inbounds %union.anon.4, ptr %316, i32 0, i32 0
  %318 = getelementptr inbounds { double, double }, ptr %317, i32 0, i32 0
  %319 = extractvalue { double, double } %313, 0
  store double %319, ptr %318, align 16
  %320 = getelementptr inbounds { double, double }, ptr %317, i32 0, i32 1
  %321 = extractvalue { double, double } %313, 1
  store double %321, ptr %320, align 8
  %322 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %39, ptr align 16 %322, i64 16, i1 false), !tbaa.struct !46
  %323 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 0
  %324 = load double, ptr %323, align 16
  %325 = getelementptr inbounds { double, double }, ptr %39, i32 0, i32 1
  %326 = load double, ptr %325, align 8
  %327 = invoke { double, double } @_ZNK3JPH4QuatmlES0_(ptr noundef nonnull align 16 dereferenceable(16) %37, double %324, double %326)
          to label %328 unwind label %420

328:                                              ; preds = %314
  %329 = getelementptr inbounds %"class.JPH::Quat", ptr %36, i32 0, i32 0
  %330 = getelementptr inbounds %"class.JPH::Vec4", ptr %329, i32 0, i32 0
  %331 = getelementptr inbounds %union.anon.4, ptr %330, i32 0, i32 0
  %332 = getelementptr inbounds { double, double }, ptr %331, i32 0, i32 0
  %333 = extractvalue { double, double } %327, 0
  store double %333, ptr %332, align 16
  %334 = getelementptr inbounds { double, double }, ptr %331, i32 0, i32 1
  %335 = extractvalue { double, double } %327, 1
  store double %335, ptr %334, align 8
  %336 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %336, ptr align 16 %36, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #9
  call void @llvm.lifetime.start.p0(i64 64, ptr %41) #9
  %337 = load ptr, ptr %7, align 8, !tbaa !5
  invoke void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %41, ptr noundef nonnull align 16 dereferenceable(122) %337)
          to label %338 unwind label %424

338:                                              ; preds = %328
  %339 = load ptr, ptr %8, align 8, !tbaa !5
  %340 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %339, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %42, ptr align 16 %340, i64 16, i1 false), !tbaa.struct !46
  %341 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 0
  %342 = load double, ptr %341, align 16
  %343 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 1
  %344 = load double, ptr %343, align 8
  %345 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %41, double %342, double %344)
          to label %346 unwind label %424

346:                                              ; preds = %338
  %347 = getelementptr inbounds %"class.JPH::Vec3", ptr %40, i32 0, i32 0
  %348 = getelementptr inbounds %union.anon, ptr %347, i32 0, i32 0
  %349 = getelementptr inbounds { double, double }, ptr %348, i32 0, i32 0
  %350 = extractvalue { double, double } %345, 0
  store double %350, ptr %349, align 16
  %351 = getelementptr inbounds { double, double }, ptr %348, i32 0, i32 1
  %352 = extractvalue { double, double } %345, 1
  store double %352, ptr %351, align 8
  %353 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %353, ptr align 16 %40, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 64, ptr %41) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #9
  %354 = load ptr, ptr %7, align 8, !tbaa !5
  %355 = invoke { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %354)
          to label %356 unwind label %428

356:                                              ; preds = %346
  %357 = getelementptr inbounds %"class.JPH::Quat", ptr %45, i32 0, i32 0
  %358 = getelementptr inbounds %"class.JPH::Vec4", ptr %357, i32 0, i32 0
  %359 = getelementptr inbounds %union.anon.4, ptr %358, i32 0, i32 0
  %360 = getelementptr inbounds { double, double }, ptr %359, i32 0, i32 0
  %361 = extractvalue { double, double } %355, 0
  store double %361, ptr %360, align 16
  %362 = getelementptr inbounds { double, double }, ptr %359, i32 0, i32 1
  %363 = extractvalue { double, double } %355, 1
  store double %363, ptr %362, align 8
  %364 = invoke { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %45)
          to label %365 unwind label %428

365:                                              ; preds = %356
  %366 = getelementptr inbounds %"class.JPH::Quat", ptr %44, i32 0, i32 0
  %367 = getelementptr inbounds %"class.JPH::Vec4", ptr %366, i32 0, i32 0
  %368 = getelementptr inbounds %union.anon.4, ptr %367, i32 0, i32 0
  %369 = getelementptr inbounds { double, double }, ptr %368, i32 0, i32 0
  %370 = extractvalue { double, double } %364, 0
  store double %370, ptr %369, align 16
  %371 = getelementptr inbounds { double, double }, ptr %368, i32 0, i32 1
  %372 = extractvalue { double, double } %364, 1
  store double %372, ptr %371, align 8
  %373 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %46, ptr align 16 %373, i64 16, i1 false), !tbaa.struct !46
  %374 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 0
  %375 = load double, ptr %374, align 16
  %376 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 1
  %377 = load double, ptr %376, align 8
  %378 = invoke { double, double } @_ZNK3JPH4QuatmlES0_(ptr noundef nonnull align 16 dereferenceable(16) %44, double %375, double %377)
          to label %379 unwind label %428

379:                                              ; preds = %365
  %380 = getelementptr inbounds %"class.JPH::Quat", ptr %43, i32 0, i32 0
  %381 = getelementptr inbounds %"class.JPH::Vec4", ptr %380, i32 0, i32 0
  %382 = getelementptr inbounds %union.anon.4, ptr %381, i32 0, i32 0
  %383 = getelementptr inbounds { double, double }, ptr %382, i32 0, i32 0
  %384 = extractvalue { double, double } %378, 0
  store double %384, ptr %383, align 16
  %385 = getelementptr inbounds { double, double }, ptr %382, i32 0, i32 1
  %386 = extractvalue { double, double } %378, 1
  store double %386, ptr %385, align 8
  %387 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %387, ptr align 16 %43, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #9
  br label %439

388:                                              ; preds = %149, %130, %128, %102, %93, %84, %80, %75
  %389 = landingpad { ptr, i32 }
          cleanup
  %390 = extractvalue { ptr, i32 } %389, 0
  store ptr %390, ptr %9, align 8
  %391 = extractvalue { ptr, i32 } %389, 1
  store i32 %391, ptr %10, align 4
  br label %488

392:                                              ; preds = %154
  %393 = landingpad { ptr, i32 }
          cleanup
  %394 = extractvalue { ptr, i32 } %393, 0
  store ptr %394, ptr %9, align 8
  %395 = extractvalue { ptr, i32 } %393, 1
  store i32 %395, ptr %10, align 4
  br label %487

396:                                              ; preds = %190, %189, %184, %177, %164
  %397 = landingpad { ptr, i32 }
          cleanup
  %398 = extractvalue { ptr, i32 } %397, 0
  store ptr %398, ptr %9, align 8
  %399 = extractvalue { ptr, i32 } %397, 1
  store i32 %399, ptr %10, align 4
  br label %486

400:                                              ; preds = %207
  %401 = landingpad { ptr, i32 }
          cleanup
  %402 = extractvalue { ptr, i32 } %401, 0
  store ptr %402, ptr %9, align 8
  %403 = extractvalue { ptr, i32 } %401, 1
  store i32 %403, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #9
  br label %486

404:                                              ; preds = %209
  %405 = landingpad { ptr, i32 }
          cleanup
  %406 = extractvalue { ptr, i32 } %405, 0
  store ptr %406, ptr %9, align 8
  %407 = extractvalue { ptr, i32 } %405, 1
  store i32 %407, ptr %10, align 4
  br label %485

408:                                              ; preds = %482, %481, %457, %456, %455, %439, %253, %252, %247, %240, %227
  %409 = landingpad { ptr, i32 }
          cleanup
  %410 = extractvalue { ptr, i32 } %409, 0
  store ptr %410, ptr %9, align 8
  %411 = extractvalue { ptr, i32 } %409, 1
  store i32 %411, ptr %10, align 4
  br label %484

412:                                              ; preds = %270
  %413 = landingpad { ptr, i32 }
          cleanup
  %414 = extractvalue { ptr, i32 } %413, 0
  store ptr %414, ptr %9, align 8
  %415 = extractvalue { ptr, i32 } %413, 1
  store i32 %415, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #9
  br label %484

416:                                              ; preds = %287, %285
  %417 = landingpad { ptr, i32 }
          cleanup
  %418 = extractvalue { ptr, i32 } %417, 0
  store ptr %418, ptr %9, align 8
  %419 = extractvalue { ptr, i32 } %417, 1
  store i32 %419, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %34) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #9
  br label %484

420:                                              ; preds = %314, %305, %295
  %421 = landingpad { ptr, i32 }
          cleanup
  %422 = extractvalue { ptr, i32 } %421, 0
  store ptr %422, ptr %9, align 8
  %423 = extractvalue { ptr, i32 } %421, 1
  store i32 %423, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %38) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #9
  br label %484

424:                                              ; preds = %338, %328
  %425 = landingpad { ptr, i32 }
          cleanup
  %426 = extractvalue { ptr, i32 } %425, 0
  store ptr %426, ptr %9, align 8
  %427 = extractvalue { ptr, i32 } %425, 1
  store i32 %427, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %41) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #9
  br label %484

428:                                              ; preds = %365, %356, %346
  %429 = landingpad { ptr, i32 }
          cleanup
  %430 = extractvalue { ptr, i32 } %429, 0
  store ptr %430, ptr %9, align 8
  %431 = extractvalue { ptr, i32 } %429, 1
  store i32 %431, ptr %10, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #9
  br label %484

432:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 16, ptr %47) #9
  %433 = load ptr, ptr %8, align 8, !tbaa !5
  %434 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %433, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %434, i64 16, i1 false), !tbaa.struct !46
  %435 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %435, ptr align 16 %47, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %47) #9
  call void @llvm.lifetime.start.p0(i64 16, ptr %48) #9
  %436 = load ptr, ptr %8, align 8, !tbaa !5
  %437 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %436, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %48, ptr align 16 %437, i64 16, i1 false), !tbaa.struct !46
  %438 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %438, ptr align 16 %48, i64 16, i1 false), !tbaa.struct !46
  call void @llvm.lifetime.end.p0(i64 16, ptr %48) #9
  br label %439

439:                                              ; preds = %432, %379
  %440 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 11
  %441 = getelementptr inbounds [6 x float], ptr %440, i64 0, i64 0
  %442 = load ptr, ptr %8, align 8, !tbaa !5
  %443 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %442, i32 0, i32 12
  %444 = getelementptr inbounds [6 x float], ptr %443, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %441, ptr align 4 %444, i64 24, i1 false)
  %445 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 12
  %446 = getelementptr inbounds [6 x float], ptr %445, i64 0, i64 0
  %447 = load ptr, ptr %8, align 8, !tbaa !5
  %448 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %447, i32 0, i32 13
  %449 = getelementptr inbounds [6 x float], ptr %448, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %446, ptr align 4 %449, i64 24, i1 false)
  %450 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 13
  %451 = getelementptr inbounds [3 x %"class.JPH::SpringSettings"], ptr %450, i64 0, i64 0
  %452 = load ptr, ptr %8, align 8, !tbaa !5
  %453 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %452, i32 0, i32 14
  %454 = getelementptr inbounds [3 x %"class.JPH::SpringSettings"], ptr %453, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %451, ptr align 4 %454, i64 36, i1 false)
  invoke void @_ZN3JPH16SixDOFConstraint23UpdateTranslationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %455 unwind label %408

455:                                              ; preds = %439
  invoke void @_ZN3JPH16SixDOFConstraint20UpdateRotationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %456 unwind label %408

456:                                              ; preds = %455
  invoke void @_ZN3JPH16SixDOFConstraint19UpdateFixedFreeAxisEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %457 unwind label %408

457:                                              ; preds = %456
  invoke void @_ZN3JPH16SixDOFConstraint20CacheHasSpringLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %458 unwind label %408

458:                                              ; preds = %457
  %459 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 15
  %460 = getelementptr inbounds [6 x float], ptr %459, i64 0, i64 0
  %461 = load ptr, ptr %8, align 8, !tbaa !5
  %462 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %461, i32 0, i32 9
  %463 = getelementptr inbounds [6 x float], ptr %462, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %460, ptr align 16 %463, i64 24, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #9
  store i32 0, ptr %49, align 4, !tbaa !48
  br label %464

464:                                              ; preds = %478, %458
  %465 = load i32, ptr %49, align 4, !tbaa !48
  %466 = icmp slt i32 %465, 6
  br i1 %466, label %468, label %467

467:                                              ; preds = %464
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #9
  br label %481

468:                                              ; preds = %464
  %469 = load ptr, ptr %8, align 8, !tbaa !5
  %470 = getelementptr inbounds %"class.JPH::SixDOFConstraintSettings", ptr %469, i32 0, i32 15
  %471 = load i32, ptr %49, align 4, !tbaa !48
  %472 = sext i32 %471 to i64
  %473 = getelementptr inbounds [6 x %"class.JPH::MotorSettings"], ptr %470, i64 0, i64 %472
  %474 = getelementptr inbounds %"class.JPH::SixDOFConstraint", ptr %50, i32 0, i32 14
  %475 = load i32, ptr %49, align 4, !tbaa !48
  %476 = sext i32 %475 to i64
  %477 = getelementptr inbounds [6 x %"class.JPH::MotorSettings"], ptr %474, i64 0, i64 %476
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %477, ptr align 4 %473, i64 28, i1 false), !tbaa.struct !49
  br label %478

478:                                              ; preds = %468
  %479 = load i32, ptr %49, align 4, !tbaa !48
  %480 = add nsw i32 %479, 1
  store i32 %480, ptr %49, align 4, !tbaa !48
  br label %464, !llvm.loop !53

481:                                              ; preds = %467
  invoke void @_ZN3JPH16SixDOFConstraint27CacheTranslationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %482 unwind label %408

482:                                              ; preds = %481
  invoke void @_ZN3JPH16SixDOFConstraint24CacheRotationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856) %50)
          to label %483 unwind label %408

483:                                              ; preds = %482
  call void @llvm.lifetime.end.p0(i64 64, ptr %24) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 64, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #9
  ret void

484:                                              ; preds = %428, %424, %420, %416, %412, %408
  call void @llvm.lifetime.end.p0(i64 64, ptr %24) #9
  br label %485

485:                                              ; preds = %484, %404
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #9
  br label %486

486:                                              ; preds = %485, %400, %396
  call void @llvm.lifetime.end.p0(i64 64, ptr %13) #9
  br label %487

487:                                              ; preds = %486, %392
  call void @llvm.lifetime.end.p0(i64 16, ptr %11) #9
  br label %488

488:                                              ; preds = %487, %388
  call void @_ZN3JPH10ConstraintD2Ev(ptr noundef nonnull align 8 dereferenceable(48) %50) #9
  br label %489

489:                                              ; preds = %488
  %490 = load ptr, ptr %9, align 8
  %491 = load i32, ptr %10, align 4
  %492 = insertvalue { ptr, i32 } poison, ptr %490, 0
  %493 = insertvalue { ptr, i32 } %492, i32 %491, 1
  resume { ptr, i32 } %493
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH17TwoBodyConstraintC2ERNS_4BodyES2_RKNS_25TwoBodyConstraintSettingsE(ptr noundef nonnull align 8 dereferenceable(48), ptr noundef nonnull align 16 dereferenceable(122), ptr noundef nonnull align 16 dereferenceable(122), ptr noundef nonnull align 8 dereferenceable(40)) unnamed_addr #1 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH19PointConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(240)) unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH27RotationEulerConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(208)) unnamed_addr #7 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH24SwingTwistConstraintPart12SetSwingTypeENS_10ESwingTypeE(ptr noundef nonnull align 16 dereferenceable(272), i8 noundef zeroext) #2 align 2

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) #7 align 2

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint20UpdateRotationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856)) #7 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint19UpdateFixedFreeAxisEv(ptr noundef nonnull align 16 dereferenceable(1856)) #7 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint20CacheHasSpringLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint27CacheTranslationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint24CacheRotationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856)) #1 align 2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"vtable pointer", !8, i64 0}
!11 = !{!12, !7, i64 112}
!12 = !{!"_ZTSN3JPH16SixDOFConstraintE", !13, i64 0, !21, i64 48, !21, i64 64, !22, i64 80, !22, i64 96, !7, i64 112, !7, i64 113, !19, i64 114, !19, i64 115, !7, i64 116, !19, i64 117, !7, i64 120, !7, i64 144, !7, i64 168, !7, i64 204, !7, i64 372, !7, i64 396, !21, i64 432, !21, i64 448, !21, i64 464, !22, i64 480, !7, i64 496, !7, i64 544, !7, i64 592, !7, i64 604, !24, i64 800, !26, i64 1040, !31, i64 1312, !7, i64 1520, !7, i64 1712}
!13 = !{!"_ZTSN3JPH17TwoBodyConstraintE", !14, i64 0, !6, i64 32, !6, i64 40}
!14 = !{!"_ZTSN3JPH10ConstraintE", !15, i64 8, !18, i64 12, !18, i64 16, !7, i64 20, !7, i64 21, !19, i64 22, !20, i64 24}
!15 = !{!"_ZTSN3JPH9RefTargetINS_10ConstraintEEE", !16, i64 0}
!16 = !{!"_ZTSSt6atomicIjE", !17, i64 0}
!17 = !{!"_ZTSSt13__atomic_baseIjE", !18, i64 0}
!18 = !{!"int", !7, i64 0}
!19 = !{!"bool", !7, i64 0}
!20 = !{!"long", !7, i64 0}
!21 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!22 = !{!"_ZTSN3JPH4QuatE", !23, i64 0}
!23 = !{!"_ZTSN3JPH4Vec4E", !7, i64 0}
!24 = !{!"_ZTSN3JPH19PointConstraintPartE", !21, i64 0, !21, i64 16, !25, i64 32, !25, i64 96, !25, i64 160, !21, i64 224}
!25 = !{!"_ZTSN3JPH5Mat44E", !7, i64 0}
!26 = !{!"_ZTSN3JPH24SwingTwistConstraintPartE", !7, i64 0, !27, i64 1, !28, i64 4, !28, i64 8, !28, i64 12, !28, i64 16, !28, i64 20, !28, i64 24, !28, i64 28, !28, i64 32, !28, i64 36, !28, i64 40, !28, i64 44, !28, i64 48, !28, i64 52, !28, i64 56, !28, i64 60, !28, i64 64, !21, i64 80, !21, i64 96, !21, i64 112, !29, i64 128, !29, i64 176, !29, i64 224}
!27 = !{!"_ZTSN3JPH10ESwingTypeE", !7, i64 0}
!28 = !{!"float", !7, i64 0}
!29 = !{!"_ZTSN3JPH19AngleConstraintPartE", !21, i64 0, !21, i64 16, !28, i64 32, !30, i64 36, !28, i64 44}
!30 = !{!"_ZTSN3JPH10SpringPartE", !28, i64 0, !28, i64 4}
!31 = !{!"_ZTSN3JPH27RotationEulerConstraintPartE", !25, i64 0, !25, i64 64, !25, i64 128, !21, i64 192}
!32 = !{!12, !7, i64 113}
!33 = !{!12, !19, i64 114}
!34 = !{!12, !19, i64 115}
!35 = !{!12, !7, i64 116}
!36 = !{!12, !19, i64 117}
!37 = !{i64 0, i64 24, !38}
!38 = !{!7, !7, i64 0}
!39 = !{!40, !27, i64 168}
!40 = !{!"_ZTSN3JPH24SixDOFConstraintSettingsE", !41, i64 0, !45, i64 40, !21, i64 48, !21, i64 64, !21, i64 80, !21, i64 96, !21, i64 112, !21, i64 128, !7, i64 144, !27, i64 168, !7, i64 172, !7, i64 196, !7, i64 220, !7, i64 256}
!41 = !{!"_ZTSN3JPH25TwoBodyConstraintSettingsE", !42, i64 0}
!42 = !{!"_ZTSN3JPH18ConstraintSettingsE", !43, i64 0, !44, i64 8, !19, i64 12, !18, i64 16, !18, i64 20, !18, i64 24, !28, i64 28, !20, i64 32}
!43 = !{!"_ZTSN3JPH18SerializableObjectE"}
!44 = !{!"_ZTSN3JPH9RefTargetINS_18ConstraintSettingsEEE", !16, i64 0}
!45 = !{!"_ZTSN3JPH16EConstraintSpaceE", !7, i64 0}
!46 = !{i64 0, i64 16, !38}
!47 = !{!40, !45, i64 40}
!48 = !{!18, !18, i64 0}
!49 = !{i64 0, i64 1, !50, i64 4, i64 4, !38, i64 8, i64 4, !52, i64 12, i64 4, !52, i64 16, i64 4, !52, i64 20, i64 4, !52, i64 24, i64 4, !52}
!50 = !{!51, !51, i64 0}
!51 = !{!"_ZTSN3JPH11ESpringModeE", !7, i64 0}
!52 = !{!28, !28, i64 0}
!53 = distinct !{!53, !54}
!54 = !{!"llvm.loop.mustprogress"}


; 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::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%"class.JPH::Vec4" = type { %union.anon.4 }
%union.anon.4 = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }

@_ZTVN3JPH16SixDOFConstraintE = external dso_local unnamed_addr constant { [20 x ptr] }, align 8
@constinit = external hidden local_unnamed_addr constant [6 x i32], align 4

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

declare i32 @__gxx_personality_v0(...)

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH16SixDOFConstraintC2ERNS_4BodyES2_RKNS_24SixDOFConstraintSettingsE(ptr noundef nonnull align 16 dereferenceable(1856) %0, ptr noundef nonnull align 16 dereferenceable(122) %1, ptr noundef nonnull align 16 dereferenceable(122) %2, ptr noundef nonnull align 16 dereferenceable(432) %3) unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %5 = alloca %"class.JPH::Mat44", align 16
  %6 = alloca %"class.JPH::Vec4", align 16
  %7 = alloca %"class.JPH::Vec4", align 16
  %8 = alloca %"class.JPH::Vec4", align 16
  %9 = alloca %"class.JPH::Vec4", align 16
  %10 = alloca %"class.JPH::Mat44", align 16
  %11 = alloca %"class.JPH::Vec4", align 16
  %12 = alloca %"class.JPH::Vec4", align 16
  %13 = alloca %"class.JPH::Vec4", align 16
  %14 = alloca %"class.JPH::Vec4", align 16
  %15 = alloca %"class.JPH::Mat44", align 16
  %16 = alloca %"class.JPH::Quat", align 16
  %17 = alloca %"class.JPH::Quat", align 16
  %18 = alloca %"class.JPH::Mat44", align 16
  %19 = alloca %"class.JPH::Quat", align 16
  %20 = alloca %"class.JPH::Quat", align 16
  tail call void @_ZN3JPH17TwoBodyConstraintC2ERNS_4BodyES2_RKNS_25TwoBodyConstraintSettingsE(ptr noundef nonnull align 8 dereferenceable(48) %0, ptr noundef nonnull align 16 dereferenceable(122) %1, ptr noundef nonnull align 16 dereferenceable(122) %2, ptr noundef nonnull align 8 dereferenceable(40) %3)
  store ptr getelementptr inbounds inrange(-16, 144) (i8, ptr @_ZTVN3JPH16SixDOFConstraintE, i64 16), ptr %0, align 16, !tbaa !5
  %21 = getelementptr inbounds i8, ptr %0, i64 112
  %.ptr = getelementptr inbounds i8, ptr %0, i64 168
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(6) %21, i8 0, i64 6, i1 false)
  tail call void @_ZN3JPH14SpringSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr) #10
  %.ptr.1 = getelementptr inbounds i8, ptr %0, i64 180
  tail call void @_ZN3JPH14SpringSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr.1) #10
  %.ptr.2 = getelementptr inbounds i8, ptr %0, i64 192
  tail call void @_ZN3JPH14SpringSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr.2) #10
  %.ptr86 = getelementptr inbounds i8, ptr %0, i64 204
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr86)
          to label %22 unwind label %.loopexit

22:                                               ; preds = %4
  %.ptr84.1 = getelementptr inbounds i8, ptr %0, i64 232
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr84.1)
          to label %23 unwind label %.loopexit

23:                                               ; preds = %22
  %.ptr84.2 = getelementptr inbounds i8, ptr %0, i64 260
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr84.2)
          to label %24 unwind label %.loopexit

24:                                               ; preds = %23
  %.ptr84.3 = getelementptr inbounds i8, ptr %0, i64 288
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr84.3)
          to label %25 unwind label %.loopexit

25:                                               ; preds = %24
  %.ptr84.4 = getelementptr inbounds i8, ptr %0, i64 316
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr84.4)
          to label %26 unwind label %.loopexit

26:                                               ; preds = %25
  %.ptr84.5 = getelementptr inbounds i8, ptr %0, i64 344
  invoke void @_ZN3JPH13MotorSettingsC2Ev(ptr noundef nonnull align 4 dereferenceable(28) %.ptr84.5)
          to label %27 unwind label %.loopexit

27:                                               ; preds = %26
  %28 = getelementptr inbounds i8, ptr %0, i64 396
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) %28, ptr noundef nonnull align 4 dereferenceable(24) @constinit, i64 24, i1 false), !tbaa.struct !8
  %29 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %30 unwind label %.loopexit.split-lp

30:                                               ; preds = %27
  %31 = getelementptr inbounds i8, ptr %0, i64 432
  %32 = extractvalue { double, double } %29, 0
  store double %32, ptr %31, align 16
  %33 = getelementptr inbounds i8, ptr %0, i64 440
  %34 = extractvalue { double, double } %29, 1
  store double %34, ptr %33, align 8
  %35 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %36 unwind label %.loopexit.split-lp

36:                                               ; preds = %30
  %37 = getelementptr inbounds i8, ptr %0, i64 448
  %38 = extractvalue { double, double } %35, 0
  store double %38, ptr %37, align 16
  %39 = getelementptr inbounds i8, ptr %0, i64 456
  %40 = extractvalue { double, double } %35, 1
  store double %40, ptr %39, align 8
  %41 = invoke { double, double } @_ZN3JPH4Vec35sZeroEv()
          to label %42 unwind label %.loopexit.split-lp

42:                                               ; preds = %36
  %43 = getelementptr inbounds i8, ptr %0, i64 464
  %44 = extractvalue { double, double } %41, 0
  store double %44, ptr %43, align 16
  %45 = getelementptr inbounds i8, ptr %0, i64 472
  %46 = extractvalue { double, double } %41, 1
  store double %46, ptr %45, align 8
  %47 = invoke { double, double } @_ZN3JPH4Quat9sIdentityEv()
          to label %48 unwind label %.loopexit.split-lp

48:                                               ; preds = %42
  %49 = getelementptr inbounds i8, ptr %0, i64 480
  %50 = extractvalue { double, double } %47, 0
  store double %50, ptr %49, align 16
  %51 = getelementptr inbounds i8, ptr %0, i64 488
  %52 = extractvalue { double, double } %47, 1
  store double %52, ptr %51, align 8
  %.ptr89 = getelementptr inbounds i8, ptr %0, i64 604
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr89) #10
  %.ptr89.1 = getelementptr inbounds i8, ptr %0, i64 668
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr89.1) #10
  %.ptr89.2 = getelementptr inbounds i8, ptr %0, i64 732
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr89.2) #10
  %53 = getelementptr inbounds i8, ptr %0, i64 800
  invoke void @_ZN3JPH19PointConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(240) %53)
          to label %54 unwind label %.loopexit.split-lp

54:                                               ; preds = %48
  %55 = getelementptr inbounds i8, ptr %0, i64 1040
  tail call void @_ZN3JPH24SwingTwistConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(272) %55) #10
  %56 = getelementptr inbounds i8, ptr %0, i64 1312
  invoke void @_ZN3JPH27RotationEulerConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(208) %56)
          to label %.preheader107.preheader unwind label %.loopexit.split-lp

.preheader107.preheader:                          ; preds = %54
  %.ptr94 = getelementptr inbounds i8, ptr %0, i64 1520
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr94) #10
  %.ptr94.1 = getelementptr inbounds i8, ptr %0, i64 1584
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr94.1) #10
  %.ptr94.2 = getelementptr inbounds i8, ptr %0, i64 1648
  tail call void @_ZN3JPH18AxisConstraintPartC2Ev(ptr noundef nonnull align 4 dereferenceable(64) %.ptr94.2) #10
  %.ptr99 = getelementptr inbounds i8, ptr %0, i64 1712
  tail call void @_ZN3JPH19AngleConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(48) %.ptr99) #10
  %.ptr99.1 = getelementptr inbounds i8, ptr %0, i64 1760
  tail call void @_ZN3JPH19AngleConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(48) %.ptr99.1) #10
  %.ptr99.2 = getelementptr inbounds i8, ptr %0, i64 1808
  tail call void @_ZN3JPH19AngleConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(48) %.ptr99.2) #10
  %57 = getelementptr inbounds i8, ptr %3, i64 168
  %58 = load i8, ptr %57, align 8, !tbaa !11
  tail call void @_ZN3JPH24SwingTwistConstraintPart12SetSwingTypeENS_10ESwingTypeE(ptr noundef nonnull align 16 dereferenceable(272) %55, i8 noundef zeroext %58)
  %59 = getelementptr inbounds i8, ptr %3, i64 64
  %60 = getelementptr inbounds i8, ptr %3, i64 80
  %.sroa.041.0.copyload = load double, ptr %60, align 16
  %.sroa.242.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 88
  %.sroa.242.0.copyload = load double, ptr %.sroa.242.0..sroa_idx, align 8, !tbaa !9
  %61 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %59, double %.sroa.041.0.copyload, double %.sroa.242.0.copyload)
          to label %62 unwind label %153

62:                                               ; preds = %.preheader107.preheader
  %63 = extractvalue { double, double } %61, 0
  %64 = extractvalue { double, double } %61, 1
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %5) #10
  %.sroa.039.0.copyload = load double, ptr %59, align 16
  %.sroa.240.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 72
  %.sroa.240.0.copyload = load double, ptr %.sroa.240.0..sroa_idx, align 8, !tbaa !9
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.039.0.copyload, double %.sroa.240.0.copyload, float noundef 0.000000e+00)
  %.sroa.037.0.copyload = load double, ptr %60, align 16
  %.sroa.238.0.copyload = load double, ptr %.sroa.242.0..sroa_idx, align 8, !tbaa !9
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %7, double %.sroa.037.0.copyload, double %.sroa.238.0.copyload, float noundef 0.000000e+00)
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %8, double %63, double %64, float noundef 0.000000e+00)
  invoke void @_ZN3JPH4Vec4C2Effff(ptr noundef nonnull align 16 dereferenceable(16) %9, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %65 unwind label %155

65:                                               ; preds = %62
  %66 = load double, ptr %6, align 16
  %67 = getelementptr inbounds i8, ptr %6, i64 8
  %68 = load double, ptr %67, align 8
  %69 = load double, ptr %7, align 16
  %70 = getelementptr inbounds i8, ptr %7, i64 8
  %71 = load double, ptr %70, align 8
  %72 = load double, ptr %8, align 16
  %73 = getelementptr inbounds i8, ptr %8, i64 8
  %74 = load double, ptr %73, align 8
  %75 = load double, ptr %9, align 16
  %76 = getelementptr inbounds i8, ptr %9, i64 8
  %77 = load double, ptr %76, align 8
  call void @_ZN3JPH5Mat44C2ENS_4Vec4ES1_S1_S1_(ptr noundef nonnull align 16 dereferenceable(64) %5, double %66, double %68, double %69, double %71, double %72, double %74, double %75, double %77)
  %78 = invoke { double, double } @_ZNK3JPH5Mat4413GetQuaternionEv(ptr noundef nonnull align 16 dereferenceable(64) %5)
          to label %79 unwind label %157

79:                                               ; preds = %65
  %80 = extractvalue { double, double } %78, 0
  %81 = extractvalue { double, double } %78, 1
  %82 = getelementptr inbounds i8, ptr %0, i64 80
  store double %80, ptr %82, align 16
  %.sroa.534.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 88
  store double %81, ptr %.sroa.534.0..sroa_idx, align 8, !tbaa !9
  %83 = getelementptr inbounds i8, ptr %3, i64 112
  %84 = getelementptr inbounds i8, ptr %3, i64 128
  %.sroa.029.0.copyload = load double, ptr %84, align 16
  %.sroa.230.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 136
  %.sroa.230.0.copyload = load double, ptr %.sroa.230.0..sroa_idx, align 8, !tbaa !9
  %85 = invoke { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %83, double %.sroa.029.0.copyload, double %.sroa.230.0.copyload)
          to label %86 unwind label %159

86:                                               ; preds = %79
  %87 = extractvalue { double, double } %85, 0
  %88 = extractvalue { double, double } %85, 1
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %10) #10
  %.sroa.027.0.copyload = load double, ptr %83, align 16
  %.sroa.228.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 120
  %.sroa.228.0.copyload = load double, ptr %.sroa.228.0..sroa_idx, align 8, !tbaa !9
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %11, double %.sroa.027.0.copyload, double %.sroa.228.0.copyload, float noundef 0.000000e+00)
  %.sroa.025.0.copyload = load double, ptr %84, align 16
  %.sroa.226.0.copyload = load double, ptr %.sroa.230.0..sroa_idx, align 8, !tbaa !9
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %12, double %.sroa.025.0.copyload, double %.sroa.226.0.copyload, float noundef 0.000000e+00)
  call void @_ZN3JPH4Vec4C2ENS_4Vec3Ef(ptr noundef nonnull align 16 dereferenceable(16) %13, double %87, double %88, float noundef 0.000000e+00)
  invoke void @_ZN3JPH4Vec4C2Effff(ptr noundef nonnull align 16 dereferenceable(16) %14, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 0.000000e+00, float noundef 1.000000e+00)
          to label %89 unwind label %161

89:                                               ; preds = %86
  %90 = load double, ptr %11, align 16
  %91 = getelementptr inbounds i8, ptr %11, i64 8
  %92 = load double, ptr %91, align 8
  %93 = load double, ptr %12, align 16
  %94 = getelementptr inbounds i8, ptr %12, i64 8
  %95 = load double, ptr %94, align 8
  %96 = load double, ptr %13, align 16
  %97 = getelementptr inbounds i8, ptr %13, i64 8
  %98 = load double, ptr %97, align 8
  %99 = load double, ptr %14, align 16
  %100 = getelementptr inbounds i8, ptr %14, i64 8
  %101 = load double, ptr %100, align 8
  call void @_ZN3JPH5Mat44C2ENS_4Vec4ES1_S1_S1_(ptr noundef nonnull align 16 dereferenceable(64) %10, double %90, double %92, double %93, double %95, double %96, double %98, double %99, double %101)
  %102 = invoke { double, double } @_ZNK3JPH5Mat4413GetQuaternionEv(ptr noundef nonnull align 16 dereferenceable(64) %10)
          to label %103 unwind label %163

103:                                              ; preds = %89
  %104 = extractvalue { double, double } %102, 0
  %105 = extractvalue { double, double } %102, 1
  %106 = getelementptr inbounds i8, ptr %0, i64 96
  store double %104, ptr %106, align 16
  %.sroa.522.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 104
  store double %105, ptr %.sroa.522.0..sroa_idx, align 8, !tbaa !9
  %107 = getelementptr inbounds i8, ptr %3, i64 40
  %108 = load i32, ptr %107, align 8, !tbaa !26
  %109 = icmp eq i32 %108, 1
  br i1 %109, label %110, label %173

110:                                              ; preds = %103
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %15) #10
  invoke void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %15, ptr noundef nonnull align 16 dereferenceable(122) %1)
          to label %111 unwind label %165

111:                                              ; preds = %110
  %112 = getelementptr inbounds i8, ptr %3, i64 48
  %.sroa.017.0.copyload = load double, ptr %112, align 16
  %.sroa.218.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 56
  %.sroa.218.0.copyload = load double, ptr %.sroa.218.0..sroa_idx, align 8, !tbaa !9
  %113 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %15, double %.sroa.017.0.copyload, double %.sroa.218.0.copyload)
          to label %114 unwind label %165

114:                                              ; preds = %111
  %115 = extractvalue { double, double } %113, 0
  %116 = extractvalue { double, double } %113, 1
  %117 = getelementptr inbounds i8, ptr %0, i64 48
  store double %115, ptr %117, align 16
  %.sroa.520.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 56
  store double %116, ptr %.sroa.520.0..sroa_idx, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #10
  %118 = invoke { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %1)
          to label %119 unwind label %167

119:                                              ; preds = %114
  %120 = extractvalue { double, double } %118, 0
  store double %120, ptr %17, align 16
  %121 = getelementptr inbounds i8, ptr %17, i64 8
  %122 = extractvalue { double, double } %118, 1
  store double %122, ptr %121, align 8
  %123 = invoke { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %17)
          to label %124 unwind label %167

124:                                              ; preds = %119
  %125 = extractvalue { double, double } %123, 0
  store double %125, ptr %16, align 16
  %126 = getelementptr inbounds i8, ptr %16, i64 8
  %127 = extractvalue { double, double } %123, 1
  store double %127, ptr %126, align 8
  %.sroa.013.0.copyload = load double, ptr %82, align 16
  %.sroa.214.0.copyload = load double, ptr %.sroa.534.0..sroa_idx, align 8, !tbaa !9
  %128 = invoke { double, double } @_ZNK3JPH4QuatmlES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %.sroa.013.0.copyload, double %.sroa.214.0.copyload)
          to label %129 unwind label %167

129:                                              ; preds = %124
  %130 = extractvalue { double, double } %128, 0
  %131 = extractvalue { double, double } %128, 1
  store double %130, ptr %82, align 16
  store double %131, ptr %.sroa.534.0..sroa_idx, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #10
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %18) #10
  invoke void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %18, ptr noundef nonnull align 16 dereferenceable(122) %2)
          to label %132 unwind label %169

132:                                              ; preds = %129
  %133 = getelementptr inbounds i8, ptr %3, i64 96
  %.sroa.09.0.copyload = load double, ptr %133, align 16
  %.sroa.210.0..sroa_idx = getelementptr inbounds i8, ptr %3, i64 104
  %.sroa.210.0.copyload = load double, ptr %.sroa.210.0..sroa_idx, align 8, !tbaa !9
  %134 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %18, double %.sroa.09.0.copyload, double %.sroa.210.0.copyload)
          to label %135 unwind label %169

135:                                              ; preds = %132
  %136 = extractvalue { double, double } %134, 0
  %137 = extractvalue { double, double } %134, 1
  %138 = getelementptr inbounds i8, ptr %0, i64 64
  store double %136, ptr %138, align 16
  %.sroa.512.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 72
  store double %137, ptr %.sroa.512.0..sroa_idx, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %18) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #10
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #10
  %139 = invoke { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %2)
          to label %140 unwind label %171

140:                                              ; preds = %135
  %141 = extractvalue { double, double } %139, 0
  store double %141, ptr %20, align 16
  %142 = getelementptr inbounds i8, ptr %20, i64 8
  %143 = extractvalue { double, double } %139, 1
  store double %143, ptr %142, align 8
  %144 = invoke { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %20)
          to label %145 unwind label %171

145:                                              ; preds = %140
  %146 = extractvalue { double, double } %144, 0
  store double %146, ptr %19, align 16
  %147 = getelementptr inbounds i8, ptr %19, i64 8
  %148 = extractvalue { double, double } %144, 1
  store double %148, ptr %147, align 8
  %.sroa.07.0.copyload = load double, ptr %106, align 16
  %.sroa.2.0.copyload = load double, ptr %.sroa.522.0..sroa_idx, align 8, !tbaa !9
  %149 = invoke { double, double } @_ZNK3JPH4QuatmlES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %.sroa.07.0.copyload, double %.sroa.2.0.copyload)
          to label %150 unwind label %171

150:                                              ; preds = %145
  %151 = extractvalue { double, double } %149, 0
  %152 = extractvalue { double, double } %149, 1
  store double %151, ptr %106, align 16
  store double %152, ptr %.sroa.522.0..sroa_idx, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #10
  br label %178

.loopexit:                                        ; preds = %26, %25, %24, %23, %22, %4
  %lpad.loopexit = landingpad { ptr, i32 }
          cleanup
  br label %203

.loopexit.split-lp:                               ; preds = %27, %30, %36, %42, %48, %54
  %lpad.loopexit.split-lp = landingpad { ptr, i32 }
          cleanup
  br label %203

153:                                              ; preds = %.preheader107.preheader
  %154 = landingpad { ptr, i32 }
          cleanup
  br label %203

155:                                              ; preds = %62
  %156 = landingpad { ptr, i32 }
          cleanup
  br label %202

157:                                              ; preds = %65
  %158 = landingpad { ptr, i32 }
          cleanup
  br label %202

159:                                              ; preds = %79
  %160 = landingpad { ptr, i32 }
          cleanup
  br label %202

161:                                              ; preds = %199, %185, %184, %178, %86
  %162 = landingpad { ptr, i32 }
          cleanup
  br label %201

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

165:                                              ; preds = %111, %110
  %166 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #10
  br label %201

167:                                              ; preds = %124, %119, %114
  %168 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #10
  br label %201

169:                                              ; preds = %132, %129
  %170 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %18) #10
  br label %201

171:                                              ; preds = %145, %140, %135
  %172 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #10
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #10
  br label %201

173:                                              ; preds = %103
  %174 = getelementptr inbounds i8, ptr %3, i64 48
  %.sroa.05.0.copyload = load <4 x float>, ptr %174, align 16, !tbaa !9
  %175 = getelementptr inbounds i8, ptr %0, i64 48
  store <4 x float> %.sroa.05.0.copyload, ptr %175, align 16, !tbaa !9
  %176 = getelementptr inbounds i8, ptr %3, i64 96
  %.sroa.0.0.copyload = load <4 x float>, ptr %176, align 16, !tbaa !9
  %177 = getelementptr inbounds i8, ptr %0, i64 64
  store <4 x float> %.sroa.0.0.copyload, ptr %177, align 16, !tbaa !9
  br label %178

178:                                              ; preds = %173, %150
  %179 = getelementptr inbounds i8, ptr %0, i64 120
  %180 = getelementptr inbounds i8, ptr %3, i64 172
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(24) %179, ptr noundef nonnull align 4 dereferenceable(24) %180, i64 24, i1 false)
  %181 = getelementptr inbounds i8, ptr %0, i64 144
  %182 = getelementptr inbounds i8, ptr %3, i64 196
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(24) %181, ptr noundef nonnull align 4 dereferenceable(24) %182, i64 24, i1 false)
  %183 = getelementptr inbounds i8, ptr %3, i64 220
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(36) %.ptr, ptr noundef nonnull align 4 dereferenceable(36) %183, i64 36, i1 false)
  call void @_ZN3JPH16SixDOFConstraint23UpdateTranslationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
  invoke void @_ZN3JPH16SixDOFConstraint20UpdateRotationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
          to label %184 unwind label %161

184:                                              ; preds = %178
  invoke void @_ZN3JPH16SixDOFConstraint19UpdateFixedFreeAxisEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
          to label %185 unwind label %161

185:                                              ; preds = %184
  call void @_ZN3JPH16SixDOFConstraint20CacheHasSpringLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
  %186 = getelementptr inbounds i8, ptr %0, i64 372
  %187 = getelementptr inbounds i8, ptr %3, i64 144
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) %186, ptr noundef nonnull align 16 dereferenceable(24) %187, i64 24, i1 false)
  %188 = getelementptr inbounds i8, ptr %3, i64 256
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(28) %.ptr86, ptr noundef nonnull align 16 dereferenceable(28) %188, i64 28, i1 false), !tbaa.struct !27
  %189 = getelementptr inbounds i8, ptr %3, i64 284
  %190 = getelementptr inbounds i8, ptr %0, i64 232
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %190, ptr noundef nonnull align 4 dereferenceable(28) %189, i64 28, i1 false), !tbaa.struct !27
  %191 = getelementptr inbounds i8, ptr %3, i64 312
  %192 = getelementptr inbounds i8, ptr %0, i64 260
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(28) %192, ptr noundef nonnull align 8 dereferenceable(28) %191, i64 28, i1 false), !tbaa.struct !27
  %193 = getelementptr inbounds i8, ptr %3, i64 340
  %194 = getelementptr inbounds i8, ptr %0, i64 288
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(28) %194, ptr noundef nonnull align 4 dereferenceable(28) %193, i64 28, i1 false), !tbaa.struct !27
  %195 = getelementptr inbounds i8, ptr %3, i64 368
  %196 = getelementptr inbounds i8, ptr %0, i64 316
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(28) %196, ptr noundef nonnull align 16 dereferenceable(28) %195, i64 28, i1 false), !tbaa.struct !27
  %197 = getelementptr inbounds i8, ptr %3, i64 396
  %198 = getelementptr inbounds i8, ptr %0, i64 344
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %198, ptr noundef nonnull align 4 dereferenceable(28) %197, i64 28, i1 false), !tbaa.struct !27
  invoke void @_ZN3JPH16SixDOFConstraint27CacheTranslationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
          to label %199 unwind label %161

199:                                              ; preds = %185
  invoke void @_ZN3JPH16SixDOFConstraint24CacheRotationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856) %0)
          to label %200 unwind label %161

200:                                              ; preds = %199
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %10) #10
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %5) #10
  ret void

201:                                              ; preds = %171, %169, %167, %165, %163, %161
  %.pn = phi { ptr, i32 } [ %162, %161 ], [ %172, %171 ], [ %170, %169 ], [ %168, %167 ], [ %166, %165 ], [ %164, %163 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %10) #10
  br label %202

202:                                              ; preds = %159, %201, %157, %155
  %.pn.pn.pn = phi { ptr, i32 } [ %158, %157 ], [ %156, %155 ], [ %.pn, %201 ], [ %160, %159 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %5) #10
  br label %203

203:                                              ; preds = %.loopexit, %.loopexit.split-lp, %153, %202
  %.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn.pn.pn, %202 ], [ %154, %153 ], [ %lpad.loopexit, %.loopexit ], [ %lpad.loopexit.split-lp, %.loopexit.split-lp ]
  call void @_ZN3JPH10ConstraintD2Ev(ptr noundef nonnull align 8 dereferenceable(48) %0) #10
  resume { ptr, i32 } %.pn.pn.pn.pn.pn
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH17TwoBodyConstraintC2ERNS_4BodyES2_RKNS_25TwoBodyConstraintSettingsE(ptr noundef nonnull align 8 dereferenceable(48), ptr noundef nonnull align 16 dereferenceable(122), ptr noundef nonnull align 16 dereferenceable(122), ptr noundef nonnull align 8 dereferenceable(40)) unnamed_addr #1 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH19PointConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(240)) unnamed_addr #7 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH27RotationEulerConstraintPartC2Ev(ptr noundef nonnull align 16 dereferenceable(208)) unnamed_addr #7 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH24SwingTwistConstraintPart12SetSwingTypeENS_10ESwingTypeE(ptr noundef nonnull align 16 dereferenceable(272), i8 noundef zeroext) local_unnamed_addr #2 align 2

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

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

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body31GetInverseCenterOfMassTransformEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #7 align 2

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint23UpdateTranslationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint20UpdateRotationLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #7 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint19UpdateFixedFreeAxisEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #7 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint20CacheHasSpringLimitsEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint27CacheTranslationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH16SixDOFConstraint24CacheRotationMotorActiveEv(ptr noundef nonnull align 16 dereferenceable(1856)) local_unnamed_addr #1 align 2

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 #3 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { 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 #5 = { 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 #6 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { 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 #8 = { 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 #9 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{i64 0, i64 24, !9}
!9 = !{!10, !10, i64 0}
!10 = !{!"omnipotent char", !7, i64 0}
!11 = !{!12, !25, i64 168}
!12 = !{!"_ZTSN3JPH24SixDOFConstraintSettingsE", !13, i64 0, !23, i64 40, !24, i64 48, !24, i64 64, !24, i64 80, !24, i64 96, !24, i64 112, !24, i64 128, !10, i64 144, !25, i64 168, !10, i64 172, !10, i64 196, !10, i64 220, !10, i64 256}
!13 = !{!"_ZTSN3JPH25TwoBodyConstraintSettingsE", !14, i64 0}
!14 = !{!"_ZTSN3JPH18ConstraintSettingsE", !15, i64 0, !16, i64 8, !20, i64 12, !19, i64 16, !19, i64 20, !19, i64 24, !21, i64 28, !22, i64 32}
!15 = !{!"_ZTSN3JPH18SerializableObjectE"}
!16 = !{!"_ZTSN3JPH9RefTargetINS_18ConstraintSettingsEEE", !17, i64 0}
!17 = !{!"_ZTSSt6atomicIjE", !18, i64 0}
!18 = !{!"_ZTSSt13__atomic_baseIjE", !19, i64 0}
!19 = !{!"int", !10, i64 0}
!20 = !{!"bool", !10, i64 0}
!21 = !{!"float", !10, i64 0}
!22 = !{!"long", !10, i64 0}
!23 = !{!"_ZTSN3JPH16EConstraintSpaceE", !10, i64 0}
!24 = !{!"_ZTSN3JPH4Vec3E", !10, i64 0}
!25 = !{!"_ZTSN3JPH10ESwingTypeE", !10, i64 0}
!26 = !{!12, !23, i64 40}
!27 = !{i64 0, i64 1, !28, i64 4, i64 4, !9, i64 8, i64 4, !30, i64 12, i64 4, !30, i64 16, i64 4, !30, i64 20, i64 4, !30, i64 24, i64 4, !30}
!28 = !{!29, !29, i64 0}
!29 = !{!"_ZTSN3JPH11ESpringModeE", !10, i64 0}
!30 = !{!21, !21, i64 0}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopRotatePass,LoopSimplifyPass,MemCpyOptPass,SROAPass,SimplifyCFGPass,TailCallElimPass