; LLVM IR from ClementineAccount/Albuquerque :: lib/bullet/include/Bullet3Dynamics/ConstraintSolver (b3PgsJacobiSolver)

; 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.b3ProfileZone = type { i8 }
%class.b3Vector3 = type { %union.anon }
%union.anon = type { [4 x float] }
%class.b3Quaternion = type { %class.b3QuadWord }
%class.b3QuadWord = type { %union.anon.10 }
%union.anon.10 = type { [4 x float] }
%class.b3PgsJacobiSolver = type { ptr, %class.b3AlignedObjectArray, %class.b3AlignedObjectArray.0, %class.b3AlignedObjectArray.0, %class.b3AlignedObjectArray.0, %class.b3AlignedObjectArray.0, %class.b3AlignedObjectArray.2, %class.b3AlignedObjectArray.2, %class.b3AlignedObjectArray.2, %class.b3AlignedObjectArray.4, %class.b3AlignedObjectArray.2, %class.b3AlignedObjectArray.2, %class.b3AlignedObjectArray.6, %class.b3AlignedObjectArray.6, i8, i32, i32, i64 }
%class.b3AlignedObjectArray = type <{ [4 x i8], i32, i32, [4 x i8], ptr, i8, [7 x i8] }>
%class.b3AlignedObjectArray.0 = type <{ [4 x i8], i32, i32, [4 x i8], ptr, i8, [7 x i8] }>
%class.b3AlignedObjectArray.4 = type <{ [4 x i8], i32, i32, [4 x i8], ptr, i8, [7 x i8] }>
%class.b3AlignedObjectArray.2 = type <{ [4 x i8], i32, i32, [4 x i8], ptr, i8, [7 x i8] }>
%class.b3AlignedObjectArray.6 = type <{ [4 x i8], i32, i32, [4 x i8], ptr, i8, [7 x i8] }>
%struct.b3ContactSolverInfoData = type { float, float, float, float, float, i32, float, float, float, float, float, i32, float, float, float, float, i32, i32, i32, float, float }
%struct.b3SolverConstraint = type { %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, float, float, i32, i32, float, float, float, float, float, float, float, %union.anon.9, i32, i32, i32, i32, [8 x i8] }
%union.anon.9 = type { ptr }
%struct.b3ContactPoint = type { %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, float, float, float, float, %class.b3Vector3, %class.b3Vector3, float, float, float, float, float, float, float, i8 }
%struct.b3SolverBody = type <{ %class.b3Transform, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %union.anon.8, [3 x i32], [12 x i8] }>
%class.b3Transform = type { %class.b3Matrix3x3, %class.b3Vector3 }
%class.b3Matrix3x3 = type { [3 x %class.b3Vector3] }
%union.anon.8 = type { ptr }
%struct.b3JointFeedback = type { %class.b3Vector3, %class.b3Vector3, %class.b3Vector3, %class.b3Vector3 }
%struct.b3RigidBodyData = type { %class.b3Vector3, %class.b3Quaternion, %class.b3Vector3, %class.b3Vector3, i32, float, float, float }

@.str.4 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [37 x i8], align 1

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) #2

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

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1), ptr noundef) unnamed_addr #3 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) #2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16)) #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN20b3AlignedObjectArrayIiEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #5 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #5 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN17b3TypedConstraint25internalSetAppliedImpulseEf(ptr noundef nonnull align 16 dereferenceable(64), float noundef) #4 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN17b3TypedConstraint16getJointFeedbackEv(ptr noundef nonnull align 16 dereferenceable(64)) #4 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK17b3TypedConstraint27getBreakingImpulseThresholdEv(ptr noundef nonnull align 16 dereferenceable(64)) #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_Z6b3Fabsf(float noundef) #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #5 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local noundef float @_ZN17b3PgsJacobiSolver29solveGroupCacheFriendlyFinishEP15b3RigidBodyDataP13b3InertiaDataiRK19b3ContactSolverInfo(ptr noundef nonnull align 8 dereferenceable(448) %0, ptr noundef %1, ptr noundef %2, i32 noundef %3, ptr noundef nonnull align 4 dereferenceable(84) %4) unnamed_addr #7 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca %class.b3ProfileZone, align 1
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca %class.b3Vector3, align 16
  %25 = alloca %class.b3Vector3, align 16
  %26 = alloca %class.b3Vector3, align 16
  %27 = alloca %class.b3Vector3, align 16
  %28 = alloca %class.b3Vector3, align 16
  %29 = alloca %class.b3Vector3, align 16
  %30 = alloca %class.b3Vector3, align 16
  %31 = alloca %class.b3Vector3, align 16
  %32 = alloca %class.b3Vector3, align 16
  %33 = alloca %class.b3Vector3, align 16
  %34 = alloca %class.b3Vector3, align 16
  %35 = alloca %class.b3Vector3, align 16
  %36 = alloca %class.b3Vector3, align 16
  %37 = alloca %class.b3Vector3, align 16
  %38 = alloca %class.b3ProfileZone, align 1
  %39 = alloca i32, align 4
  %40 = alloca ptr, align 8
  %41 = alloca float, align 4
  %42 = alloca %class.b3Vector3, align 16
  %43 = alloca %class.b3Vector3, align 16
  %44 = alloca %class.b3Quaternion, align 16
  %45 = alloca %class.b3Quaternion, align 16
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store i32 %3, ptr %9, align 4, !tbaa !9
  store ptr %4, ptr %10, align 8, !tbaa !5
  %46 = load ptr, ptr %6, align 8
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #8
  call void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1) %11, ptr noundef @.str.4)
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #8
  %47 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 2
  %48 = invoke noundef i32 @_ZNK20b3AlignedObjectArrayI18b3SolverConstraintE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %47)
          to label %49 unwind label %100

49:                                               ; preds = %5
  store i32 %48, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #8
  %50 = load ptr, ptr %10, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %50, i32 0, i32 16
  %52 = load i32, ptr %51, align 4, !tbaa !11
  %53 = and i32 %52, 4
  %54 = icmp ne i32 %53, 0
  br i1 %54, label %55, label %118

55:                                               ; preds = %49
  store i32 0, ptr %16, align 4, !tbaa !9
  br label %56

56:                                               ; preds = %113, %55
  %57 = load i32, ptr %16, align 4, !tbaa !9
  %58 = load i32, ptr %12, align 4, !tbaa !9
  %59 = icmp slt i32 %57, %58
  br i1 %59, label %60, label %117

60:                                               ; preds = %56
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #8
  %61 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 2
  %62 = load i32, ptr %16, align 4, !tbaa !9
  %63 = invoke noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %61, i32 noundef %62)
          to label %64 unwind label %104

64:                                               ; preds = %60
  store ptr %63, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #8
  %65 = load ptr, ptr %17, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.b3SolverConstraint, ptr %65, i32 0, i32 16
  %67 = load ptr, ptr %66, align 16, !tbaa !14
  store ptr %67, ptr %18, align 8, !tbaa !5
  %68 = load ptr, ptr %17, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.b3SolverConstraint, ptr %68, i32 0, i32 6
  %70 = load float, ptr %69, align 4, !tbaa !15
  %71 = load ptr, ptr %18, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.b3ContactPoint, ptr %71, i32 0, i32 3
  store float %70, ptr %72, align 16, !tbaa !18
  %73 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 4
  %74 = load ptr, ptr %17, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct.b3SolverConstraint, ptr %74, i32 0, i32 18
  %76 = load i32, ptr %75, align 4, !tbaa !21
  %77 = invoke noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %73, i32 noundef %76)
          to label %78 unwind label %108

78:                                               ; preds = %64
  %79 = getelementptr inbounds %struct.b3SolverConstraint, ptr %77, i32 0, i32 6
  %80 = load float, ptr %79, align 4, !tbaa !15
  %81 = load ptr, ptr %18, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.b3ContactPoint, ptr %81, i32 0, i32 9
  store float %80, ptr %82, align 16, !tbaa !22
  %83 = load ptr, ptr %10, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %83, i32 0, i32 16
  %85 = load i32, ptr %84, align 4, !tbaa !11
  %86 = and i32 %85, 16
  %87 = icmp ne i32 %86, 0
  br i1 %87, label %88, label %112

88:                                               ; preds = %78
  %89 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 4
  %90 = load ptr, ptr %17, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.b3SolverConstraint, ptr %90, i32 0, i32 18
  %92 = load i32, ptr %91, align 4, !tbaa !21
  %93 = add nsw i32 %92, 1
  %94 = invoke noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %89, i32 noundef %93)
          to label %95 unwind label %108

95:                                               ; preds = %88
  %96 = getelementptr inbounds %struct.b3SolverConstraint, ptr %94, i32 0, i32 6
  %97 = load float, ptr %96, align 4, !tbaa !15
  %98 = load ptr, ptr %18, align 8, !tbaa !5
  %99 = getelementptr inbounds %struct.b3ContactPoint, ptr %98, i32 0, i32 10
  store float %97, ptr %99, align 4, !tbaa !23
  br label %112

100:                                              ; preds = %5
  %101 = landingpad { ptr, i32 }
          cleanup
  %102 = extractvalue { ptr, i32 } %101, 0
  store ptr %102, ptr %13, align 8
  %103 = extractvalue { ptr, i32 } %101, 1
  store i32 %103, ptr %14, align 4
  br label %571

104:                                              ; preds = %60
  %105 = landingpad { ptr, i32 }
          cleanup
  %106 = extractvalue { ptr, i32 } %105, 0
  store ptr %106, ptr %13, align 8
  %107 = extractvalue { ptr, i32 } %105, 1
  store i32 %107, ptr %14, align 4
  br label %116

108:                                              ; preds = %88, %64
  %109 = landingpad { ptr, i32 }
          cleanup
  %110 = extractvalue { ptr, i32 } %109, 0
  store ptr %110, ptr %13, align 8
  %111 = extractvalue { ptr, i32 } %109, 1
  store i32 %111, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  br label %116

112:                                              ; preds = %95, %78
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  br label %113

113:                                              ; preds = %112
  %114 = load i32, ptr %16, align 4, !tbaa !9
  %115 = add nsw i32 %114, 1
  store i32 %115, ptr %16, align 4, !tbaa !9
  br label %56, !llvm.loop !24

116:                                              ; preds = %108, %104
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  br label %570

117:                                              ; preds = %56
  br label %118

118:                                              ; preds = %117, %49
  %119 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 3
  %120 = invoke noundef i32 @_ZNK20b3AlignedObjectArrayI18b3SolverConstraintE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %119)
          to label %121 unwind label %312

121:                                              ; preds = %118
  store i32 %120, ptr %12, align 4, !tbaa !9
  store i32 0, ptr %16, align 4, !tbaa !9
  br label %122

122:                                              ; preds = %369, %121
  %123 = load i32, ptr %16, align 4, !tbaa !9
  %124 = load i32, ptr %12, align 4, !tbaa !9
  %125 = icmp slt i32 %123, %124
  br i1 %125, label %126, label %374

126:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  %127 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 3
  %128 = load i32, ptr %16, align 4, !tbaa !9
  %129 = invoke noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %127, i32 noundef %128)
          to label %130 unwind label %316

130:                                              ; preds = %126
  store ptr %129, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #8
  %131 = load ptr, ptr %19, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.b3SolverConstraint, ptr %131, i32 0, i32 16
  %133 = load ptr, ptr %132, align 16, !tbaa !14
  store ptr %133, ptr %20, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #8
  %134 = load ptr, ptr %20, align 8, !tbaa !5
  %135 = invoke noundef ptr @_ZN17b3TypedConstraint16getJointFeedbackEv(ptr noundef nonnull align 16 dereferenceable(64) %134)
          to label %136 unwind label %320

136:                                              ; preds = %130
  store ptr %135, ptr %21, align 8, !tbaa !5
  %137 = load ptr, ptr %21, align 8, !tbaa !5
  %138 = icmp ne ptr %137, null
  br i1 %138, label %139, label %350

139:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  %140 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %141 = load ptr, ptr %19, align 8, !tbaa !5
  %142 = getelementptr inbounds %struct.b3SolverConstraint, ptr %141, i32 0, i32 19
  %143 = load i32, ptr %142, align 16, !tbaa !26
  %144 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %140, i32 noundef %143)
          to label %145 unwind label %324

145:                                              ; preds = %139
  store ptr %144, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #8
  %146 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %147 = load ptr, ptr %19, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.b3SolverConstraint, ptr %147, i32 0, i32 20
  %149 = load i32, ptr %148, align 4, !tbaa !27
  %150 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %146, i32 noundef %149)
          to label %151 unwind label %328

151:                                              ; preds = %145
  store ptr %150, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %24) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #8
  %152 = load ptr, ptr %19, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.b3SolverConstraint, ptr %152, i32 0, i32 1
  %154 = load ptr, ptr %19, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.b3SolverConstraint, ptr %154, i32 0, i32 6
  %156 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %153, ptr noundef nonnull align 4 dereferenceable(4) %155)
          to label %157 unwind label %332

157:                                              ; preds = %151
  %158 = getelementptr inbounds %class.b3Vector3, ptr %26, i32 0, i32 0
  %159 = getelementptr inbounds %union.anon, ptr %158, i32 0, i32 0
  %160 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %159, i32 0, i32 0
  %161 = extractvalue { <2 x float>, <2 x float> } %156, 0
  store <2 x float> %161, ptr %160, align 16
  %162 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %159, i32 0, i32 1
  %163 = extractvalue { <2 x float>, <2 x float> } %156, 1
  store <2 x float> %163, ptr %162, align 8
  %164 = load ptr, ptr %22, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.b3SolverBody, ptr %164, i32 0, i32 4
  %166 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %26, ptr noundef nonnull align 16 dereferenceable(16) %165)
          to label %167 unwind label %332

167:                                              ; preds = %157
  %168 = getelementptr inbounds %class.b3Vector3, ptr %25, i32 0, i32 0
  %169 = getelementptr inbounds %union.anon, ptr %168, i32 0, i32 0
  %170 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %169, i32 0, i32 0
  %171 = extractvalue { <2 x float>, <2 x float> } %166, 0
  store <2 x float> %171, ptr %170, align 16
  %172 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %169, i32 0, i32 1
  %173 = extractvalue { <2 x float>, <2 x float> } %166, 1
  store <2 x float> %173, ptr %172, align 8
  %174 = load ptr, ptr %10, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %174, i32 0, i32 3
  %176 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %25, ptr noundef nonnull align 4 dereferenceable(4) %175)
          to label %177 unwind label %332

177:                                              ; preds = %167
  %178 = getelementptr inbounds %class.b3Vector3, ptr %24, i32 0, i32 0
  %179 = getelementptr inbounds %union.anon, ptr %178, i32 0, i32 0
  %180 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %179, i32 0, i32 0
  %181 = extractvalue { <2 x float>, <2 x float> } %176, 0
  store <2 x float> %181, ptr %180, align 16
  %182 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %179, i32 0, i32 1
  %183 = extractvalue { <2 x float>, <2 x float> } %176, 1
  store <2 x float> %183, ptr %182, align 8
  %184 = load ptr, ptr %21, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.b3JointFeedback, ptr %184, i32 0, i32 0
  %186 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %185, ptr noundef nonnull align 16 dereferenceable(16) %24)
          to label %187 unwind label %332

187:                                              ; preds = %177
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %27) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %28) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %29) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #8
  %188 = load ptr, ptr %19, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.b3SolverConstraint, ptr %188, i32 0, i32 1
  %190 = invoke { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16) %189)
          to label %191 unwind label %336

191:                                              ; preds = %187
  %192 = getelementptr inbounds %class.b3Vector3, ptr %30, i32 0, i32 0
  %193 = getelementptr inbounds %union.anon, ptr %192, i32 0, i32 0
  %194 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %193, i32 0, i32 0
  %195 = extractvalue { <2 x float>, <2 x float> } %190, 0
  store <2 x float> %195, ptr %194, align 16
  %196 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %193, i32 0, i32 1
  %197 = extractvalue { <2 x float>, <2 x float> } %190, 1
  store <2 x float> %197, ptr %196, align 8
  %198 = load ptr, ptr %19, align 8, !tbaa !5
  %199 = getelementptr inbounds %struct.b3SolverConstraint, ptr %198, i32 0, i32 6
  %200 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %30, ptr noundef nonnull align 4 dereferenceable(4) %199)
          to label %201 unwind label %336

201:                                              ; preds = %191
  %202 = getelementptr inbounds %class.b3Vector3, ptr %29, i32 0, i32 0
  %203 = getelementptr inbounds %union.anon, ptr %202, i32 0, i32 0
  %204 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %203, i32 0, i32 0
  %205 = extractvalue { <2 x float>, <2 x float> } %200, 0
  store <2 x float> %205, ptr %204, align 16
  %206 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %203, i32 0, i32 1
  %207 = extractvalue { <2 x float>, <2 x float> } %200, 1
  store <2 x float> %207, ptr %206, align 8
  %208 = load ptr, ptr %23, align 8, !tbaa !5
  %209 = getelementptr inbounds %struct.b3SolverBody, ptr %208, i32 0, i32 4
  %210 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %29, ptr noundef nonnull align 16 dereferenceable(16) %209)
          to label %211 unwind label %336

211:                                              ; preds = %201
  %212 = getelementptr inbounds %class.b3Vector3, ptr %28, i32 0, i32 0
  %213 = getelementptr inbounds %union.anon, ptr %212, i32 0, i32 0
  %214 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %213, i32 0, i32 0
  %215 = extractvalue { <2 x float>, <2 x float> } %210, 0
  store <2 x float> %215, ptr %214, align 16
  %216 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %213, i32 0, i32 1
  %217 = extractvalue { <2 x float>, <2 x float> } %210, 1
  store <2 x float> %217, ptr %216, align 8
  %218 = load ptr, ptr %10, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %218, i32 0, i32 3
  %220 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %28, ptr noundef nonnull align 4 dereferenceable(4) %219)
          to label %221 unwind label %336

221:                                              ; preds = %211
  %222 = getelementptr inbounds %class.b3Vector3, ptr %27, i32 0, i32 0
  %223 = getelementptr inbounds %union.anon, ptr %222, i32 0, i32 0
  %224 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %223, i32 0, i32 0
  %225 = extractvalue { <2 x float>, <2 x float> } %220, 0
  store <2 x float> %225, ptr %224, align 16
  %226 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %223, i32 0, i32 1
  %227 = extractvalue { <2 x float>, <2 x float> } %220, 1
  store <2 x float> %227, ptr %226, align 8
  %228 = load ptr, ptr %21, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.b3JointFeedback, ptr %228, i32 0, i32 2
  %230 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %229, ptr noundef nonnull align 16 dereferenceable(16) %27)
          to label %231 unwind label %336

231:                                              ; preds = %221
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %31) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %33) #8
  %232 = load ptr, ptr %19, align 8, !tbaa !5
  %233 = getelementptr inbounds %struct.b3SolverConstraint, ptr %232, i32 0, i32 0
  %234 = load ptr, ptr %22, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.b3SolverBody, ptr %234, i32 0, i32 3
  %236 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %233, ptr noundef nonnull align 16 dereferenceable(16) %235)
          to label %237 unwind label %340

237:                                              ; preds = %231
  %238 = getelementptr inbounds %class.b3Vector3, ptr %33, i32 0, i32 0
  %239 = getelementptr inbounds %union.anon, ptr %238, i32 0, i32 0
  %240 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %239, i32 0, i32 0
  %241 = extractvalue { <2 x float>, <2 x float> } %236, 0
  store <2 x float> %241, ptr %240, align 16
  %242 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %239, i32 0, i32 1
  %243 = extractvalue { <2 x float>, <2 x float> } %236, 1
  store <2 x float> %243, ptr %242, align 8
  %244 = load ptr, ptr %19, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.b3SolverConstraint, ptr %244, i32 0, i32 6
  %246 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %33, ptr noundef nonnull align 4 dereferenceable(4) %245)
          to label %247 unwind label %340

247:                                              ; preds = %237
  %248 = getelementptr inbounds %class.b3Vector3, ptr %32, i32 0, i32 0
  %249 = getelementptr inbounds %union.anon, ptr %248, i32 0, i32 0
  %250 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %249, i32 0, i32 0
  %251 = extractvalue { <2 x float>, <2 x float> } %246, 0
  store <2 x float> %251, ptr %250, align 16
  %252 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %249, i32 0, i32 1
  %253 = extractvalue { <2 x float>, <2 x float> } %246, 1
  store <2 x float> %253, ptr %252, align 8
  %254 = load ptr, ptr %10, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %254, i32 0, i32 3
  %256 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %32, ptr noundef nonnull align 4 dereferenceable(4) %255)
          to label %257 unwind label %340

257:                                              ; preds = %247
  %258 = getelementptr inbounds %class.b3Vector3, ptr %31, i32 0, i32 0
  %259 = getelementptr inbounds %union.anon, ptr %258, i32 0, i32 0
  %260 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %259, i32 0, i32 0
  %261 = extractvalue { <2 x float>, <2 x float> } %256, 0
  store <2 x float> %261, ptr %260, align 16
  %262 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %259, i32 0, i32 1
  %263 = extractvalue { <2 x float>, <2 x float> } %256, 1
  store <2 x float> %263, ptr %262, align 8
  %264 = load ptr, ptr %21, align 8, !tbaa !5
  %265 = getelementptr inbounds %struct.b3JointFeedback, ptr %264, i32 0, i32 1
  %266 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %265, ptr noundef nonnull align 16 dereferenceable(16) %31)
          to label %267 unwind label %340

267:                                              ; preds = %257
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %31) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %34) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %35) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #8
  %268 = load ptr, ptr %19, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.b3SolverConstraint, ptr %268, i32 0, i32 0
  %270 = invoke { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16) %269)
          to label %271 unwind label %344

271:                                              ; preds = %267
  %272 = getelementptr inbounds %class.b3Vector3, ptr %37, i32 0, i32 0
  %273 = getelementptr inbounds %union.anon, ptr %272, i32 0, i32 0
  %274 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %273, i32 0, i32 0
  %275 = extractvalue { <2 x float>, <2 x float> } %270, 0
  store <2 x float> %275, ptr %274, align 16
  %276 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %273, i32 0, i32 1
  %277 = extractvalue { <2 x float>, <2 x float> } %270, 1
  store <2 x float> %277, ptr %276, align 8
  %278 = load ptr, ptr %23, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.b3SolverBody, ptr %278, i32 0, i32 3
  %280 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %37, ptr noundef nonnull align 16 dereferenceable(16) %279)
          to label %281 unwind label %344

281:                                              ; preds = %271
  %282 = getelementptr inbounds %class.b3Vector3, ptr %36, i32 0, i32 0
  %283 = getelementptr inbounds %union.anon, ptr %282, i32 0, i32 0
  %284 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %283, i32 0, i32 0
  %285 = extractvalue { <2 x float>, <2 x float> } %280, 0
  store <2 x float> %285, ptr %284, align 16
  %286 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %283, i32 0, i32 1
  %287 = extractvalue { <2 x float>, <2 x float> } %280, 1
  store <2 x float> %287, ptr %286, align 8
  %288 = load ptr, ptr %19, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.b3SolverConstraint, ptr %288, i32 0, i32 6
  %290 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %36, ptr noundef nonnull align 4 dereferenceable(4) %289)
          to label %291 unwind label %344

291:                                              ; preds = %281
  %292 = getelementptr inbounds %class.b3Vector3, ptr %35, i32 0, i32 0
  %293 = getelementptr inbounds %union.anon, ptr %292, i32 0, i32 0
  %294 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %293, i32 0, i32 0
  %295 = extractvalue { <2 x float>, <2 x float> } %290, 0
  store <2 x float> %295, ptr %294, align 16
  %296 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %293, i32 0, i32 1
  %297 = extractvalue { <2 x float>, <2 x float> } %290, 1
  store <2 x float> %297, ptr %296, align 8
  %298 = load ptr, ptr %10, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %298, i32 0, i32 3
  %300 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %35, ptr noundef nonnull align 4 dereferenceable(4) %299)
          to label %301 unwind label %344

301:                                              ; preds = %291
  %302 = getelementptr inbounds %class.b3Vector3, ptr %34, i32 0, i32 0
  %303 = getelementptr inbounds %union.anon, ptr %302, i32 0, i32 0
  %304 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %303, i32 0, i32 0
  %305 = extractvalue { <2 x float>, <2 x float> } %300, 0
  store <2 x float> %305, ptr %304, align 16
  %306 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %303, i32 0, i32 1
  %307 = extractvalue { <2 x float>, <2 x float> } %300, 1
  store <2 x float> %307, ptr %306, align 8
  %308 = load ptr, ptr %21, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.b3JointFeedback, ptr %308, i32 0, i32 3
  %310 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %309, ptr noundef nonnull align 16 dereferenceable(16) %34)
          to label %311 unwind label %344

311:                                              ; preds = %301
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  br label %350

312:                                              ; preds = %565, %563, %561, %559, %557, %118
  %313 = landingpad { ptr, i32 }
          cleanup
  %314 = extractvalue { ptr, i32 } %313, 0
  store ptr %314, ptr %13, align 8
  %315 = extractvalue { ptr, i32 } %313, 1
  store i32 %315, ptr %14, align 4
  br label %570

316:                                              ; preds = %126
  %317 = landingpad { ptr, i32 }
          cleanup
  %318 = extractvalue { ptr, i32 } %317, 0
  store ptr %318, ptr %13, align 8
  %319 = extractvalue { ptr, i32 } %317, 1
  store i32 %319, ptr %14, align 4
  br label %373

320:                                              ; preds = %365, %360, %355, %350, %130
  %321 = landingpad { ptr, i32 }
          cleanup
  %322 = extractvalue { ptr, i32 } %321, 0
  store ptr %322, ptr %13, align 8
  %323 = extractvalue { ptr, i32 } %321, 1
  store i32 %323, ptr %14, align 4
  br label %372

324:                                              ; preds = %139
  %325 = landingpad { ptr, i32 }
          cleanup
  %326 = extractvalue { ptr, i32 } %325, 0
  store ptr %326, ptr %13, align 8
  %327 = extractvalue { ptr, i32 } %325, 1
  store i32 %327, ptr %14, align 4
  br label %349

328:                                              ; preds = %145
  %329 = landingpad { ptr, i32 }
          cleanup
  %330 = extractvalue { ptr, i32 } %329, 0
  store ptr %330, ptr %13, align 8
  %331 = extractvalue { ptr, i32 } %329, 1
  store i32 %331, ptr %14, align 4
  br label %348

332:                                              ; preds = %177, %167, %157, %151
  %333 = landingpad { ptr, i32 }
          cleanup
  %334 = extractvalue { ptr, i32 } %333, 0
  store ptr %334, ptr %13, align 8
  %335 = extractvalue { ptr, i32 } %333, 1
  store i32 %335, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %24) #8
  br label %348

336:                                              ; preds = %221, %211, %201, %191, %187
  %337 = landingpad { ptr, i32 }
          cleanup
  %338 = extractvalue { ptr, i32 } %337, 0
  store ptr %338, ptr %13, align 8
  %339 = extractvalue { ptr, i32 } %337, 1
  store i32 %339, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %27) #8
  br label %348

340:                                              ; preds = %257, %247, %237, %231
  %341 = landingpad { ptr, i32 }
          cleanup
  %342 = extractvalue { ptr, i32 } %341, 0
  store ptr %342, ptr %13, align 8
  %343 = extractvalue { ptr, i32 } %341, 1
  store i32 %343, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %31) #8
  br label %348

344:                                              ; preds = %301, %291, %281, %271, %267
  %345 = landingpad { ptr, i32 }
          cleanup
  %346 = extractvalue { ptr, i32 } %345, 0
  store ptr %346, ptr %13, align 8
  %347 = extractvalue { ptr, i32 } %345, 1
  store i32 %347, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #8
  br label %348

348:                                              ; preds = %344, %340, %336, %332, %328
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #8
  br label %349

349:                                              ; preds = %348, %324
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  br label %372

350:                                              ; preds = %311, %136
  %351 = load ptr, ptr %20, align 8, !tbaa !5
  %352 = load ptr, ptr %19, align 8, !tbaa !5
  %353 = getelementptr inbounds %struct.b3SolverConstraint, ptr %352, i32 0, i32 6
  %354 = load float, ptr %353, align 4, !tbaa !15
  invoke void @_ZN17b3TypedConstraint25internalSetAppliedImpulseEf(ptr noundef nonnull align 16 dereferenceable(64) %351, float noundef %354)
          to label %355 unwind label %320

355:                                              ; preds = %350
  %356 = load ptr, ptr %19, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.b3SolverConstraint, ptr %356, i32 0, i32 6
  %358 = load float, ptr %357, align 4, !tbaa !15
  %359 = invoke noundef float @_Z6b3Fabsf(float noundef %358)
          to label %360 unwind label %320

360:                                              ; preds = %355
  %361 = load ptr, ptr %20, align 8, !tbaa !5
  %362 = invoke noundef float @_ZNK17b3TypedConstraint27getBreakingImpulseThresholdEv(ptr noundef nonnull align 16 dereferenceable(64) %361)
          to label %363 unwind label %320

363:                                              ; preds = %360
  %364 = fcmp oge float %359, %362
  br i1 %364, label %365, label %368

365:                                              ; preds = %363
  %366 = load ptr, ptr %20, align 8, !tbaa !5
  invoke void @_ZN17b3TypedConstraint10setEnabledEb(ptr noundef nonnull align 16 dereferenceable(64) %366, i1 noundef zeroext false)
          to label %367 unwind label %320

367:                                              ; preds = %365
  br label %368

368:                                              ; preds = %367, %363
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  br label %369

369:                                              ; preds = %368
  %370 = load i32, ptr %16, align 4, !tbaa !9
  %371 = add nsw i32 %370, 1
  store i32 %371, ptr %16, align 4, !tbaa !9
  br label %122, !llvm.loop !28

372:                                              ; preds = %349, %320
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #8
  br label %373

373:                                              ; preds = %372, %316
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  br label %570

374:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 1, ptr %38) #8
  invoke void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1) %38, ptr noundef @.str.5)
          to label %375 unwind label %414

375:                                              ; preds = %374
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %376

376:                                              ; preds = %552, %375
  %377 = load i32, ptr %15, align 4, !tbaa !9
  %378 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %379 = invoke noundef i32 @_ZNK20b3AlignedObjectArrayI12b3SolverBodyE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %378)
          to label %380 unwind label %418

380:                                              ; preds = %376
  %381 = icmp slt i32 %377, %379
  br i1 %381, label %382, label %557

382:                                              ; preds = %380
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #8
  %383 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %384 = load i32, ptr %15, align 4, !tbaa !9
  %385 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %383, i32 noundef %384)
          to label %386 unwind label %422

386:                                              ; preds = %382
  %387 = getelementptr inbounds %struct.b3SolverBody, ptr %385, i32 0, i32 10
  %388 = load i32, ptr %387, align 16, !tbaa !14
  store i32 %388, ptr %39, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #8
  %389 = load ptr, ptr %7, align 8, !tbaa !5
  %390 = load i32, ptr %39, align 4, !tbaa !9
  %391 = sext i32 %390 to i64
  %392 = getelementptr inbounds %struct.b3RigidBodyData, ptr %389, i64 %391
  store ptr %392, ptr %40, align 8, !tbaa !5
  %393 = load ptr, ptr %40, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.b3RigidBodyData, ptr %393, i32 0, i32 5
  %395 = load float, ptr %394, align 4, !tbaa !29
  %396 = fcmp une float %395, 0.000000e+00
  br i1 %396, label %397, label %551

397:                                              ; preds = %386
  %398 = load ptr, ptr %10, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %398, i32 0, i32 11
  %400 = load i32, ptr %399, align 4, !tbaa !33
  %401 = icmp ne i32 %400, 0
  br i1 %401, label %402, label %430

402:                                              ; preds = %397
  %403 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %404 = load i32, ptr %15, align 4, !tbaa !9
  %405 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %403, i32 noundef %404)
          to label %406 unwind label %426

406:                                              ; preds = %402
  %407 = load ptr, ptr %10, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %407, i32 0, i32 3
  %409 = load float, ptr %408, align 4, !tbaa !34
  %410 = load ptr, ptr %10, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %410, i32 0, i32 13
  %412 = load float, ptr %411, align 4, !tbaa !35
  invoke void @_ZN12b3SolverBody29writebackVelocityAndTransformEff(ptr noundef nonnull align 16 dereferenceable(228) %405, float noundef %409, float noundef %412)
          to label %413 unwind label %426

413:                                              ; preds = %406
  br label %436

414:                                              ; preds = %374
  %415 = landingpad { ptr, i32 }
          cleanup
  %416 = extractvalue { ptr, i32 } %415, 0
  store ptr %416, ptr %13, align 8
  %417 = extractvalue { ptr, i32 } %415, 1
  store i32 %417, ptr %14, align 4
  br label %569

418:                                              ; preds = %376
  %419 = landingpad { ptr, i32 }
          cleanup
  %420 = extractvalue { ptr, i32 } %419, 0
  store ptr %420, ptr %13, align 8
  %421 = extractvalue { ptr, i32 } %419, 1
  store i32 %421, ptr %14, align 4
  br label %568

422:                                              ; preds = %382
  %423 = landingpad { ptr, i32 }
          cleanup
  %424 = extractvalue { ptr, i32 } %423, 0
  store ptr %424, ptr %13, align 8
  %425 = extractvalue { ptr, i32 } %423, 1
  store i32 %425, ptr %14, align 4
  br label %556

426:                                              ; preds = %518, %514, %444, %440, %434, %430, %406, %402
  %427 = landingpad { ptr, i32 }
          cleanup
  %428 = extractvalue { ptr, i32 } %427, 0
  store ptr %428, ptr %13, align 8
  %429 = extractvalue { ptr, i32 } %427, 1
  store i32 %429, ptr %14, align 4
  br label %555

430:                                              ; preds = %397
  %431 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %432 = load i32, ptr %15, align 4, !tbaa !9
  %433 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %431, i32 noundef %432)
          to label %434 unwind label %426

434:                                              ; preds = %430
  invoke void @_ZN12b3SolverBody17writebackVelocityEv(ptr noundef nonnull align 16 dereferenceable(228) %433)
          to label %435 unwind label %426

435:                                              ; preds = %434
  br label %436

436:                                              ; preds = %435, %413
  %437 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 14
  %438 = load i8, ptr %437, align 8, !tbaa !36, !range !49, !noundef !50
  %439 = trunc i8 %438 to i1
  br i1 %439, label %440, label %455

440:                                              ; preds = %436
  %441 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %442 = load i32, ptr %15, align 4, !tbaa !9
  %443 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %441, i32 noundef %442)
          to label %444 unwind label %426

444:                                              ; preds = %440
  %445 = getelementptr inbounds %struct.b3SolverBody, ptr %443, i32 0, i32 8
  %446 = load ptr, ptr %40, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.b3RigidBodyData, ptr %446, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %447, ptr align 16 %445, i64 16, i1 false), !tbaa.struct !51
  %448 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %449 = load i32, ptr %15, align 4, !tbaa !9
  %450 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %448, i32 noundef %449)
          to label %451 unwind label %426

451:                                              ; preds = %444
  %452 = getelementptr inbounds %struct.b3SolverBody, ptr %450, i32 0, i32 9
  %453 = load ptr, ptr %40, align 8, !tbaa !5
  %454 = getelementptr inbounds %struct.b3RigidBodyData, ptr %453, i32 0, i32 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %454, ptr align 16 %452, i64 16, i1 false), !tbaa.struct !51
  br label %509

455:                                              ; preds = %436
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #8
  %456 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 10
  %457 = load i32, ptr %39, align 4, !tbaa !9
  %458 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN20b3AlignedObjectArrayIiEixEi(ptr noundef nonnull align 8 dereferenceable(25) %456, i32 noundef %457)
          to label %459 unwind label %495

459:                                              ; preds = %455
  %460 = load i32, ptr %458, align 4, !tbaa !9
  %461 = sitofp i32 %460 to float
  %462 = fdiv float 1.000000e+00, %461
  store float %462, ptr %41, align 4, !tbaa !52
  call void @llvm.lifetime.start.p0(i64 16, ptr %42) #8
  %463 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 12
  %464 = load i32, ptr %39, align 4, !tbaa !9
  %465 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25) %463, i32 noundef %464)
          to label %466 unwind label %499

466:                                              ; preds = %459
  %467 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %465, ptr noundef nonnull align 4 dereferenceable(4) %41)
          to label %468 unwind label %499

468:                                              ; preds = %466
  %469 = getelementptr inbounds %class.b3Vector3, ptr %42, i32 0, i32 0
  %470 = getelementptr inbounds %union.anon, ptr %469, i32 0, i32 0
  %471 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %470, i32 0, i32 0
  %472 = extractvalue { <2 x float>, <2 x float> } %467, 0
  store <2 x float> %472, ptr %471, align 16
  %473 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %470, i32 0, i32 1
  %474 = extractvalue { <2 x float>, <2 x float> } %467, 1
  store <2 x float> %474, ptr %473, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #8
  %475 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 13
  %476 = load i32, ptr %39, align 4, !tbaa !9
  %477 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25) %475, i32 noundef %476)
          to label %478 unwind label %503

478:                                              ; preds = %468
  %479 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %477, ptr noundef nonnull align 4 dereferenceable(4) %41)
          to label %480 unwind label %503

480:                                              ; preds = %478
  %481 = getelementptr inbounds %class.b3Vector3, ptr %43, i32 0, i32 0
  %482 = getelementptr inbounds %union.anon, ptr %481, i32 0, i32 0
  %483 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %482, i32 0, i32 0
  %484 = extractvalue { <2 x float>, <2 x float> } %479, 0
  store <2 x float> %484, ptr %483, align 16
  %485 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %482, i32 0, i32 1
  %486 = extractvalue { <2 x float>, <2 x float> } %479, 1
  store <2 x float> %486, ptr %485, align 8
  %487 = load ptr, ptr %40, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.b3RigidBodyData, ptr %487, i32 0, i32 2
  %489 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %488, ptr noundef nonnull align 16 dereferenceable(16) %42)
          to label %490 unwind label %503

490:                                              ; preds = %480
  %491 = load ptr, ptr %40, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.b3RigidBodyData, ptr %491, i32 0, i32 3
  %493 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %492, ptr noundef nonnull align 16 dereferenceable(16) %43)
          to label %494 unwind label %503

494:                                              ; preds = %490
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  br label %509

495:                                              ; preds = %455
  %496 = landingpad { ptr, i32 }
          cleanup
  %497 = extractvalue { ptr, i32 } %496, 0
  store ptr %497, ptr %13, align 8
  %498 = extractvalue { ptr, i32 } %496, 1
  store i32 %498, ptr %14, align 4
  br label %508

499:                                              ; preds = %466, %459
  %500 = landingpad { ptr, i32 }
          cleanup
  %501 = extractvalue { ptr, i32 } %500, 0
  store ptr %501, ptr %13, align 8
  %502 = extractvalue { ptr, i32 } %500, 1
  store i32 %502, ptr %14, align 4
  br label %507

503:                                              ; preds = %490, %480, %478, %468
  %504 = landingpad { ptr, i32 }
          cleanup
  %505 = extractvalue { ptr, i32 } %504, 0
  store ptr %505, ptr %13, align 8
  %506 = extractvalue { ptr, i32 } %504, 1
  store i32 %506, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #8
  br label %507

507:                                              ; preds = %503, %499
  call void @llvm.lifetime.end.p0(i64 16, ptr %42) #8
  br label %508

508:                                              ; preds = %507, %495
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  br label %555

509:                                              ; preds = %494, %451
  %510 = load ptr, ptr %10, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.b3ContactSolverInfoData, ptr %510, i32 0, i32 11
  %512 = load i32, ptr %511, align 4, !tbaa !33
  %513 = icmp ne i32 %512, 0
  br i1 %513, label %514, label %550

514:                                              ; preds = %509
  %515 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %516 = load i32, ptr %15, align 4, !tbaa !9
  %517 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %515, i32 noundef %516)
          to label %518 unwind label %426

518:                                              ; preds = %514
  %519 = getelementptr inbounds %struct.b3SolverBody, ptr %517, i32 0, i32 0
  %520 = invoke noundef nonnull align 16 dereferenceable(16) ptr @_ZN11b3Transform9getOriginEv(ptr noundef nonnull align 16 dereferenceable(64) %519)
          to label %521 unwind label %426

521:                                              ; preds = %518
  %522 = load ptr, ptr %40, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.b3RigidBodyData, ptr %522, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %523, ptr align 16 %520, i64 16, i1 false), !tbaa.struct !51
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #8
  invoke void @_ZN12b3QuaternionC2Ev(ptr noundef nonnull align 16 dereferenceable(16) %44)
          to label %524 unwind label %541

524:                                              ; preds = %521
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #8
  %525 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  %526 = load i32, ptr %15, align 4, !tbaa !9
  %527 = invoke noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %525, i32 noundef %526)
          to label %528 unwind label %545

528:                                              ; preds = %524
  %529 = getelementptr inbounds %struct.b3SolverBody, ptr %527, i32 0, i32 0
  %530 = invoke { <2 x float>, <2 x float> } @_ZNK11b3Transform11getRotationEv(ptr noundef nonnull align 16 dereferenceable(64) %529)
          to label %531 unwind label %545

531:                                              ; preds = %528
  %532 = getelementptr inbounds %class.b3Quaternion, ptr %45, i32 0, i32 0
  %533 = getelementptr inbounds %class.b3QuadWord, ptr %532, i32 0, i32 0
  %534 = getelementptr inbounds %union.anon.10, ptr %533, i32 0, i32 0
  %535 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %534, i32 0, i32 0
  %536 = extractvalue { <2 x float>, <2 x float> } %530, 0
  store <2 x float> %536, ptr %535, align 16
  %537 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %534, i32 0, i32 1
  %538 = extractvalue { <2 x float>, <2 x float> } %530, 1
  store <2 x float> %538, ptr %537, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %44, ptr align 16 %45, i64 16, i1 false)
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #8
  %539 = load ptr, ptr %40, align 8, !tbaa !5
  %540 = getelementptr inbounds %struct.b3RigidBodyData, ptr %539, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %540, ptr align 16 %44, i64 16, i1 false)
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #8
  br label %550

541:                                              ; preds = %521
  %542 = landingpad { ptr, i32 }
          cleanup
  %543 = extractvalue { ptr, i32 } %542, 0
  store ptr %543, ptr %13, align 8
  %544 = extractvalue { ptr, i32 } %542, 1
  store i32 %544, ptr %14, align 4
  br label %549

545:                                              ; preds = %528, %524
  %546 = landingpad { ptr, i32 }
          cleanup
  %547 = extractvalue { ptr, i32 } %546, 0
  store ptr %547, ptr %13, align 8
  %548 = extractvalue { ptr, i32 } %546, 1
  store i32 %548, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #8
  br label %549

549:                                              ; preds = %545, %541
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #8
  br label %555

550:                                              ; preds = %531, %509
  br label %551

551:                                              ; preds = %550, %386
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #8
  br label %552

552:                                              ; preds = %551
  %553 = load i32, ptr %15, align 4, !tbaa !9
  %554 = add nsw i32 %553, 1
  store i32 %554, ptr %15, align 4, !tbaa !9
  br label %376, !llvm.loop !53

555:                                              ; preds = %549, %508, %426
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #8
  br label %556

556:                                              ; preds = %555, %422
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #8
  br label %568

557:                                              ; preds = %380
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #8
  %558 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 2
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %558, i32 noundef 0)
          to label %559 unwind label %312

559:                                              ; preds = %557
  %560 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 3
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %560, i32 noundef 0)
          to label %561 unwind label %312

561:                                              ; preds = %559
  %562 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 4
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %562, i32 noundef 0)
          to label %563 unwind label %312

563:                                              ; preds = %561
  %564 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 5
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %564, i32 noundef 0)
          to label %565 unwind label %312

565:                                              ; preds = %563
  %566 = getelementptr inbounds %class.b3PgsJacobiSolver, ptr %46, i32 0, i32 1
  invoke void @_ZN20b3AlignedObjectArrayI12b3SolverBodyE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %566, i32 noundef 0)
          to label %567 unwind label %312

567:                                              ; preds = %565
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #8
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %11) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #8
  ret float 0.000000e+00

568:                                              ; preds = %556, %418
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %38) #8
  br label %569

569:                                              ; preds = %568, %414
  call void @llvm.lifetime.end.p0(i64 1, ptr %38) #8
  br label %570

570:                                              ; preds = %569, %373, %312, %116
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #8
  br label %571

571:                                              ; preds = %570, %100
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #8
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %11) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #8
  br label %572

572:                                              ; preds = %571
  %573 = load ptr, ptr %13, align 8
  %574 = load i32, ptr %14, align 4
  %575 = insertvalue { ptr, i32 } poison, ptr %573, 0
  %576 = insertvalue { ptr, i32 } %575, i32 %574, 1
  resume { ptr, i32 } %576
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN17b3TypedConstraint10setEnabledEb(ptr noundef nonnull align 16 dereferenceable(64), i1 noundef zeroext) #4 align 2

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN11b3Transform9getOriginEv(ptr noundef nonnull align 16 dereferenceable(64)) #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN12b3QuaternionC2Ev(ptr noundef nonnull align 16 dereferenceable(16)) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZNK11b3Transform11getRotationEv(ptr noundef nonnull align 16 dereferenceable(64)) #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN20b3AlignedObjectArrayI12b3SolverBodyE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) #6 align 2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { inlinehint mustprogress uwtable "min-legal-vector-width"="64" "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 uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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 #7 = { mustprogress uwtable "min-legal-vector-width"="64" "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 = { 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 = !{!"int", !7, i64 0}
!11 = !{!12, !10, i64 64}
!12 = !{!"_ZTS23b3ContactSolverInfoData", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !10, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !10, i64 44, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !13, i64 76, !13, i64 80}
!13 = !{!"float", !7, i64 0}
!14 = !{!7, !7, i64 0}
!15 = !{!16, !13, i64 84}
!16 = !{!"_ZTS18b3SolverConstraint", !17, i64 0, !17, i64 16, !17, i64 32, !17, i64 48, !17, i64 64, !13, i64 80, !13, i64 84, !10, i64 88, !10, i64 92, !13, i64 96, !13, i64 100, !13, i64 104, !13, i64 108, !13, i64 112, !13, i64 116, !13, i64 120, !7, i64 128, !10, i64 136, !10, i64 140, !10, i64 144, !10, i64 148}
!17 = !{!"_ZTS9b3Vector3", !7, i64 0}
!18 = !{!19, !13, i64 48}
!19 = !{!"_ZTS14b3ContactPoint", !17, i64 0, !17, i64 16, !17, i64 32, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !17, i64 64, !17, i64 80, !13, i64 96, !13, i64 100, !13, i64 104, !13, i64 108, !13, i64 112, !13, i64 116, !13, i64 120, !20, i64 124}
!20 = !{!"bool", !7, i64 0}
!21 = !{!16, !10, i64 140}
!22 = !{!19, !13, i64 96}
!23 = !{!19, !13, i64 100}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!16, !10, i64 144}
!27 = !{!16, !10, i64 148}
!28 = distinct !{!28, !25}
!29 = !{!30, !13, i64 68}
!30 = !{!"_ZTS15b3RigidBodyData", !17, i64 0, !31, i64 16, !17, i64 32, !17, i64 48, !10, i64 64, !13, i64 68, !13, i64 72, !13, i64 76}
!31 = !{!"_ZTS12b3Quaternion", !32, i64 0}
!32 = !{!"_ZTS10b3QuadWord", !7, i64 0}
!33 = !{!12, !10, i64 44}
!34 = !{!12, !13, i64 12}
!35 = !{!12, !13, i64 52}
!36 = !{!37, !20, i64 424}
!37 = !{!"_ZTS17b3PgsJacobiSolver", !38, i64 8, !40, i64 40, !40, i64 72, !40, i64 104, !40, i64 136, !42, i64 168, !42, i64 200, !42, i64 232, !44, i64 264, !42, i64 296, !42, i64 328, !46, i64 360, !46, i64 392, !20, i64 424, !10, i64 428, !10, i64 432, !48, i64 440}
!38 = !{!"_ZTS20b3AlignedObjectArrayI12b3SolverBodyE", !39, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !20, i64 24}
!39 = !{!"_ZTS18b3AlignedAllocatorI12b3SolverBodyLj16EE"}
!40 = !{!"_ZTS20b3AlignedObjectArrayI18b3SolverConstraintE", !41, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !20, i64 24}
!41 = !{!"_ZTS18b3AlignedAllocatorI18b3SolverConstraintLj16EE"}
!42 = !{!"_ZTS20b3AlignedObjectArrayIiE", !43, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !20, i64 24}
!43 = !{!"_ZTS18b3AlignedAllocatorIiLj16EE"}
!44 = !{!"_ZTS20b3AlignedObjectArrayIN17b3TypedConstraint17b3ConstraintInfo1EE", !45, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !20, i64 24}
!45 = !{!"_ZTS18b3AlignedAllocatorIN17b3TypedConstraint17b3ConstraintInfo1ELj16EE"}
!46 = !{!"_ZTS20b3AlignedObjectArrayI9b3Vector3E", !47, i64 0, !10, i64 4, !10, i64 8, !6, i64 16, !20, i64 24}
!47 = !{!"_ZTS18b3AlignedAllocatorI9b3Vector3Lj16EE"}
!48 = !{!"long", !7, i64 0}
!49 = !{i8 0, i8 2}
!50 = !{}
!51 = !{i64 0, i64 16, !14}
!52 = !{!13, !13, i64 0}
!53 = distinct !{!53, !25}


; 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.b3ProfileZone = type { i8 }
%class.b3Vector3 = type { %union.anon }
%union.anon = type { [4 x float] }
%class.b3Quaternion = type { %class.b3QuadWord }
%class.b3QuadWord = type { %union.anon.10 }
%union.anon.10 = type { [4 x float] }
%struct.b3RigidBodyData = type { %class.b3Vector3, %class.b3Quaternion, %class.b3Vector3, %class.b3Vector3, i32, float, float, float }

@.str.4 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [37 x i8], align 1

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2

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

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1), ptr noundef) unnamed_addr #3 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN20b3AlignedObjectArrayIiEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #5 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #5 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN17b3TypedConstraint25internalSetAppliedImpulseEf(ptr noundef nonnull align 16 dereferenceable(64), float noundef) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN17b3TypedConstraint16getJointFeedbackEv(ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK17b3TypedConstraint27getBreakingImpulseThresholdEv(ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_Z6b3Fabsf(float noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #5 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local noundef float @_ZN17b3PgsJacobiSolver29solveGroupCacheFriendlyFinishEP15b3RigidBodyDataP13b3InertiaDataiRK19b3ContactSolverInfo(ptr noundef nonnull align 8 dereferenceable(448) %0, ptr noundef %1, ptr nocapture noundef readnone %2, i32 noundef %3, ptr noundef nonnull align 4 dereferenceable(84) %4) unnamed_addr #7 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca %class.b3ProfileZone, align 1
  %7 = alloca %class.b3Vector3, align 16
  %8 = alloca %class.b3Vector3, align 16
  %9 = alloca %class.b3Vector3, align 16
  %10 = alloca %class.b3Vector3, align 16
  %11 = alloca %class.b3Vector3, align 16
  %12 = alloca %class.b3Vector3, align 16
  %13 = alloca %class.b3Vector3, align 16
  %14 = alloca %class.b3Vector3, align 16
  %15 = alloca %class.b3Vector3, align 16
  %16 = alloca %class.b3Vector3, align 16
  %17 = alloca %class.b3Vector3, align 16
  %18 = alloca %class.b3Vector3, align 16
  %19 = alloca %class.b3Vector3, align 16
  %20 = alloca %class.b3Vector3, align 16
  %21 = alloca %class.b3ProfileZone, align 1
  %22 = alloca float, align 4
  %23 = alloca %class.b3Vector3, align 16
  %24 = alloca %class.b3Vector3, align 16
  %25 = alloca %class.b3Quaternion, align 16
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %6) #8
  call void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1) %6, ptr noundef nonnull @.str.4)
  %26 = getelementptr inbounds i8, ptr %0, i64 40
  %27 = call noundef i32 @_ZNK20b3AlignedObjectArrayI18b3SolverConstraintE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %26)
  %28 = getelementptr inbounds i8, ptr %4, i64 64
  %29 = load i32, ptr %28, align 4, !tbaa !5
  %30 = and i32 %29, 4
  %.not = icmp ne i32 %30, 0
  %31 = icmp sgt i32 %27, 0
  %or.cond = and i1 %.not, %31
  br i1 %or.cond, label %.lr.ph, label %.loopexit

.lr.ph:                                           ; preds = %5
  %32 = getelementptr inbounds i8, ptr %0, i64 104
  br label %33

33:                                               ; preds = %.lr.ph, %55
  %.081102 = phi i32 [ 0, %.lr.ph ], [ %56, %55 ]
  %34 = call noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %26, i32 noundef %.081102)
  %35 = getelementptr inbounds i8, ptr %34, i64 128
  %36 = load ptr, ptr %35, align 16, !tbaa !11
  %37 = getelementptr inbounds i8, ptr %34, i64 84
  %38 = load float, ptr %37, align 4, !tbaa !12
  %39 = getelementptr inbounds i8, ptr %36, i64 48
  store float %38, ptr %39, align 16, !tbaa !15
  %40 = getelementptr inbounds i8, ptr %34, i64 140
  %41 = load i32, ptr %40, align 4, !tbaa !18
  %42 = call noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %32, i32 noundef %41)
  %43 = getelementptr inbounds i8, ptr %42, i64 84
  %44 = load float, ptr %43, align 4, !tbaa !12
  %45 = getelementptr inbounds i8, ptr %36, i64 96
  store float %44, ptr %45, align 16, !tbaa !19
  %46 = load i32, ptr %28, align 4, !tbaa !5
  %47 = and i32 %46, 16
  %.not95 = icmp eq i32 %47, 0
  br i1 %.not95, label %55, label %48

48:                                               ; preds = %33
  %49 = load i32, ptr %40, align 4, !tbaa !18
  %50 = add nsw i32 %49, 1
  %51 = call noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %32, i32 noundef %50)
  %52 = getelementptr inbounds i8, ptr %51, i64 84
  %53 = load float, ptr %52, align 4, !tbaa !12
  %54 = getelementptr inbounds i8, ptr %36, i64 100
  store float %53, ptr %54, align 4, !tbaa !20
  br label %55

55:                                               ; preds = %48, %33
  %56 = add nuw nsw i32 %.081102, 1
  %exitcond.not = icmp eq i32 %56, %27
  br i1 %exitcond.not, label %.loopexit, label %33, !llvm.loop !21

.loopexit:                                        ; preds = %55, %5
  %57 = getelementptr inbounds i8, ptr %0, i64 72
  %58 = call noundef i32 @_ZNK20b3AlignedObjectArrayI18b3SolverConstraintE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %57)
  %59 = icmp sgt i32 %58, 0
  br i1 %59, label %.lr.ph104, label %._crit_edge

.lr.ph104:                                        ; preds = %.loopexit
  %60 = getelementptr inbounds i8, ptr %0, i64 8
  %61 = getelementptr inbounds i8, ptr %9, i64 8
  %62 = getelementptr inbounds i8, ptr %8, i64 8
  %63 = getelementptr inbounds i8, ptr %4, i64 12
  %64 = getelementptr inbounds i8, ptr %7, i64 8
  %65 = getelementptr inbounds i8, ptr %13, i64 8
  %66 = getelementptr inbounds i8, ptr %12, i64 8
  %67 = getelementptr inbounds i8, ptr %11, i64 8
  %68 = getelementptr inbounds i8, ptr %10, i64 8
  %69 = getelementptr inbounds i8, ptr %16, i64 8
  %70 = getelementptr inbounds i8, ptr %15, i64 8
  %71 = getelementptr inbounds i8, ptr %14, i64 8
  %72 = getelementptr inbounds i8, ptr %20, i64 8
  %73 = getelementptr inbounds i8, ptr %19, i64 8
  %74 = getelementptr inbounds i8, ptr %18, i64 8
  %75 = getelementptr inbounds i8, ptr %17, i64 8
  br label %76

76:                                               ; preds = %.lr.ph104, %175
  %.182103 = phi i32 [ 0, %.lr.ph104 ], [ %176, %175 ]
  %77 = call noundef nonnull align 16 dereferenceable(160) ptr @_ZN20b3AlignedObjectArrayI18b3SolverConstraintEixEi(ptr noundef nonnull align 8 dereferenceable(25) %57, i32 noundef %.182103)
  %78 = getelementptr inbounds i8, ptr %77, i64 128
  %79 = load ptr, ptr %78, align 16, !tbaa !11
  %80 = call noundef ptr @_ZN17b3TypedConstraint16getJointFeedbackEv(ptr noundef nonnull align 16 dereferenceable(64) %79)
  %.not91 = icmp eq ptr %80, null
  br i1 %.not91, label %167, label %81

81:                                               ; preds = %76
  %82 = getelementptr inbounds i8, ptr %77, i64 144
  %83 = load i32, ptr %82, align 16, !tbaa !23
  %84 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %60, i32 noundef %83)
  %85 = getelementptr inbounds i8, ptr %77, i64 148
  %86 = load i32, ptr %85, align 4, !tbaa !24
  %87 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %60, i32 noundef %86)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #8
  %88 = getelementptr inbounds i8, ptr %77, i64 16
  %89 = getelementptr inbounds i8, ptr %77, i64 84
  %90 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %88, ptr noundef nonnull align 4 dereferenceable(4) %89)
          to label %91 unwind label %159

91:                                               ; preds = %81
  %92 = extractvalue { <2 x float>, <2 x float> } %90, 0
  store <2 x float> %92, ptr %9, align 16
  %93 = extractvalue { <2 x float>, <2 x float> } %90, 1
  store <2 x float> %93, ptr %61, align 8
  %94 = getelementptr inbounds i8, ptr %84, i64 112
  %95 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %9, ptr noundef nonnull align 16 dereferenceable(16) %94)
          to label %96 unwind label %159

96:                                               ; preds = %91
  %97 = extractvalue { <2 x float>, <2 x float> } %95, 0
  store <2 x float> %97, ptr %8, align 16
  %98 = extractvalue { <2 x float>, <2 x float> } %95, 1
  store <2 x float> %98, ptr %62, align 8
  %99 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %8, ptr noundef nonnull align 4 dereferenceable(4) %63)
          to label %100 unwind label %159

100:                                              ; preds = %96
  %101 = extractvalue { <2 x float>, <2 x float> } %99, 0
  store <2 x float> %101, ptr %7, align 16
  %102 = extractvalue { <2 x float>, <2 x float> } %99, 1
  store <2 x float> %102, ptr %64, align 8
  %103 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %80, ptr noundef nonnull align 16 dereferenceable(16) %7)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #8
  %104 = invoke { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16) %88)
          to label %105 unwind label %161

105:                                              ; preds = %100
  %106 = extractvalue { <2 x float>, <2 x float> } %104, 0
  store <2 x float> %106, ptr %13, align 16
  %107 = extractvalue { <2 x float>, <2 x float> } %104, 1
  store <2 x float> %107, ptr %65, align 8
  %108 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(4) %89)
          to label %109 unwind label %161

109:                                              ; preds = %105
  %110 = extractvalue { <2 x float>, <2 x float> } %108, 0
  store <2 x float> %110, ptr %12, align 16
  %111 = extractvalue { <2 x float>, <2 x float> } %108, 1
  store <2 x float> %111, ptr %66, align 8
  %112 = getelementptr inbounds i8, ptr %87, i64 112
  %113 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %12, ptr noundef nonnull align 16 dereferenceable(16) %112)
          to label %114 unwind label %161

114:                                              ; preds = %109
  %115 = extractvalue { <2 x float>, <2 x float> } %113, 0
  store <2 x float> %115, ptr %11, align 16
  %116 = extractvalue { <2 x float>, <2 x float> } %113, 1
  store <2 x float> %116, ptr %67, align 8
  %117 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %11, ptr noundef nonnull align 4 dereferenceable(4) %63)
          to label %118 unwind label %161

118:                                              ; preds = %114
  %119 = extractvalue { <2 x float>, <2 x float> } %117, 0
  store <2 x float> %119, ptr %10, align 16
  %120 = extractvalue { <2 x float>, <2 x float> } %117, 1
  store <2 x float> %120, ptr %68, align 8
  %121 = getelementptr inbounds i8, ptr %80, i64 32
  %122 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %121, ptr noundef nonnull align 16 dereferenceable(16) %10)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #8
  %123 = getelementptr inbounds i8, ptr %84, i64 96
  %124 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %77, ptr noundef nonnull align 16 dereferenceable(16) %123)
          to label %125 unwind label %163

125:                                              ; preds = %118
  %126 = extractvalue { <2 x float>, <2 x float> } %124, 0
  store <2 x float> %126, ptr %16, align 16
  %127 = extractvalue { <2 x float>, <2 x float> } %124, 1
  store <2 x float> %127, ptr %69, align 8
  %128 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(4) %89)
          to label %129 unwind label %163

129:                                              ; preds = %125
  %130 = extractvalue { <2 x float>, <2 x float> } %128, 0
  store <2 x float> %130, ptr %15, align 16
  %131 = extractvalue { <2 x float>, <2 x float> } %128, 1
  store <2 x float> %131, ptr %70, align 8
  %132 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %15, ptr noundef nonnull align 4 dereferenceable(4) %63)
          to label %133 unwind label %163

133:                                              ; preds = %129
  %134 = extractvalue { <2 x float>, <2 x float> } %132, 0
  store <2 x float> %134, ptr %14, align 16
  %135 = extractvalue { <2 x float>, <2 x float> } %132, 1
  store <2 x float> %135, ptr %71, align 8
  %136 = getelementptr inbounds i8, ptr %80, i64 16
  %137 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %136, ptr noundef nonnull align 16 dereferenceable(16) %14)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #8
  %138 = invoke { <2 x float>, <2 x float> } @_ZngRK9b3Vector3(ptr noundef nonnull align 16 dereferenceable(16) %77)
          to label %139 unwind label %165

139:                                              ; preds = %133
  %140 = extractvalue { <2 x float>, <2 x float> } %138, 0
  store <2 x float> %140, ptr %20, align 16
  %141 = extractvalue { <2 x float>, <2 x float> } %138, 1
  store <2 x float> %141, ptr %72, align 8
  %142 = getelementptr inbounds i8, ptr %87, i64 96
  %143 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3S1_(ptr noundef nonnull align 16 dereferenceable(16) %20, ptr noundef nonnull align 16 dereferenceable(16) %142)
          to label %144 unwind label %165

144:                                              ; preds = %139
  %145 = extractvalue { <2 x float>, <2 x float> } %143, 0
  store <2 x float> %145, ptr %19, align 16
  %146 = extractvalue { <2 x float>, <2 x float> } %143, 1
  store <2 x float> %146, ptr %73, align 8
  %147 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %19, ptr noundef nonnull align 4 dereferenceable(4) %89)
          to label %148 unwind label %165

148:                                              ; preds = %144
  %149 = extractvalue { <2 x float>, <2 x float> } %147, 0
  store <2 x float> %149, ptr %18, align 16
  %150 = extractvalue { <2 x float>, <2 x float> } %147, 1
  store <2 x float> %150, ptr %74, align 8
  %151 = invoke { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %18, ptr noundef nonnull align 4 dereferenceable(4) %63)
          to label %152 unwind label %165

152:                                              ; preds = %148
  %153 = extractvalue { <2 x float>, <2 x float> } %151, 0
  store <2 x float> %153, ptr %17, align 16
  %154 = extractvalue { <2 x float>, <2 x float> } %151, 1
  store <2 x float> %154, ptr %75, align 8
  %155 = getelementptr inbounds i8, ptr %80, i64 48
  %156 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %155, ptr noundef nonnull align 16 dereferenceable(16) %17)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #8
  br label %167

157:                                              ; preds = %270, %268, %266, %265, %._crit_edge107
  %158 = landingpad { ptr, i32 }
          cleanup
  br label %273

159:                                              ; preds = %96, %91, %81
  %160 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #8
  br label %273

161:                                              ; preds = %114, %109, %105, %100
  %162 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #8
  br label %273

163:                                              ; preds = %129, %125, %118
  %164 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #8
  br label %273

165:                                              ; preds = %148, %144, %139, %133
  %166 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #8
  br label %273

167:                                              ; preds = %152, %76
  %168 = getelementptr inbounds i8, ptr %77, i64 84
  %169 = load float, ptr %168, align 4, !tbaa !12
  call void @_ZN17b3TypedConstraint25internalSetAppliedImpulseEf(ptr noundef nonnull align 16 dereferenceable(64) %79, float noundef %169)
  %170 = load float, ptr %168, align 4, !tbaa !12
  %171 = call noundef float @_Z6b3Fabsf(float noundef %170)
  %172 = call noundef float @_ZNK17b3TypedConstraint27getBreakingImpulseThresholdEv(ptr noundef nonnull align 16 dereferenceable(64) %79)
  %173 = fcmp ult float %171, %172
  br i1 %173, label %175, label %174

174:                                              ; preds = %167
  call void @_ZN17b3TypedConstraint10setEnabledEb(ptr noundef nonnull align 16 dereferenceable(64) %79, i1 noundef zeroext false)
  br label %175

175:                                              ; preds = %174, %167
  %176 = add nuw nsw i32 %.182103, 1
  %exitcond108.not = icmp eq i32 %176, %58
  br i1 %exitcond108.not, label %._crit_edge, label %76, !llvm.loop !25

._crit_edge:                                      ; preds = %175, %.loopexit
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %21) #8
  invoke void @_ZN13b3ProfileZoneC2EPKc(ptr noundef nonnull align 1 dereferenceable(1) %21, ptr noundef nonnull @.str.5)
          to label %.preheader unwind label %204

.preheader:                                       ; preds = %._crit_edge
  %177 = getelementptr inbounds i8, ptr %0, i64 8
  %178 = call noundef i32 @_ZNK20b3AlignedObjectArrayI12b3SolverBodyE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %177)
  %179 = icmp sgt i32 %178, 0
  br i1 %179, label %.lr.ph106, label %._crit_edge107

.lr.ph106:                                        ; preds = %.preheader
  %180 = getelementptr inbounds i8, ptr %4, i64 44
  %181 = getelementptr inbounds i8, ptr %4, i64 12
  %182 = getelementptr inbounds i8, ptr %4, i64 52
  %183 = getelementptr inbounds i8, ptr %0, i64 424
  %184 = getelementptr inbounds i8, ptr %0, i64 296
  %185 = getelementptr inbounds i8, ptr %0, i64 360
  %186 = getelementptr inbounds i8, ptr %23, i64 8
  %187 = getelementptr inbounds i8, ptr %0, i64 392
  %188 = getelementptr inbounds i8, ptr %24, i64 8
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %25, i64 8
  br label %189

189:                                              ; preds = %.lr.ph106, %260
  %.080105 = phi i32 [ 0, %.lr.ph106 ], [ %261, %260 ]
  %190 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  %191 = getelementptr inbounds i8, ptr %190, i64 208
  %192 = load i32, ptr %191, align 16, !tbaa !11
  %193 = sext i32 %192 to i64
  %194 = getelementptr inbounds %struct.b3RigidBodyData, ptr %1, i64 %193
  %195 = getelementptr inbounds i8, ptr %194, i64 68
  %196 = load float, ptr %195, align 4, !tbaa !26
  %197 = fcmp une float %196, 0.000000e+00
  br i1 %197, label %198, label %260

198:                                              ; preds = %189
  %199 = load i32, ptr %180, align 4, !tbaa !30
  %.not84 = icmp eq i32 %199, 0
  %200 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  br i1 %.not84, label %208, label %201

201:                                              ; preds = %198
  %202 = load float, ptr %181, align 4, !tbaa !31
  %203 = load float, ptr %182, align 4, !tbaa !32
  invoke void @_ZN12b3SolverBody29writebackVelocityAndTransformEff(ptr noundef nonnull align 16 dereferenceable(228) %200, float noundef %202, float noundef %203)
          to label %209 unwind label %206

204:                                              ; preds = %._crit_edge
  %205 = landingpad { ptr, i32 }
          cleanup
  br label %272

206:                                              ; preds = %201
  %207 = landingpad { ptr, i32 }
          cleanup
  br label %264

208:                                              ; preds = %198
  call void @_ZN12b3SolverBody17writebackVelocityEv(ptr noundef nonnull align 16 dereferenceable(228) %200)
  br label %209

209:                                              ; preds = %201, %208
  %210 = load i8, ptr %183, align 8, !tbaa !33, !range !47, !noundef !48
  %211 = trunc nuw i8 %210 to i1
  br i1 %211, label %212, label %219

212:                                              ; preds = %209
  %213 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  %214 = getelementptr inbounds i8, ptr %213, i64 176
  %215 = getelementptr inbounds i8, ptr %194, i64 32
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %215, ptr noundef nonnull align 16 dereferenceable(16) %214, i64 16, i1 false), !tbaa.struct !49
  %216 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  %217 = getelementptr inbounds i8, ptr %216, i64 192
  %218 = getelementptr inbounds i8, ptr %194, i64 48
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %218, ptr noundef nonnull align 16 dereferenceable(16) %217, i64 16, i1 false), !tbaa.struct !49
  br label %243

219:                                              ; preds = %209
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %22) #8
  %220 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN20b3AlignedObjectArrayIiEixEi(ptr noundef nonnull align 8 dereferenceable(25) %184, i32 noundef %192)
  %221 = load i32, ptr %220, align 4, !tbaa !50
  %222 = sitofp i32 %221 to float
  %223 = fdiv float 1.000000e+00, %222
  store float %223, ptr %22, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #8
  %224 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25) %185, i32 noundef %192)
  %225 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %224, ptr noundef nonnull align 4 dereferenceable(4) %22)
          to label %226 unwind label %238

226:                                              ; preds = %219
  %227 = extractvalue { <2 x float>, <2 x float> } %225, 0
  store <2 x float> %227, ptr %23, align 16
  %228 = extractvalue { <2 x float>, <2 x float> } %225, 1
  store <2 x float> %228, ptr %186, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #8
  %229 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN20b3AlignedObjectArrayI9b3Vector3EixEi(ptr noundef nonnull align 8 dereferenceable(25) %187, i32 noundef %192)
  %230 = invoke { <2 x float>, <2 x float> } @_ZmlRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16) %229, ptr noundef nonnull align 4 dereferenceable(4) %22)
          to label %231 unwind label %240

231:                                              ; preds = %226
  %232 = extractvalue { <2 x float>, <2 x float> } %230, 0
  store <2 x float> %232, ptr %24, align 16
  %233 = extractvalue { <2 x float>, <2 x float> } %230, 1
  store <2 x float> %233, ptr %188, align 8
  %234 = getelementptr inbounds i8, ptr %194, i64 32
  %235 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %234, ptr noundef nonnull align 16 dereferenceable(16) %23)
  %236 = getelementptr inbounds i8, ptr %194, i64 48
  %237 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN9b3Vector3pLERKS_(ptr noundef nonnull align 16 dereferenceable(16) %236, ptr noundef nonnull align 16 dereferenceable(16) %24)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %22) #8
  br label %243

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

240:                                              ; preds = %226
  %241 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #8
  br label %242

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

243:                                              ; preds = %231, %212
  %244 = load i32, ptr %180, align 4, !tbaa !30
  %.not86 = icmp eq i32 %244, 0
  br i1 %.not86, label %260, label %245

245:                                              ; preds = %243
  %246 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  %247 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN11b3Transform9getOriginEv(ptr noundef nonnull align 16 dereferenceable(64) %246)
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %194, ptr noundef nonnull align 16 dereferenceable(16) %247, i64 16, i1 false), !tbaa.struct !49
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %25) #8
  invoke void @_ZN12b3QuaternionC2Ev(ptr noundef nonnull align 16 dereferenceable(16) %25)
          to label %248 unwind label %255

248:                                              ; preds = %245
  %249 = call noundef nonnull align 16 dereferenceable(228) ptr @_ZN20b3AlignedObjectArrayI12b3SolverBodyEixEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef %.080105)
  %250 = invoke { <2 x float>, <2 x float> } @_ZNK11b3Transform11getRotationEv(ptr noundef nonnull align 16 dereferenceable(64) %249)
          to label %251 unwind label %257

251:                                              ; preds = %248
  %252 = extractvalue { <2 x float>, <2 x float> } %250, 0
  %253 = extractvalue { <2 x float>, <2 x float> } %250, 1
  store <2 x float> %252, ptr %25, align 16
  store <2 x float> %253, ptr %.sroa.5.0..sroa_idx, align 8
  %254 = getelementptr inbounds i8, ptr %194, i64 16
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %254, ptr noundef nonnull align 16 dereferenceable(16) %25, i64 16, i1 false)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %25) #8
  br label %260

255:                                              ; preds = %245
  %256 = landingpad { ptr, i32 }
          cleanup
  br label %259

257:                                              ; preds = %248
  %258 = landingpad { ptr, i32 }
          cleanup
  br label %259

259:                                              ; preds = %257, %255
  %.pn87 = phi { ptr, i32 } [ %258, %257 ], [ %256, %255 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %25) #8
  br label %264

260:                                              ; preds = %243, %251, %189
  %261 = add nuw nsw i32 %.080105, 1
  %262 = call noundef i32 @_ZNK20b3AlignedObjectArrayI12b3SolverBodyE4sizeEv(ptr noundef nonnull align 8 dereferenceable(25) %177)
  %263 = icmp slt i32 %261, %262
  br i1 %263, label %189, label %._crit_edge107, !llvm.loop !52

264:                                              ; preds = %259, %242, %206
  %.pn87.pn = phi { ptr, i32 } [ %.pn87, %259 ], [ %.pn, %242 ], [ %207, %206 ]
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %21) #8
  br label %272

._crit_edge107:                                   ; preds = %260, %.preheader
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %21) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %21) #8
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %26, i32 noundef 0)
          to label %265 unwind label %157

265:                                              ; preds = %._crit_edge107
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %57, i32 noundef 0)
          to label %266 unwind label %157

266:                                              ; preds = %265
  %267 = getelementptr inbounds i8, ptr %0, i64 104
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %267, i32 noundef 0)
          to label %268 unwind label %157

268:                                              ; preds = %266
  %269 = getelementptr inbounds i8, ptr %0, i64 136
  invoke void @_ZN20b3AlignedObjectArrayI18b3SolverConstraintE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %269, i32 noundef 0)
          to label %270 unwind label %157

270:                                              ; preds = %268
  invoke void @_ZN20b3AlignedObjectArrayI12b3SolverBodyE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25) %177, i32 noundef 0)
          to label %271 unwind label %157

271:                                              ; preds = %270
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %6) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %6) #8
  ret float 0.000000e+00

272:                                              ; preds = %264, %204
  %.pn87.pn.pn = phi { ptr, i32 } [ %.pn87.pn, %264 ], [ %205, %204 ]
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %21) #8
  br label %273

273:                                              ; preds = %159, %161, %163, %165, %272, %157
  %.pn92.pn = phi { ptr, i32 } [ %.pn87.pn.pn, %272 ], [ %158, %157 ], [ %166, %165 ], [ %164, %163 ], [ %162, %161 ], [ %160, %159 ]
  call void @_ZN13b3ProfileZoneD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %6) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %6) #8
  resume { ptr, i32 } %.pn92.pn
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZdvRK9b3Vector3RKf(ptr noundef nonnull align 16 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN17b3TypedConstraint10setEnabledEb(ptr noundef nonnull align 16 dereferenceable(64), i1 noundef zeroext) local_unnamed_addr #4 align 2

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN11b3Transform9getOriginEv(ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #5 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN12b3QuaternionC2Ev(ptr noundef nonnull align 16 dereferenceable(16)) unnamed_addr #3 align 2

; Function Attrs: mustprogress uwtable
declare dso_local { <2 x float>, <2 x float> } @_ZNK11b3Transform11getRotationEv(ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN20b3AlignedObjectArrayI12b3SolverBodyE18resizeNoInitializeEi(ptr noundef nonnull align 8 dereferenceable(25), i32 noundef) local_unnamed_addr #6 align 2

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { inlinehint mustprogress uwtable "min-legal-vector-width"="64" "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 uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { 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 #7 = { mustprogress uwtable "min-legal-vector-width"="64" "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 = { 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, !10, i64 64}
!6 = !{!"_ZTS23b3ContactSolverInfoData", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !10, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !10, i64 44, !7, i64 48, !7, i64 52, !7, i64 56, !7, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !7, i64 76, !7, i64 80}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!8, !8, i64 0}
!12 = !{!13, !7, i64 84}
!13 = !{!"_ZTS18b3SolverConstraint", !14, i64 0, !14, i64 16, !14, i64 32, !14, i64 48, !14, i64 64, !7, i64 80, !7, i64 84, !10, i64 88, !10, i64 92, !7, i64 96, !7, i64 100, !7, i64 104, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !8, i64 128, !10, i64 136, !10, i64 140, !10, i64 144, !10, i64 148}
!14 = !{!"_ZTS9b3Vector3", !8, i64 0}
!15 = !{!16, !7, i64 48}
!16 = !{!"_ZTS14b3ContactPoint", !14, i64 0, !14, i64 16, !14, i64 32, !7, i64 48, !7, i64 52, !7, i64 56, !7, i64 60, !14, i64 64, !14, i64 80, !7, i64 96, !7, i64 100, !7, i64 104, !7, i64 108, !7, i64 112, !7, i64 116, !7, i64 120, !17, i64 124}
!17 = !{!"bool", !8, i64 0}
!18 = !{!13, !10, i64 140}
!19 = !{!16, !7, i64 96}
!20 = !{!16, !7, i64 100}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!13, !10, i64 144}
!24 = !{!13, !10, i64 148}
!25 = distinct !{!25, !22}
!26 = !{!27, !7, i64 68}
!27 = !{!"_ZTS15b3RigidBodyData", !14, i64 0, !28, i64 16, !14, i64 32, !14, i64 48, !10, i64 64, !7, i64 68, !7, i64 72, !7, i64 76}
!28 = !{!"_ZTS12b3Quaternion", !29, i64 0}
!29 = !{!"_ZTS10b3QuadWord", !8, i64 0}
!30 = !{!6, !10, i64 44}
!31 = !{!6, !7, i64 12}
!32 = !{!6, !7, i64 52}
!33 = !{!34, !17, i64 424}
!34 = !{!"_ZTS17b3PgsJacobiSolver", !35, i64 8, !38, i64 40, !38, i64 72, !38, i64 104, !38, i64 136, !40, i64 168, !40, i64 200, !40, i64 232, !42, i64 264, !40, i64 296, !40, i64 328, !44, i64 360, !44, i64 392, !17, i64 424, !10, i64 428, !10, i64 432, !46, i64 440}
!35 = !{!"_ZTS20b3AlignedObjectArrayI12b3SolverBodyE", !36, i64 0, !10, i64 4, !10, i64 8, !37, i64 16, !17, i64 24}
!36 = !{!"_ZTS18b3AlignedAllocatorI12b3SolverBodyLj16EE"}
!37 = !{!"any pointer", !8, i64 0}
!38 = !{!"_ZTS20b3AlignedObjectArrayI18b3SolverConstraintE", !39, i64 0, !10, i64 4, !10, i64 8, !37, i64 16, !17, i64 24}
!39 = !{!"_ZTS18b3AlignedAllocatorI18b3SolverConstraintLj16EE"}
!40 = !{!"_ZTS20b3AlignedObjectArrayIiE", !41, i64 0, !10, i64 4, !10, i64 8, !37, i64 16, !17, i64 24}
!41 = !{!"_ZTS18b3AlignedAllocatorIiLj16EE"}
!42 = !{!"_ZTS20b3AlignedObjectArrayIN17b3TypedConstraint17b3ConstraintInfo1EE", !43, i64 0, !10, i64 4, !10, i64 8, !37, i64 16, !17, i64 24}
!43 = !{!"_ZTS18b3AlignedAllocatorIN17b3TypedConstraint17b3ConstraintInfo1ELj16EE"}
!44 = !{!"_ZTS20b3AlignedObjectArrayI9b3Vector3E", !45, i64 0, !10, i64 4, !10, i64 8, !37, i64 16, !17, i64 24}
!45 = !{!"_ZTS18b3AlignedAllocatorI9b3Vector3Lj16EE"}
!46 = !{!"long", !8, i64 0}
!47 = !{i8 0, i8 2}
!48 = !{}
!49 = !{i64 0, i64 16, !11}
!50 = !{!10, !10, i64 0}
!51 = !{!7, !7, i64 0}
!52 = distinct !{!52, !22}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass