; LLVM IR from mtsamis/box2d-optimized :: src/dynamics/b2_island.ll (ZN8b2Island5SolveERK10b2TimeStepRK6b2Vec2b)

; 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"

%struct.b2Vec2 = type { float, float }
%struct.b2SolverData = type { %struct.b2TimeStep, ptr, ptr }
%struct.b2TimeStep = type { float, float, float, i32, i32, i32, i8 }
%class.b2ContactSolver = type <{ ptr, ptr, ptr, ptr, ptr, i32, [4 x i8] }>
%struct.b2ContactSolverDef = type { %struct.b2TimeStep, ptr, i32, ptr, ptr, ptr }
%class.b2Island = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32 }
%class.b2Body = type { i32, i16, i32, %struct.b2Transform, %struct.b2Transform, %struct.b2Sweep, %struct.b2Vec2, float, %struct.b2Vec2, float, ptr, ptr, ptr, ptr, i32, ptr, ptr, i32, i32, float, float, float, float, float, float, float, float, %struct.b2BodyUserData }
%struct.b2Transform = type { %struct.b2Vec2, %struct.b2Rot }
%struct.b2Rot = type { float, float }
%struct.b2Sweep = type { %struct.b2Vec2, %struct.b2Vec2, %struct.b2Vec2, float, float, float }
%struct.b2BodyUserData = type { i64 }
%struct.b2Position = type { %struct.b2Vec2, float }
%struct.b2Velocity = type { %struct.b2Vec2, float }

declare i32 @__gxx_personality_v0(...)

; 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> @_ZmlfRK6b2Vec2(float noundef, ptr noundef nonnull align 4 dereferenceable(8)) #2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(8)) #3 align 2

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN6b2Vec2dVEf(ptr noundef nonnull align 4 dereferenceable(8), float noundef) #3 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK6b2Vec26LengthEv(ptr noundef nonnull align 4 dereferenceable(8)) #3 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN6b2Vec2mLEf(ptr noundef nonnull align 4 dereferenceable(8), float noundef) #3 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN6b2Body20SynchronizeTransformEv(ptr noundef nonnull align 8 dereferenceable(208)) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN6b2Body8SetAwakeEb(ptr noundef nonnull align 8 dereferenceable(208), i1 noundef zeroext) #6 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8b2Island5SolveERK10b2TimeStepRK6b2Vec2b(ptr noundef nonnull align 8 dereferenceable(80) %0, ptr noundef nonnull align 4 dereferenceable(28) %1, ptr noundef nonnull align 4 dereferenceable(8) %2, i1 noundef zeroext %3) #7 align 2 personality ptr @__gxx_personality_v0 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i8, align 1
  %9 = alloca float, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca %struct.b2Vec2, align 4
  %13 = alloca float, align 4
  %14 = alloca %struct.b2Vec2, align 4
  %15 = alloca float, align 4
  %16 = alloca %struct.b2Vec2, align 4
  %17 = alloca %struct.b2Vec2, align 4
  %18 = alloca %struct.b2Vec2, align 4
  %19 = alloca %struct.b2SolverData, align 8
  %20 = alloca %class.b2ContactSolver, align 8
  %21 = alloca %struct.b2ContactSolverDef, align 8
  %22 = alloca ptr, align 8
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca %struct.b2Vec2, align 4
  %32 = alloca float, align 4
  %33 = alloca %struct.b2Vec2, align 4
  %34 = alloca float, align 4
  %35 = alloca %struct.b2Vec2, align 4
  %36 = alloca float, align 4
  %37 = alloca float, align 4
  %38 = alloca float, align 4
  %39 = alloca %struct.b2Vec2, align 4
  %40 = alloca i8, align 1
  %41 = alloca i32, align 4
  %42 = alloca i8, align 1
  %43 = alloca i8, align 1
  %44 = alloca i32, align 4
  %45 = alloca i8, align 1
  %46 = alloca i32, align 4
  %47 = alloca i8, align 1
  %48 = alloca i32, align 4
  %49 = alloca i8, align 1
  %50 = alloca i32, align 4
  %51 = alloca ptr, align 8
  %52 = alloca float, align 4
  %53 = alloca float, align 4
  %54 = alloca float, align 4
  %55 = alloca i32, align 4
  %56 = alloca ptr, align 8
  %57 = alloca i32, align 4
  %58 = alloca ptr, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  %59 = zext i1 %3 to i8
  store i8 %59, ptr %8, align 1, !tbaa !9
  %60 = load ptr, ptr %5, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #11
  %61 = load ptr, ptr %6, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.b2TimeStep, ptr %61, i32 0, i32 0
  %63 = load float, ptr %62, align 4, !tbaa !11
  store float %63, ptr %9, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #11
  store i32 0, ptr %10, align 4, !tbaa !16
  br label %64

64:                                               ; preds = %161, %4
  %65 = load i32, ptr %10, align 4, !tbaa !16
  %66 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 7
  %67 = load i32, ptr %66, align 8, !tbaa !17
  %68 = icmp slt i32 %65, %67
  br i1 %68, label %70, label %69

69:                                               ; preds = %64
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #11
  br label %164

70:                                               ; preds = %64
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #11
  %71 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 2
  %72 = load ptr, ptr %71, align 8, !tbaa !19
  %73 = load i32, ptr %10, align 4, !tbaa !16
  %74 = sext i32 %73 to i64
  %75 = getelementptr inbounds ptr, ptr %72, i64 %74
  %76 = load ptr, ptr %75, align 8, !tbaa !5
  store ptr %76, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #11
  %77 = load ptr, ptr %11, align 8, !tbaa !5
  %78 = getelementptr inbounds %class.b2Body, ptr %77, i32 0, i32 5
  %79 = getelementptr inbounds %struct.b2Sweep, ptr %78, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %12, ptr align 4 %79, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #11
  %80 = load ptr, ptr %11, align 8, !tbaa !5
  %81 = getelementptr inbounds %class.b2Body, ptr %80, i32 0, i32 5
  %82 = getelementptr inbounds %struct.b2Sweep, ptr %81, i32 0, i32 4
  %83 = load float, ptr %82, align 4, !tbaa !21
  store float %83, ptr %13, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #11
  %84 = load ptr, ptr %11, align 8, !tbaa !5
  %85 = getelementptr inbounds %class.b2Body, ptr %84, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %14, ptr align 8 %85, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #11
  %86 = load ptr, ptr %11, align 8, !tbaa !5
  %87 = getelementptr inbounds %class.b2Body, ptr %86, i32 0, i32 7
  %88 = load float, ptr %87, align 8, !tbaa !31
  store float %88, ptr %15, align 4, !tbaa !15
  %89 = load ptr, ptr %11, align 8, !tbaa !5
  %90 = getelementptr inbounds %class.b2Body, ptr %89, i32 0, i32 0
  %91 = load i32, ptr %90, align 8, !tbaa !32
  %92 = icmp eq i32 %91, 2
  br i1 %92, label %93, label %134

93:                                               ; preds = %70
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #11
  %94 = load float, ptr %9, align 4, !tbaa !15
  %95 = load ptr, ptr %11, align 8, !tbaa !5
  %96 = getelementptr inbounds %class.b2Body, ptr %95, i32 0, i32 20
  %97 = load float, ptr %96, align 4, !tbaa !33
  %98 = fmul float %94, %97
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #11
  %99 = load ptr, ptr %11, align 8, !tbaa !5
  %100 = getelementptr inbounds %class.b2Body, ptr %99, i32 0, i32 25
  %101 = load float, ptr %100, align 8, !tbaa !34
  %102 = load ptr, ptr %11, align 8, !tbaa !5
  %103 = getelementptr inbounds %class.b2Body, ptr %102, i32 0, i32 19
  %104 = load float, ptr %103, align 8, !tbaa !35
  %105 = fmul float %101, %104
  %106 = load ptr, ptr %7, align 8, !tbaa !5
  %107 = call <2 x float> @_ZmlfRK6b2Vec2(float noundef %105, ptr noundef nonnull align 4 dereferenceable(8) %106)
  store <2 x float> %107, ptr %18, align 4
  %108 = load ptr, ptr %11, align 8, !tbaa !5
  %109 = getelementptr inbounds %class.b2Body, ptr %108, i32 0, i32 8
  %110 = call <2 x float> @_ZplRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %109)
  store <2 x float> %110, ptr %17, align 4
  %111 = call <2 x float> @_ZmlfRK6b2Vec2(float noundef %98, ptr noundef nonnull align 4 dereferenceable(8) %17)
  store <2 x float> %111, ptr %16, align 4
  call void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8) %14, ptr noundef nonnull align 4 dereferenceable(8) %16)
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #11
  %112 = load float, ptr %9, align 4, !tbaa !15
  %113 = load ptr, ptr %11, align 8, !tbaa !5
  %114 = getelementptr inbounds %class.b2Body, ptr %113, i32 0, i32 22
  %115 = load float, ptr %114, align 4, !tbaa !36
  %116 = fmul float %112, %115
  %117 = load ptr, ptr %11, align 8, !tbaa !5
  %118 = getelementptr inbounds %class.b2Body, ptr %117, i32 0, i32 9
  %119 = load float, ptr %118, align 4, !tbaa !37
  %120 = load float, ptr %15, align 4, !tbaa !15
  %121 = call float @llvm.fmuladd.f32(float %116, float %119, float %120)
  store float %121, ptr %15, align 4, !tbaa !15
  %122 = load float, ptr %9, align 4, !tbaa !15
  %123 = load ptr, ptr %11, align 8, !tbaa !5
  %124 = getelementptr inbounds %class.b2Body, ptr %123, i32 0, i32 23
  %125 = load float, ptr %124, align 8, !tbaa !38
  %126 = call float @llvm.fmuladd.f32(float %122, float %125, float 1.000000e+00)
  call void @_ZN6b2Vec2dVEf(ptr noundef nonnull align 4 dereferenceable(8) %14, float noundef %126)
  %127 = load float, ptr %9, align 4, !tbaa !15
  %128 = load ptr, ptr %11, align 8, !tbaa !5
  %129 = getelementptr inbounds %class.b2Body, ptr %128, i32 0, i32 24
  %130 = load float, ptr %129, align 4, !tbaa !39
  %131 = call float @llvm.fmuladd.f32(float %127, float %130, float 1.000000e+00)
  %132 = load float, ptr %15, align 4, !tbaa !15
  %133 = fdiv float %132, %131
  store float %133, ptr %15, align 4, !tbaa !15
  br label %134

134:                                              ; preds = %93, %70
  %135 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %136 = load ptr, ptr %135, align 8, !tbaa !40
  %137 = load i32, ptr %10, align 4, !tbaa !16
  %138 = sext i32 %137 to i64
  %139 = getelementptr inbounds %struct.b2Position, ptr %136, i64 %138
  %140 = getelementptr inbounds %struct.b2Position, ptr %139, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %140, ptr align 4 %12, i64 8, i1 false), !tbaa.struct !20
  %141 = load float, ptr %13, align 4, !tbaa !15
  %142 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %143 = load ptr, ptr %142, align 8, !tbaa !40
  %144 = load i32, ptr %10, align 4, !tbaa !16
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds %struct.b2Position, ptr %143, i64 %145
  %147 = getelementptr inbounds %struct.b2Position, ptr %146, i32 0, i32 1
  store float %141, ptr %147, align 4, !tbaa !41
  %148 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %149 = load ptr, ptr %148, align 8, !tbaa !43
  %150 = load i32, ptr %10, align 4, !tbaa !16
  %151 = sext i32 %150 to i64
  %152 = getelementptr inbounds %struct.b2Velocity, ptr %149, i64 %151
  %153 = getelementptr inbounds %struct.b2Velocity, ptr %152, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %153, ptr align 4 %14, i64 8, i1 false), !tbaa.struct !20
  %154 = load float, ptr %15, align 4, !tbaa !15
  %155 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %156 = load ptr, ptr %155, align 8, !tbaa !43
  %157 = load i32, ptr %10, align 4, !tbaa !16
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds %struct.b2Velocity, ptr %156, i64 %158
  %160 = getelementptr inbounds %struct.b2Velocity, ptr %159, i32 0, i32 1
  store float %154, ptr %160, align 4, !tbaa !44
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #11
  br label %161

161:                                              ; preds = %134
  %162 = load i32, ptr %10, align 4, !tbaa !16
  %163 = add nsw i32 %162, 1
  store i32 %163, ptr %10, align 4, !tbaa !16
  br label %64, !llvm.loop !46

164:                                              ; preds = %69
  call void @llvm.lifetime.start.p0(i64 48, ptr %19) #11
  %165 = load ptr, ptr %6, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.b2SolverData, ptr %19, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %166, ptr align 4 %165, i64 28, i1 false), !tbaa.struct !48
  %167 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %168 = load ptr, ptr %167, align 8, !tbaa !40
  %169 = getelementptr inbounds %struct.b2SolverData, ptr %19, i32 0, i32 1
  store ptr %168, ptr %169, align 8, !tbaa !49
  %170 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %171 = load ptr, ptr %170, align 8, !tbaa !43
  %172 = getelementptr inbounds %struct.b2SolverData, ptr %19, i32 0, i32 2
  store ptr %171, ptr %172, align 8, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 48, ptr %20) #11
  call void @_ZN15b2ContactSolverC1Ev(ptr noundef nonnull align 8 dereferenceable(44) %20)
  %173 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 9
  %174 = load i32, ptr %173, align 8, !tbaa !52
  %175 = icmp sgt i32 %174, 0
  br i1 %175, label %176, label %207

176:                                              ; preds = %164
  call void @llvm.lifetime.start.p0(i64 72, ptr %21) #11
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %178, ptr align 4 %177, i64 28, i1 false), !tbaa.struct !48
  %179 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 3
  %180 = load ptr, ptr %179, align 8, !tbaa !53
  %181 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 1
  store ptr %180, ptr %181, align 8, !tbaa !54
  %182 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 9
  %183 = load i32, ptr %182, align 8, !tbaa !52
  %184 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 2
  store i32 %183, ptr %184, align 8, !tbaa !56
  %185 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %186 = load ptr, ptr %185, align 8, !tbaa !40
  %187 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 3
  store ptr %186, ptr %187, align 8, !tbaa !57
  %188 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %189 = load ptr, ptr %188, align 8, !tbaa !43
  %190 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 4
  store ptr %189, ptr %190, align 8, !tbaa !58
  %191 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 0
  %192 = load ptr, ptr %191, align 8, !tbaa !59
  %193 = getelementptr inbounds %struct.b2ContactSolverDef, ptr %21, i32 0, i32 5
  store ptr %192, ptr %193, align 8, !tbaa !60
  invoke void @_ZN15b2ContactSolver10InitializeEP18b2ContactSolverDef(ptr noundef nonnull align 8 dereferenceable(44) %20, ptr noundef %21)
          to label %194 unwind label %202

194:                                              ; preds = %176
  invoke void @_ZN15b2ContactSolver29InitializeVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %20)
          to label %195 unwind label %202

195:                                              ; preds = %194
  %196 = load ptr, ptr %6, align 8, !tbaa !5
  %197 = getelementptr inbounds %struct.b2TimeStep, ptr %196, i32 0, i32 6
  %198 = load i8, ptr %197, align 4, !tbaa !61, !range !62, !noundef !63
  %199 = trunc i8 %198 to i1
  br i1 %199, label %200, label %206

200:                                              ; preds = %195
  invoke void @_ZN15b2ContactSolver9WarmStartEv(ptr noundef nonnull align 8 dereferenceable(44) %20)
          to label %201 unwind label %202

201:                                              ; preds = %200
  br label %206

202:                                              ; preds = %200, %194, %176
  %203 = landingpad { ptr, i32 }
          cleanup
  %204 = extractvalue { ptr, i32 } %203, 0
  store ptr %204, ptr %22, align 8
  %205 = extractvalue { ptr, i32 } %203, 1
  store i32 %205, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 72, ptr %21) #11
  br label %745

206:                                              ; preds = %201, %195
  call void @llvm.lifetime.end.p0(i64 72, ptr %21) #11
  br label %207

207:                                              ; preds = %206, %164
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #11
  store i32 0, ptr %24, align 4, !tbaa !16
  br label %208

208:                                              ; preds = %225, %207
  %209 = load i32, ptr %24, align 4, !tbaa !16
  %210 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 8
  %211 = load i32, ptr %210, align 4, !tbaa !64
  %212 = icmp slt i32 %209, %211
  br i1 %212, label %214, label %213

213:                                              ; preds = %208
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  br label %232

214:                                              ; preds = %208
  %215 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 4
  %216 = load ptr, ptr %215, align 8, !tbaa !65
  %217 = load i32, ptr %24, align 4, !tbaa !16
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds ptr, ptr %216, i64 %218
  %220 = load ptr, ptr %219, align 8, !tbaa !5
  %221 = load ptr, ptr %220, align 8, !tbaa !66
  %222 = getelementptr inbounds ptr, ptr %221, i64 9
  %223 = load ptr, ptr %222, align 8
  invoke void %223(ptr noundef nonnull align 8 dereferenceable(128) %220, ptr noundef nonnull align 8 dereferenceable(48) %19)
          to label %224 unwind label %228

224:                                              ; preds = %214
  br label %225

225:                                              ; preds = %224
  %226 = load i32, ptr %24, align 4, !tbaa !16
  %227 = add nsw i32 %226, 1
  store i32 %227, ptr %24, align 4, !tbaa !16
  br label %208, !llvm.loop !68

228:                                              ; preds = %214
  %229 = landingpad { ptr, i32 }
          cleanup
  %230 = extractvalue { ptr, i32 } %229, 0
  store ptr %230, ptr %22, align 8
  %231 = extractvalue { ptr, i32 } %229, 1
  store i32 %231, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #11
  br label %745

232:                                              ; preds = %213
  %233 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 9
  %234 = load i32, ptr %233, align 8, !tbaa !52
  %235 = icmp sgt i32 %234, 0
  br i1 %235, label %236, label %285

236:                                              ; preds = %232
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #11
  store i32 0, ptr %25, align 4, !tbaa !16
  br label %237

237:                                              ; preds = %271, %236
  %238 = load i32, ptr %25, align 4, !tbaa !16
  %239 = load ptr, ptr %6, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.b2TimeStep, ptr %239, i32 0, i32 3
  %241 = load i32, ptr %240, align 4, !tbaa !69
  %242 = icmp slt i32 %238, %241
  br i1 %242, label %244, label %243

243:                                              ; preds = %237
  store i32 8, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #11
  br label %279

244:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #11
  store i32 0, ptr %27, align 4, !tbaa !16
  br label %245

245:                                              ; preds = %262, %244
  %246 = load i32, ptr %27, align 4, !tbaa !16
  %247 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 8
  %248 = load i32, ptr %247, align 4, !tbaa !64
  %249 = icmp slt i32 %246, %248
  br i1 %249, label %251, label %250

250:                                              ; preds = %245
  store i32 11, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #11
  br label %269

251:                                              ; preds = %245
  %252 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 4
  %253 = load ptr, ptr %252, align 8, !tbaa !65
  %254 = load i32, ptr %27, align 4, !tbaa !16
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds ptr, ptr %253, i64 %255
  %257 = load ptr, ptr %256, align 8, !tbaa !5
  %258 = load ptr, ptr %257, align 8, !tbaa !66
  %259 = getelementptr inbounds ptr, ptr %258, i64 10
  %260 = load ptr, ptr %259, align 8
  invoke void %260(ptr noundef nonnull align 8 dereferenceable(128) %257, ptr noundef nonnull align 8 dereferenceable(48) %19)
          to label %261 unwind label %265

261:                                              ; preds = %251
  br label %262

262:                                              ; preds = %261
  %263 = load i32, ptr %27, align 4, !tbaa !16
  %264 = add nsw i32 %263, 1
  store i32 %264, ptr %27, align 4, !tbaa !16
  br label %245, !llvm.loop !70

265:                                              ; preds = %251
  %266 = landingpad { ptr, i32 }
          cleanup
  %267 = extractvalue { ptr, i32 } %266, 0
  store ptr %267, ptr %22, align 8
  %268 = extractvalue { ptr, i32 } %266, 1
  store i32 %268, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #11
  br label %278

269:                                              ; preds = %250
  invoke void @_ZN15b2ContactSolver24SolveVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %20)
          to label %270 unwind label %274

270:                                              ; preds = %269
  br label %271

271:                                              ; preds = %270
  %272 = load i32, ptr %25, align 4, !tbaa !16
  %273 = add nsw i32 %272, 1
  store i32 %273, ptr %25, align 4, !tbaa !16
  br label %237, !llvm.loop !71

274:                                              ; preds = %269
  %275 = landingpad { ptr, i32 }
          cleanup
  %276 = extractvalue { ptr, i32 } %275, 0
  store ptr %276, ptr %22, align 8
  %277 = extractvalue { ptr, i32 } %275, 1
  store i32 %277, ptr %23, align 4
  br label %278

278:                                              ; preds = %274, %265
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #11
  br label %745

279:                                              ; preds = %243
  invoke void @_ZN15b2ContactSolver13StoreImpulsesEv(ptr noundef nonnull align 8 dereferenceable(44) %20)
          to label %280 unwind label %281

280:                                              ; preds = %279
  br label %323

281:                                              ; preds = %279
  %282 = landingpad { ptr, i32 }
          cleanup
  %283 = extractvalue { ptr, i32 } %282, 0
  store ptr %283, ptr %22, align 8
  %284 = extractvalue { ptr, i32 } %282, 1
  store i32 %284, ptr %23, align 4
  br label %745

285:                                              ; preds = %232
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #11
  store i32 0, ptr %28, align 4, !tbaa !16
  br label %286

286:                                              ; preds = %319, %285
  %287 = load i32, ptr %28, align 4, !tbaa !16
  %288 = load ptr, ptr %6, align 8, !tbaa !5
  %289 = getelementptr inbounds %struct.b2TimeStep, ptr %288, i32 0, i32 3
  %290 = load i32, ptr %289, align 4, !tbaa !69
  %291 = icmp slt i32 %287, %290
  br i1 %291, label %293, label %292

292:                                              ; preds = %286
  store i32 14, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #11
  br label %322

293:                                              ; preds = %286
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #11
  store i32 0, ptr %29, align 4, !tbaa !16
  br label %294

294:                                              ; preds = %311, %293
  %295 = load i32, ptr %29, align 4, !tbaa !16
  %296 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 8
  %297 = load i32, ptr %296, align 4, !tbaa !64
  %298 = icmp slt i32 %295, %297
  br i1 %298, label %300, label %299

299:                                              ; preds = %294
  store i32 17, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #11
  br label %318

300:                                              ; preds = %294
  %301 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 4
  %302 = load ptr, ptr %301, align 8, !tbaa !65
  %303 = load i32, ptr %29, align 4, !tbaa !16
  %304 = sext i32 %303 to i64
  %305 = getelementptr inbounds ptr, ptr %302, i64 %304
  %306 = load ptr, ptr %305, align 8, !tbaa !5
  %307 = load ptr, ptr %306, align 8, !tbaa !66
  %308 = getelementptr inbounds ptr, ptr %307, i64 10
  %309 = load ptr, ptr %308, align 8
  invoke void %309(ptr noundef nonnull align 8 dereferenceable(128) %306, ptr noundef nonnull align 8 dereferenceable(48) %19)
          to label %310 unwind label %314

310:                                              ; preds = %300
  br label %311

311:                                              ; preds = %310
  %312 = load i32, ptr %29, align 4, !tbaa !16
  %313 = add nsw i32 %312, 1
  store i32 %313, ptr %29, align 4, !tbaa !16
  br label %294, !llvm.loop !72

314:                                              ; preds = %300
  %315 = landingpad { ptr, i32 }
          cleanup
  %316 = extractvalue { ptr, i32 } %315, 0
  store ptr %316, ptr %22, align 8
  %317 = extractvalue { ptr, i32 } %315, 1
  store i32 %317, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #11
  br label %745

318:                                              ; preds = %299
  br label %319

319:                                              ; preds = %318
  %320 = load i32, ptr %28, align 4, !tbaa !16
  %321 = add nsw i32 %320, 1
  store i32 %321, ptr %28, align 4, !tbaa !16
  br label %286, !llvm.loop !73

322:                                              ; preds = %292
  br label %323

323:                                              ; preds = %322, %280
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #11
  store i32 0, ptr %30, align 4, !tbaa !16
  br label %324

324:                                              ; preds = %432, %323
  %325 = load i32, ptr %30, align 4, !tbaa !16
  %326 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 7
  %327 = load i32, ptr %326, align 8, !tbaa !17
  %328 = icmp slt i32 %325, %327
  br i1 %328, label %330, label %329

329:                                              ; preds = %324
  store i32 20, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #11
  br label %441

330:                                              ; preds = %324
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #11
  %331 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %332 = load ptr, ptr %331, align 8, !tbaa !40
  %333 = load i32, ptr %30, align 4, !tbaa !16
  %334 = sext i32 %333 to i64
  %335 = getelementptr inbounds %struct.b2Position, ptr %332, i64 %334
  %336 = getelementptr inbounds %struct.b2Position, ptr %335, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %31, ptr align 4 %336, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #11
  %337 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %338 = load ptr, ptr %337, align 8, !tbaa !40
  %339 = load i32, ptr %30, align 4, !tbaa !16
  %340 = sext i32 %339 to i64
  %341 = getelementptr inbounds %struct.b2Position, ptr %338, i64 %340
  %342 = getelementptr inbounds %struct.b2Position, ptr %341, i32 0, i32 1
  %343 = load float, ptr %342, align 4, !tbaa !41
  store float %343, ptr %32, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #11
  %344 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %345 = load ptr, ptr %344, align 8, !tbaa !43
  %346 = load i32, ptr %30, align 4, !tbaa !16
  %347 = sext i32 %346 to i64
  %348 = getelementptr inbounds %struct.b2Velocity, ptr %345, i64 %347
  %349 = getelementptr inbounds %struct.b2Velocity, ptr %348, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %349, i64 8, i1 false), !tbaa.struct !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #11
  %350 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %351 = load ptr, ptr %350, align 8, !tbaa !43
  %352 = load i32, ptr %30, align 4, !tbaa !16
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds %struct.b2Velocity, ptr %351, i64 %353
  %355 = getelementptr inbounds %struct.b2Velocity, ptr %354, i32 0, i32 1
  %356 = load float, ptr %355, align 4, !tbaa !44
  store float %356, ptr %34, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #11
  %357 = load float, ptr %9, align 4, !tbaa !15
  %358 = invoke <2 x float> @_ZmlfRK6b2Vec2(float noundef %357, ptr noundef nonnull align 4 dereferenceable(8) %33)
          to label %359 unwind label %369

359:                                              ; preds = %330
  store <2 x float> %358, ptr %35, align 4
  %360 = invoke noundef float @_Z5b2DotRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %35, ptr noundef nonnull align 4 dereferenceable(8) %35)
          to label %361 unwind label %369

361:                                              ; preds = %359
  %362 = fcmp ogt float %360, 4.000000e+00
  br i1 %362, label %363, label %377

363:                                              ; preds = %361
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #11
  %364 = invoke noundef float @_ZNK6b2Vec26LengthEv(ptr noundef nonnull align 4 dereferenceable(8) %35)
          to label %365 unwind label %373

365:                                              ; preds = %363
  %366 = fdiv float 2.000000e+00, %364
  store float %366, ptr %36, align 4, !tbaa !15
  %367 = load float, ptr %36, align 4, !tbaa !15
  invoke void @_ZN6b2Vec2mLEf(ptr noundef nonnull align 4 dereferenceable(8) %33, float noundef %367)
          to label %368 unwind label %373

368:                                              ; preds = %365
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #11
  br label %377

369:                                              ; preds = %359, %330
  %370 = landingpad { ptr, i32 }
          cleanup
  %371 = extractvalue { ptr, i32 } %370, 0
  store ptr %371, ptr %22, align 8
  %372 = extractvalue { ptr, i32 } %370, 1
  store i32 %372, ptr %23, align 4
  br label %440

373:                                              ; preds = %365, %363
  %374 = landingpad { ptr, i32 }
          cleanup
  %375 = extractvalue { ptr, i32 } %374, 0
  store ptr %375, ptr %22, align 8
  %376 = extractvalue { ptr, i32 } %374, 1
  store i32 %376, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #11
  br label %440

377:                                              ; preds = %368, %361
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #11
  %378 = load float, ptr %9, align 4, !tbaa !15
  %379 = load float, ptr %34, align 4, !tbaa !15
  %380 = fmul float %378, %379
  store float %380, ptr %37, align 4, !tbaa !15
  %381 = load float, ptr %37, align 4, !tbaa !15
  %382 = load float, ptr %37, align 4, !tbaa !15
  %383 = fmul float %381, %382
  %384 = fcmp ogt float %383, 0x4003BD3CE0000000
  br i1 %384, label %385, label %397

385:                                              ; preds = %377
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #11
  %386 = load float, ptr %37, align 4, !tbaa !15
  %387 = invoke noundef float @_Z5b2AbsIfET_S0_(float noundef %386)
          to label %388 unwind label %393

388:                                              ; preds = %385
  %389 = fdiv float 0x3FF921FB60000000, %387
  store float %389, ptr %38, align 4, !tbaa !15
  %390 = load float, ptr %38, align 4, !tbaa !15
  %391 = load float, ptr %34, align 4, !tbaa !15
  %392 = fmul float %391, %390
  store float %392, ptr %34, align 4, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #11
  br label %397

393:                                              ; preds = %385
  %394 = landingpad { ptr, i32 }
          cleanup
  %395 = extractvalue { ptr, i32 } %394, 0
  store ptr %395, ptr %22, align 8
  %396 = extractvalue { ptr, i32 } %394, 1
  store i32 %396, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #11
  br label %439

397:                                              ; preds = %388, %377
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #11
  %398 = load float, ptr %9, align 4, !tbaa !15
  %399 = invoke <2 x float> @_ZmlfRK6b2Vec2(float noundef %398, ptr noundef nonnull align 4 dereferenceable(8) %33)
          to label %400 unwind label %435

400:                                              ; preds = %397
  store <2 x float> %399, ptr %39, align 4
  invoke void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8) %31, ptr noundef nonnull align 4 dereferenceable(8) %39)
          to label %401 unwind label %435

401:                                              ; preds = %400
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #11
  %402 = load float, ptr %9, align 4, !tbaa !15
  %403 = load float, ptr %34, align 4, !tbaa !15
  %404 = load float, ptr %32, align 4, !tbaa !15
  %405 = call float @llvm.fmuladd.f32(float %402, float %403, float %404)
  store float %405, ptr %32, align 4, !tbaa !15
  %406 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %407 = load ptr, ptr %406, align 8, !tbaa !40
  %408 = load i32, ptr %30, align 4, !tbaa !16
  %409 = sext i32 %408 to i64
  %410 = getelementptr inbounds %struct.b2Position, ptr %407, i64 %409
  %411 = getelementptr inbounds %struct.b2Position, ptr %410, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %411, ptr align 4 %31, i64 8, i1 false), !tbaa.struct !20
  %412 = load float, ptr %32, align 4, !tbaa !15
  %413 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %414 = load ptr, ptr %413, align 8, !tbaa !40
  %415 = load i32, ptr %30, align 4, !tbaa !16
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds %struct.b2Position, ptr %414, i64 %416
  %418 = getelementptr inbounds %struct.b2Position, ptr %417, i32 0, i32 1
  store float %412, ptr %418, align 4, !tbaa !41
  %419 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %420 = load ptr, ptr %419, align 8, !tbaa !43
  %421 = load i32, ptr %30, align 4, !tbaa !16
  %422 = sext i32 %421 to i64
  %423 = getelementptr inbounds %struct.b2Velocity, ptr %420, i64 %422
  %424 = getelementptr inbounds %struct.b2Velocity, ptr %423, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %424, ptr align 4 %33, i64 8, i1 false), !tbaa.struct !20
  %425 = load float, ptr %34, align 4, !tbaa !15
  %426 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %427 = load ptr, ptr %426, align 8, !tbaa !43
  %428 = load i32, ptr %30, align 4, !tbaa !16
  %429 = sext i32 %428 to i64
  %430 = getelementptr inbounds %struct.b2Velocity, ptr %427, i64 %429
  %431 = getelementptr inbounds %struct.b2Velocity, ptr %430, i32 0, i32 1
  store float %425, ptr %431, align 4, !tbaa !44
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #11
  br label %432

432:                                              ; preds = %401
  %433 = load i32, ptr %30, align 4, !tbaa !16
  %434 = add nsw i32 %433, 1
  store i32 %434, ptr %30, align 4, !tbaa !16
  br label %324, !llvm.loop !74

435:                                              ; preds = %400, %397
  %436 = landingpad { ptr, i32 }
          cleanup
  %437 = extractvalue { ptr, i32 } %436, 0
  store ptr %437, ptr %22, align 8
  %438 = extractvalue { ptr, i32 } %436, 1
  store i32 %438, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #11
  br label %439

439:                                              ; preds = %435, %393
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #11
  br label %440

440:                                              ; preds = %439, %373, %369
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #11
  br label %745

441:                                              ; preds = %329
  call void @llvm.lifetime.start.p0(i64 1, ptr %40) #11
  store i8 0, ptr %40, align 1, !tbaa !9
  %442 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 9
  %443 = load i32, ptr %442, align 8, !tbaa !52
  %444 = icmp sgt i32 %443, 0
  br i1 %444, label %445, label %512

445:                                              ; preds = %441
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #11
  store i32 0, ptr %41, align 4, !tbaa !16
  br label %446

446:                                              ; preds = %506, %445
  %447 = load i32, ptr %41, align 4, !tbaa !16
  %448 = load ptr, ptr %6, align 8, !tbaa !5
  %449 = getelementptr inbounds %struct.b2TimeStep, ptr %448, i32 0, i32 4
  %450 = load i32, ptr %449, align 4, !tbaa !75
  %451 = icmp slt i32 %447, %450
  br i1 %451, label %453, label %452

452:                                              ; preds = %446
  store i32 23, ptr %26, align 4
  br label %510

453:                                              ; preds = %446
  call void @llvm.lifetime.start.p0(i64 1, ptr %42) #11
  %454 = invoke noundef zeroext i1 @_ZN15b2ContactSolver24SolvePositionConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %20)
          to label %455 unwind label %463

455:                                              ; preds = %453
  %456 = zext i1 %454 to i8
  store i8 %456, ptr %42, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %43) #11
  store i8 1, ptr %43, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #11
  store i32 0, ptr %44, align 4, !tbaa !16
  br label %457

457:                                              ; preds = %488, %455
  %458 = load i32, ptr %44, align 4, !tbaa !16
  %459 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 8
  %460 = load i32, ptr %459, align 4, !tbaa !64
  %461 = icmp slt i32 %458, %460
  br i1 %461, label %467, label %462

462:                                              ; preds = %457
  store i32 26, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #11
  br label %495

463:                                              ; preds = %453
  %464 = landingpad { ptr, i32 }
          cleanup
  %465 = extractvalue { ptr, i32 } %464, 0
  store ptr %465, ptr %22, align 8
  %466 = extractvalue { ptr, i32 } %464, 1
  store i32 %466, ptr %23, align 4
  br label %509

467:                                              ; preds = %457
  call void @llvm.lifetime.start.p0(i64 1, ptr %45) #11
  %468 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 4
  %469 = load ptr, ptr %468, align 8, !tbaa !65
  %470 = load i32, ptr %44, align 4, !tbaa !16
  %471 = sext i32 %470 to i64
  %472 = getelementptr inbounds ptr, ptr %469, i64 %471
  %473 = load ptr, ptr %472, align 8, !tbaa !5
  %474 = load ptr, ptr %473, align 8, !tbaa !66
  %475 = getelementptr inbounds ptr, ptr %474, i64 11
  %476 = load ptr, ptr %475, align 8
  %477 = invoke noundef zeroext i1 %476(ptr noundef nonnull align 8 dereferenceable(128) %473, ptr noundef nonnull align 8 dereferenceable(48) %19)
          to label %478 unwind label %491

478:                                              ; preds = %467
  %479 = zext i1 %477 to i8
  store i8 %479, ptr %45, align 1, !tbaa !9
  %480 = load i8, ptr %43, align 1, !tbaa !9, !range !62, !noundef !63
  %481 = trunc i8 %480 to i1
  br i1 %481, label %482, label %485

482:                                              ; preds = %478
  %483 = load i8, ptr %45, align 1, !tbaa !9, !range !62, !noundef !63
  %484 = trunc i8 %483 to i1
  br label %485

485:                                              ; preds = %482, %478
  %486 = phi i1 [ false, %478 ], [ %484, %482 ]
  %487 = zext i1 %486 to i8
  store i8 %487, ptr %43, align 1, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 1, ptr %45) #11
  br label %488

488:                                              ; preds = %485
  %489 = load i32, ptr %44, align 4, !tbaa !16
  %490 = add nsw i32 %489, 1
  store i32 %490, ptr %44, align 4, !tbaa !16
  br label %457, !llvm.loop !76

491:                                              ; preds = %467
  %492 = landingpad { ptr, i32 }
          cleanup
  %493 = extractvalue { ptr, i32 } %492, 0
  store ptr %493, ptr %22, align 8
  %494 = extractvalue { ptr, i32 } %492, 1
  store i32 %494, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %45) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %43) #11
  br label %509

495:                                              ; preds = %462
  %496 = load i8, ptr %42, align 1, !tbaa !9, !range !62, !noundef !63
  %497 = trunc i8 %496 to i1
  br i1 %497, label %498, label %502

498:                                              ; preds = %495
  %499 = load i8, ptr %43, align 1, !tbaa !9, !range !62, !noundef !63
  %500 = trunc i8 %499 to i1
  br i1 %500, label %501, label %502

501:                                              ; preds = %498
  store i8 1, ptr %40, align 1, !tbaa !9
  store i32 23, ptr %26, align 4
  br label %503

502:                                              ; preds = %498, %495
  store i32 0, ptr %26, align 4
  br label %503

503:                                              ; preds = %502, %501
  call void @llvm.lifetime.end.p0(i64 1, ptr %43) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %42) #11
  %504 = load i32, ptr %26, align 4
  switch i32 %504, label %510 [
    i32 0, label %505
  ]

505:                                              ; preds = %503
  br label %506

506:                                              ; preds = %505
  %507 = load i32, ptr %41, align 4, !tbaa !16
  %508 = add nsw i32 %507, 1
  store i32 %508, ptr %41, align 4, !tbaa !16
  br label %446, !llvm.loop !77

509:                                              ; preds = %491, %463
  call void @llvm.lifetime.end.p0(i64 1, ptr %42) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #11
  br label %744

510:                                              ; preds = %503, %452
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #11
  br label %511

511:                                              ; preds = %510
  br label %568

512:                                              ; preds = %441
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #11
  store i32 0, ptr %46, align 4, !tbaa !16
  br label %513

513:                                              ; preds = %563, %512
  %514 = load i32, ptr %46, align 4, !tbaa !16
  %515 = load ptr, ptr %6, align 8, !tbaa !5
  %516 = getelementptr inbounds %struct.b2TimeStep, ptr %515, i32 0, i32 4
  %517 = load i32, ptr %516, align 4, !tbaa !75
  %518 = icmp slt i32 %514, %517
  br i1 %518, label %520, label %519

519:                                              ; preds = %513
  store i32 29, ptr %26, align 4
  br label %566

520:                                              ; preds = %513
  call void @llvm.lifetime.start.p0(i64 1, ptr %47) #11
  store i8 1, ptr %47, align 1, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #11
  store i32 0, ptr %48, align 4, !tbaa !16
  br label %521

521:                                              ; preds = %548, %520
  %522 = load i32, ptr %48, align 4, !tbaa !16
  %523 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 8
  %524 = load i32, ptr %523, align 4, !tbaa !64
  %525 = icmp slt i32 %522, %524
  br i1 %525, label %527, label %526

526:                                              ; preds = %521
  store i32 32, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #11
  br label %555

527:                                              ; preds = %521
  call void @llvm.lifetime.start.p0(i64 1, ptr %49) #11
  %528 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 4
  %529 = load ptr, ptr %528, align 8, !tbaa !65
  %530 = load i32, ptr %48, align 4, !tbaa !16
  %531 = sext i32 %530 to i64
  %532 = getelementptr inbounds ptr, ptr %529, i64 %531
  %533 = load ptr, ptr %532, align 8, !tbaa !5
  %534 = load ptr, ptr %533, align 8, !tbaa !66
  %535 = getelementptr inbounds ptr, ptr %534, i64 11
  %536 = load ptr, ptr %535, align 8
  %537 = invoke noundef zeroext i1 %536(ptr noundef nonnull align 8 dereferenceable(128) %533, ptr noundef nonnull align 8 dereferenceable(48) %19)
          to label %538 unwind label %551

538:                                              ; preds = %527
  %539 = zext i1 %537 to i8
  store i8 %539, ptr %49, align 1, !tbaa !9
  %540 = load i8, ptr %47, align 1, !tbaa !9, !range !62, !noundef !63
  %541 = trunc i8 %540 to i1
  br i1 %541, label %542, label %545

542:                                              ; preds = %538
  %543 = load i8, ptr %49, align 1, !tbaa !9, !range !62, !noundef !63
  %544 = trunc i8 %543 to i1
  br label %545

545:                                              ; preds = %542, %538
  %546 = phi i1 [ false, %538 ], [ %544, %542 ]
  %547 = zext i1 %546 to i8
  store i8 %547, ptr %47, align 1, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 1, ptr %49) #11
  br label %548

548:                                              ; preds = %545
  %549 = load i32, ptr %48, align 4, !tbaa !16
  %550 = add nsw i32 %549, 1
  store i32 %550, ptr %48, align 4, !tbaa !16
  br label %521, !llvm.loop !78

551:                                              ; preds = %527
  %552 = landingpad { ptr, i32 }
          cleanup
  %553 = extractvalue { ptr, i32 } %552, 0
  store ptr %553, ptr %22, align 8
  %554 = extractvalue { ptr, i32 } %552, 1
  store i32 %554, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %49) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #11
  call void @llvm.lifetime.end.p0(i64 1, ptr %47) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #11
  br label %744

555:                                              ; preds = %526
  %556 = load i8, ptr %47, align 1, !tbaa !9, !range !62, !noundef !63
  %557 = trunc i8 %556 to i1
  br i1 %557, label %558, label %559

558:                                              ; preds = %555
  store i8 1, ptr %40, align 1, !tbaa !9
  store i32 29, ptr %26, align 4
  br label %560

559:                                              ; preds = %555
  store i32 0, ptr %26, align 4
  br label %560

560:                                              ; preds = %559, %558
  call void @llvm.lifetime.end.p0(i64 1, ptr %47) #11
  %561 = load i32, ptr %26, align 4
  switch i32 %561, label %566 [
    i32 0, label %562
  ]

562:                                              ; preds = %560
  br label %563

563:                                              ; preds = %562
  %564 = load i32, ptr %46, align 4, !tbaa !16
  %565 = add nsw i32 %564, 1
  store i32 %565, ptr %46, align 4, !tbaa !16
  br label %513, !llvm.loop !79

566:                                              ; preds = %560, %519
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #11
  br label %567

567:                                              ; preds = %566
  br label %568

568:                                              ; preds = %567, %511
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #11
  store i32 0, ptr %50, align 4, !tbaa !16
  br label %569

569:                                              ; preds = %620, %568
  %570 = load i32, ptr %50, align 4, !tbaa !16
  %571 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 7
  %572 = load i32, ptr %571, align 8, !tbaa !17
  %573 = icmp slt i32 %570, %572
  br i1 %573, label %575, label %574

574:                                              ; preds = %569
  store i32 35, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #11
  br label %627

575:                                              ; preds = %569
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #11
  %576 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 2
  %577 = load ptr, ptr %576, align 8, !tbaa !19
  %578 = load i32, ptr %50, align 4, !tbaa !16
  %579 = sext i32 %578 to i64
  %580 = getelementptr inbounds ptr, ptr %577, i64 %579
  %581 = load ptr, ptr %580, align 8, !tbaa !5
  store ptr %581, ptr %51, align 8, !tbaa !5
  %582 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %583 = load ptr, ptr %582, align 8, !tbaa !40
  %584 = load i32, ptr %50, align 4, !tbaa !16
  %585 = sext i32 %584 to i64
  %586 = getelementptr inbounds %struct.b2Position, ptr %583, i64 %585
  %587 = getelementptr inbounds %struct.b2Position, ptr %586, i32 0, i32 0
  %588 = load ptr, ptr %51, align 8, !tbaa !5
  %589 = getelementptr inbounds %class.b2Body, ptr %588, i32 0, i32 5
  %590 = getelementptr inbounds %struct.b2Sweep, ptr %589, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %590, ptr align 4 %587, i64 8, i1 false), !tbaa.struct !20
  %591 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 5
  %592 = load ptr, ptr %591, align 8, !tbaa !40
  %593 = load i32, ptr %50, align 4, !tbaa !16
  %594 = sext i32 %593 to i64
  %595 = getelementptr inbounds %struct.b2Position, ptr %592, i64 %594
  %596 = getelementptr inbounds %struct.b2Position, ptr %595, i32 0, i32 1
  %597 = load float, ptr %596, align 4, !tbaa !41
  %598 = load ptr, ptr %51, align 8, !tbaa !5
  %599 = getelementptr inbounds %class.b2Body, ptr %598, i32 0, i32 5
  %600 = getelementptr inbounds %struct.b2Sweep, ptr %599, i32 0, i32 4
  store float %597, ptr %600, align 4, !tbaa !21
  %601 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %602 = load ptr, ptr %601, align 8, !tbaa !43
  %603 = load i32, ptr %50, align 4, !tbaa !16
  %604 = sext i32 %603 to i64
  %605 = getelementptr inbounds %struct.b2Velocity, ptr %602, i64 %604
  %606 = getelementptr inbounds %struct.b2Velocity, ptr %605, i32 0, i32 0
  %607 = load ptr, ptr %51, align 8, !tbaa !5
  %608 = getelementptr inbounds %class.b2Body, ptr %607, i32 0, i32 6
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %608, ptr align 4 %606, i64 8, i1 false), !tbaa.struct !20
  %609 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 6
  %610 = load ptr, ptr %609, align 8, !tbaa !43
  %611 = load i32, ptr %50, align 4, !tbaa !16
  %612 = sext i32 %611 to i64
  %613 = getelementptr inbounds %struct.b2Velocity, ptr %610, i64 %612
  %614 = getelementptr inbounds %struct.b2Velocity, ptr %613, i32 0, i32 1
  %615 = load float, ptr %614, align 4, !tbaa !44
  %616 = load ptr, ptr %51, align 8, !tbaa !5
  %617 = getelementptr inbounds %class.b2Body, ptr %616, i32 0, i32 7
  store float %615, ptr %617, align 8, !tbaa !31
  %618 = load ptr, ptr %51, align 8, !tbaa !5
  invoke void @_ZN6b2Body20SynchronizeTransformEv(ptr noundef nonnull align 8 dereferenceable(208) %618)
          to label %619 unwind label %623

619:                                              ; preds = %575
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #11
  br label %620

620:                                              ; preds = %619
  %621 = load i32, ptr %50, align 4, !tbaa !16
  %622 = add nsw i32 %621, 1
  store i32 %622, ptr %50, align 4, !tbaa !16
  br label %569, !llvm.loop !80

623:                                              ; preds = %575
  %624 = landingpad { ptr, i32 }
          cleanup
  %625 = extractvalue { ptr, i32 } %624, 0
  store ptr %625, ptr %22, align 8
  %626 = extractvalue { ptr, i32 } %624, 1
  store i32 %626, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #11
  br label %744

627:                                              ; preds = %574
  %628 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 9
  %629 = load i32, ptr %628, align 8, !tbaa !52
  %630 = icmp sgt i32 %629, 0
  br i1 %630, label %631, label %639

631:                                              ; preds = %627
  %632 = getelementptr inbounds %class.b2ContactSolver, ptr %20, i32 0, i32 4
  %633 = load ptr, ptr %632, align 8, !tbaa !81
  invoke void @_ZN8b2Island6ReportEPK27b2ContactVelocityConstraint(ptr noundef nonnull align 8 dereferenceable(80) %60, ptr noundef %633)
          to label %634 unwind label %635

634:                                              ; preds = %631
  br label %639

635:                                              ; preds = %631
  %636 = landingpad { ptr, i32 }
          cleanup
  %637 = extractvalue { ptr, i32 } %636, 0
  store ptr %637, ptr %22, align 8
  %638 = extractvalue { ptr, i32 } %636, 1
  store i32 %638, ptr %23, align 4
  br label %744

639:                                              ; preds = %634, %627
  %640 = load i8, ptr %8, align 1, !tbaa !9, !range !62, !noundef !63
  %641 = trunc i8 %640 to i1
  br i1 %641, label %642, label %743

642:                                              ; preds = %639
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #11
  store float 0x47EFFFFFE0000000, ptr %52, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #11
  store float 0x3F1A36E2E0000000, ptr %53, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #11
  store float 0x3F53F6A220000000, ptr %54, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #11
  store i32 0, ptr %55, align 4, !tbaa !16
  br label %643

643:                                              ; preds = %708, %642
  %644 = load i32, ptr %55, align 4, !tbaa !16
  %645 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 7
  %646 = load i32, ptr %645, align 8, !tbaa !17
  %647 = icmp slt i32 %644, %646
  br i1 %647, label %649, label %648

648:                                              ; preds = %643
  store i32 38, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #11
  br label %711

649:                                              ; preds = %643
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #11
  %650 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 2
  %651 = load ptr, ptr %650, align 8, !tbaa !19
  %652 = load i32, ptr %55, align 4, !tbaa !16
  %653 = sext i32 %652 to i64
  %654 = getelementptr inbounds ptr, ptr %651, i64 %653
  %655 = load ptr, ptr %654, align 8, !tbaa !5
  store ptr %655, ptr %56, align 8, !tbaa !5
  %656 = load ptr, ptr %56, align 8, !tbaa !5
  %657 = invoke noundef i32 @_ZNK6b2Body7GetTypeEv(ptr noundef nonnull align 8 dereferenceable(208) %656)
          to label %658 unwind label %661

658:                                              ; preds = %649
  %659 = icmp eq i32 %657, 0
  br i1 %659, label %660, label %665

660:                                              ; preds = %658
  store i32 40, ptr %26, align 4
  br label %705

661:                                              ; preds = %692, %681, %649
  %662 = landingpad { ptr, i32 }
          cleanup
  %663 = extractvalue { ptr, i32 } %662, 0
  store ptr %663, ptr %22, align 8
  %664 = extractvalue { ptr, i32 } %662, 1
  store i32 %664, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #11
  br label %742

665:                                              ; preds = %658
  %666 = load ptr, ptr %56, align 8, !tbaa !5
  %667 = getelementptr inbounds %class.b2Body, ptr %666, i32 0, i32 1
  %668 = load i16, ptr %667, align 4, !tbaa !83
  %669 = zext i16 %668 to i32
  %670 = and i32 %669, 4
  %671 = icmp eq i32 %670, 0
  br i1 %671, label %689, label %672

672:                                              ; preds = %665
  %673 = load ptr, ptr %56, align 8, !tbaa !5
  %674 = getelementptr inbounds %class.b2Body, ptr %673, i32 0, i32 7
  %675 = load float, ptr %674, align 8, !tbaa !31
  %676 = load ptr, ptr %56, align 8, !tbaa !5
  %677 = getelementptr inbounds %class.b2Body, ptr %676, i32 0, i32 7
  %678 = load float, ptr %677, align 8, !tbaa !31
  %679 = fmul float %675, %678
  %680 = fcmp ogt float %679, 0x3F53F6A220000000
  br i1 %680, label %689, label %681

681:                                              ; preds = %672
  %682 = load ptr, ptr %56, align 8, !tbaa !5
  %683 = getelementptr inbounds %class.b2Body, ptr %682, i32 0, i32 6
  %684 = load ptr, ptr %56, align 8, !tbaa !5
  %685 = getelementptr inbounds %class.b2Body, ptr %684, i32 0, i32 6
  %686 = invoke noundef float @_Z5b2DotRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %683, ptr noundef nonnull align 4 dereferenceable(8) %685)
          to label %687 unwind label %661

687:                                              ; preds = %681
  %688 = fcmp ogt float %686, 0x3F1A36E2E0000000
  br i1 %688, label %689, label %692

689:                                              ; preds = %687, %672, %665
  %690 = load ptr, ptr %56, align 8, !tbaa !5
  %691 = getelementptr inbounds %class.b2Body, ptr %690, i32 0, i32 26
  store float 0.000000e+00, ptr %691, align 4, !tbaa !84
  store float 0.000000e+00, ptr %52, align 4, !tbaa !15
  br label %704

692:                                              ; preds = %687
  %693 = load float, ptr %9, align 4, !tbaa !15
  %694 = load ptr, ptr %56, align 8, !tbaa !5
  %695 = getelementptr inbounds %class.b2Body, ptr %694, i32 0, i32 26
  %696 = load float, ptr %695, align 4, !tbaa !84
  %697 = fadd float %696, %693
  store float %697, ptr %695, align 4, !tbaa !84
  %698 = load float, ptr %52, align 4, !tbaa !15
  %699 = load ptr, ptr %56, align 8, !tbaa !5
  %700 = getelementptr inbounds %class.b2Body, ptr %699, i32 0, i32 26
  %701 = load float, ptr %700, align 4, !tbaa !84
  %702 = invoke noundef float @_Z5b2MinIfET_S0_S0_(float noundef %698, float noundef %701)
          to label %703 unwind label %661

703:                                              ; preds = %692
  store float %702, ptr %52, align 4, !tbaa !15
  br label %704

704:                                              ; preds = %703, %689
  store i32 0, ptr %26, align 4
  br label %705

705:                                              ; preds = %704, %660
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #11
  %706 = load i32, ptr %26, align 4
  switch i32 %706, label %751 [
    i32 0, label %707
    i32 40, label %708
  ]

707:                                              ; preds = %705
  br label %708

708:                                              ; preds = %707, %705
  %709 = load i32, ptr %55, align 4, !tbaa !16
  %710 = add nsw i32 %709, 1
  store i32 %710, ptr %55, align 4, !tbaa !16
  br label %643, !llvm.loop !85

711:                                              ; preds = %648
  %712 = load float, ptr %52, align 4, !tbaa !15
  %713 = fcmp oge float %712, 5.000000e-01
  br i1 %713, label %714, label %741

714:                                              ; preds = %711
  %715 = load i8, ptr %40, align 1, !tbaa !9, !range !62, !noundef !63
  %716 = trunc i8 %715 to i1
  br i1 %716, label %717, label %741

717:                                              ; preds = %714
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #11
  store i32 0, ptr %57, align 4, !tbaa !16
  br label %718

718:                                              ; preds = %733, %717
  %719 = load i32, ptr %57, align 4, !tbaa !16
  %720 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 7
  %721 = load i32, ptr %720, align 8, !tbaa !17
  %722 = icmp slt i32 %719, %721
  br i1 %722, label %724, label %723

723:                                              ; preds = %718
  store i32 41, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #11
  br label %740

724:                                              ; preds = %718
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #11
  %725 = getelementptr inbounds %class.b2Island, ptr %60, i32 0, i32 2
  %726 = load ptr, ptr %725, align 8, !tbaa !19
  %727 = load i32, ptr %57, align 4, !tbaa !16
  %728 = sext i32 %727 to i64
  %729 = getelementptr inbounds ptr, ptr %726, i64 %728
  %730 = load ptr, ptr %729, align 8, !tbaa !5
  store ptr %730, ptr %58, align 8, !tbaa !5
  %731 = load ptr, ptr %58, align 8, !tbaa !5
  invoke void @_ZN6b2Body8SetAwakeEb(ptr noundef nonnull align 8 dereferenceable(208) %731, i1 noundef zeroext false)
          to label %732 unwind label %736

732:                                              ; preds = %724
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #11
  br label %733

733:                                              ; preds = %732
  %734 = load i32, ptr %57, align 4, !tbaa !16
  %735 = add nsw i32 %734, 1
  store i32 %735, ptr %57, align 4, !tbaa !16
  br label %718, !llvm.loop !86

736:                                              ; preds = %724
  %737 = landingpad { ptr, i32 }
          cleanup
  %738 = extractvalue { ptr, i32 } %737, 0
  store ptr %738, ptr %22, align 8
  %739 = extractvalue { ptr, i32 } %737, 1
  store i32 %739, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #11
  br label %742

740:                                              ; preds = %723
  br label %741

741:                                              ; preds = %740, %714, %711
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #11
  br label %743

742:                                              ; preds = %736, %661
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #11
  br label %744

743:                                              ; preds = %741, %639
  call void @llvm.lifetime.end.p0(i64 1, ptr %40) #11
  call void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44) %20) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #11
  ret void

744:                                              ; preds = %742, %635, %623, %551, %509
  call void @llvm.lifetime.end.p0(i64 1, ptr %40) #11
  br label %745

745:                                              ; preds = %744, %440, %314, %281, %278, %228, %202
  call void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44) %20) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %20) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr %19) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #11
  br label %746

746:                                              ; preds = %745
  %747 = load ptr, ptr %22, align 8
  %748 = load i32, ptr %23, align 4
  %749 = insertvalue { ptr, i32 } poison, ptr %747, 0
  %750 = insertvalue { ptr, i32 } %749, i32 %748, 1
  resume { ptr, i32 } %750

751:                                              ; preds = %705
  unreachable
}

declare void @_ZN15b2ContactSolverC1Ev(ptr noundef nonnull align 8 dereferenceable(44)) unnamed_addr #8

declare void @_ZN15b2ContactSolver10InitializeEP18b2ContactSolverDef(ptr noundef nonnull align 8 dereferenceable(44), ptr noundef) #8

declare void @_ZN15b2ContactSolver29InitializeVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) #8

declare void @_ZN15b2ContactSolver9WarmStartEv(ptr noundef nonnull align 8 dereferenceable(44)) #8

declare void @_ZN15b2ContactSolver24SolveVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) #8

declare void @_ZN15b2ContactSolver13StoreImpulsesEv(ptr noundef nonnull align 8 dereferenceable(44)) #8

declare noundef zeroext i1 @_ZN15b2ContactSolver24SolvePositionConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) #8

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN8b2Island6ReportEPK27b2ContactVelocityConstraint(ptr noundef nonnull align 8 dereferenceable(80), ptr noundef) #9 align 2

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

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

; Function Attrs: nounwind
declare void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44)) unnamed_addr #10

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"bool", !7, i64 0}
!11 = !{!12, !13, i64 0}
!12 = !{!"_ZTS10b2TimeStep", !13, i64 0, !13, i64 4, !13, i64 8, !14, i64 12, !14, i64 16, !14, i64 20, !10, i64 24}
!13 = !{!"float", !7, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = !{!13, !13, i64 0}
!16 = !{!14, !14, i64 0}
!17 = !{!18, !14, i64 56}
!18 = !{!"_ZTS8b2Island", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !14, i64 56, !14, i64 60, !14, i64 64, !14, i64 68, !14, i64 72, !14, i64 76}
!19 = !{!18, !6, i64 16}
!20 = !{i64 0, i64 4, !15, i64 4, i64 4, !15}
!21 = !{!22, !13, i64 72}
!22 = !{!"_ZTS6b2Body", !23, i64 0, !24, i64 4, !14, i64 8, !25, i64 12, !25, i64 28, !28, i64 44, !26, i64 80, !13, i64 88, !26, i64 92, !13, i64 100, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !14, i64 136, !6, i64 144, !6, i64 152, !14, i64 160, !14, i64 164, !13, i64 168, !13, i64 172, !13, i64 176, !13, i64 180, !13, i64 184, !13, i64 188, !13, i64 192, !13, i64 196, !29, i64 200}
!23 = !{!"_ZTS10b2BodyType", !7, i64 0}
!24 = !{!"short", !7, i64 0}
!25 = !{!"_ZTS11b2Transform", !26, i64 0, !27, i64 8}
!26 = !{!"_ZTS6b2Vec2", !13, i64 0, !13, i64 4}
!27 = !{!"_ZTS5b2Rot", !13, i64 0, !13, i64 4}
!28 = !{!"_ZTS7b2Sweep", !26, i64 0, !26, i64 8, !26, i64 16, !13, i64 24, !13, i64 28, !13, i64 32}
!29 = !{!"_ZTS14b2BodyUserData", !30, i64 0}
!30 = !{!"long", !7, i64 0}
!31 = !{!22, !13, i64 88}
!32 = !{!22, !23, i64 0}
!33 = !{!22, !13, i64 172}
!34 = !{!22, !13, i64 192}
!35 = !{!22, !13, i64 168}
!36 = !{!22, !13, i64 180}
!37 = !{!22, !13, i64 100}
!38 = !{!22, !13, i64 184}
!39 = !{!22, !13, i64 188}
!40 = !{!18, !6, i64 40}
!41 = !{!42, !13, i64 8}
!42 = !{!"_ZTS10b2Position", !26, i64 0, !13, i64 8}
!43 = !{!18, !6, i64 48}
!44 = !{!45, !13, i64 8}
!45 = !{!"_ZTS10b2Velocity", !26, i64 0, !13, i64 8}
!46 = distinct !{!46, !47}
!47 = !{!"llvm.loop.mustprogress"}
!48 = !{i64 0, i64 4, !15, i64 4, i64 4, !15, i64 8, i64 4, !15, i64 12, i64 4, !16, i64 16, i64 4, !16, i64 20, i64 4, !16, i64 24, i64 1, !9}
!49 = !{!50, !6, i64 32}
!50 = !{!"_ZTS12b2SolverData", !12, i64 0, !6, i64 32, !6, i64 40}
!51 = !{!50, !6, i64 40}
!52 = !{!18, !14, i64 64}
!53 = !{!18, !6, i64 24}
!54 = !{!55, !6, i64 32}
!55 = !{!"_ZTS18b2ContactSolverDef", !12, i64 0, !6, i64 32, !14, i64 40, !6, i64 48, !6, i64 56, !6, i64 64}
!56 = !{!55, !14, i64 40}
!57 = !{!55, !6, i64 48}
!58 = !{!55, !6, i64 56}
!59 = !{!18, !6, i64 0}
!60 = !{!55, !6, i64 64}
!61 = !{!12, !10, i64 24}
!62 = !{i8 0, i8 2}
!63 = !{}
!64 = !{!18, !14, i64 60}
!65 = !{!18, !6, i64 32}
!66 = !{!67, !67, i64 0}
!67 = !{!"vtable pointer", !8, i64 0}
!68 = distinct !{!68, !47}
!69 = !{!12, !14, i64 12}
!70 = distinct !{!70, !47}
!71 = distinct !{!71, !47}
!72 = distinct !{!72, !47}
!73 = distinct !{!73, !47}
!74 = distinct !{!74, !47}
!75 = !{!12, !14, i64 16}
!76 = distinct !{!76, !47}
!77 = distinct !{!77, !47}
!78 = distinct !{!78, !47}
!79 = distinct !{!79, !47}
!80 = distinct !{!80, !47}
!81 = !{!82, !6, i64 32}
!82 = !{!"_ZTS15b2ContactSolver", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !14, i64 40}
!83 = !{!22, !24, i64 4}
!84 = !{!22, !13, i64 196}
!85 = distinct !{!85, !47}
!86 = distinct !{!86, !47}


; 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"

%struct.b2Vec2 = type { float, float }
%struct.b2SolverData = type { %struct.b2TimeStep, ptr, ptr }
%struct.b2TimeStep = type { float, float, float, i32, i32, i32, i8 }
%class.b2ContactSolver = type <{ ptr, ptr, ptr, ptr, ptr, i32, [4 x i8] }>
%struct.b2ContactSolverDef = type { %struct.b2TimeStep, ptr, i32, ptr, ptr, ptr }
%struct.b2Position = type { %struct.b2Vec2, float }
%struct.b2Velocity = type { %struct.b2Vec2, float }

declare i32 @__gxx_personality_v0(...)

; 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> @_ZmlfRK6b2Vec2(float noundef, ptr noundef nonnull align 4 dereferenceable(8)) local_unnamed_addr #2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(8)) local_unnamed_addr #3 align 2

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

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK6b2Vec26LengthEv(ptr noundef nonnull align 4 dereferenceable(8)) local_unnamed_addr #3 align 2

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN6b2Body20SynchronizeTransformEv(ptr noundef nonnull align 8 dereferenceable(208)) local_unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN6b2Body8SetAwakeEb(ptr noundef nonnull align 8 dereferenceable(208), i1 noundef zeroext) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8b2Island5SolveERK10b2TimeStepRK6b2Vec2b(ptr noundef nonnull align 8 dereferenceable(80) %0, ptr nocapture noundef nonnull readonly align 4 dereferenceable(28) %1, ptr noundef nonnull align 4 dereferenceable(8) %2, i1 noundef zeroext %3) local_unnamed_addr #7 align 2 personality ptr @__gxx_personality_v0 {
  %5 = alloca %struct.b2Vec2, align 8
  %6 = alloca %struct.b2Vec2, align 8
  %7 = alloca %struct.b2Vec2, align 8
  %8 = alloca %struct.b2Vec2, align 8
  %9 = alloca %struct.b2SolverData, align 8
  %10 = alloca %class.b2ContactSolver, align 8
  %11 = alloca %struct.b2ContactSolverDef, align 8
  %12 = alloca %struct.b2Vec2, align 8
  %13 = alloca %struct.b2Vec2, align 8
  %14 = alloca %struct.b2Vec2, align 8
  %15 = alloca %struct.b2Vec2, align 8
  %16 = load float, ptr %1, align 4, !tbaa !5
  %17 = getelementptr inbounds i8, ptr %0, i64 56
  %18 = load i32, ptr %17, align 8, !tbaa !12
  %19 = icmp sgt i32 %18, 0
  br i1 %19, label %.lr.ph, label %.._crit_edge_crit_edge

.._crit_edge_crit_edge:                           ; preds = %4
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 48
  %.pre = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !15
  br label %._crit_edge

.lr.ph:                                           ; preds = %4
  %20 = getelementptr inbounds i8, ptr %0, i64 16
  %21 = getelementptr inbounds i8, ptr %0, i64 40
  %22 = getelementptr inbounds i8, ptr %0, i64 48
  br label %32

._crit_edge:                                      ; preds = %72, %.._crit_edge_crit_edge
  %23 = phi ptr [ %.pre, %.._crit_edge_crit_edge ], [ %80, %72 ]
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %9) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %9, ptr noundef nonnull align 4 dereferenceable(28) %1, i64 28, i1 false), !tbaa.struct !16
  %24 = getelementptr inbounds i8, ptr %0, i64 40
  %25 = load ptr, ptr %24, align 8, !tbaa !20
  %26 = getelementptr inbounds i8, ptr %9, i64 32
  store ptr %25, ptr %26, align 8, !tbaa !21
  %27 = getelementptr inbounds i8, ptr %0, i64 48
  %28 = getelementptr inbounds i8, ptr %9, i64 40
  store ptr %23, ptr %28, align 8, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %10) #11
  call void @_ZN15b2ContactSolverC1Ev(ptr noundef nonnull align 8 dereferenceable(44) %10)
  %29 = getelementptr inbounds i8, ptr %0, i64 64
  %30 = load i32, ptr %29, align 8, !tbaa !24
  %31 = icmp sgt i32 %30, 0
  br i1 %31, label %85, label %103

32:                                               ; preds = %.lr.ph, %72
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %72 ]
  %33 = load ptr, ptr %20, align 8, !tbaa !25
  %34 = getelementptr inbounds ptr, ptr %33, i64 %indvars.iv
  %35 = load ptr, ptr %34, align 8, !tbaa !26
  %36 = getelementptr inbounds i8, ptr %35, i64 60
  %37 = load i64, ptr %36, align 4
  %38 = getelementptr inbounds i8, ptr %35, i64 72
  %39 = load float, ptr %38, align 4, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #11
  %40 = getelementptr inbounds i8, ptr %35, i64 80
  %41 = load i64, ptr %40, align 8
  store i64 %41, ptr %5, align 8
  %42 = getelementptr inbounds i8, ptr %35, i64 88
  %43 = load float, ptr %42, align 8, !tbaa !37
  %44 = load i32, ptr %35, align 8, !tbaa !38
  %45 = icmp eq i32 %44, 2
  br i1 %45, label %46, label %72

46:                                               ; preds = %32
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #11
  %47 = getelementptr inbounds i8, ptr %35, i64 172
  %48 = load float, ptr %47, align 4, !tbaa !39
  %49 = fmul float %16, %48
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #11
  %50 = getelementptr inbounds i8, ptr %35, i64 192
  %51 = load float, ptr %50, align 8, !tbaa !40
  %52 = getelementptr inbounds i8, ptr %35, i64 168
  %53 = load float, ptr %52, align 8, !tbaa !41
  %54 = fmul float %51, %53
  %55 = call <2 x float> @_ZmlfRK6b2Vec2(float noundef %54, ptr noundef nonnull align 4 dereferenceable(8) %2)
  store <2 x float> %55, ptr %8, align 8
  %56 = getelementptr inbounds i8, ptr %35, i64 92
  %57 = call <2 x float> @_ZplRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %8, ptr noundef nonnull align 4 dereferenceable(8) %56)
  store <2 x float> %57, ptr %7, align 8
  %58 = call <2 x float> @_ZmlfRK6b2Vec2(float noundef %49, ptr noundef nonnull align 4 dereferenceable(8) %7)
  store <2 x float> %58, ptr %6, align 8
  call void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8) %5, ptr noundef nonnull align 4 dereferenceable(8) %6)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #11
  %59 = getelementptr inbounds i8, ptr %35, i64 180
  %60 = load float, ptr %59, align 4, !tbaa !42
  %61 = fmul float %16, %60
  %62 = getelementptr inbounds i8, ptr %35, i64 100
  %63 = load float, ptr %62, align 4, !tbaa !43
  %64 = call float @llvm.fmuladd.f32(float %61, float %63, float %43)
  %65 = getelementptr inbounds i8, ptr %35, i64 184
  %66 = load float, ptr %65, align 8, !tbaa !44
  %67 = call float @llvm.fmuladd.f32(float %16, float %66, float 1.000000e+00)
  call void @_ZN6b2Vec2dVEf(ptr noundef nonnull align 4 dereferenceable(8) %5, float noundef %67)
  %68 = getelementptr inbounds i8, ptr %35, i64 188
  %69 = load float, ptr %68, align 4, !tbaa !45
  %70 = call float @llvm.fmuladd.f32(float %16, float %69, float 1.000000e+00)
  %71 = fdiv float %64, %70
  br label %72

72:                                               ; preds = %46, %32
  %.0131 = phi float [ %71, %46 ], [ %43, %32 ]
  %73 = load ptr, ptr %21, align 8, !tbaa !20
  %74 = getelementptr inbounds %struct.b2Position, ptr %73, i64 %indvars.iv
  store i64 %37, ptr %74, align 4
  %75 = load ptr, ptr %21, align 8, !tbaa !20
  %76 = getelementptr inbounds %struct.b2Position, ptr %75, i64 %indvars.iv, i32 1
  store float %39, ptr %76, align 4, !tbaa !46
  %77 = load ptr, ptr %22, align 8, !tbaa !15
  %78 = getelementptr inbounds %struct.b2Velocity, ptr %77, i64 %indvars.iv
  %79 = load i64, ptr %5, align 8
  store i64 %79, ptr %78, align 4
  %80 = load ptr, ptr %22, align 8, !tbaa !15
  %81 = getelementptr inbounds %struct.b2Velocity, ptr %80, i64 %indvars.iv, i32 1
  store float %.0131, ptr %81, align 4, !tbaa !48
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #11
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %82 = load i32, ptr %17, align 8, !tbaa !12
  %83 = sext i32 %82 to i64
  %84 = icmp slt i64 %indvars.iv.next, %83
  br i1 %84, label %32, label %._crit_edge, !llvm.loop !50

85:                                               ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 72, ptr nonnull %11) #11
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(28) %11, ptr noundef nonnull align 4 dereferenceable(28) %1, i64 28, i1 false), !tbaa.struct !16
  %86 = getelementptr inbounds i8, ptr %0, i64 24
  %87 = load ptr, ptr %86, align 8, !tbaa !52
  %88 = getelementptr inbounds i8, ptr %11, i64 32
  store ptr %87, ptr %88, align 8, !tbaa !53
  %89 = getelementptr inbounds i8, ptr %11, i64 40
  store i32 %30, ptr %89, align 8, !tbaa !55
  %90 = getelementptr inbounds i8, ptr %11, i64 48
  %91 = load <2 x ptr>, ptr %24, align 8, !tbaa !26
  store <2 x ptr> %91, ptr %90, align 8, !tbaa !26
  %92 = load ptr, ptr %0, align 8, !tbaa !56
  %93 = getelementptr inbounds i8, ptr %11, i64 64
  store ptr %92, ptr %93, align 8, !tbaa !57
  invoke void @_ZN15b2ContactSolver10InitializeEP18b2ContactSolverDef(ptr noundef nonnull align 8 dereferenceable(44) %10, ptr noundef nonnull %11)
          to label %94 unwind label %100

94:                                               ; preds = %85
  invoke void @_ZN15b2ContactSolver29InitializeVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %10)
          to label %95 unwind label %100

95:                                               ; preds = %94
  %96 = getelementptr inbounds i8, ptr %1, i64 24
  %97 = load i8, ptr %96, align 4, !tbaa !58, !range !59, !noundef !60
  %98 = trunc nuw i8 %97 to i1
  br i1 %98, label %99, label %102

99:                                               ; preds = %95
  invoke void @_ZN15b2ContactSolver9WarmStartEv(ptr noundef nonnull align 8 dereferenceable(44) %10)
          to label %102 unwind label %100

100:                                              ; preds = %99, %94, %85
  %101 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %11) #11
  br label %358

102:                                              ; preds = %99, %95
  call void @llvm.lifetime.end.p0(i64 72, ptr nonnull %11) #11
  br label %103

103:                                              ; preds = %102, %._crit_edge
  %104 = getelementptr inbounds i8, ptr %0, i64 60
  %105 = load i32, ptr %104, align 4, !tbaa !61
  %106 = icmp sgt i32 %105, 0
  br i1 %106, label %.lr.ph191, label %._crit_edge192

.lr.ph191:                                        ; preds = %103
  %107 = getelementptr inbounds i8, ptr %0, i64 32
  br label %117

._crit_edge192:                                   ; preds = %124, %103
  %108 = phi i32 [ %105, %103 ], [ %125, %124 ]
  %109 = load i32, ptr %29, align 8, !tbaa !24
  %110 = icmp sgt i32 %109, 0
  %111 = getelementptr inbounds i8, ptr %1, i64 12
  %112 = load i32, ptr %111, align 4, !tbaa !62
  %113 = icmp sgt i32 %112, 0
  br i1 %110, label %.preheader180, label %.preheader182

.preheader182:                                    ; preds = %._crit_edge192
  br i1 %113, label %.preheader181.lr.ph, label %.loopexit183

.preheader181.lr.ph:                              ; preds = %.preheader182
  %114 = getelementptr inbounds i8, ptr %0, i64 32
  %115 = icmp sgt i32 %108, 0
  br i1 %115, label %.preheader181, label %.loopexit183

.preheader180:                                    ; preds = %._crit_edge192
  br i1 %113, label %.preheader179.lr.ph, label %._crit_edge201

.preheader179.lr.ph:                              ; preds = %.preheader180
  %116 = getelementptr inbounds i8, ptr %0, i64 32
  br label %.preheader179

117:                                              ; preds = %.lr.ph191, %124
  %indvars.iv243 = phi i64 [ 0, %.lr.ph191 ], [ %indvars.iv.next244, %124 ]
  %118 = load ptr, ptr %107, align 8, !tbaa !63
  %119 = getelementptr inbounds ptr, ptr %118, i64 %indvars.iv243
  %120 = load ptr, ptr %119, align 8, !tbaa !26
  %121 = load ptr, ptr %120, align 8, !tbaa !64
  %122 = getelementptr inbounds i8, ptr %121, i64 72
  %123 = load ptr, ptr %122, align 8
  invoke void %123(ptr noundef nonnull align 8 dereferenceable(128) %120, ptr noundef nonnull align 8 dereferenceable(48) %9)
          to label %124 unwind label %128

124:                                              ; preds = %117
  %indvars.iv.next244 = add nuw nsw i64 %indvars.iv243, 1
  %125 = load i32, ptr %104, align 4, !tbaa !61
  %126 = sext i32 %125 to i64
  %127 = icmp slt i64 %indvars.iv.next244, %126
  br i1 %127, label %117, label %._crit_edge192, !llvm.loop !66

128:                                              ; preds = %117
  %129 = landingpad { ptr, i32 }
          cleanup
  br label %358

.preheader179:                                    ; preds = %.preheader179.lr.ph, %144
  %.0144200 = phi i32 [ 0, %.preheader179.lr.ph ], [ %145, %144 ]
  %130 = load i32, ptr %104, align 4, !tbaa !61
  %131 = icmp sgt i32 %130, 0
  br i1 %131, label %.lr.ph198, label %._crit_edge199

._crit_edge201:                                   ; preds = %144, %.preheader180
  invoke void @_ZN15b2ContactSolver13StoreImpulsesEv(ptr noundef nonnull align 8 dereferenceable(44) %10)
          to label %.loopexit183 unwind label %150

._crit_edge199:                                   ; preds = %138, %.preheader179
  invoke void @_ZN15b2ContactSolver24SolveVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %10)
          to label %144 unwind label %148

.lr.ph198:                                        ; preds = %.preheader179, %138
  %indvars.iv249 = phi i64 [ %indvars.iv.next250, %138 ], [ 0, %.preheader179 ]
  %132 = load ptr, ptr %116, align 8, !tbaa !63
  %133 = getelementptr inbounds ptr, ptr %132, i64 %indvars.iv249
  %134 = load ptr, ptr %133, align 8, !tbaa !26
  %135 = load ptr, ptr %134, align 8, !tbaa !64
  %136 = getelementptr inbounds i8, ptr %135, i64 80
  %137 = load ptr, ptr %136, align 8
  invoke void %137(ptr noundef nonnull align 8 dereferenceable(128) %134, ptr noundef nonnull align 8 dereferenceable(48) %9)
          to label %138 unwind label %142

138:                                              ; preds = %.lr.ph198
  %indvars.iv.next250 = add nuw nsw i64 %indvars.iv249, 1
  %139 = load i32, ptr %104, align 4, !tbaa !61
  %140 = sext i32 %139 to i64
  %141 = icmp slt i64 %indvars.iv.next250, %140
  br i1 %141, label %.lr.ph198, label %._crit_edge199, !llvm.loop !67

142:                                              ; preds = %.lr.ph198
  %143 = landingpad { ptr, i32 }
          cleanup
  br label %358

144:                                              ; preds = %._crit_edge199
  %145 = add nuw nsw i32 %.0144200, 1
  %146 = load i32, ptr %111, align 4, !tbaa !62
  %147 = icmp slt i32 %145, %146
  br i1 %147, label %.preheader179, label %._crit_edge201, !llvm.loop !68

148:                                              ; preds = %._crit_edge199
  %149 = landingpad { ptr, i32 }
          cleanup
  br label %358

150:                                              ; preds = %._crit_edge201
  %151 = landingpad { ptr, i32 }
          cleanup
  br label %358

.preheader181:                                    ; preds = %.preheader181.lr.ph, %._crit_edge195
  %152 = phi i32 [ %155, %._crit_edge195 ], [ %112, %.preheader181.lr.ph ]
  %153 = phi i32 [ %156, %._crit_edge195 ], [ %108, %.preheader181.lr.ph ]
  %.0159196 = phi i32 [ %157, %._crit_edge195 ], [ 0, %.preheader181.lr.ph ]
  %154 = icmp sgt i32 %153, 0
  br i1 %154, label %.lr.ph194, label %._crit_edge195

._crit_edge195.loopexit:                          ; preds = %165
  %.pre268 = load i32, ptr %111, align 4, !tbaa !62
  br label %._crit_edge195

._crit_edge195:                                   ; preds = %._crit_edge195.loopexit, %.preheader181
  %155 = phi i32 [ %.pre268, %._crit_edge195.loopexit ], [ %152, %.preheader181 ]
  %156 = phi i32 [ %166, %._crit_edge195.loopexit ], [ %153, %.preheader181 ]
  %157 = add nuw nsw i32 %.0159196, 1
  %158 = icmp slt i32 %157, %155
  br i1 %158, label %.preheader181, label %.loopexit183, !llvm.loop !69

.lr.ph194:                                        ; preds = %.preheader181, %165
  %indvars.iv246 = phi i64 [ %indvars.iv.next247, %165 ], [ 0, %.preheader181 ]
  %159 = load ptr, ptr %114, align 8, !tbaa !63
  %160 = getelementptr inbounds ptr, ptr %159, i64 %indvars.iv246
  %161 = load ptr, ptr %160, align 8, !tbaa !26
  %162 = load ptr, ptr %161, align 8, !tbaa !64
  %163 = getelementptr inbounds i8, ptr %162, i64 80
  %164 = load ptr, ptr %163, align 8
  invoke void %164(ptr noundef nonnull align 8 dereferenceable(128) %161, ptr noundef nonnull align 8 dereferenceable(48) %9)
          to label %165 unwind label %169

165:                                              ; preds = %.lr.ph194
  %indvars.iv.next247 = add nuw nsw i64 %indvars.iv246, 1
  %166 = load i32, ptr %104, align 4, !tbaa !61
  %167 = sext i32 %166 to i64
  %168 = icmp slt i64 %indvars.iv.next247, %167
  br i1 %168, label %.lr.ph194, label %._crit_edge195.loopexit, !llvm.loop !71

169:                                              ; preds = %.lr.ph194
  %170 = landingpad { ptr, i32 }
          cleanup
  br label %358

.loopexit183:                                     ; preds = %._crit_edge195, %.preheader181.lr.ph, %.preheader182, %._crit_edge201
  %171 = load i32, ptr %17, align 8, !tbaa !12
  %172 = icmp sgt i32 %171, 0
  br i1 %172, label %.lr.ph204.preheader, label %._crit_edge205

.lr.ph204.preheader:                              ; preds = %.loopexit183
  %.pre269 = load ptr, ptr %27, align 8, !tbaa !15
  br label %.lr.ph204

._crit_edge205:                                   ; preds = %211, %.loopexit183
  %173 = load i32, ptr %29, align 8, !tbaa !24
  %174 = icmp sgt i32 %173, 0
  %175 = getelementptr inbounds i8, ptr %1, i64 16
  %176 = load i32, ptr %175, align 4, !tbaa !72
  %177 = icmp sgt i32 %176, 0
  br i1 %174, label %.preheader173, label %.preheader176

.preheader176:                                    ; preds = %._crit_edge205
  br i1 %177, label %.preheader175.lr.ph, label %.loopexit174

.preheader175.lr.ph:                              ; preds = %.preheader176
  %178 = getelementptr inbounds i8, ptr %0, i64 32
  %179 = load i32, ptr %104, align 4, !tbaa !61
  %180 = icmp sgt i32 %179, 0
  br i1 %180, label %.preheader175, label %.loopexit174

.preheader173:                                    ; preds = %._crit_edge205
  br i1 %177, label %.lr.ph221, label %.loopexit174

.lr.ph221:                                        ; preds = %.preheader173
  %181 = getelementptr inbounds i8, ptr %0, i64 32
  br label %233

.lr.ph204:                                        ; preds = %.lr.ph204.preheader, %211
  %182 = phi ptr [ %.pre269, %.lr.ph204.preheader ], [ %221, %211 ]
  %indvars.iv252 = phi i64 [ 0, %.lr.ph204.preheader ], [ %indvars.iv.next253, %211 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #11
  %183 = load ptr, ptr %24, align 8, !tbaa !20
  %184 = getelementptr inbounds %struct.b2Position, ptr %183, i64 %indvars.iv252
  %185 = load i64, ptr %184, align 4
  store i64 %185, ptr %12, align 8
  %186 = getelementptr inbounds %struct.b2Position, ptr %183, i64 %indvars.iv252, i32 1
  %187 = load float, ptr %186, align 4, !tbaa !46
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #11
  %188 = getelementptr inbounds %struct.b2Velocity, ptr %182, i64 %indvars.iv252
  %189 = load i64, ptr %188, align 4
  store i64 %189, ptr %13, align 8
  %190 = getelementptr inbounds %struct.b2Velocity, ptr %182, i64 %indvars.iv252, i32 1
  %191 = load float, ptr %190, align 4, !tbaa !48
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #11
  %192 = invoke <2 x float> @_ZmlfRK6b2Vec2(float noundef %16, ptr noundef nonnull align 4 dereferenceable(8) %13)
          to label %193 unwind label %199

193:                                              ; preds = %.lr.ph204
  store <2 x float> %192, ptr %14, align 8
  %194 = call noundef float @_Z5b2DotRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %14, ptr noundef nonnull align 4 dereferenceable(8) %14)
  %195 = fcmp ogt float %194, 4.000000e+00
  br i1 %195, label %196, label %201

196:                                              ; preds = %193
  %197 = call noundef float @_ZNK6b2Vec26LengthEv(ptr noundef nonnull align 4 dereferenceable(8) %14)
  %198 = fdiv float 2.000000e+00, %197
  call void @_ZN6b2Vec2mLEf(ptr noundef nonnull align 4 dereferenceable(8) %13, float noundef %198)
  br label %201

199:                                              ; preds = %.lr.ph204
  %200 = landingpad { ptr, i32 }
          cleanup
  br label %228

201:                                              ; preds = %196, %193
  %202 = fmul float %16, %191
  %203 = fmul float %202, %202
  %204 = fcmp ogt float %203, 0x4003BD3CE0000000
  br i1 %204, label %205, label %209

205:                                              ; preds = %201
  %206 = call noundef float @_Z5b2AbsIfET_S0_(float noundef %202)
  %207 = fdiv float 0x3FF921FB60000000, %206
  %208 = fmul float %191, %207
  br label %209

209:                                              ; preds = %205, %201
  %.0162 = phi float [ %208, %205 ], [ %191, %201 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #11
  %210 = invoke <2 x float> @_ZmlfRK6b2Vec2(float noundef %16, ptr noundef nonnull align 4 dereferenceable(8) %13)
          to label %211 unwind label %226

211:                                              ; preds = %209
  store <2 x float> %210, ptr %15, align 8
  call void @_ZN6b2Vec2pLERKS_(ptr noundef nonnull align 4 dereferenceable(8) %12, ptr noundef nonnull align 4 dereferenceable(8) %15)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #11
  %212 = call float @llvm.fmuladd.f32(float %16, float %.0162, float %187)
  %213 = load ptr, ptr %24, align 8, !tbaa !20
  %214 = getelementptr inbounds %struct.b2Position, ptr %213, i64 %indvars.iv252
  %215 = load i64, ptr %12, align 8
  store i64 %215, ptr %214, align 4
  %216 = load ptr, ptr %24, align 8, !tbaa !20
  %217 = getelementptr inbounds %struct.b2Position, ptr %216, i64 %indvars.iv252, i32 1
  store float %212, ptr %217, align 4, !tbaa !46
  %218 = load ptr, ptr %27, align 8, !tbaa !15
  %219 = getelementptr inbounds %struct.b2Velocity, ptr %218, i64 %indvars.iv252
  %220 = load i64, ptr %13, align 8
  store i64 %220, ptr %219, align 4
  %221 = load ptr, ptr %27, align 8, !tbaa !15
  %222 = getelementptr inbounds %struct.b2Velocity, ptr %221, i64 %indvars.iv252, i32 1
  store float %.0162, ptr %222, align 4, !tbaa !48
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #11
  %indvars.iv.next253 = add nuw nsw i64 %indvars.iv252, 1
  %223 = load i32, ptr %17, align 8, !tbaa !12
  %224 = sext i32 %223 to i64
  %225 = icmp slt i64 %indvars.iv.next253, %224
  br i1 %225, label %.lr.ph204, label %._crit_edge205, !llvm.loop !73

226:                                              ; preds = %209
  %227 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #11
  br label %228

228:                                              ; preds = %226, %199
  %.pn165 = phi { ptr, i32 } [ %227, %226 ], [ %200, %199 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #11
  br label %358

229:                                              ; preds = %._crit_edge218
  %230 = add nuw nsw i32 %.0153220, 1
  %231 = load i32, ptr %175, align 4, !tbaa !72
  %232 = icmp slt i32 %230, %231
  br i1 %232, label %233, label %.loopexit174, !llvm.loop !74

233:                                              ; preds = %.lr.ph221, %229
  %.0153220 = phi i32 [ 0, %.lr.ph221 ], [ %230, %229 ]
  %234 = invoke noundef zeroext i1 @_ZN15b2ContactSolver24SolvePositionConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44) %10)
          to label %.preheader172 unwind label %238

.preheader172:                                    ; preds = %233
  %235 = load i32, ptr %104, align 4, !tbaa !61
  %236 = icmp sgt i32 %235, 0
  br i1 %236, label %.lr.ph217, label %._crit_edge218

._crit_edge218:                                   ; preds = %247, %.preheader172
  %.0151.lcssa = phi i1 [ true, %.preheader172 ], [ %248, %247 ]
  %237 = select i1 %234, i1 %.0151.lcssa, i1 false
  br i1 %237, label %.loopexit174, label %229

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

.lr.ph217:                                        ; preds = %.preheader172, %247
  %indvars.iv257 = phi i64 [ %indvars.iv.next258, %247 ], [ 0, %.preheader172 ]
  %.0151215 = phi i1 [ %248, %247 ], [ true, %.preheader172 ]
  %240 = load ptr, ptr %181, align 8, !tbaa !63
  %241 = getelementptr inbounds ptr, ptr %240, i64 %indvars.iv257
  %242 = load ptr, ptr %241, align 8, !tbaa !26
  %243 = load ptr, ptr %242, align 8, !tbaa !64
  %244 = getelementptr inbounds i8, ptr %243, i64 88
  %245 = load ptr, ptr %244, align 8
  %246 = invoke noundef zeroext i1 %245(ptr noundef nonnull align 8 dereferenceable(128) %242, ptr noundef nonnull align 8 dereferenceable(48) %9)
          to label %247 unwind label %252

247:                                              ; preds = %.lr.ph217
  %248 = and i1 %.0151215, %246
  %indvars.iv.next258 = add nuw nsw i64 %indvars.iv257, 1
  %249 = load i32, ptr %104, align 4, !tbaa !61
  %250 = sext i32 %249 to i64
  %251 = icmp slt i64 %indvars.iv.next258, %250
  br i1 %251, label %.lr.ph217, label %._crit_edge218, !llvm.loop !75

252:                                              ; preds = %.lr.ph217
  %253 = landingpad { ptr, i32 }
          cleanup
  br label %358

254:                                              ; preds = %._crit_edge209
  %255 = add nuw nsw i32 %.0147210, 1
  %256 = load i32, ptr %175, align 4, !tbaa !72
  %257 = icmp slt i32 %255, %256
  br i1 %257, label %.preheader175, label %.loopexit174, !llvm.loop !76

.preheader175:                                    ; preds = %.preheader175.lr.ph, %254
  %258 = phi i32 [ %269, %254 ], [ %179, %.preheader175.lr.ph ]
  %.0147210 = phi i32 [ %255, %254 ], [ 0, %.preheader175.lr.ph ]
  %259 = icmp sgt i32 %258, 0
  br i1 %259, label %.lr.ph208, label %.loopexit174

._crit_edge209:                                   ; preds = %267
  br i1 %268, label %.loopexit174, label %254

.lr.ph208:                                        ; preds = %.preheader175, %267
  %indvars.iv255 = phi i64 [ %indvars.iv.next256, %267 ], [ 0, %.preheader175 ]
  %.0146206 = phi i1 [ %268, %267 ], [ true, %.preheader175 ]
  %260 = load ptr, ptr %178, align 8, !tbaa !63
  %261 = getelementptr inbounds ptr, ptr %260, i64 %indvars.iv255
  %262 = load ptr, ptr %261, align 8, !tbaa !26
  %263 = load ptr, ptr %262, align 8, !tbaa !64
  %264 = getelementptr inbounds i8, ptr %263, i64 88
  %265 = load ptr, ptr %264, align 8
  %266 = invoke noundef zeroext i1 %265(ptr noundef nonnull align 8 dereferenceable(128) %262, ptr noundef nonnull align 8 dereferenceable(48) %9)
          to label %267 unwind label %272

267:                                              ; preds = %.lr.ph208
  %268 = and i1 %.0146206, %266
  %indvars.iv.next256 = add nuw nsw i64 %indvars.iv255, 1
  %269 = load i32, ptr %104, align 4, !tbaa !61
  %270 = sext i32 %269 to i64
  %271 = icmp slt i64 %indvars.iv.next256, %270
  br i1 %271, label %.lr.ph208, label %._crit_edge209, !llvm.loop !77

272:                                              ; preds = %.lr.ph208
  %273 = landingpad { ptr, i32 }
          cleanup
  br label %358

.loopexit174:                                     ; preds = %.preheader175, %254, %._crit_edge209, %229, %._crit_edge218, %.preheader175.lr.ph, %.preheader176, %.preheader173
  %.6.not.not = phi i1 [ false, %.preheader173 ], [ false, %.preheader176 ], [ true, %.preheader175.lr.ph ], [ %237, %._crit_edge218 ], [ %237, %229 ], [ true, %.preheader175 ], [ false, %254 ], [ true, %._crit_edge209 ]
  %274 = load i32, ptr %17, align 8, !tbaa !12
  %275 = icmp sgt i32 %274, 0
  br i1 %275, label %.lr.ph227, label %._crit_edge228

.lr.ph227:                                        ; preds = %.loopexit174
  %276 = getelementptr inbounds i8, ptr %0, i64 16
  br label %279

._crit_edge228:                                   ; preds = %299, %.loopexit174
  %277 = load i32, ptr %29, align 8, !tbaa !24
  %278 = icmp sgt i32 %277, 0
  br i1 %278, label %305, label %310

279:                                              ; preds = %.lr.ph227, %299
  %indvars.iv259 = phi i64 [ 0, %.lr.ph227 ], [ %indvars.iv.next260, %299 ]
  %280 = load ptr, ptr %276, align 8, !tbaa !25
  %281 = getelementptr inbounds ptr, ptr %280, i64 %indvars.iv259
  %282 = load ptr, ptr %281, align 8, !tbaa !26
  %283 = load ptr, ptr %24, align 8, !tbaa !20
  %284 = getelementptr inbounds %struct.b2Position, ptr %283, i64 %indvars.iv259
  %285 = getelementptr inbounds i8, ptr %282, i64 60
  %286 = load i64, ptr %284, align 4
  store i64 %286, ptr %285, align 4
  %287 = load ptr, ptr %24, align 8, !tbaa !20
  %288 = getelementptr inbounds %struct.b2Position, ptr %287, i64 %indvars.iv259, i32 1
  %289 = load float, ptr %288, align 4, !tbaa !46
  %290 = getelementptr inbounds i8, ptr %282, i64 72
  store float %289, ptr %290, align 4, !tbaa !27
  %291 = load ptr, ptr %27, align 8, !tbaa !15
  %292 = getelementptr inbounds %struct.b2Velocity, ptr %291, i64 %indvars.iv259
  %293 = getelementptr inbounds i8, ptr %282, i64 80
  %294 = load i64, ptr %292, align 4
  store i64 %294, ptr %293, align 8
  %295 = load ptr, ptr %27, align 8, !tbaa !15
  %296 = getelementptr inbounds %struct.b2Velocity, ptr %295, i64 %indvars.iv259, i32 1
  %297 = load float, ptr %296, align 4, !tbaa !48
  %298 = getelementptr inbounds i8, ptr %282, i64 88
  store float %297, ptr %298, align 8, !tbaa !37
  invoke void @_ZN6b2Body20SynchronizeTransformEv(ptr noundef nonnull align 8 dereferenceable(208) %282)
          to label %299 unwind label %303

299:                                              ; preds = %279
  %indvars.iv.next260 = add nuw nsw i64 %indvars.iv259, 1
  %300 = load i32, ptr %17, align 8, !tbaa !12
  %301 = sext i32 %300 to i64
  %302 = icmp slt i64 %indvars.iv.next260, %301
  br i1 %302, label %279, label %._crit_edge228, !llvm.loop !78

303:                                              ; preds = %279
  %304 = landingpad { ptr, i32 }
          cleanup
  br label %358

305:                                              ; preds = %._crit_edge228
  %306 = getelementptr inbounds i8, ptr %10, i64 32
  %307 = load ptr, ptr %306, align 8, !tbaa !79
  invoke void @_ZN8b2Island6ReportEPK27b2ContactVelocityConstraint(ptr noundef nonnull align 8 dereferenceable(80) %0, ptr noundef %307)
          to label %310 unwind label %308

308:                                              ; preds = %305
  %309 = landingpad { ptr, i32 }
          cleanup
  br label %358

310:                                              ; preds = %305, %._crit_edge228
  %311 = load i32, ptr %17, align 8
  %312 = icmp sgt i32 %311, 0
  %or.cond284 = select i1 %3, i1 %312, i1 false
  br i1 %or.cond284, label %.lr.ph231, label %.loopexit

.lr.ph231:                                        ; preds = %310
  %313 = getelementptr inbounds i8, ptr %0, i64 16
  br label %317

._crit_edge232:                                   ; preds = %344
  %314 = fcmp oge float %.2141, 5.000000e-01
  %315 = icmp sgt i32 %345, 0
  %brmerge.not237 = and i1 %.6.not.not, %314
  %or.cond = and i1 %brmerge.not237, %315
  br i1 %or.cond, label %.lr.ph235, label %.loopexit

.lr.ph235:                                        ; preds = %._crit_edge232
  %316 = getelementptr inbounds i8, ptr %0, i64 16
  br label %348

317:                                              ; preds = %.lr.ph231, %344
  %indvars.iv262 = phi i64 [ 0, %.lr.ph231 ], [ %indvars.iv.next263, %344 ]
  %.0139229 = phi float [ 0x47EFFFFFE0000000, %.lr.ph231 ], [ %.2141, %344 ]
  %318 = load ptr, ptr %313, align 8, !tbaa !25
  %319 = getelementptr inbounds ptr, ptr %318, i64 %indvars.iv262
  %320 = load ptr, ptr %319, align 8, !tbaa !26
  %321 = call noundef i32 @_ZNK6b2Body7GetTypeEv(ptr noundef nonnull align 8 dereferenceable(208) %320)
  %322 = icmp eq i32 %321, 0
  br i1 %322, label %344, label %323

323:                                              ; preds = %317
  %324 = getelementptr inbounds i8, ptr %320, i64 4
  %325 = load i16, ptr %324, align 4, !tbaa !81
  %326 = and i16 %325, 4
  %327 = icmp eq i16 %326, 0
  br i1 %327, label %337, label %328

328:                                              ; preds = %323
  %329 = getelementptr inbounds i8, ptr %320, i64 88
  %330 = load float, ptr %329, align 8, !tbaa !37
  %331 = fmul float %330, %330
  %332 = fcmp ogt float %331, 0x3F53F6A220000000
  br i1 %332, label %337, label %333

333:                                              ; preds = %328
  %334 = getelementptr inbounds i8, ptr %320, i64 80
  %335 = call noundef float @_Z5b2DotRK6b2Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %334, ptr noundef nonnull align 4 dereferenceable(8) %334)
  %336 = fcmp ogt float %335, 0x3F1A36E2E0000000
  br i1 %336, label %337, label %339

337:                                              ; preds = %333, %328, %323
  %338 = getelementptr inbounds i8, ptr %320, i64 196
  store float 0.000000e+00, ptr %338, align 4, !tbaa !82
  br label %344

339:                                              ; preds = %333
  %340 = getelementptr inbounds i8, ptr %320, i64 196
  %341 = load float, ptr %340, align 4, !tbaa !82
  %342 = fadd float %16, %341
  store float %342, ptr %340, align 4, !tbaa !82
  %343 = call noundef float @_Z5b2MinIfET_S0_S0_(float noundef %.0139229, float noundef %342)
  br label %344

344:                                              ; preds = %337, %339, %317
  %.2141 = phi float [ %.0139229, %317 ], [ 0.000000e+00, %337 ], [ %343, %339 ]
  %indvars.iv.next263 = add nuw nsw i64 %indvars.iv262, 1
  %345 = load i32, ptr %17, align 8
  %346 = sext i32 %345 to i64
  %347 = icmp slt i64 %indvars.iv.next263, %346
  br i1 %347, label %317, label %._crit_edge232, !llvm.loop !83

348:                                              ; preds = %.lr.ph235, %352
  %indvars.iv265 = phi i64 [ 0, %.lr.ph235 ], [ %indvars.iv.next266, %352 ]
  %349 = load ptr, ptr %316, align 8, !tbaa !25
  %350 = getelementptr inbounds ptr, ptr %349, i64 %indvars.iv265
  %351 = load ptr, ptr %350, align 8, !tbaa !26
  invoke void @_ZN6b2Body8SetAwakeEb(ptr noundef nonnull align 8 dereferenceable(208) %351, i1 noundef zeroext false)
          to label %352 unwind label %356

352:                                              ; preds = %348
  %indvars.iv.next266 = add nuw nsw i64 %indvars.iv265, 1
  %353 = load i32, ptr %17, align 8, !tbaa !12
  %354 = sext i32 %353 to i64
  %355 = icmp slt i64 %indvars.iv.next266, %354
  br i1 %355, label %348, label %.loopexit, !llvm.loop !84

356:                                              ; preds = %348
  %357 = landingpad { ptr, i32 }
          cleanup
  br label %358

.loopexit:                                        ; preds = %352, %._crit_edge232, %310
  call void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44) %10) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %10) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %9) #11
  ret void

358:                                              ; preds = %272, %303, %308, %356, %252, %238, %142, %148, %228, %169, %150, %128, %100
  %.pn169 = phi { ptr, i32 } [ %129, %128 ], [ %.pn165, %228 ], [ %151, %150 ], [ %170, %169 ], [ %101, %100 ], [ %143, %142 ], [ %149, %148 ], [ %304, %303 ], [ %357, %356 ], [ %309, %308 ], [ %273, %272 ], [ %253, %252 ], [ %239, %238 ]
  call void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44) %10) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %10) #11
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %9) #11
  resume { ptr, i32 } %.pn169
}

declare void @_ZN15b2ContactSolverC1Ev(ptr noundef nonnull align 8 dereferenceable(44)) unnamed_addr #8

declare void @_ZN15b2ContactSolver10InitializeEP18b2ContactSolverDef(ptr noundef nonnull align 8 dereferenceable(44), ptr noundef) local_unnamed_addr #8

declare void @_ZN15b2ContactSolver29InitializeVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) local_unnamed_addr #8

declare void @_ZN15b2ContactSolver9WarmStartEv(ptr noundef nonnull align 8 dereferenceable(44)) local_unnamed_addr #8

declare void @_ZN15b2ContactSolver24SolveVelocityConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) local_unnamed_addr #8

declare void @_ZN15b2ContactSolver13StoreImpulsesEv(ptr noundef nonnull align 8 dereferenceable(44)) local_unnamed_addr #8

declare noundef zeroext i1 @_ZN15b2ContactSolver24SolvePositionConstraintsEv(ptr noundef nonnull align 8 dereferenceable(44)) local_unnamed_addr #8

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN8b2Island6ReportEPK27b2ContactVelocityConstraint(ptr noundef nonnull align 8 dereferenceable(80), ptr noundef) local_unnamed_addr #9 align 2

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

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

; Function Attrs: nounwind
declare void @_ZN15b2ContactSolverD1Ev(ptr noundef nonnull align 8 dereferenceable(44)) unnamed_addr #10

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTS10b2TimeStep", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !11, i64 24}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"bool", !8, i64 0}
!12 = !{!13, !10, i64 56}
!13 = !{!"_ZTS8b2Island", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32, !14, i64 40, !14, i64 48, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76}
!14 = !{!"any pointer", !8, i64 0}
!15 = !{!13, !14, i64 48}
!16 = !{i64 0, i64 4, !17, i64 4, i64 4, !17, i64 8, i64 4, !17, i64 12, i64 4, !18, i64 16, i64 4, !18, i64 20, i64 4, !18, i64 24, i64 1, !19}
!17 = !{!7, !7, i64 0}
!18 = !{!10, !10, i64 0}
!19 = !{!11, !11, i64 0}
!20 = !{!13, !14, i64 40}
!21 = !{!22, !14, i64 32}
!22 = !{!"_ZTS12b2SolverData", !6, i64 0, !14, i64 32, !14, i64 40}
!23 = !{!22, !14, i64 40}
!24 = !{!13, !10, i64 64}
!25 = !{!13, !14, i64 16}
!26 = !{!14, !14, i64 0}
!27 = !{!28, !7, i64 72}
!28 = !{!"_ZTS6b2Body", !29, i64 0, !30, i64 4, !10, i64 8, !31, i64 12, !31, i64 28, !34, i64 44, !32, i64 80, !7, i64 88, !32, i64 92, !7, i64 100, !14, i64 104, !14, i64 112, !14, i64 120, !14, i64 128, !10, i64 136, !14, i64 144, !14, i64 152, !10, i64 160, !10, i64 164, !7, i64 168, !7, i64 172, !7, i64 176, !7, i64 180, !7, i64 184, !7, i64 188, !7, i64 192, !7, i64 196, !35, i64 200}
!29 = !{!"_ZTS10b2BodyType", !8, i64 0}
!30 = !{!"short", !8, i64 0}
!31 = !{!"_ZTS11b2Transform", !32, i64 0, !33, i64 8}
!32 = !{!"_ZTS6b2Vec2", !7, i64 0, !7, i64 4}
!33 = !{!"_ZTS5b2Rot", !7, i64 0, !7, i64 4}
!34 = !{!"_ZTS7b2Sweep", !32, i64 0, !32, i64 8, !32, i64 16, !7, i64 24, !7, i64 28, !7, i64 32}
!35 = !{!"_ZTS14b2BodyUserData", !36, i64 0}
!36 = !{!"long", !8, i64 0}
!37 = !{!28, !7, i64 88}
!38 = !{!28, !29, i64 0}
!39 = !{!28, !7, i64 172}
!40 = !{!28, !7, i64 192}
!41 = !{!28, !7, i64 168}
!42 = !{!28, !7, i64 180}
!43 = !{!28, !7, i64 100}
!44 = !{!28, !7, i64 184}
!45 = !{!28, !7, i64 188}
!46 = !{!47, !7, i64 8}
!47 = !{!"_ZTS10b2Position", !32, i64 0, !7, i64 8}
!48 = !{!49, !7, i64 8}
!49 = !{!"_ZTS10b2Velocity", !32, i64 0, !7, i64 8}
!50 = distinct !{!50, !51}
!51 = !{!"llvm.loop.mustprogress"}
!52 = !{!13, !14, i64 24}
!53 = !{!54, !14, i64 32}
!54 = !{!"_ZTS18b2ContactSolverDef", !6, i64 0, !14, i64 32, !10, i64 40, !14, i64 48, !14, i64 56, !14, i64 64}
!55 = !{!54, !10, i64 40}
!56 = !{!13, !14, i64 0}
!57 = !{!54, !14, i64 64}
!58 = !{!6, !11, i64 24}
!59 = !{i8 0, i8 2}
!60 = !{}
!61 = !{!13, !10, i64 60}
!62 = !{!6, !10, i64 12}
!63 = !{!13, !14, i64 32}
!64 = !{!65, !65, i64 0}
!65 = !{!"vtable pointer", !9, i64 0}
!66 = distinct !{!66, !51}
!67 = distinct !{!67, !51}
!68 = distinct !{!68, !51}
!69 = distinct !{!69, !51, !70}
!70 = !{!"llvm.loop.unswitch.partial.disable"}
!71 = distinct !{!71, !51}
!72 = !{!6, !10, i64 16}
!73 = distinct !{!73, !51}
!74 = distinct !{!74, !51}
!75 = distinct !{!75, !51}
!76 = distinct !{!76, !51, !70}
!77 = distinct !{!77, !51}
!78 = distinct !{!78, !51}
!79 = !{!80, !14, i64 32}
!80 = !{!"_ZTS15b2ContactSolver", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !14, i64 32, !10, i64 40}
!81 = !{!28, !30, i64 4}
!82 = !{!28, !7, i64 196}
!83 = distinct !{!83, !51}
!84 = distinct !{!84, !51}


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