; LLVM IR from erincatto/box2d :: src (world)

; 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.b2AABB = type { %struct.b2Vec2, %struct.b2Vec2 }
%struct.b2WorldId = type { i16, i16 }
%struct.b2Transform = type { %struct.b2Vec2, %struct.b2Rot }
%struct.b2Rot = type { float, float }
%struct.b2World = type { %struct.b2ArenaAllocator, %struct.b2BroadPhase, %struct.b2ConstraintGraph, %struct.b2IdPool, %struct.b2BodyArray, %struct.b2IdPool, %struct.b2SolverSetArray, %struct.b2IdPool, %struct.b2JointArray, %struct.b2IdPool, %struct.b2ContactArray, %struct.b2IdPool, %struct.b2IslandArray, %struct.b2IdPool, %struct.b2IdPool, %struct.b2ShapeArray, %struct.b2ChainShapeArray, %struct.b2SensorArray, %struct.b2TaskContextArray, %struct.b2SensorTaskContextArray, %struct.b2BodyMoveEventArray, %struct.b2SensorBeginTouchEventArray, %struct.b2ContactBeginTouchEventArray, [2 x %struct.b2SensorEndTouchEventArray], [2 x %struct.b2ContactEndTouchEventArray], i32, %struct.b2ContactHitEventArray, %struct.b2BitSet, %struct.b2BitSet, %struct.b2BitSet, %struct.b2BitSet, i64, i32, %struct.b2Vec2, float, float, float, float, float, float, float, float, ptr, ptr, i16, %struct.b2Profile, ptr, ptr, ptr, ptr, i32, ptr, ptr, ptr, ptr, ptr, float, i32, i32, i16, i8, i8, i8, i8, i8, i8 }
%struct.b2ArenaAllocator = type { ptr, i32, i32, i32, i32, %struct.b2ArenaEntryArray }
%struct.b2ArenaEntryArray = type { ptr, i32, i32 }
%struct.b2BroadPhase = type { [3 x %struct.b2DynamicTree], i32, %struct.b2HashSet, %struct.b2IntArray, ptr, ptr, i32, %struct.b2AtomicInt, %struct.b2HashSet }
%struct.b2DynamicTree = type { ptr, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, i32 }
%struct.b2IntArray = type { ptr, i32, i32 }
%struct.b2AtomicInt = type { i32 }
%struct.b2HashSet = type { ptr, i32, i32 }
%struct.b2ConstraintGraph = type { [12 x %struct.b2GraphColor] }
%struct.b2GraphColor = type { %struct.b2BitSet, %struct.b2ContactSimArray, %struct.b2JointSimArray, %union.anon }
%struct.b2ContactSimArray = type { ptr, i32, i32 }
%struct.b2JointSimArray = type { ptr, i32, i32 }
%union.anon = type { ptr }
%struct.b2BodyArray = type { ptr, i32, i32 }
%struct.b2SolverSetArray = type { ptr, i32, i32 }
%struct.b2JointArray = type { ptr, i32, i32 }
%struct.b2ContactArray = type { ptr, i32, i32 }
%struct.b2IslandArray = type { ptr, i32, i32 }
%struct.b2IdPool = type { %struct.b2IntArray, i32 }
%struct.b2ShapeArray = type { ptr, i32, i32 }
%struct.b2ChainShapeArray = type { ptr, i32, i32 }
%struct.b2SensorArray = type { ptr, i32, i32 }
%struct.b2TaskContextArray = type { ptr, i32, i32 }
%struct.b2SensorTaskContextArray = type { ptr, i32, i32 }
%struct.b2BodyMoveEventArray = type { ptr, i32, i32 }
%struct.b2SensorBeginTouchEventArray = type { ptr, i32, i32 }
%struct.b2ContactBeginTouchEventArray = type { ptr, i32, i32 }
%struct.b2SensorEndTouchEventArray = type { ptr, i32, i32 }
%struct.b2ContactEndTouchEventArray = type { ptr, i32, i32 }
%struct.b2ContactHitEventArray = type { ptr, i32, i32 }
%struct.b2BitSet = type { ptr, i32, i32 }
%struct.b2Profile = type { float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float }
%struct.b2DebugDraw = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %struct.b2AABB, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, ptr }
%struct.b2SolverSet = type { %struct.b2BodySimArray, %struct.b2BodyStateArray, %struct.b2JointSimArray, %struct.b2ContactSimArray, %struct.b2IslandSimArray, i32 }
%struct.b2BodySimArray = type { ptr, i32, i32 }
%struct.b2BodyStateArray = type { ptr, i32, i32 }
%struct.b2IslandSimArray = type { ptr, i32, i32 }
%struct.b2BodySim = type { %struct.b2Transform, %struct.b2Vec2, %struct.b2Rot, %struct.b2Vec2, %struct.b2Vec2, %struct.b2Vec2, float, float, float, float, float, float, float, float, i32, i8, i8, i8, i8, i8 }
%struct.b2Body = type { [32 x i8], ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, i32, i32, i32, i16, i8, i8, i8, i8 }
%struct.b2Shape = type { i32, i32, i32, i32, i32, i32, float, float, float, float, float, i32, %struct.b2AABB, %struct.b2AABB, %struct.b2Vec2, i32, %struct.b2Filter, ptr, i32, %union.anon.0, i16, i8, i8, i8, i8, i8 }
%struct.b2Filter = type { i64, i64, i32 }
%union.anon.0 = type { %struct.b2Polygon }
%struct.b2Polygon = type { [8 x %struct.b2Vec2], [8 x %struct.b2Vec2], %struct.b2Vec2, float, i32 }
%struct.b2Joint = type { ptr, i32, i32, i32, [2 x %struct.b2JointEdge], i32, i32, i32, i32, float, i32, i16, i8, i8 }
%struct.b2JointEdge = type { i32, i32, i32 }
%struct.b2ContactSim = type { i32, i32, i32, i32, i32, float, float, float, float, %struct.b2Manifold, float, float, float, float, i32, %struct.b2SimplexCache }
%struct.b2Manifold = type { %struct.b2Vec2, float, [2 x %struct.b2ManifoldPoint], i32 }
%struct.b2ManifoldPoint = type { %struct.b2Vec2, %struct.b2Vec2, %struct.b2Vec2, float, float, float, float, float, i16, i8 }
%struct.b2SimplexCache = type { i16, [3 x i8], [3 x i8] }
%struct.b2Island = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@.str.1 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [3 x i8], align 1
@__const.b2World_Draw.offset = external hidden unnamed_addr constant %struct.b2Vec2, align 4
@__const.b2World_Draw.offset.20 = external hidden unnamed_addr constant %struct.b2Vec2, align 4
@.str.21 = external hidden unnamed_addr constant [7 x i8], align 1
@b2_lengthUnitsPerMeter = external global float, align 4
@__const.b2World_Draw.colors = external hidden unnamed_addr constant [12 x i32], align 16
@.str.22 = external hidden unnamed_addr constant [5 x i8], align 1
@__const.b2World_Draw.aabb = external hidden unnamed_addr constant %struct.b2AABB, align 4

; Function Attrs: nounwind uwtable
declare dso_local ptr @b2GetWorldFromId(i32) #0

declare i32 @b2InternalAssertFcn(ptr noundef, ptr noundef, i32 noundef) #1

; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write)
declare void @llvm.trap() #2

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

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

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

; Function Attrs: nounwind uwtable
define dso_local void @b2World_Draw(i32 %0, ptr noundef %1) #5 {
  %3 = alloca %struct.b2WorldId, align 2
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca %struct.b2Transform, align 4
  %15 = alloca i32, align 4
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca ptr, align 8
  %28 = alloca [32 x i8], align 16
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca ptr, align 8
  %32 = alloca %struct.b2AABB, align 4
  %33 = alloca [4 x %struct.b2Vec2], align 16
  %34 = alloca %struct.b2Vec2, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca ptr, align 8
  %38 = alloca ptr, align 8
  %39 = alloca %struct.b2Transform, align 4
  %40 = alloca %struct.b2Vec2, align 4
  %41 = alloca %struct.b2Vec2, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca ptr, align 8
  %45 = alloca i32, align 4
  %46 = alloca i32, align 4
  %47 = alloca ptr, align 8
  %48 = alloca %struct.b2Transform, align 4
  %49 = alloca %struct.b2Vec2, align 4
  %50 = alloca [32 x i8], align 16
  %51 = alloca float, align 4
  %52 = alloca float, align 4
  %53 = alloca float, align 4
  %54 = alloca float, align 4
  %55 = alloca i32, align 4
  %56 = alloca i32, align 4
  %57 = alloca i32, align 4
  %58 = alloca i32, align 4
  %59 = alloca i32, align 4
  %60 = alloca i32, align 4
  %61 = alloca [12 x i32], align 16
  %62 = alloca i32, align 4
  %63 = alloca ptr, align 8
  %64 = alloca i32, align 4
  %65 = alloca i32, align 4
  %66 = alloca ptr, align 8
  %67 = alloca i32, align 4
  %68 = alloca %struct.b2Vec2, align 4
  %69 = alloca [32 x i8], align 16
  %70 = alloca i32, align 4
  %71 = alloca ptr, align 8
  %72 = alloca float, align 4
  %73 = alloca %struct.b2Vec2, align 4
  %74 = alloca %struct.b2Vec2, align 4
  %75 = alloca %struct.b2Vec2, align 4
  %76 = alloca %struct.b2Vec2, align 4
  %77 = alloca %struct.b2Vec2, align 4
  %78 = alloca %struct.b2Vec2, align 4
  %79 = alloca %struct.b2Vec2, align 4
  %80 = alloca i32, align 4
  %81 = alloca i32, align 4
  %82 = alloca ptr, align 8
  %83 = alloca i32, align 4
  %84 = alloca %struct.b2AABB, align 4
  %85 = alloca i32, align 4
  %86 = alloca ptr, align 8
  %87 = alloca i32, align 4
  %88 = alloca ptr, align 8
  %89 = alloca %struct.b2AABB, align 4
  %90 = alloca [4 x %struct.b2Vec2], align 16
  store i32 %0, ptr %3, align 2
  store ptr %1, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #9
  %91 = load i32, ptr %3, align 2
  %92 = call ptr @b2GetWorldFromId(i32 %91)
  store ptr %92, ptr %5, align 8, !tbaa !5
  br label %93

93:                                               ; preds = %2
  %94 = load ptr, ptr %5, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.b2World, ptr %94, i32 0, i32 61
  %96 = load i8, ptr %95, align 1, !tbaa !9, !range !26, !noundef !27
  %97 = trunc i8 %96 to i1
  %98 = zext i1 %97 to i32
  %99 = icmp eq i32 %98, 0
  br i1 %99, label %104, label %100

100:                                              ; preds = %93
  %101 = call i32 @b2InternalAssertFcn(ptr noundef @.str.15, ptr noundef @.str.1, i32 noundef 1170)
  %102 = icmp ne i32 %101, 0
  br i1 %102, label %103, label %104

103:                                              ; preds = %100
  call void @llvm.trap()
  br label %104

104:                                              ; preds = %103, %100, %93
  br label %105

105:                                              ; preds = %104
  br label %106

106:                                              ; preds = %105
  %107 = load ptr, ptr %5, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.b2World, ptr %107, i32 0, i32 61
  %109 = load i8, ptr %108, align 1, !tbaa !9, !range !26, !noundef !27
  %110 = trunc i8 %109 to i1
  br i1 %110, label %111, label %112

111:                                              ; preds = %106
  store i32 1, ptr %6, align 4
  br label %1044

112:                                              ; preds = %106
  %113 = load ptr, ptr %4, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.b2DebugDraw, ptr %113, i32 0, i32 10
  %115 = load i8, ptr %114, align 8, !tbaa !28, !range !26, !noundef !27
  %116 = trunc i8 %115 to i1
  br i1 %116, label %117, label %120

117:                                              ; preds = %112
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = load ptr, ptr %4, align 8, !tbaa !5
  call void @b2DrawWithBounds(ptr noundef %118, ptr noundef %119)
  store i32 1, ptr %6, align 4
  br label %1044

120:                                              ; preds = %112
  %121 = load ptr, ptr %4, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.b2DebugDraw, ptr %121, i32 0, i32 11
  %123 = load i8, ptr %122, align 1, !tbaa !31, !range !26, !noundef !27
  %124 = trunc i8 %123 to i1
  br i1 %124, label %125, label %294

125:                                              ; preds = %120
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #9
  %126 = load ptr, ptr %5, align 8, !tbaa !5
  %127 = getelementptr inbounds %struct.b2World, ptr %126, i32 0, i32 6
  %128 = getelementptr inbounds %struct.b2SolverSetArray, ptr %127, i32 0, i32 1
  %129 = load i32, ptr %128, align 8, !tbaa !32
  store i32 %129, ptr %7, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #9
  store i32 0, ptr %8, align 4, !tbaa !33
  br label %130

130:                                              ; preds = %290, %125
  %131 = load i32, ptr %8, align 4, !tbaa !33
  %132 = load i32, ptr %7, align 4, !tbaa !33
  %133 = icmp slt i32 %131, %132
  br i1 %133, label %135, label %134

134:                                              ; preds = %130
  store i32 4, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #9
  br label %293

135:                                              ; preds = %130
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #9
  %136 = load ptr, ptr %5, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.b2World, ptr %136, i32 0, i32 6
  %138 = load i32, ptr %8, align 4, !tbaa !33
  %139 = call ptr @b2SolverSetArray_Get(ptr noundef %137, i32 noundef %138)
  store ptr %139, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #9
  %140 = load ptr, ptr %9, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.b2SolverSet, ptr %140, i32 0, i32 0
  %142 = getelementptr inbounds %struct.b2BodySimArray, ptr %141, i32 0, i32 1
  %143 = load i32, ptr %142, align 8, !tbaa !34
  store i32 %143, ptr %10, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #9
  store i32 0, ptr %11, align 4, !tbaa !33
  br label %144

144:                                              ; preds = %286, %135
  %145 = load i32, ptr %11, align 4, !tbaa !33
  %146 = load i32, ptr %10, align 4, !tbaa !33
  %147 = icmp slt i32 %145, %146
  br i1 %147, label %149, label %148

148:                                              ; preds = %144
  store i32 7, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #9
  br label %289

149:                                              ; preds = %144
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #9
  %150 = load ptr, ptr %9, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.b2SolverSet, ptr %150, i32 0, i32 0
  %152 = getelementptr inbounds %struct.b2BodySimArray, ptr %151, i32 0, i32 0
  %153 = load ptr, ptr %152, align 8, !tbaa !36
  %154 = load i32, ptr %11, align 4, !tbaa !33
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds %struct.b2BodySim, ptr %153, i64 %155
  store ptr %156, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #9
  %157 = load ptr, ptr %5, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.b2World, ptr %157, i32 0, i32 4
  %159 = load ptr, ptr %12, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.b2BodySim, ptr %159, i32 0, i32 14
  %161 = load i32, ptr %160, align 4, !tbaa !37
  %162 = call ptr @b2BodyArray_Get(ptr noundef %158, i32 noundef %161)
  store ptr %162, ptr %13, align 8, !tbaa !5
  br label %163

163:                                              ; preds = %149
  %164 = load ptr, ptr %13, align 8, !tbaa !5
  %165 = getelementptr inbounds %struct.b2Body, ptr %164, i32 0, i32 2
  %166 = load i32, ptr %165, align 8, !tbaa !41
  %167 = load i32, ptr %8, align 4, !tbaa !33
  %168 = icmp eq i32 %166, %167
  br i1 %168, label %173, label %169

169:                                              ; preds = %163
  %170 = call i32 @b2InternalAssertFcn(ptr noundef @.str.18, ptr noundef @.str.1, i32 noundef 1194)
  %171 = icmp ne i32 %170, 0
  br i1 %171, label %172, label %173

172:                                              ; preds = %169
  call void @llvm.trap()
  br label %173

173:                                              ; preds = %172, %169, %163
  br label %174

174:                                              ; preds = %173
  br label %175

175:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 16, ptr %14) #9
  %176 = load ptr, ptr %12, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.b2BodySim, ptr %176, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %14, ptr align 4 %177, i64 16, i1 false), !tbaa.struct !43
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #9
  %178 = load ptr, ptr %13, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.b2Body, ptr %178, i32 0, i32 6
  %180 = load i32, ptr %179, align 8, !tbaa !45
  store i32 %180, ptr %15, align 4, !tbaa !33
  br label %181

181:                                              ; preds = %274, %175
  %182 = load i32, ptr %15, align 4, !tbaa !33
  %183 = icmp ne i32 %182, -1
  br i1 %183, label %184, label %285

184:                                              ; preds = %181
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #9
  %185 = load ptr, ptr %5, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.b2World, ptr %185, i32 0, i32 15
  %187 = getelementptr inbounds %struct.b2ShapeArray, ptr %186, i32 0, i32 0
  %188 = load ptr, ptr %187, align 8, !tbaa !46
  %189 = load i32, ptr %15, align 4, !tbaa !33
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds %struct.b2Shape, ptr %188, i64 %190
  store ptr %191, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #9
  %192 = load ptr, ptr %16, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.b2Shape, ptr %192, i32 0, i32 18
  %194 = load i32, ptr %193, align 8, !tbaa !47
  %195 = icmp ne i32 %194, 0
  br i1 %195, label %196, label %200

196:                                              ; preds = %184
  %197 = load ptr, ptr %16, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.b2Shape, ptr %197, i32 0, i32 18
  %199 = load i32, ptr %198, align 8, !tbaa !47
  store i32 %199, ptr %17, align 4, !tbaa !33
  br label %274

200:                                              ; preds = %184
  %201 = load ptr, ptr %13, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.b2Body, ptr %201, i32 0, i32 20
  %203 = load i32, ptr %202, align 8, !tbaa !50
  %204 = icmp eq i32 %203, 2
  br i1 %204, label %205, label %211

205:                                              ; preds = %200
  %206 = load ptr, ptr %13, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.b2Body, ptr %206, i32 0, i32 14
  %208 = load float, ptr %207, align 8, !tbaa !51
  %209 = fcmp oeq float %208, 0.000000e+00
  br i1 %209, label %210, label %211

210:                                              ; preds = %205
  store i32 16711680, ptr %17, align 4, !tbaa !33
  br label %273

211:                                              ; preds = %205, %200
  %212 = load ptr, ptr %13, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.b2Body, ptr %212, i32 0, i32 2
  %214 = load i32, ptr %213, align 8, !tbaa !41
  %215 = icmp eq i32 %214, 1
  br i1 %215, label %216, label %217

216:                                              ; preds = %211
  store i32 7372944, ptr %17, align 4, !tbaa !33
  br label %272

217:                                              ; preds = %211
  %218 = load ptr, ptr %16, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.b2Shape, ptr %218, i32 0, i32 4
  %220 = load i32, ptr %219, align 8, !tbaa !52
  %221 = icmp ne i32 %220, -1
  br i1 %221, label %222, label %223

222:                                              ; preds = %217
  store i32 16113331, ptr %17, align 4, !tbaa !33
  br label %271

223:                                              ; preds = %217
  %224 = load ptr, ptr %12, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.b2BodySim, ptr %224, i32 0, i32 16
  %226 = load i8, ptr %225, align 1, !tbaa !53, !range !26, !noundef !27
  %227 = trunc i8 %226 to i1
  br i1 %227, label %228, label %234

228:                                              ; preds = %223
  %229 = load ptr, ptr %13, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.b2Body, ptr %229, i32 0, i32 2
  %231 = load i32, ptr %230, align 8, !tbaa !41
  %232 = icmp eq i32 %231, 2
  br i1 %232, label %233, label %234

233:                                              ; preds = %228
  store i32 4251856, ptr %17, align 4, !tbaa !33
  br label %270

234:                                              ; preds = %228, %223
  %235 = load ptr, ptr %13, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.b2Body, ptr %235, i32 0, i32 24
  %237 = load i8, ptr %236, align 8, !tbaa !54, !range !26, !noundef !27
  %238 = trunc i8 %237 to i1
  br i1 %238, label %239, label %240

239:                                              ; preds = %234
  store i32 16776960, ptr %17, align 4, !tbaa !33
  br label %269

240:                                              ; preds = %234
  %241 = load ptr, ptr %12, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.b2BodySim, ptr %241, i32 0, i32 15
  %243 = load i8, ptr %242, align 4, !tbaa !55, !range !26, !noundef !27
  %244 = trunc i8 %243 to i1
  br i1 %244, label %245, label %246

245:                                              ; preds = %240
  store i32 16416882, ptr %17, align 4, !tbaa !33
  br label %268

246:                                              ; preds = %240
  %247 = load ptr, ptr %13, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.b2Body, ptr %247, i32 0, i32 20
  %249 = load i32, ptr %248, align 8, !tbaa !50
  %250 = icmp eq i32 %249, 0
  br i1 %250, label %251, label %252

251:                                              ; preds = %246
  store i32 10025880, ptr %17, align 4, !tbaa !33
  br label %267

252:                                              ; preds = %246
  %253 = load ptr, ptr %13, align 8, !tbaa !5
  %254 = getelementptr inbounds %struct.b2Body, ptr %253, i32 0, i32 20
  %255 = load i32, ptr %254, align 8, !tbaa !50
  %256 = icmp eq i32 %255, 1
  br i1 %256, label %257, label %258

257:                                              ; preds = %252
  store i32 4286945, ptr %17, align 4, !tbaa !33
  br label %266

258:                                              ; preds = %252
  %259 = load ptr, ptr %13, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.b2Body, ptr %259, i32 0, i32 2
  %261 = load i32, ptr %260, align 8, !tbaa !41
  %262 = icmp eq i32 %261, 2
  br i1 %262, label %263, label %264

263:                                              ; preds = %258
  store i32 16761035, ptr %17, align 4, !tbaa !33
  br label %265

264:                                              ; preds = %258
  store i32 8421504, ptr %17, align 4, !tbaa !33
  br label %265

265:                                              ; preds = %264, %263
  br label %266

266:                                              ; preds = %265, %257
  br label %267

267:                                              ; preds = %266, %251
  br label %268

268:                                              ; preds = %267, %245
  br label %269

269:                                              ; preds = %268, %239
  br label %270

270:                                              ; preds = %269, %233
  br label %271

271:                                              ; preds = %270, %222
  br label %272

272:                                              ; preds = %271, %216
  br label %273

273:                                              ; preds = %272, %210
  br label %274

274:                                              ; preds = %273, %196
  %275 = load ptr, ptr %4, align 8, !tbaa !5
  %276 = load ptr, ptr %16, align 8, !tbaa !5
  %277 = load i32, ptr %17, align 4, !tbaa !33
  %278 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %14, i32 0, i32 0
  %279 = load <2 x float>, ptr %278, align 4
  %280 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %14, i32 0, i32 1
  %281 = load <2 x float>, ptr %280, align 4
  call void @b2DrawShape(ptr noundef %275, ptr noundef %276, <2 x float> %279, <2 x float> %281, i32 noundef %277)
  %282 = load ptr, ptr %16, align 8, !tbaa !5
  %283 = getelementptr inbounds %struct.b2Shape, ptr %282, i32 0, i32 3
  %284 = load i32, ptr %283, align 4, !tbaa !56
  store i32 %284, ptr %15, align 4, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #9
  br label %181, !llvm.loop !57

285:                                              ; preds = %181
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #9
  br label %286

286:                                              ; preds = %285
  %287 = load i32, ptr %11, align 4, !tbaa !33
  %288 = add nsw i32 %287, 1
  store i32 %288, ptr %11, align 4, !tbaa !33
  br label %144, !llvm.loop !59

289:                                              ; preds = %148
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #9
  br label %290

290:                                              ; preds = %289
  %291 = load i32, ptr %8, align 4, !tbaa !33
  %292 = add nsw i32 %291, 1
  store i32 %292, ptr %8, align 4, !tbaa !33
  br label %130, !llvm.loop !60

293:                                              ; preds = %134
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #9
  br label %294

294:                                              ; preds = %293, %120
  %295 = load ptr, ptr %4, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.b2DebugDraw, ptr %295, i32 0, i32 12
  %297 = load i8, ptr %296, align 2, !tbaa !61, !range !26, !noundef !27
  %298 = trunc i8 %297 to i1
  br i1 %298, label %299, label %333

299:                                              ; preds = %294
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #9
  %300 = load ptr, ptr %5, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.b2World, ptr %300, i32 0, i32 8
  %302 = getelementptr inbounds %struct.b2JointArray, ptr %301, i32 0, i32 1
  %303 = load i32, ptr %302, align 8, !tbaa !62
  store i32 %303, ptr %18, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #9
  store i32 0, ptr %19, align 4, !tbaa !33
  br label %304

304:                                              ; preds = %329, %299
  %305 = load i32, ptr %19, align 4, !tbaa !33
  %306 = load i32, ptr %18, align 4, !tbaa !33
  %307 = icmp slt i32 %305, %306
  br i1 %307, label %309, label %308

308:                                              ; preds = %304
  store i32 14, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #9
  br label %332

309:                                              ; preds = %304
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #9
  %310 = load ptr, ptr %5, align 8, !tbaa !5
  %311 = getelementptr inbounds %struct.b2World, ptr %310, i32 0, i32 8
  %312 = getelementptr inbounds %struct.b2JointArray, ptr %311, i32 0, i32 0
  %313 = load ptr, ptr %312, align 8, !tbaa !63
  %314 = load i32, ptr %19, align 4, !tbaa !33
  %315 = sext i32 %314 to i64
  %316 = getelementptr inbounds %struct.b2Joint, ptr %313, i64 %315
  store ptr %316, ptr %20, align 8, !tbaa !5
  %317 = load ptr, ptr %20, align 8, !tbaa !5
  %318 = getelementptr inbounds %struct.b2Joint, ptr %317, i32 0, i32 1
  %319 = load i32, ptr %318, align 8, !tbaa !64
  %320 = icmp eq i32 %319, -1
  br i1 %320, label %321, label %322

321:                                              ; preds = %309
  store i32 16, ptr %6, align 4
  br label %326

322:                                              ; preds = %309
  %323 = load ptr, ptr %4, align 8, !tbaa !5
  %324 = load ptr, ptr %5, align 8, !tbaa !5
  %325 = load ptr, ptr %20, align 8, !tbaa !5
  call void @b2DrawJoint(ptr noundef %323, ptr noundef %324, ptr noundef %325)
  store i32 0, ptr %6, align 4
  br label %326

326:                                              ; preds = %322, %321
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #9
  %327 = load i32, ptr %6, align 4
  switch i32 %327, label %1047 [
    i32 0, label %328
    i32 16, label %329
  ]

328:                                              ; preds = %326
  br label %329

329:                                              ; preds = %328, %326
  %330 = load i32, ptr %19, align 4, !tbaa !33
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %19, align 4, !tbaa !33
  br label %304, !llvm.loop !66

332:                                              ; preds = %308
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #9
  br label %333

333:                                              ; preds = %332, %294
  %334 = load ptr, ptr %4, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.b2DebugDraw, ptr %334, i32 0, i32 14
  %336 = load i8, ptr %335, align 4, !tbaa !67, !range !26, !noundef !27
  %337 = trunc i8 %336 to i1
  br i1 %337, label %338, label %475

338:                                              ; preds = %333
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #9
  store i32 16766720, ptr %21, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #9
  %339 = load ptr, ptr %5, align 8, !tbaa !5
  %340 = getelementptr inbounds %struct.b2World, ptr %339, i32 0, i32 6
  %341 = getelementptr inbounds %struct.b2SolverSetArray, ptr %340, i32 0, i32 1
  %342 = load i32, ptr %341, align 8, !tbaa !32
  store i32 %342, ptr %22, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #9
  store i32 0, ptr %23, align 4, !tbaa !33
  br label %343

343:                                              ; preds = %471, %338
  %344 = load i32, ptr %23, align 4, !tbaa !33
  %345 = load i32, ptr %22, align 4, !tbaa !33
  %346 = icmp slt i32 %344, %345
  br i1 %346, label %348, label %347

347:                                              ; preds = %343
  store i32 17, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #9
  br label %474

348:                                              ; preds = %343
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #9
  %349 = load ptr, ptr %5, align 8, !tbaa !5
  %350 = getelementptr inbounds %struct.b2World, ptr %349, i32 0, i32 6
  %351 = load i32, ptr %23, align 4, !tbaa !33
  %352 = call ptr @b2SolverSetArray_Get(ptr noundef %350, i32 noundef %351)
  store ptr %352, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #9
  %353 = load ptr, ptr %24, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.b2SolverSet, ptr %353, i32 0, i32 0
  %355 = getelementptr inbounds %struct.b2BodySimArray, ptr %354, i32 0, i32 1
  %356 = load i32, ptr %355, align 8, !tbaa !34
  store i32 %356, ptr %25, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #9
  store i32 0, ptr %26, align 4, !tbaa !33
  br label %357

357:                                              ; preds = %467, %348
  %358 = load i32, ptr %26, align 4, !tbaa !33
  %359 = load i32, ptr %25, align 4, !tbaa !33
  %360 = icmp slt i32 %358, %359
  br i1 %360, label %362, label %361

361:                                              ; preds = %357
  store i32 20, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #9
  br label %470

362:                                              ; preds = %357
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #9
  %363 = load ptr, ptr %24, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.b2SolverSet, ptr %363, i32 0, i32 0
  %365 = getelementptr inbounds %struct.b2BodySimArray, ptr %364, i32 0, i32 0
  %366 = load ptr, ptr %365, align 8, !tbaa !36
  %367 = load i32, ptr %26, align 4, !tbaa !33
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds %struct.b2BodySim, ptr %366, i64 %368
  store ptr %369, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 32, ptr %28) #9
  %370 = getelementptr inbounds [32 x i8], ptr %28, i64 0, i64 0
  %371 = load ptr, ptr %27, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.b2BodySim, ptr %371, i32 0, i32 14
  %373 = load i32, ptr %372, align 4, !tbaa !37
  %374 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %370, i64 noundef 32, ptr noundef @.str.19, i32 noundef %373) #9
  %375 = load ptr, ptr %4, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.b2DebugDraw, ptr %375, i32 0, i32 8
  %377 = load ptr, ptr %376, align 8, !tbaa !68
  %378 = load ptr, ptr %27, align 8, !tbaa !5
  %379 = getelementptr inbounds %struct.b2BodySim, ptr %378, i32 0, i32 1
  %380 = getelementptr inbounds [32 x i8], ptr %28, i64 0, i64 0
  %381 = load ptr, ptr %4, align 8, !tbaa !5
  %382 = getelementptr inbounds %struct.b2DebugDraw, ptr %381, i32 0, i32 24
  %383 = load ptr, ptr %382, align 8, !tbaa !69
  %384 = load <2 x float>, ptr %379, align 4
  call void %377(<2 x float> %384, ptr noundef %380, i32 noundef 16777215, ptr noundef %383)
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #9
  %385 = load ptr, ptr %5, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.b2World, ptr %385, i32 0, i32 4
  %387 = load ptr, ptr %27, align 8, !tbaa !5
  %388 = getelementptr inbounds %struct.b2BodySim, ptr %387, i32 0, i32 14
  %389 = load i32, ptr %388, align 4, !tbaa !37
  %390 = call ptr @b2BodyArray_Get(ptr noundef %386, i32 noundef %389)
  store ptr %390, ptr %29, align 8, !tbaa !5
  br label %391

391:                                              ; preds = %362
  %392 = load ptr, ptr %29, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.b2Body, ptr %392, i32 0, i32 2
  %394 = load i32, ptr %393, align 8, !tbaa !41
  %395 = load i32, ptr %23, align 4, !tbaa !33
  %396 = icmp eq i32 %394, %395
  br i1 %396, label %401, label %397

397:                                              ; preds = %391
  %398 = call i32 @b2InternalAssertFcn(ptr noundef @.str.18, ptr noundef @.str.1, i32 noundef 1289)
  %399 = icmp ne i32 %398, 0
  br i1 %399, label %400, label %401

400:                                              ; preds = %397
  call void @llvm.trap()
  br label %401

401:                                              ; preds = %400, %397, %391
  br label %402

402:                                              ; preds = %401
  br label %403

403:                                              ; preds = %402
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #9
  %404 = load ptr, ptr %29, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.b2Body, ptr %404, i32 0, i32 6
  %406 = load i32, ptr %405, align 8, !tbaa !45
  store i32 %406, ptr %30, align 4, !tbaa !33
  br label %407

407:                                              ; preds = %410, %403
  %408 = load i32, ptr %30, align 4, !tbaa !33
  %409 = icmp ne i32 %408, -1
  br i1 %409, label %410, label %466

410:                                              ; preds = %407
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #9
  %411 = load ptr, ptr %5, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.b2World, ptr %411, i32 0, i32 15
  %413 = getelementptr inbounds %struct.b2ShapeArray, ptr %412, i32 0, i32 0
  %414 = load ptr, ptr %413, align 8, !tbaa !46
  %415 = load i32, ptr %30, align 4, !tbaa !33
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds %struct.b2Shape, ptr %414, i64 %416
  store ptr %417, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #9
  %418 = load ptr, ptr %31, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.b2Shape, ptr %418, i32 0, i32 13
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %32, ptr align 8 %419, i64 16, i1 false), !tbaa.struct !43
  call void @llvm.lifetime.start.p0(i64 32, ptr %33) #9
  %420 = getelementptr inbounds %struct.b2Vec2, ptr %33, i32 0, i32 0
  %421 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 0
  %422 = getelementptr inbounds %struct.b2Vec2, ptr %421, i32 0, i32 0
  %423 = load float, ptr %422, align 4, !tbaa !70
  store float %423, ptr %420, align 8, !tbaa !71
  %424 = getelementptr inbounds %struct.b2Vec2, ptr %33, i32 0, i32 1
  %425 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 0
  %426 = getelementptr inbounds %struct.b2Vec2, ptr %425, i32 0, i32 1
  %427 = load float, ptr %426, align 4, !tbaa !72
  store float %427, ptr %424, align 4, !tbaa !73
  %428 = getelementptr inbounds %struct.b2Vec2, ptr %33, i64 1
  %429 = getelementptr inbounds %struct.b2Vec2, ptr %428, i32 0, i32 0
  %430 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 1
  %431 = getelementptr inbounds %struct.b2Vec2, ptr %430, i32 0, i32 0
  %432 = load float, ptr %431, align 4, !tbaa !74
  store float %432, ptr %429, align 8, !tbaa !71
  %433 = getelementptr inbounds %struct.b2Vec2, ptr %428, i32 0, i32 1
  %434 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 0
  %435 = getelementptr inbounds %struct.b2Vec2, ptr %434, i32 0, i32 1
  %436 = load float, ptr %435, align 4, !tbaa !72
  store float %436, ptr %433, align 4, !tbaa !73
  %437 = getelementptr inbounds %struct.b2Vec2, ptr %33, i64 2
  %438 = getelementptr inbounds %struct.b2Vec2, ptr %437, i32 0, i32 0
  %439 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 1
  %440 = getelementptr inbounds %struct.b2Vec2, ptr %439, i32 0, i32 0
  %441 = load float, ptr %440, align 4, !tbaa !74
  store float %441, ptr %438, align 8, !tbaa !71
  %442 = getelementptr inbounds %struct.b2Vec2, ptr %437, i32 0, i32 1
  %443 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 1
  %444 = getelementptr inbounds %struct.b2Vec2, ptr %443, i32 0, i32 1
  %445 = load float, ptr %444, align 4, !tbaa !75
  store float %445, ptr %442, align 4, !tbaa !73
  %446 = getelementptr inbounds %struct.b2Vec2, ptr %33, i64 3
  %447 = getelementptr inbounds %struct.b2Vec2, ptr %446, i32 0, i32 0
  %448 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 0
  %449 = getelementptr inbounds %struct.b2Vec2, ptr %448, i32 0, i32 0
  %450 = load float, ptr %449, align 4, !tbaa !70
  store float %450, ptr %447, align 8, !tbaa !71
  %451 = getelementptr inbounds %struct.b2Vec2, ptr %446, i32 0, i32 1
  %452 = getelementptr inbounds %struct.b2AABB, ptr %32, i32 0, i32 1
  %453 = getelementptr inbounds %struct.b2Vec2, ptr %452, i32 0, i32 1
  %454 = load float, ptr %453, align 4, !tbaa !75
  store float %454, ptr %451, align 4, !tbaa !73
  %455 = load ptr, ptr %4, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.b2DebugDraw, ptr %455, i32 0, i32 0
  %457 = load ptr, ptr %456, align 8, !tbaa !76
  %458 = getelementptr inbounds [4 x %struct.b2Vec2], ptr %33, i64 0, i64 0
  %459 = load i32, ptr %21, align 4, !tbaa !33
  %460 = load ptr, ptr %4, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.b2DebugDraw, ptr %460, i32 0, i32 24
  %462 = load ptr, ptr %461, align 8, !tbaa !69
  call void %457(ptr noundef %458, i32 noundef 4, i32 noundef %459, ptr noundef %462)
  %463 = load ptr, ptr %31, align 8, !tbaa !5
  %464 = getelementptr inbounds %struct.b2Shape, ptr %463, i32 0, i32 3
  %465 = load i32, ptr %464, align 4, !tbaa !56
  store i32 %465, ptr %30, align 4, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 32, ptr %33) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #9
  br label %407, !llvm.loop !77

466:                                              ; preds = %407
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr %28) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #9
  br label %467

467:                                              ; preds = %466
  %468 = load i32, ptr %26, align 4, !tbaa !33
  %469 = add nsw i32 %468, 1
  store i32 %469, ptr %26, align 4, !tbaa !33
  br label %357, !llvm.loop !78

470:                                              ; preds = %361
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #9
  br label %471

471:                                              ; preds = %470
  %472 = load i32, ptr %23, align 4, !tbaa !33
  %473 = add nsw i32 %472, 1
  store i32 %473, ptr %23, align 4, !tbaa !33
  br label %343, !llvm.loop !79

474:                                              ; preds = %347
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #9
  br label %475

475:                                              ; preds = %474, %333
  %476 = load ptr, ptr %4, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct.b2DebugDraw, ptr %476, i32 0, i32 16
  %478 = load i8, ptr %477, align 2, !tbaa !80, !range !26, !noundef !27
  %479 = trunc i8 %478 to i1
  br i1 %479, label %480, label %545

480:                                              ; preds = %475
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %34, ptr align 4 @__const.b2World_Draw.offset, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #9
  %481 = load ptr, ptr %5, align 8, !tbaa !5
  %482 = getelementptr inbounds %struct.b2World, ptr %481, i32 0, i32 4
  %483 = getelementptr inbounds %struct.b2BodyArray, ptr %482, i32 0, i32 1
  %484 = load i32, ptr %483, align 8, !tbaa !81
  store i32 %484, ptr %35, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #9
  store i32 0, ptr %36, align 4, !tbaa !33
  br label %485

485:                                              ; preds = %541, %480
  %486 = load i32, ptr %36, align 4, !tbaa !33
  %487 = load i32, ptr %35, align 4, !tbaa !33
  %488 = icmp slt i32 %486, %487
  br i1 %488, label %490, label %489

489:                                              ; preds = %485
  store i32 27, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #9
  br label %544

490:                                              ; preds = %485
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #9
  %491 = load ptr, ptr %5, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.b2World, ptr %491, i32 0, i32 4
  %493 = getelementptr inbounds %struct.b2BodyArray, ptr %492, i32 0, i32 0
  %494 = load ptr, ptr %493, align 8, !tbaa !82
  %495 = load i32, ptr %36, align 4, !tbaa !33
  %496 = sext i32 %495 to i64
  %497 = getelementptr inbounds %struct.b2Body, ptr %494, i64 %496
  store ptr %497, ptr %37, align 8, !tbaa !5
  %498 = load ptr, ptr %37, align 8, !tbaa !5
  %499 = getelementptr inbounds %struct.b2Body, ptr %498, i32 0, i32 2
  %500 = load i32, ptr %499, align 8, !tbaa !41
  %501 = icmp eq i32 %500, -1
  br i1 %501, label %502, label %503

502:                                              ; preds = %490
  store i32 29, ptr %6, align 4
  br label %538

503:                                              ; preds = %490
  %504 = load ptr, ptr %37, align 8, !tbaa !5
  %505 = getelementptr inbounds %struct.b2Body, ptr %504, i32 0, i32 0
  %506 = getelementptr inbounds [32 x i8], ptr %505, i64 0, i64 0
  %507 = load i8, ptr %506, align 8, !tbaa !83
  %508 = sext i8 %507 to i32
  %509 = icmp eq i32 %508, 0
  br i1 %509, label %510, label %511

510:                                              ; preds = %503
  store i32 29, ptr %6, align 4
  br label %538

511:                                              ; preds = %503
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #9
  %512 = load ptr, ptr %5, align 8, !tbaa !5
  %513 = load ptr, ptr %37, align 8, !tbaa !5
  %514 = call ptr @b2GetBodySim(ptr noundef %512, ptr noundef %513)
  store ptr %514, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #9
  %515 = getelementptr inbounds %struct.b2Transform, ptr %39, i32 0, i32 0
  %516 = load ptr, ptr %38, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.b2BodySim, ptr %516, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %515, ptr align 4 %517, i64 8, i1 false), !tbaa.struct !84
  %518 = getelementptr inbounds %struct.b2Transform, ptr %39, i32 0, i32 1
  %519 = load ptr, ptr %38, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.b2BodySim, ptr %519, i32 0, i32 0
  %521 = getelementptr inbounds %struct.b2Transform, ptr %520, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %518, ptr align 4 %521, i64 8, i1 false), !tbaa.struct !84
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #9
  %522 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %39, i32 0, i32 0
  %523 = load <2 x float>, ptr %522, align 4
  %524 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %39, i32 0, i32 1
  %525 = load <2 x float>, ptr %524, align 4
  %526 = load <2 x float>, ptr %34, align 4
  %527 = call <2 x float> @b2TransformPoint(<2 x float> %523, <2 x float> %525, <2 x float> %526)
  store <2 x float> %527, ptr %40, align 4
  %528 = load ptr, ptr %4, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.b2DebugDraw, ptr %528, i32 0, i32 8
  %530 = load ptr, ptr %529, align 8, !tbaa !68
  %531 = load ptr, ptr %37, align 8, !tbaa !5
  %532 = getelementptr inbounds %struct.b2Body, ptr %531, i32 0, i32 0
  %533 = getelementptr inbounds [32 x i8], ptr %532, i64 0, i64 0
  %534 = load ptr, ptr %4, align 8, !tbaa !5
  %535 = getelementptr inbounds %struct.b2DebugDraw, ptr %534, i32 0, i32 24
  %536 = load ptr, ptr %535, align 8, !tbaa !69
  %537 = load <2 x float>, ptr %40, align 4
  call void %530(<2 x float> %537, ptr noundef %533, i32 noundef 9055202, ptr noundef %536)
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #9
  store i32 0, ptr %6, align 4
  br label %538

538:                                              ; preds = %511, %510, %502
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #9
  %539 = load i32, ptr %6, align 4
  switch i32 %539, label %1047 [
    i32 0, label %540
    i32 29, label %541
  ]

540:                                              ; preds = %538
  br label %541

541:                                              ; preds = %540, %538
  %542 = load i32, ptr %36, align 4, !tbaa !33
  %543 = add nsw i32 %542, 1
  store i32 %543, ptr %36, align 4, !tbaa !33
  br label %485, !llvm.loop !85

544:                                              ; preds = %489
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #9
  br label %545

545:                                              ; preds = %544, %475
  %546 = load ptr, ptr %4, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.b2DebugDraw, ptr %546, i32 0, i32 15
  %548 = load i8, ptr %547, align 1, !tbaa !86, !range !26, !noundef !27
  %549 = trunc i8 %548 to i1
  br i1 %549, label %550, label %637

550:                                              ; preds = %545
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %41, ptr align 4 @__const.b2World_Draw.offset.20, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #9
  %551 = load ptr, ptr %5, align 8, !tbaa !5
  %552 = getelementptr inbounds %struct.b2World, ptr %551, i32 0, i32 6
  %553 = getelementptr inbounds %struct.b2SolverSetArray, ptr %552, i32 0, i32 1
  %554 = load i32, ptr %553, align 8, !tbaa !32
  store i32 %554, ptr %42, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #9
  store i32 0, ptr %43, align 4, !tbaa !33
  br label %555

555:                                              ; preds = %633, %550
  %556 = load i32, ptr %43, align 4, !tbaa !33
  %557 = load i32, ptr %42, align 4, !tbaa !33
  %558 = icmp slt i32 %556, %557
  br i1 %558, label %560, label %559

559:                                              ; preds = %555
  store i32 30, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #9
  br label %636

560:                                              ; preds = %555
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #9
  %561 = load ptr, ptr %5, align 8, !tbaa !5
  %562 = getelementptr inbounds %struct.b2World, ptr %561, i32 0, i32 6
  %563 = load i32, ptr %43, align 4, !tbaa !33
  %564 = call ptr @b2SolverSetArray_Get(ptr noundef %562, i32 noundef %563)
  store ptr %564, ptr %44, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #9
  %565 = load ptr, ptr %44, align 8, !tbaa !5
  %566 = getelementptr inbounds %struct.b2SolverSet, ptr %565, i32 0, i32 0
  %567 = getelementptr inbounds %struct.b2BodySimArray, ptr %566, i32 0, i32 1
  %568 = load i32, ptr %567, align 8, !tbaa !34
  store i32 %568, ptr %45, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %46) #9
  store i32 0, ptr %46, align 4, !tbaa !33
  br label %569

569:                                              ; preds = %629, %560
  %570 = load i32, ptr %46, align 4, !tbaa !33
  %571 = load i32, ptr %45, align 4, !tbaa !33
  %572 = icmp slt i32 %570, %571
  br i1 %572, label %574, label %573

573:                                              ; preds = %569
  store i32 33, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %46) #9
  br label %632

574:                                              ; preds = %569
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #9
  %575 = load ptr, ptr %44, align 8, !tbaa !5
  %576 = getelementptr inbounds %struct.b2SolverSet, ptr %575, i32 0, i32 0
  %577 = getelementptr inbounds %struct.b2BodySimArray, ptr %576, i32 0, i32 0
  %578 = load ptr, ptr %577, align 8, !tbaa !36
  %579 = load i32, ptr %46, align 4, !tbaa !33
  %580 = sext i32 %579 to i64
  %581 = getelementptr inbounds %struct.b2BodySim, ptr %578, i64 %580
  store ptr %581, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %48) #9
  %582 = getelementptr inbounds %struct.b2Transform, ptr %48, i32 0, i32 0
  %583 = load ptr, ptr %47, align 8, !tbaa !5
  %584 = getelementptr inbounds %struct.b2BodySim, ptr %583, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %582, ptr align 4 %584, i64 8, i1 false), !tbaa.struct !84
  %585 = getelementptr inbounds %struct.b2Transform, ptr %48, i32 0, i32 1
  %586 = load ptr, ptr %47, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.b2BodySim, ptr %586, i32 0, i32 0
  %588 = getelementptr inbounds %struct.b2Transform, ptr %587, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %585, ptr align 4 %588, i64 8, i1 false), !tbaa.struct !84
  %589 = load ptr, ptr %4, align 8, !tbaa !5
  %590 = getelementptr inbounds %struct.b2DebugDraw, ptr %589, i32 0, i32 6
  %591 = load ptr, ptr %590, align 8, !tbaa !87
  %592 = load ptr, ptr %4, align 8, !tbaa !5
  %593 = getelementptr inbounds %struct.b2DebugDraw, ptr %592, i32 0, i32 24
  %594 = load ptr, ptr %593, align 8, !tbaa !69
  %595 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %48, i32 0, i32 0
  %596 = load <2 x float>, ptr %595, align 4
  %597 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %48, i32 0, i32 1
  %598 = load <2 x float>, ptr %597, align 4
  call void %591(<2 x float> %596, <2 x float> %598, ptr noundef %594)
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #9
  %599 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %48, i32 0, i32 0
  %600 = load <2 x float>, ptr %599, align 4
  %601 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %48, i32 0, i32 1
  %602 = load <2 x float>, ptr %601, align 4
  %603 = load <2 x float>, ptr %41, align 4
  %604 = call <2 x float> @b2TransformPoint(<2 x float> %600, <2 x float> %602, <2 x float> %603)
  store <2 x float> %604, ptr %49, align 4
  call void @llvm.lifetime.start.p0(i64 32, ptr %50) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #9
  %605 = load ptr, ptr %47, align 8, !tbaa !5
  %606 = getelementptr inbounds %struct.b2BodySim, ptr %605, i32 0, i32 7
  %607 = load float, ptr %606, align 4, !tbaa !88
  %608 = fcmp ogt float %607, 0.000000e+00
  br i1 %608, label %609, label %614

609:                                              ; preds = %574
  %610 = load ptr, ptr %47, align 8, !tbaa !5
  %611 = getelementptr inbounds %struct.b2BodySim, ptr %610, i32 0, i32 7
  %612 = load float, ptr %611, align 4, !tbaa !88
  %613 = fdiv float 1.000000e+00, %612
  br label %615

614:                                              ; preds = %574
  br label %615

615:                                              ; preds = %614, %609
  %616 = phi float [ %613, %609 ], [ 0.000000e+00, %614 ]
  store float %616, ptr %51, align 4, !tbaa !44
  %617 = getelementptr inbounds [32 x i8], ptr %50, i64 0, i64 0
  %618 = load float, ptr %51, align 4, !tbaa !44
  %619 = fpext float %618 to double
  %620 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %617, i64 noundef 32, ptr noundef @.str.21, double noundef %619) #9
  %621 = load ptr, ptr %4, align 8, !tbaa !5
  %622 = getelementptr inbounds %struct.b2DebugDraw, ptr %621, i32 0, i32 8
  %623 = load ptr, ptr %622, align 8, !tbaa !68
  %624 = getelementptr inbounds [32 x i8], ptr %50, i64 0, i64 0
  %625 = load ptr, ptr %4, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.b2DebugDraw, ptr %625, i32 0, i32 24
  %627 = load ptr, ptr %626, align 8, !tbaa !69
  %628 = load <2 x float>, ptr %49, align 4
  call void %623(<2 x float> %628, ptr noundef %624, i32 noundef 16777215, ptr noundef %627)
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #9
  call void @llvm.lifetime.end.p0(i64 32, ptr %50) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %48) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #9
  br label %629

629:                                              ; preds = %615
  %630 = load i32, ptr %46, align 4, !tbaa !33
  %631 = add nsw i32 %630, 1
  store i32 %631, ptr %46, align 4, !tbaa !33
  br label %569, !llvm.loop !89

632:                                              ; preds = %573
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #9
  br label %633

633:                                              ; preds = %632
  %634 = load i32, ptr %43, align 4, !tbaa !33
  %635 = add nsw i32 %634, 1
  store i32 %635, ptr %43, align 4, !tbaa !33
  br label %555, !llvm.loop !90

636:                                              ; preds = %559
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #9
  br label %637

637:                                              ; preds = %636, %545
  %638 = load ptr, ptr %4, align 8, !tbaa !5
  %639 = getelementptr inbounds %struct.b2DebugDraw, ptr %638, i32 0, i32 17
  %640 = load i8, ptr %639, align 1, !tbaa !91, !range !26, !noundef !27
  %641 = trunc i8 %640 to i1
  br i1 %641, label %642, label %914

642:                                              ; preds = %637
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #9
  store float 1.000000e+00, ptr %52, align 4, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #9
  store float 0x3FD3333340000000, ptr %53, align 4, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #9
  %643 = load float, ptr @b2_lengthUnitsPerMeter, align 4, !tbaa !44
  %644 = fmul float 0x3F747AE140000000, %643
  store float %644, ptr %54, align 4, !tbaa !44
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #9
  store i32 13882323, ptr %55, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #9
  store i32 32768, ptr %56, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #9
  store i32 255, ptr %57, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #9
  store i32 6908265, ptr %58, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #9
  store i32 16711935, ptr %59, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #9
  store i32 16776960, ptr %60, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 48, ptr %61) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %61, ptr align 16 @__const.b2World_Draw.colors, i64 48, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #9
  store i32 0, ptr %62, align 4, !tbaa !33
  br label %645

645:                                              ; preds = %910, %642
  %646 = load i32, ptr %62, align 4, !tbaa !33
  %647 = icmp slt i32 %646, 12
  br i1 %647, label %649, label %648

648:                                              ; preds = %645
  store i32 36, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #9
  br label %913

649:                                              ; preds = %645
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #9
  %650 = load ptr, ptr %5, align 8, !tbaa !5
  %651 = getelementptr inbounds %struct.b2World, ptr %650, i32 0, i32 2
  %652 = getelementptr inbounds %struct.b2ConstraintGraph, ptr %651, i32 0, i32 0
  %653 = getelementptr inbounds [12 x %struct.b2GraphColor], ptr %652, i64 0, i64 0
  %654 = load i32, ptr %62, align 4, !tbaa !33
  %655 = sext i32 %654 to i64
  %656 = getelementptr inbounds %struct.b2GraphColor, ptr %653, i64 %655
  store ptr %656, ptr %63, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #9
  %657 = load ptr, ptr %63, align 8, !tbaa !5
  %658 = getelementptr inbounds %struct.b2GraphColor, ptr %657, i32 0, i32 1
  %659 = getelementptr inbounds %struct.b2ContactSimArray, ptr %658, i32 0, i32 1
  %660 = load i32, ptr %659, align 8, !tbaa !92
  store i32 %660, ptr %64, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %65) #9
  store i32 0, ptr %65, align 4, !tbaa !33
  br label %661

661:                                              ; preds = %906, %649
  %662 = load i32, ptr %65, align 4, !tbaa !33
  %663 = load i32, ptr %64, align 4, !tbaa !33
  %664 = icmp slt i32 %662, %663
  br i1 %664, label %666, label %665

665:                                              ; preds = %661
  store i32 39, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %65) #9
  br label %909

666:                                              ; preds = %661
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #9
  %667 = load ptr, ptr %63, align 8, !tbaa !5
  %668 = getelementptr inbounds %struct.b2GraphColor, ptr %667, i32 0, i32 1
  %669 = getelementptr inbounds %struct.b2ContactSimArray, ptr %668, i32 0, i32 0
  %670 = load ptr, ptr %669, align 8, !tbaa !94
  %671 = load i32, ptr %65, align 4, !tbaa !33
  %672 = sext i32 %671 to i64
  %673 = getelementptr inbounds %struct.b2ContactSim, ptr %670, i64 %672
  store ptr %673, ptr %66, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %67) #9
  %674 = load ptr, ptr %66, align 8, !tbaa !5
  %675 = getelementptr inbounds %struct.b2ContactSim, ptr %674, i32 0, i32 9
  %676 = getelementptr inbounds %struct.b2Manifold, ptr %675, i32 0, i32 3
  %677 = load i32, ptr %676, align 4, !tbaa !95
  store i32 %677, ptr %67, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #9
  %678 = load ptr, ptr %66, align 8, !tbaa !5
  %679 = getelementptr inbounds %struct.b2ContactSim, ptr %678, i32 0, i32 9
  %680 = getelementptr inbounds %struct.b2Manifold, ptr %679, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %68, ptr align 4 %680, i64 8, i1 false), !tbaa.struct !84
  call void @llvm.lifetime.start.p0(i64 32, ptr %69) #9
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #9
  store i32 0, ptr %70, align 4, !tbaa !33
  br label %681

681:                                              ; preds = %902, %666
  %682 = load i32, ptr %70, align 4, !tbaa !33
  %683 = load i32, ptr %67, align 4, !tbaa !33
  %684 = icmp slt i32 %682, %683
  br i1 %684, label %686, label %685

685:                                              ; preds = %681
  store i32 42, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #9
  br label %905

686:                                              ; preds = %681
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #9
  %687 = load ptr, ptr %66, align 8, !tbaa !5
  %688 = getelementptr inbounds %struct.b2ContactSim, ptr %687, i32 0, i32 9
  %689 = getelementptr inbounds %struct.b2Manifold, ptr %688, i32 0, i32 2
  %690 = getelementptr inbounds [2 x %struct.b2ManifoldPoint], ptr %689, i64 0, i64 0
  %691 = load i32, ptr %70, align 4, !tbaa !33
  %692 = sext i32 %691 to i64
  %693 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %690, i64 %692
  store ptr %693, ptr %71, align 8, !tbaa !5
  %694 = load ptr, ptr %4, align 8, !tbaa !5
  %695 = getelementptr inbounds %struct.b2DebugDraw, ptr %694, i32 0, i32 18
  %696 = load i8, ptr %695, align 8, !tbaa !99, !range !26, !noundef !27
  %697 = trunc i8 %696 to i1
  br i1 %697, label %698, label %723

698:                                              ; preds = %686
  %699 = load i32, ptr %62, align 4, !tbaa !33
  %700 = icmp sle i32 0, %699
  br i1 %700, label %701, label %723

701:                                              ; preds = %698
  %702 = load i32, ptr %62, align 4, !tbaa !33
  %703 = icmp sle i32 %702, 12
  br i1 %703, label %704, label %723

704:                                              ; preds = %701
  call void @llvm.lifetime.start.p0(i64 4, ptr %72) #9
  %705 = load i32, ptr %62, align 4, !tbaa !33
  %706 = icmp eq i32 %705, 11
  %707 = zext i1 %706 to i64
  %708 = select i1 %706, float 7.500000e+00, float 5.000000e+00
  store float %708, ptr %72, align 4, !tbaa !44
  %709 = load ptr, ptr %4, align 8, !tbaa !5
  %710 = getelementptr inbounds %struct.b2DebugDraw, ptr %709, i32 0, i32 7
  %711 = load ptr, ptr %710, align 8, !tbaa !100
  %712 = load ptr, ptr %71, align 8, !tbaa !5
  %713 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %712, i32 0, i32 0
  %714 = load float, ptr %72, align 4, !tbaa !44
  %715 = load i32, ptr %62, align 4, !tbaa !33
  %716 = sext i32 %715 to i64
  %717 = getelementptr inbounds [12 x i32], ptr %61, i64 0, i64 %716
  %718 = load i32, ptr %717, align 4, !tbaa !33
  %719 = load ptr, ptr %4, align 8, !tbaa !5
  %720 = getelementptr inbounds %struct.b2DebugDraw, ptr %719, i32 0, i32 24
  %721 = load ptr, ptr %720, align 8, !tbaa !69
  %722 = load <2 x float>, ptr %713, align 4
  call void %711(<2 x float> %722, float noundef %714, i32 noundef %718, ptr noundef %721)
  call void @llvm.lifetime.end.p0(i64 4, ptr %72) #9
  br label %779

723:                                              ; preds = %701, %698, %686
  %724 = load ptr, ptr %71, align 8, !tbaa !5
  %725 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %724, i32 0, i32 3
  %726 = load float, ptr %725, align 4, !tbaa !101
  %727 = load float, ptr %54, align 4, !tbaa !44
  %728 = fcmp ogt float %726, %727
  br i1 %728, label %729, label %740

729:                                              ; preds = %723
  %730 = load ptr, ptr %4, align 8, !tbaa !5
  %731 = getelementptr inbounds %struct.b2DebugDraw, ptr %730, i32 0, i32 7
  %732 = load ptr, ptr %731, align 8, !tbaa !100
  %733 = load ptr, ptr %71, align 8, !tbaa !5
  %734 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %733, i32 0, i32 0
  %735 = load i32, ptr %55, align 4, !tbaa !33
  %736 = load ptr, ptr %4, align 8, !tbaa !5
  %737 = getelementptr inbounds %struct.b2DebugDraw, ptr %736, i32 0, i32 24
  %738 = load ptr, ptr %737, align 8, !tbaa !69
  %739 = load <2 x float>, ptr %734, align 4
  call void %732(<2 x float> %739, float noundef 5.000000e+00, i32 noundef %735, ptr noundef %738)
  br label %778

740:                                              ; preds = %723
  %741 = load ptr, ptr %71, align 8, !tbaa !5
  %742 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %741, i32 0, i32 9
  %743 = load i8, ptr %742, align 2, !tbaa !103, !range !26, !noundef !27
  %744 = trunc i8 %743 to i1
  %745 = zext i1 %744 to i32
  %746 = icmp eq i32 %745, 0
  br i1 %746, label %747, label %758

747:                                              ; preds = %740
  %748 = load ptr, ptr %4, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.b2DebugDraw, ptr %748, i32 0, i32 7
  %750 = load ptr, ptr %749, align 8, !tbaa !100
  %751 = load ptr, ptr %71, align 8, !tbaa !5
  %752 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %751, i32 0, i32 0
  %753 = load i32, ptr %56, align 4, !tbaa !33
  %754 = load ptr, ptr %4, align 8, !tbaa !5
  %755 = getelementptr inbounds %struct.b2DebugDraw, ptr %754, i32 0, i32 24
  %756 = load ptr, ptr %755, align 8, !tbaa !69
  %757 = load <2 x float>, ptr %752, align 4
  call void %750(<2 x float> %757, float noundef 1.000000e+01, i32 noundef %753, ptr noundef %756)
  br label %777

758:                                              ; preds = %740
  %759 = load ptr, ptr %71, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %759, i32 0, i32 9
  %761 = load i8, ptr %760, align 2, !tbaa !103, !range !26, !noundef !27
  %762 = trunc i8 %761 to i1
  %763 = zext i1 %762 to i32
  %764 = icmp eq i32 %763, 1
  br i1 %764, label %765, label %776

765:                                              ; preds = %758
  %766 = load ptr, ptr %4, align 8, !tbaa !5
  %767 = getelementptr inbounds %struct.b2DebugDraw, ptr %766, i32 0, i32 7
  %768 = load ptr, ptr %767, align 8, !tbaa !100
  %769 = load ptr, ptr %71, align 8, !tbaa !5
  %770 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %769, i32 0, i32 0
  %771 = load i32, ptr %57, align 4, !tbaa !33
  %772 = load ptr, ptr %4, align 8, !tbaa !5
  %773 = getelementptr inbounds %struct.b2DebugDraw, ptr %772, i32 0, i32 24
  %774 = load ptr, ptr %773, align 8, !tbaa !69
  %775 = load <2 x float>, ptr %770, align 4
  call void %768(<2 x float> %775, float noundef 5.000000e+00, i32 noundef %771, ptr noundef %774)
  br label %776

776:                                              ; preds = %765, %758
  br label %777

777:                                              ; preds = %776, %747
  br label %778

778:                                              ; preds = %777, %729
  br label %779

779:                                              ; preds = %778, %704
  %780 = load ptr, ptr %4, align 8, !tbaa !5
  %781 = getelementptr inbounds %struct.b2DebugDraw, ptr %780, i32 0, i32 19
  %782 = load i8, ptr %781, align 1, !tbaa !104, !range !26, !noundef !27
  %783 = trunc i8 %782 to i1
  br i1 %783, label %784, label %799

784:                                              ; preds = %779
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #9
  %785 = load ptr, ptr %71, align 8, !tbaa !5
  %786 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %785, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %73, ptr align 4 %786, i64 8, i1 false), !tbaa.struct !84
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #9
  %787 = load <2 x float>, ptr %73, align 4
  %788 = load <2 x float>, ptr %68, align 4
  %789 = call <2 x float> @b2MulAdd(<2 x float> %787, float noundef 0x3FD3333340000000, <2 x float> %788)
  store <2 x float> %789, ptr %74, align 4
  %790 = load ptr, ptr %4, align 8, !tbaa !5
  %791 = getelementptr inbounds %struct.b2DebugDraw, ptr %790, i32 0, i32 5
  %792 = load ptr, ptr %791, align 8, !tbaa !105
  %793 = load i32, ptr %58, align 4, !tbaa !33
  %794 = load ptr, ptr %4, align 8, !tbaa !5
  %795 = getelementptr inbounds %struct.b2DebugDraw, ptr %794, i32 0, i32 24
  %796 = load ptr, ptr %795, align 8, !tbaa !69
  %797 = load <2 x float>, ptr %73, align 4
  %798 = load <2 x float>, ptr %74, align 4
  call void %792(<2 x float> %797, <2 x float> %798, i32 noundef %793, ptr noundef %796)
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #9
  br label %839

799:                                              ; preds = %779
  %800 = load ptr, ptr %4, align 8, !tbaa !5
  %801 = getelementptr inbounds %struct.b2DebugDraw, ptr %800, i32 0, i32 20
  %802 = load i8, ptr %801, align 2, !tbaa !106, !range !26, !noundef !27
  %803 = trunc i8 %802 to i1
  br i1 %803, label %804, label %838

804:                                              ; preds = %799
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #9
  %805 = load ptr, ptr %71, align 8, !tbaa !5
  %806 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %805, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %75, ptr align 4 %806, i64 8, i1 false), !tbaa.struct !84
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #9
  %807 = load ptr, ptr %71, align 8, !tbaa !5
  %808 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %807, i32 0, i32 4
  %809 = load float, ptr %808, align 4, !tbaa !107
  %810 = fmul float 1.000000e+00, %809
  %811 = load <2 x float>, ptr %75, align 4
  %812 = load <2 x float>, ptr %68, align 4
  %813 = call <2 x float> @b2MulAdd(<2 x float> %811, float noundef %810, <2 x float> %812)
  store <2 x float> %813, ptr %76, align 4
  %814 = load ptr, ptr %4, align 8, !tbaa !5
  %815 = getelementptr inbounds %struct.b2DebugDraw, ptr %814, i32 0, i32 5
  %816 = load ptr, ptr %815, align 8, !tbaa !105
  %817 = load i32, ptr %59, align 4, !tbaa !33
  %818 = load ptr, ptr %4, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.b2DebugDraw, ptr %818, i32 0, i32 24
  %820 = load ptr, ptr %819, align 8, !tbaa !69
  %821 = load <2 x float>, ptr %75, align 4
  %822 = load <2 x float>, ptr %76, align 4
  call void %816(<2 x float> %821, <2 x float> %822, i32 noundef %817, ptr noundef %820)
  %823 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %824 = load ptr, ptr %71, align 8, !tbaa !5
  %825 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %824, i32 0, i32 4
  %826 = load float, ptr %825, align 4, !tbaa !107
  %827 = fmul float 1.000000e+03, %826
  %828 = fpext float %827 to double
  %829 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %823, i64 noundef 32, ptr noundef @.str.22, double noundef %828) #9
  %830 = load ptr, ptr %4, align 8, !tbaa !5
  %831 = getelementptr inbounds %struct.b2DebugDraw, ptr %830, i32 0, i32 8
  %832 = load ptr, ptr %831, align 8, !tbaa !68
  %833 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %834 = load ptr, ptr %4, align 8, !tbaa !5
  %835 = getelementptr inbounds %struct.b2DebugDraw, ptr %834, i32 0, i32 24
  %836 = load ptr, ptr %835, align 8, !tbaa !69
  %837 = load <2 x float>, ptr %75, align 4
  call void %832(<2 x float> %837, ptr noundef %833, i32 noundef 16777215, ptr noundef %836)
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #9
  br label %838

838:                                              ; preds = %804, %799
  br label %839

839:                                              ; preds = %838, %784
  %840 = load ptr, ptr %4, align 8, !tbaa !5
  %841 = getelementptr inbounds %struct.b2DebugDraw, ptr %840, i32 0, i32 21
  %842 = load i8, ptr %841, align 1, !tbaa !108, !range !26, !noundef !27
  %843 = trunc i8 %842 to i1
  br i1 %843, label %844, label %861

844:                                              ; preds = %839
  %845 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %846 = load ptr, ptr %71, align 8, !tbaa !5
  %847 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %846, i32 0, i32 8
  %848 = load i16, ptr %847, align 4, !tbaa !109
  %849 = zext i16 %848 to i32
  %850 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %845, i64 noundef 32, ptr noundef @.str.19, i32 noundef %849) #9
  %851 = load ptr, ptr %4, align 8, !tbaa !5
  %852 = getelementptr inbounds %struct.b2DebugDraw, ptr %851, i32 0, i32 8
  %853 = load ptr, ptr %852, align 8, !tbaa !68
  %854 = load ptr, ptr %71, align 8, !tbaa !5
  %855 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %854, i32 0, i32 0
  %856 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %857 = load ptr, ptr %4, align 8, !tbaa !5
  %858 = getelementptr inbounds %struct.b2DebugDraw, ptr %857, i32 0, i32 24
  %859 = load ptr, ptr %858, align 8, !tbaa !69
  %860 = load <2 x float>, ptr %855, align 4
  call void %853(<2 x float> %860, ptr noundef %856, i32 noundef 16753920, ptr noundef %859)
  br label %861

861:                                              ; preds = %844, %839
  %862 = load ptr, ptr %4, align 8, !tbaa !5
  %863 = getelementptr inbounds %struct.b2DebugDraw, ptr %862, i32 0, i32 22
  %864 = load i8, ptr %863, align 4, !tbaa !110, !range !26, !noundef !27
  %865 = trunc i8 %864 to i1
  br i1 %865, label %866, label %901

866:                                              ; preds = %861
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #9
  %867 = load <2 x float>, ptr %68, align 4
  %868 = call <2 x float> @b2RightPerp(<2 x float> %867)
  store <2 x float> %868, ptr %77, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #9
  %869 = load ptr, ptr %71, align 8, !tbaa !5
  %870 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %869, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %78, ptr align 4 %870, i64 8, i1 false), !tbaa.struct !84
  call void @llvm.lifetime.start.p0(i64 8, ptr %79) #9
  %871 = load ptr, ptr %71, align 8, !tbaa !5
  %872 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %871, i32 0, i32 5
  %873 = load float, ptr %872, align 4, !tbaa !111
  %874 = fmul float 1.000000e+00, %873
  %875 = load <2 x float>, ptr %78, align 4
  %876 = load <2 x float>, ptr %77, align 4
  %877 = call <2 x float> @b2MulAdd(<2 x float> %875, float noundef %874, <2 x float> %876)
  store <2 x float> %877, ptr %79, align 4
  %878 = load ptr, ptr %4, align 8, !tbaa !5
  %879 = getelementptr inbounds %struct.b2DebugDraw, ptr %878, i32 0, i32 5
  %880 = load ptr, ptr %879, align 8, !tbaa !105
  %881 = load i32, ptr %60, align 4, !tbaa !33
  %882 = load ptr, ptr %4, align 8, !tbaa !5
  %883 = getelementptr inbounds %struct.b2DebugDraw, ptr %882, i32 0, i32 24
  %884 = load ptr, ptr %883, align 8, !tbaa !69
  %885 = load <2 x float>, ptr %78, align 4
  %886 = load <2 x float>, ptr %79, align 4
  call void %880(<2 x float> %885, <2 x float> %886, i32 noundef %881, ptr noundef %884)
  %887 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %888 = load ptr, ptr %71, align 8, !tbaa !5
  %889 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %888, i32 0, i32 5
  %890 = load float, ptr %889, align 4, !tbaa !111
  %891 = fpext float %890 to double
  %892 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef %887, i64 noundef 32, ptr noundef @.str.22, double noundef %891) #9
  %893 = load ptr, ptr %4, align 8, !tbaa !5
  %894 = getelementptr inbounds %struct.b2DebugDraw, ptr %893, i32 0, i32 8
  %895 = load ptr, ptr %894, align 8, !tbaa !68
  %896 = getelementptr inbounds [32 x i8], ptr %69, i64 0, i64 0
  %897 = load ptr, ptr %4, align 8, !tbaa !5
  %898 = getelementptr inbounds %struct.b2DebugDraw, ptr %897, i32 0, i32 24
  %899 = load ptr, ptr %898, align 8, !tbaa !69
  %900 = load <2 x float>, ptr %78, align 4
  call void %895(<2 x float> %900, ptr noundef %896, i32 noundef 16777215, ptr noundef %899)
  call void @llvm.lifetime.end.p0(i64 8, ptr %79) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #9
  br label %901

901:                                              ; preds = %866, %861
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #9
  br label %902

902:                                              ; preds = %901
  %903 = load i32, ptr %70, align 4, !tbaa !33
  %904 = add nsw i32 %903, 1
  store i32 %904, ptr %70, align 4, !tbaa !33
  br label %681, !llvm.loop !112

905:                                              ; preds = %685
  call void @llvm.lifetime.end.p0(i64 32, ptr %69) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %67) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #9
  br label %906

906:                                              ; preds = %905
  %907 = load i32, ptr %65, align 4, !tbaa !33
  %908 = add nsw i32 %907, 1
  store i32 %908, ptr %65, align 4, !tbaa !33
  br label %661, !llvm.loop !113

909:                                              ; preds = %665
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #9
  br label %910

910:                                              ; preds = %909
  %911 = load i32, ptr %62, align 4, !tbaa !33
  %912 = add nsw i32 %911, 1
  store i32 %912, ptr %62, align 4, !tbaa !33
  br label %645, !llvm.loop !114

913:                                              ; preds = %648
  call void @llvm.lifetime.end.p0(i64 48, ptr %61) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #9
  br label %914

914:                                              ; preds = %913, %637
  %915 = load ptr, ptr %4, align 8, !tbaa !5
  %916 = getelementptr inbounds %struct.b2DebugDraw, ptr %915, i32 0, i32 23
  %917 = load i8, ptr %916, align 1, !tbaa !115, !range !26, !noundef !27
  %918 = trunc i8 %917 to i1
  br i1 %918, label %919, label %1043

919:                                              ; preds = %914
  call void @llvm.lifetime.start.p0(i64 4, ptr %80) #9
  %920 = load ptr, ptr %5, align 8, !tbaa !5
  %921 = getelementptr inbounds %struct.b2World, ptr %920, i32 0, i32 12
  %922 = getelementptr inbounds %struct.b2IslandArray, ptr %921, i32 0, i32 1
  %923 = load i32, ptr %922, align 8, !tbaa !116
  store i32 %923, ptr %80, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %81) #9
  store i32 0, ptr %81, align 4, !tbaa !33
  br label %924

924:                                              ; preds = %1039, %919
  %925 = load i32, ptr %81, align 4, !tbaa !33
  %926 = load i32, ptr %80, align 4, !tbaa !33
  %927 = icmp slt i32 %925, %926
  br i1 %927, label %929, label %928

928:                                              ; preds = %924
  store i32 45, ptr %6, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %81) #9
  br label %1042

929:                                              ; preds = %924
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #9
  %930 = load ptr, ptr %5, align 8, !tbaa !5
  %931 = getelementptr inbounds %struct.b2World, ptr %930, i32 0, i32 12
  %932 = getelementptr inbounds %struct.b2IslandArray, ptr %931, i32 0, i32 0
  %933 = load ptr, ptr %932, align 8, !tbaa !117
  %934 = load i32, ptr %81, align 4, !tbaa !33
  %935 = sext i32 %934 to i64
  %936 = getelementptr inbounds %struct.b2Island, ptr %933, i64 %935
  store ptr %936, ptr %82, align 8, !tbaa !5
  %937 = load ptr, ptr %82, align 8, !tbaa !5
  %938 = getelementptr inbounds %struct.b2Island, ptr %937, i32 0, i32 0
  %939 = load i32, ptr %938, align 4, !tbaa !118
  %940 = icmp eq i32 %939, -1
  br i1 %940, label %941, label %942

941:                                              ; preds = %929
  store i32 47, ptr %6, align 4
  br label %1036

942:                                              ; preds = %929
  call void @llvm.lifetime.start.p0(i64 4, ptr %83) #9
  store i32 0, ptr %83, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 16, ptr %84) #9
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %84, ptr align 4 @__const.b2World_Draw.aabb, i64 16, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %85) #9
  %943 = load ptr, ptr %82, align 8, !tbaa !5
  %944 = getelementptr inbounds %struct.b2Island, ptr %943, i32 0, i32 3
  %945 = load i32, ptr %944, align 4, !tbaa !120
  store i32 %945, ptr %85, align 4, !tbaa !33
  br label %946

946:                                              ; preds = %985, %942
  %947 = load i32, ptr %85, align 4, !tbaa !33
  %948 = icmp ne i32 %947, -1
  br i1 %948, label %949, label %989

949:                                              ; preds = %946
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #9
  %950 = load ptr, ptr %5, align 8, !tbaa !5
  %951 = getelementptr inbounds %struct.b2World, ptr %950, i32 0, i32 4
  %952 = load i32, ptr %85, align 4, !tbaa !33
  %953 = call ptr @b2BodyArray_Get(ptr noundef %951, i32 noundef %952)
  store ptr %953, ptr %86, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %87) #9
  %954 = load ptr, ptr %86, align 8, !tbaa !5
  %955 = getelementptr inbounds %struct.b2Body, ptr %954, i32 0, i32 6
  %956 = load i32, ptr %955, align 8, !tbaa !45
  store i32 %956, ptr %87, align 4, !tbaa !33
  br label %957

957:                                              ; preds = %960, %949
  %958 = load i32, ptr %87, align 4, !tbaa !33
  %959 = icmp ne i32 %958, -1
  br i1 %959, label %960, label %985

960:                                              ; preds = %957
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #9
  %961 = load ptr, ptr %5, align 8, !tbaa !5
  %962 = getelementptr inbounds %struct.b2World, ptr %961, i32 0, i32 15
  %963 = load i32, ptr %87, align 4, !tbaa !33
  %964 = call ptr @b2ShapeArray_Get(ptr noundef %962, i32 noundef %963)
  store ptr %964, ptr %88, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %89) #9
  %965 = load ptr, ptr %88, align 8, !tbaa !5
  %966 = getelementptr inbounds %struct.b2Shape, ptr %965, i32 0, i32 13
  %967 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %84, i32 0, i32 0
  %968 = load <2 x float>, ptr %967, align 4
  %969 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %84, i32 0, i32 1
  %970 = load <2 x float>, ptr %969, align 4
  %971 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %966, i32 0, i32 0
  %972 = load <2 x float>, ptr %971, align 8
  %973 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %966, i32 0, i32 1
  %974 = load <2 x float>, ptr %973, align 8
  %975 = call { <2 x float>, <2 x float> } @b2AABB_Union(<2 x float> %968, <2 x float> %970, <2 x float> %972, <2 x float> %974)
  %976 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %89, i32 0, i32 0
  %977 = extractvalue { <2 x float>, <2 x float> } %975, 0
  store <2 x float> %977, ptr %976, align 4
  %978 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %89, i32 0, i32 1
  %979 = extractvalue { <2 x float>, <2 x float> } %975, 1
  store <2 x float> %979, ptr %978, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %84, ptr align 4 %89, i64 16, i1 false), !tbaa.struct !43
  call void @llvm.lifetime.end.p0(i64 16, ptr %89) #9
  %980 = load i32, ptr %83, align 4, !tbaa !33
  %981 = add nsw i32 %980, 1
  store i32 %981, ptr %83, align 4, !tbaa !33
  %982 = load ptr, ptr %88, align 8, !tbaa !5
  %983 = getelementptr inbounds %struct.b2Shape, ptr %982, i32 0, i32 3
  %984 = load i32, ptr %983, align 4, !tbaa !56
  store i32 %984, ptr %87, align 4, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #9
  br label %957, !llvm.loop !121

985:                                              ; preds = %957
  %986 = load ptr, ptr %86, align 8, !tbaa !5
  %987 = getelementptr inbounds %struct.b2Body, ptr %986, i32 0, i32 13
  %988 = load i32, ptr %987, align 4, !tbaa !122
  store i32 %988, ptr %85, align 4, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 4, ptr %87) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #9
  br label %946, !llvm.loop !123

989:                                              ; preds = %946
  %990 = load i32, ptr %83, align 4, !tbaa !33
  %991 = icmp sgt i32 %990, 0
  br i1 %991, label %992, label %1035

992:                                              ; preds = %989
  call void @llvm.lifetime.start.p0(i64 32, ptr %90) #9
  %993 = getelementptr inbounds %struct.b2Vec2, ptr %90, i32 0, i32 0
  %994 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 0
  %995 = getelementptr inbounds %struct.b2Vec2, ptr %994, i32 0, i32 0
  %996 = load float, ptr %995, align 4, !tbaa !70
  store float %996, ptr %993, align 8, !tbaa !71
  %997 = getelementptr inbounds %struct.b2Vec2, ptr %90, i32 0, i32 1
  %998 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 0
  %999 = getelementptr inbounds %struct.b2Vec2, ptr %998, i32 0, i32 1
  %1000 = load float, ptr %999, align 4, !tbaa !72
  store float %1000, ptr %997, align 4, !tbaa !73
  %1001 = getelementptr inbounds %struct.b2Vec2, ptr %90, i64 1
  %1002 = getelementptr inbounds %struct.b2Vec2, ptr %1001, i32 0, i32 0
  %1003 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 1
  %1004 = getelementptr inbounds %struct.b2Vec2, ptr %1003, i32 0, i32 0
  %1005 = load float, ptr %1004, align 4, !tbaa !74
  store float %1005, ptr %1002, align 8, !tbaa !71
  %1006 = getelementptr inbounds %struct.b2Vec2, ptr %1001, i32 0, i32 1
  %1007 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 0
  %1008 = getelementptr inbounds %struct.b2Vec2, ptr %1007, i32 0, i32 1
  %1009 = load float, ptr %1008, align 4, !tbaa !72
  store float %1009, ptr %1006, align 4, !tbaa !73
  %1010 = getelementptr inbounds %struct.b2Vec2, ptr %90, i64 2
  %1011 = getelementptr inbounds %struct.b2Vec2, ptr %1010, i32 0, i32 0
  %1012 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 1
  %1013 = getelementptr inbounds %struct.b2Vec2, ptr %1012, i32 0, i32 0
  %1014 = load float, ptr %1013, align 4, !tbaa !74
  store float %1014, ptr %1011, align 8, !tbaa !71
  %1015 = getelementptr inbounds %struct.b2Vec2, ptr %1010, i32 0, i32 1
  %1016 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 1
  %1017 = getelementptr inbounds %struct.b2Vec2, ptr %1016, i32 0, i32 1
  %1018 = load float, ptr %1017, align 4, !tbaa !75
  store float %1018, ptr %1015, align 4, !tbaa !73
  %1019 = getelementptr inbounds %struct.b2Vec2, ptr %90, i64 3
  %1020 = getelementptr inbounds %struct.b2Vec2, ptr %1019, i32 0, i32 0
  %1021 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 0
  %1022 = getelementptr inbounds %struct.b2Vec2, ptr %1021, i32 0, i32 0
  %1023 = load float, ptr %1022, align 4, !tbaa !70
  store float %1023, ptr %1020, align 8, !tbaa !71
  %1024 = getelementptr inbounds %struct.b2Vec2, ptr %1019, i32 0, i32 1
  %1025 = getelementptr inbounds %struct.b2AABB, ptr %84, i32 0, i32 1
  %1026 = getelementptr inbounds %struct.b2Vec2, ptr %1025, i32 0, i32 1
  %1027 = load float, ptr %1026, align 4, !tbaa !75
  store float %1027, ptr %1024, align 4, !tbaa !73
  %1028 = load ptr, ptr %4, align 8, !tbaa !5
  %1029 = getelementptr inbounds %struct.b2DebugDraw, ptr %1028, i32 0, i32 0
  %1030 = load ptr, ptr %1029, align 8, !tbaa !76
  %1031 = getelementptr inbounds [4 x %struct.b2Vec2], ptr %90, i64 0, i64 0
  %1032 = load ptr, ptr %4, align 8, !tbaa !5
  %1033 = getelementptr inbounds %struct.b2DebugDraw, ptr %1032, i32 0, i32 24
  %1034 = load ptr, ptr %1033, align 8, !tbaa !69
  call void %1030(ptr noundef %1031, i32 noundef 4, i32 noundef 16729344, ptr noundef %1034)
  call void @llvm.lifetime.end.p0(i64 32, ptr %90) #9
  br label %1035

1035:                                             ; preds = %992, %989
  call void @llvm.lifetime.end.p0(i64 4, ptr %85) #9
  call void @llvm.lifetime.end.p0(i64 16, ptr %84) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr %83) #9
  store i32 0, ptr %6, align 4
  br label %1036

1036:                                             ; preds = %1035, %941
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #9
  %1037 = load i32, ptr %6, align 4
  switch i32 %1037, label %1047 [
    i32 0, label %1038
    i32 47, label %1039
  ]

1038:                                             ; preds = %1036
  br label %1039

1039:                                             ; preds = %1038, %1036
  %1040 = load i32, ptr %81, align 4, !tbaa !33
  %1041 = add nsw i32 %1040, 1
  store i32 %1041, ptr %81, align 4, !tbaa !33
  br label %924, !llvm.loop !124

1042:                                             ; preds = %928
  call void @llvm.lifetime.end.p0(i64 4, ptr %80) #9
  br label %1043

1043:                                             ; preds = %1042, %914
  store i32 0, ptr %6, align 4
  br label %1044

1044:                                             ; preds = %1043, %117, %111
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #9
  %1045 = load i32, ptr %6, align 4
  switch i32 %1045, label %1047 [
    i32 0, label %1046
    i32 1, label %1046
  ]

1046:                                             ; preds = %1044, %1044
  ret void

1047:                                             ; preds = %1044, %1036, %538, %326
  unreachable
}

; Function Attrs: nounwind uwtable
declare hidden void @b2DrawWithBounds(ptr noundef, ptr noundef) #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2SolverSetArray_Get(ptr noundef, i32 noundef) #6

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2BodyArray_Get(ptr noundef, i32 noundef) #6

; Function Attrs: nounwind uwtable
declare hidden void @b2DrawShape(ptr noundef, ptr noundef, <2 x float>, <2 x float>, i32 noundef) #5

declare void @b2DrawJoint(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind
declare i32 @snprintf(ptr noundef, i64 noundef, ptr noundef, ...) #7

declare ptr @b2GetBodySim(ptr noundef, ptr noundef) #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2TransformPoint(<2 x float>, <2 x float>, <2 x float>) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2MulAdd(<2 x float>, float noundef, <2 x float>) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2RightPerp(<2 x float>) #8

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2ShapeArray_Get(ptr noundef, i32 noundef) #6

; Function Attrs: inlinehint nounwind uwtable
declare hidden { <2 x float>, <2 x float> } @b2AABB_Union(<2 x float>, <2 x float>, <2 x float>, <2 x float>) #8

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !25, i64 1799}
!10 = !{!"b2World", !11, i64 0, !14, i64 40, !17, i64 336, !18, i64 1008, !13, i64 1032, !18, i64 1048, !13, i64 1072, !18, i64 1088, !13, i64 1112, !18, i64 1128, !13, i64 1152, !18, i64 1168, !13, i64 1192, !18, i64 1208, !18, i64 1232, !13, i64 1256, !13, i64 1272, !13, i64 1288, !13, i64 1304, !13, i64 1320, !13, i64 1336, !13, i64 1352, !13, i64 1368, !7, i64 1384, !7, i64 1416, !12, i64 1448, !13, i64 1456, !19, i64 1472, !19, i64 1488, !19, i64 1504, !19, i64 1520, !20, i64 1536, !12, i64 1544, !21, i64 1548, !22, i64 1556, !22, i64 1560, !22, i64 1564, !22, i64 1568, !22, i64 1572, !22, i64 1576, !22, i64 1580, !22, i64 1584, !6, i64 1592, !6, i64 1600, !23, i64 1608, !24, i64 1612, !6, i64 1704, !6, i64 1712, !6, i64 1720, !6, i64 1728, !12, i64 1736, !6, i64 1744, !6, i64 1752, !6, i64 1760, !6, i64 1768, !6, i64 1776, !22, i64 1784, !12, i64 1788, !12, i64 1792, !23, i64 1796, !25, i64 1798, !25, i64 1799, !25, i64 1800, !25, i64 1801, !25, i64 1802, !25, i64 1803}
!11 = !{!"b2ArenaAllocator", !6, i64 0, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !13, i64 24}
!12 = !{!"int", !7, i64 0}
!13 = !{!"", !6, i64 0, !12, i64 8, !12, i64 12}
!14 = !{!"b2BroadPhase", !7, i64 0, !12, i64 216, !15, i64 224, !13, i64 240, !6, i64 256, !6, i64 264, !12, i64 272, !16, i64 276, !15, i64 280}
!15 = !{!"b2HashSet", !6, i64 0, !12, i64 8, !12, i64 12}
!16 = !{!"b2AtomicInt", !12, i64 0}
!17 = !{!"b2ConstraintGraph", !7, i64 0}
!18 = !{!"b2IdPool", !13, i64 0, !12, i64 16}
!19 = !{!"b2BitSet", !6, i64 0, !12, i64 8, !12, i64 12}
!20 = !{!"long", !7, i64 0}
!21 = !{!"b2Vec2", !22, i64 0, !22, i64 4}
!22 = !{!"float", !7, i64 0}
!23 = !{!"short", !7, i64 0}
!24 = !{!"b2Profile", !22, i64 0, !22, i64 4, !22, i64 8, !22, i64 12, !22, i64 16, !22, i64 20, !22, i64 24, !22, i64 28, !22, i64 32, !22, i64 36, !22, i64 40, !22, i64 44, !22, i64 48, !22, i64 52, !22, i64 56, !22, i64 60, !22, i64 64, !22, i64 68, !22, i64 72, !22, i64 76, !22, i64 80, !22, i64 84}
!25 = !{!"_Bool", !7, i64 0}
!26 = !{i8 0, i8 2}
!27 = !{}
!28 = !{!29, !25, i64 88}
!29 = !{!"b2DebugDraw", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !30, i64 72, !25, i64 88, !25, i64 89, !25, i64 90, !25, i64 91, !25, i64 92, !25, i64 93, !25, i64 94, !25, i64 95, !25, i64 96, !25, i64 97, !25, i64 98, !25, i64 99, !25, i64 100, !25, i64 101, !6, i64 104}
!30 = !{!"b2AABB", !21, i64 0, !21, i64 8}
!31 = !{!29, !25, i64 89}
!32 = !{!10, !12, i64 1080}
!33 = !{!12, !12, i64 0}
!34 = !{!35, !12, i64 8}
!35 = !{!"b2SolverSet", !13, i64 0, !13, i64 16, !13, i64 32, !13, i64 48, !13, i64 64, !12, i64 80}
!36 = !{!35, !6, i64 0}
!37 = !{!38, !12, i64 88}
!38 = !{!"b2BodySim", !39, i64 0, !21, i64 16, !40, i64 24, !21, i64 32, !21, i64 40, !21, i64 48, !22, i64 56, !22, i64 60, !22, i64 64, !22, i64 68, !22, i64 72, !22, i64 76, !22, i64 80, !22, i64 84, !12, i64 88, !25, i64 92, !25, i64 93, !25, i64 94, !25, i64 95, !25, i64 96}
!39 = !{!"b2Transform", !21, i64 0, !40, i64 8}
!40 = !{!"b2Rot", !22, i64 0, !22, i64 4}
!41 = !{!42, !12, i64 40}
!42 = !{!"b2Body", !7, i64 0, !6, i64 32, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60, !12, i64 64, !12, i64 68, !12, i64 72, !12, i64 76, !12, i64 80, !12, i64 84, !22, i64 88, !22, i64 92, !22, i64 96, !22, i64 100, !12, i64 104, !12, i64 108, !12, i64 112, !23, i64 116, !25, i64 118, !25, i64 119, !25, i64 120, !25, i64 121}
!43 = !{i64 0, i64 4, !44, i64 4, i64 4, !44, i64 8, i64 4, !44, i64 12, i64 4, !44}
!44 = !{!22, !22, i64 0}
!45 = !{!42, !12, i64 56}
!46 = !{!10, !6, i64 1256}
!47 = !{!48, !12, i64 128}
!48 = !{!"b2Shape", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !22, i64 24, !22, i64 28, !22, i64 32, !22, i64 36, !22, i64 40, !12, i64 44, !30, i64 48, !30, i64 64, !21, i64 80, !12, i64 88, !49, i64 96, !6, i64 120, !12, i64 128, !7, i64 132, !23, i64 276, !25, i64 278, !25, i64 279, !25, i64 280, !25, i64 281, !25, i64 282}
!49 = !{!"b2Filter", !20, i64 0, !20, i64 8, !12, i64 16}
!50 = !{!42, !12, i64 112}
!51 = !{!42, !22, i64 88}
!52 = !{!48, !12, i64 16}
!53 = !{!38, !25, i64 93}
!54 = !{!42, !25, i64 120}
!55 = !{!38, !25, i64 92}
!56 = !{!48, !12, i64 12}
!57 = distinct !{!57, !58}
!58 = !{!"llvm.loop.mustprogress"}
!59 = distinct !{!59, !58}
!60 = distinct !{!60, !58}
!61 = !{!29, !25, i64 90}
!62 = !{!10, !12, i64 1120}
!63 = !{!10, !6, i64 1112}
!64 = !{!65, !12, i64 8}
!65 = !{!"b2Joint", !6, i64 0, !12, i64 8, !12, i64 12, !12, i64 16, !7, i64 20, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !22, i64 60, !12, i64 64, !23, i64 68, !25, i64 70, !25, i64 71}
!66 = distinct !{!66, !58}
!67 = !{!29, !25, i64 92}
!68 = !{!29, !6, i64 64}
!69 = !{!29, !6, i64 104}
!70 = !{!30, !22, i64 0}
!71 = !{!21, !22, i64 0}
!72 = !{!30, !22, i64 4}
!73 = !{!21, !22, i64 4}
!74 = !{!30, !22, i64 8}
!75 = !{!30, !22, i64 12}
!76 = !{!29, !6, i64 0}
!77 = distinct !{!77, !58}
!78 = distinct !{!78, !58}
!79 = distinct !{!79, !58}
!80 = !{!29, !25, i64 94}
!81 = !{!10, !12, i64 1040}
!82 = !{!10, !6, i64 1032}
!83 = !{!7, !7, i64 0}
!84 = !{i64 0, i64 4, !44, i64 4, i64 4, !44}
!85 = distinct !{!85, !58}
!86 = !{!29, !25, i64 93}
!87 = !{!29, !6, i64 48}
!88 = !{!38, !22, i64 60}
!89 = distinct !{!89, !58}
!90 = distinct !{!90, !58}
!91 = !{!29, !25, i64 95}
!92 = !{!93, !12, i64 24}
!93 = !{!"b2GraphColor", !19, i64 0, !13, i64 16, !13, i64 32, !7, i64 48}
!94 = !{!93, !6, i64 16}
!95 = !{!96, !12, i64 144}
!96 = !{!"b2ContactSim", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !22, i64 20, !22, i64 24, !22, i64 28, !22, i64 32, !97, i64 36, !22, i64 148, !22, i64 152, !22, i64 156, !22, i64 160, !12, i64 164, !98, i64 168}
!97 = !{!"b2Manifold", !21, i64 0, !22, i64 8, !7, i64 12, !12, i64 108}
!98 = !{!"b2SimplexCache", !23, i64 0, !7, i64 2, !7, i64 5}
!99 = !{!29, !25, i64 96}
!100 = !{!29, !6, i64 56}
!101 = !{!102, !22, i64 24}
!102 = !{!"b2ManifoldPoint", !21, i64 0, !21, i64 8, !21, i64 16, !22, i64 24, !22, i64 28, !22, i64 32, !22, i64 36, !22, i64 40, !23, i64 44, !25, i64 46}
!103 = !{!102, !25, i64 46}
!104 = !{!29, !25, i64 97}
!105 = !{!29, !6, i64 40}
!106 = !{!29, !25, i64 98}
!107 = !{!102, !22, i64 28}
!108 = !{!29, !25, i64 99}
!109 = !{!102, !23, i64 44}
!110 = !{!29, !25, i64 100}
!111 = !{!102, !22, i64 32}
!112 = distinct !{!112, !58}
!113 = distinct !{!113, !58}
!114 = distinct !{!114, !58}
!115 = !{!29, !25, i64 101}
!116 = !{!10, !12, i64 1200}
!117 = !{!10, !6, i64 1192}
!118 = !{!119, !12, i64 0}
!119 = !{!"b2Island", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !12, i64 24, !12, i64 28, !12, i64 32, !12, i64 36, !12, i64 40, !12, i64 44, !12, i64 48, !12, i64 52}
!120 = !{!119, !12, i64 12}
!121 = distinct !{!121, !58}
!122 = !{!42, !12, i64 84}
!123 = distinct !{!123, !58}
!124 = distinct !{!124, !58}


; 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.b2AABB = type { %struct.b2Vec2, %struct.b2Vec2 }
%struct.b2BodySim = type { %struct.b2Transform, %struct.b2Vec2, %struct.b2Rot, %struct.b2Vec2, %struct.b2Vec2, %struct.b2Vec2, float, float, float, float, float, float, float, float, i32, i8, i8, i8, i8, i8 }
%struct.b2Transform = type { %struct.b2Vec2, %struct.b2Rot }
%struct.b2Rot = type { float, float }
%struct.b2Shape = type { i32, i32, i32, i32, i32, i32, float, float, float, float, float, i32, %struct.b2AABB, %struct.b2AABB, %struct.b2Vec2, i32, %struct.b2Filter, ptr, i32, %union.anon.0, i16, i8, i8, i8, i8, i8 }
%struct.b2Filter = type { i64, i64, i32 }
%union.anon.0 = type { %struct.b2Polygon }
%struct.b2Polygon = type { [8 x %struct.b2Vec2], [8 x %struct.b2Vec2], %struct.b2Vec2, float, i32 }
%struct.b2Joint = type { ptr, i32, i32, i32, [2 x %struct.b2JointEdge], i32, i32, i32, i32, float, i32, i16, i8, i8 }
%struct.b2JointEdge = type { i32, i32, i32 }
%struct.b2Body = type { [32 x i8], ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, float, float, float, float, i32, i32, i32, i16, i8, i8, i8, i8 }
%struct.b2GraphColor = type { %struct.b2BitSet, %struct.b2ContactSimArray, %struct.b2JointSimArray, %union.anon }
%struct.b2BitSet = type { ptr, i32, i32 }
%struct.b2ContactSimArray = type { ptr, i32, i32 }
%struct.b2JointSimArray = type { ptr, i32, i32 }
%union.anon = type { ptr }
%struct.b2ContactSim = type { i32, i32, i32, i32, i32, float, float, float, float, %struct.b2Manifold, float, float, float, float, i32, %struct.b2SimplexCache }
%struct.b2Manifold = type { %struct.b2Vec2, float, [2 x %struct.b2ManifoldPoint], i32 }
%struct.b2ManifoldPoint = type { %struct.b2Vec2, %struct.b2Vec2, %struct.b2Vec2, float, float, float, float, float, i16, i8 }
%struct.b2SimplexCache = type { i16, [3 x i8], [3 x i8] }
%struct.b2Island = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }

@.str.1 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [3 x i8], align 1
@__const.b2World_Draw.offset = external hidden unnamed_addr constant %struct.b2Vec2, align 4
@__const.b2World_Draw.offset.20 = external hidden unnamed_addr constant %struct.b2Vec2, align 4
@.str.21 = external hidden unnamed_addr constant [7 x i8], align 1
@b2_lengthUnitsPerMeter = external local_unnamed_addr global float, align 4
@__const.b2World_Draw.colors = external hidden unnamed_addr constant [12 x i32], align 16
@.str.22 = external hidden unnamed_addr constant [5 x i8], align 1
@__const.b2World_Draw.aabb = external hidden unnamed_addr constant %struct.b2AABB, align 4

; Function Attrs: nounwind uwtable
declare dso_local ptr @b2GetWorldFromId(i32) local_unnamed_addr #0

declare i32 @b2InternalAssertFcn(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write)
declare void @llvm.trap() #2

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

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

; Function Attrs: nounwind uwtable
define dso_local void @b2World_Draw(i32 %0, ptr noundef %1) local_unnamed_addr #4 {
  %3 = alloca [32 x i8], align 16
  %4 = alloca [4 x %struct.b2Vec2], align 16
  %5 = alloca [32 x i8], align 16
  %6 = alloca [32 x i8], align 16
  %7 = alloca [4 x %struct.b2Vec2], align 16
  %8 = tail call ptr @b2GetWorldFromId(i32 %0)
  %9 = getelementptr inbounds i8, ptr %8, i64 1799
  %10 = load i8, ptr %9, align 1, !tbaa !5, !range !25, !noundef !26
  %11 = icmp eq i8 %10, 0
  br i1 %11, label %.thread, label %12

12:                                               ; preds = %2
  %13 = tail call i32 @b2InternalAssertFcn(ptr noundef nonnull @.str.15, ptr noundef nonnull @.str.1, i32 noundef 1170) #8
  %.not = icmp eq i32 %13, 0
  br i1 %.not, label %15, label %14

14:                                               ; preds = %12
  tail call void @llvm.trap()
  unreachable

15:                                               ; preds = %12
  %.pre = load i8, ptr %9, align 1, !tbaa !5, !range !25
  %16 = trunc nuw i8 %.pre to i1
  br i1 %16, label %.loopexit, label %.thread

.thread:                                          ; preds = %2, %15
  %17 = getelementptr inbounds i8, ptr %1, i64 88
  %18 = load i8, ptr %17, align 8, !tbaa !27, !range !25, !noundef !26
  %19 = trunc nuw i8 %18 to i1
  br i1 %19, label %20, label %21

20:                                               ; preds = %.thread
  tail call void @b2DrawWithBounds(ptr noundef nonnull %8, ptr noundef nonnull %1)
  br label %.loopexit

21:                                               ; preds = %.thread
  %22 = getelementptr inbounds i8, ptr %1, i64 89
  %23 = load i8, ptr %22, align 1, !tbaa !30, !range !25, !noundef !26
  %24 = trunc nuw i8 %23 to i1
  br i1 %24, label %25, label %.loopexit298

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %8, i64 1072
  %27 = getelementptr inbounds i8, ptr %8, i64 1080
  %28 = load i32, ptr %27, align 8, !tbaa !31
  %29 = icmp sgt i32 %28, 0
  br i1 %29, label %.lr.ph308, label %.loopexit298

.lr.ph308:                                        ; preds = %25
  %30 = getelementptr inbounds i8, ptr %8, i64 1032
  %31 = getelementptr inbounds i8, ptr %8, i64 1256
  br label %32

32:                                               ; preds = %.lr.ph308, %._crit_edge305
  %.0306 = phi i32 [ 0, %.lr.ph308 ], [ %37, %._crit_edge305 ]
  %33 = tail call ptr @b2SolverSetArray_Get(ptr noundef nonnull %26, i32 noundef %.0306)
  %34 = getelementptr inbounds i8, ptr %33, i64 8
  %35 = load i32, ptr %34, align 8, !tbaa !32
  %36 = icmp sgt i32 %35, 0
  br i1 %36, label %.lr.ph304.preheader, label %._crit_edge305

.lr.ph304.preheader:                              ; preds = %32
  %wide.trip.count = zext nneg i32 %35 to i64
  br label %.lr.ph304

._crit_edge305:                                   ; preds = %._crit_edge, %32
  %37 = add nuw nsw i32 %.0306, 1
  %exitcond372.not = icmp eq i32 %37, %28
  br i1 %exitcond372.not, label %.loopexit298, label %32, !llvm.loop !34

.lr.ph304:                                        ; preds = %.lr.ph304.preheader, %._crit_edge
  %indvars.iv = phi i64 [ 0, %.lr.ph304.preheader ], [ %indvars.iv.next, %._crit_edge ]
  %38 = load ptr, ptr %33, align 8, !tbaa !36
  %39 = getelementptr inbounds %struct.b2BodySim, ptr %38, i64 %indvars.iv
  %40 = getelementptr inbounds i8, ptr %39, i64 88
  %41 = load i32, ptr %40, align 4, !tbaa !37
  %42 = tail call ptr @b2BodyArray_Get(ptr noundef nonnull %30, i32 noundef %41)
  %43 = getelementptr inbounds i8, ptr %42, i64 40
  %44 = load i32, ptr %43, align 8, !tbaa !41
  %45 = icmp eq i32 %44, %.0306
  br i1 %45, label %49, label %46

46:                                               ; preds = %.lr.ph304
  %47 = tail call i32 @b2InternalAssertFcn(ptr noundef nonnull @.str.18, ptr noundef nonnull @.str.1, i32 noundef 1194) #8
  %.not289 = icmp eq i32 %47, 0
  br i1 %.not289, label %49, label %48

48:                                               ; preds = %46
  tail call void @llvm.trap()
  unreachable

49:                                               ; preds = %46, %.lr.ph304
  %.sroa.0164.0.copyload = load <2 x float>, ptr %39, align 4
  %.sroa.4165.0..sroa_idx = getelementptr inbounds i8, ptr %39, i64 8
  %.sroa.4165.0.copyload = load <2 x float>, ptr %.sroa.4165.0..sroa_idx, align 4
  %50 = getelementptr inbounds i8, ptr %42, i64 56
  %.0266299 = load i32, ptr %50, align 4, !tbaa !43
  %.not290300 = icmp eq i32 %.0266299, -1
  br i1 %.not290300, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %49
  %51 = getelementptr inbounds i8, ptr %42, i64 112
  %52 = getelementptr inbounds i8, ptr %42, i64 88
  %53 = getelementptr inbounds i8, ptr %39, i64 93
  %54 = getelementptr inbounds i8, ptr %42, i64 120
  %55 = getelementptr inbounds i8, ptr %39, i64 92
  br label %56

56:                                               ; preds = %.lr.ph, %87
  %.0266301 = phi i32 [ %.0266299, %.lr.ph ], [ %.0266, %87 ]
  %57 = load ptr, ptr %31, align 8, !tbaa !44
  %58 = sext i32 %.0266301 to i64
  %59 = getelementptr inbounds %struct.b2Shape, ptr %57, i64 %58
  %60 = getelementptr inbounds i8, ptr %59, i64 128
  %61 = load i32, ptr %60, align 8, !tbaa !45
  %.not291 = icmp eq i32 %61, 0
  br i1 %.not291, label %62, label %87

62:                                               ; preds = %56
  %63 = load i32, ptr %51, align 8, !tbaa !48
  %64 = icmp eq i32 %63, 2
  br i1 %64, label %65, label %68

65:                                               ; preds = %62
  %66 = load float, ptr %52, align 8, !tbaa !49
  %67 = fcmp oeq float %66, 0.000000e+00
  br i1 %67, label %87, label %68

68:                                               ; preds = %65, %62
  %69 = load i32, ptr %43, align 8, !tbaa !41
  %70 = icmp eq i32 %69, 1
  br i1 %70, label %87, label %71

71:                                               ; preds = %68
  %72 = getelementptr inbounds i8, ptr %59, i64 16
  %73 = load i32, ptr %72, align 8, !tbaa !50
  %.not292 = icmp eq i32 %73, -1
  br i1 %.not292, label %74, label %87

74:                                               ; preds = %71
  %75 = load i8, ptr %53, align 1, !tbaa !51, !range !25, !noundef !26
  %76 = trunc nuw i8 %75 to i1
  %77 = icmp eq i32 %69, 2
  %or.cond = and i1 %77, %76
  br i1 %or.cond, label %87, label %78

78:                                               ; preds = %74
  %79 = load i8, ptr %54, align 8, !tbaa !52, !range !25, !noundef !26
  %80 = trunc nuw i8 %79 to i1
  br i1 %80, label %87, label %81

81:                                               ; preds = %78
  %82 = load i8, ptr %55, align 4, !tbaa !53, !range !25, !noundef !26
  %83 = trunc nuw i8 %82 to i1
  br i1 %83, label %87, label %84

84:                                               ; preds = %81
  switch i32 %63, label %86 [
    i32 0, label %87
    i32 1, label %85
  ]

85:                                               ; preds = %84
  br label %87

86:                                               ; preds = %84
  %. = select i1 %77, i32 16761035, i32 8421504
  br label %87

87:                                               ; preds = %86, %84, %81, %78, %74, %71, %68, %65, %56, %85
  %.0269 = phi i32 [ 4286945, %85 ], [ %61, %56 ], [ 16711680, %65 ], [ 7372944, %68 ], [ 16113331, %71 ], [ 4251856, %74 ], [ 16776960, %78 ], [ 16416882, %81 ], [ 10025880, %84 ], [ %., %86 ]
  tail call void @b2DrawShape(ptr noundef %1, ptr noundef nonnull %59, <2 x float> %.sroa.0164.0.copyload, <2 x float> %.sroa.4165.0.copyload, i32 noundef %.0269)
  %88 = getelementptr inbounds i8, ptr %59, i64 12
  %.0266 = load i32, ptr %88, align 4, !tbaa !43
  %.not290 = icmp eq i32 %.0266, -1
  br i1 %.not290, label %._crit_edge, label %56, !llvm.loop !54

._crit_edge:                                      ; preds = %87, %49
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge305, label %.lr.ph304, !llvm.loop !55

.loopexit298:                                     ; preds = %._crit_edge305, %25, %21
  %89 = getelementptr inbounds i8, ptr %1, i64 90
  %90 = load i8, ptr %89, align 2, !tbaa !56, !range !25, !noundef !26
  %91 = trunc nuw i8 %90 to i1
  br i1 %91, label %92, label %.loopexit297

92:                                               ; preds = %.loopexit298
  %93 = getelementptr inbounds i8, ptr %8, i64 1112
  %94 = getelementptr inbounds i8, ptr %8, i64 1120
  %95 = load i32, ptr %94, align 8, !tbaa !57
  %96 = icmp sgt i32 %95, 0
  br i1 %96, label %.lr.ph311.preheader, label %.loopexit297

.lr.ph311.preheader:                              ; preds = %92
  %wide.trip.count376 = zext nneg i32 %95 to i64
  br label %.lr.ph311

.lr.ph311:                                        ; preds = %.lr.ph311.preheader, %103
  %indvars.iv373 = phi i64 [ 0, %.lr.ph311.preheader ], [ %indvars.iv.next374, %103 ]
  %97 = load ptr, ptr %93, align 8, !tbaa !58
  %98 = getelementptr inbounds %struct.b2Joint, ptr %97, i64 %indvars.iv373
  %99 = getelementptr inbounds i8, ptr %98, i64 8
  %100 = load i32, ptr %99, align 8, !tbaa !59
  %101 = icmp eq i32 %100, -1
  br i1 %101, label %103, label %102

102:                                              ; preds = %.lr.ph311
  tail call void @b2DrawJoint(ptr noundef %1, ptr noundef nonnull %8, ptr noundef nonnull %98) #8
  br label %103

103:                                              ; preds = %.lr.ph311, %102
  %indvars.iv.next374 = add nuw nsw i64 %indvars.iv373, 1
  %exitcond377.not = icmp eq i64 %indvars.iv.next374, %wide.trip.count376
  br i1 %exitcond377.not, label %.loopexit297, label %.lr.ph311, !llvm.loop !61

.loopexit297:                                     ; preds = %103, %92, %.loopexit298
  %104 = getelementptr inbounds i8, ptr %1, i64 92
  %105 = load i8, ptr %104, align 4, !tbaa !62, !range !25, !noundef !26
  %106 = trunc nuw i8 %105 to i1
  br i1 %106, label %107, label %.loopexit296

107:                                              ; preds = %.loopexit297
  %108 = getelementptr inbounds i8, ptr %8, i64 1072
  %109 = getelementptr inbounds i8, ptr %8, i64 1080
  %110 = load i32, ptr %109, align 8, !tbaa !31
  %111 = icmp sgt i32 %110, 0
  br i1 %111, label %.lr.ph323, label %.loopexit296

.lr.ph323:                                        ; preds = %107
  %112 = getelementptr inbounds i8, ptr %1, i64 64
  %113 = getelementptr inbounds i8, ptr %1, i64 104
  %114 = getelementptr inbounds i8, ptr %8, i64 1032
  %115 = getelementptr inbounds i8, ptr %8, i64 1256
  %116 = getelementptr inbounds i8, ptr %4, i64 16
  br label %117

117:                                              ; preds = %.lr.ph323, %._crit_edge320
  %.0272321 = phi i32 [ 0, %.lr.ph323 ], [ %122, %._crit_edge320 ]
  %118 = call ptr @b2SolverSetArray_Get(ptr noundef nonnull %108, i32 noundef %.0272321)
  %119 = getelementptr inbounds i8, ptr %118, i64 8
  %120 = load i32, ptr %119, align 8, !tbaa !32
  %121 = icmp sgt i32 %120, 0
  br i1 %121, label %.lr.ph319.preheader, label %._crit_edge320

.lr.ph319.preheader:                              ; preds = %117
  %wide.trip.count381 = zext nneg i32 %120 to i64
  br label %.lr.ph319

._crit_edge320:                                   ; preds = %._crit_edge316, %117
  %122 = add nuw nsw i32 %.0272321, 1
  %exitcond383.not = icmp eq i32 %122, %110
  br i1 %exitcond383.not, label %.loopexit296, label %117, !llvm.loop !63

.lr.ph319:                                        ; preds = %.lr.ph319.preheader, %._crit_edge316
  %indvars.iv378 = phi i64 [ 0, %.lr.ph319.preheader ], [ %indvars.iv.next379, %._crit_edge316 ]
  %123 = load ptr, ptr %118, align 8, !tbaa !36
  %124 = getelementptr inbounds %struct.b2BodySim, ptr %123, i64 %indvars.iv378
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3) #8
  %125 = getelementptr inbounds i8, ptr %124, i64 88
  %126 = load i32, ptr %125, align 4, !tbaa !37
  %127 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %3, i64 noundef 32, ptr noundef nonnull @.str.19, i32 noundef %126) #8
  %128 = load ptr, ptr %112, align 8, !tbaa !64
  %129 = getelementptr inbounds i8, ptr %124, i64 16
  %130 = load ptr, ptr %113, align 8, !tbaa !65
  %131 = load <2 x float>, ptr %129, align 4
  call void %128(<2 x float> %131, ptr noundef nonnull %3, i32 noundef 16777215, ptr noundef %130) #8
  %132 = load i32, ptr %125, align 4, !tbaa !37
  %133 = call ptr @b2BodyArray_Get(ptr noundef nonnull %114, i32 noundef %132)
  %134 = getelementptr inbounds i8, ptr %133, i64 40
  %135 = load i32, ptr %134, align 8, !tbaa !41
  %136 = icmp eq i32 %135, %.0272321
  br i1 %136, label %140, label %137

137:                                              ; preds = %.lr.ph319
  %138 = call i32 @b2InternalAssertFcn(ptr noundef nonnull @.str.18, ptr noundef nonnull @.str.1, i32 noundef 1289) #8
  %.not287 = icmp eq i32 %138, 0
  br i1 %.not287, label %140, label %139

139:                                              ; preds = %137
  call void @llvm.trap()
  unreachable

140:                                              ; preds = %137, %.lr.ph319
  %141 = getelementptr inbounds i8, ptr %133, i64 56
  %142 = load i32, ptr %141, align 8, !tbaa !66
  %.not288312 = icmp eq i32 %142, -1
  br i1 %.not288312, label %._crit_edge316, label %.lr.ph315

.lr.ph315:                                        ; preds = %140, %.lr.ph315
  %.0274313 = phi i32 [ %159, %.lr.ph315 ], [ %142, %140 ]
  %143 = load ptr, ptr %115, align 8, !tbaa !44
  %144 = sext i32 %.0274313 to i64
  %145 = getelementptr inbounds %struct.b2Shape, ptr %143, i64 %144
  %146 = getelementptr inbounds i8, ptr %145, i64 64
  %.sroa.0122.0.copyload = load float, ptr %146, align 8, !tbaa !67
  %.sroa.5124.0..sroa_idx = getelementptr inbounds i8, ptr %145, i64 68
  %147 = load <2 x float>, ptr %.sroa.5124.0..sroa_idx, align 4, !tbaa !67
  %.sroa.9127.0..sroa_idx = getelementptr inbounds i8, ptr %145, i64 76
  %.sroa.9127.0.copyload = load float, ptr %.sroa.9127.0..sroa_idx, align 4, !tbaa !67
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %4) #8
  %148 = insertelement <4 x float> poison, float %.sroa.0122.0.copyload, i64 0
  %149 = shufflevector <2 x float> %147, <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
  %150 = shufflevector <4 x float> %148, <4 x float> %149, <4 x i32> <i32 0, i32 4, i32 5, i32 poison>
  %151 = shufflevector <4 x float> %150, <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 1>
  store <4 x float> %151, ptr %4, align 16, !tbaa !67
  %152 = shufflevector <2 x float> %147, <2 x float> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
  %153 = insertelement <4 x float> %152, float %.sroa.9127.0.copyload, i64 1
  %154 = insertelement <4 x float> %153, float %.sroa.0122.0.copyload, i64 2
  %155 = shufflevector <4 x float> %154, <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 1>
  store <4 x float> %155, ptr %116, align 16, !tbaa !67
  %156 = load ptr, ptr %1, align 8, !tbaa !68
  %157 = load ptr, ptr %113, align 8, !tbaa !65
  call void %156(ptr noundef nonnull %4, i32 noundef 4, i32 noundef 16766720, ptr noundef %157) #8
  %158 = getelementptr inbounds i8, ptr %145, i64 12
  %159 = load i32, ptr %158, align 4, !tbaa !69
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %4) #8
  %.not288 = icmp eq i32 %159, -1
  br i1 %.not288, label %._crit_edge316, label %.lr.ph315, !llvm.loop !70

._crit_edge316:                                   ; preds = %.lr.ph315, %140
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3) #8
  %indvars.iv.next379 = add nuw nsw i64 %indvars.iv378, 1
  %exitcond382.not = icmp eq i64 %indvars.iv.next379, %wide.trip.count381
  br i1 %exitcond382.not, label %._crit_edge320, label %.lr.ph319, !llvm.loop !71

.loopexit296:                                     ; preds = %._crit_edge320, %107, %.loopexit297
  %160 = getelementptr inbounds i8, ptr %1, i64 94
  %161 = load i8, ptr %160, align 2, !tbaa !72, !range !25, !noundef !26
  %162 = trunc nuw i8 %161 to i1
  br i1 %162, label %163, label %.loopexit295

163:                                              ; preds = %.loopexit296
  %.sroa.0121.0.copyload = load <2 x float>, ptr @__const.b2World_Draw.offset, align 4
  %164 = getelementptr inbounds i8, ptr %8, i64 1032
  %165 = getelementptr inbounds i8, ptr %8, i64 1040
  %166 = load i32, ptr %165, align 8, !tbaa !73
  %167 = icmp sgt i32 %166, 0
  br i1 %167, label %.lr.ph326, label %.loopexit295

.lr.ph326:                                        ; preds = %163
  %168 = getelementptr inbounds i8, ptr %1, i64 64
  %169 = getelementptr inbounds i8, ptr %1, i64 104
  %wide.trip.count387 = zext nneg i32 %166 to i64
  br label %170

170:                                              ; preds = %.lr.ph326, %186
  %indvars.iv384 = phi i64 [ 0, %.lr.ph326 ], [ %indvars.iv.next385, %186 ]
  %171 = load ptr, ptr %164, align 8, !tbaa !74
  %172 = getelementptr inbounds %struct.b2Body, ptr %171, i64 %indvars.iv384
  %173 = getelementptr inbounds i8, ptr %172, i64 40
  %174 = load i32, ptr %173, align 8, !tbaa !41
  %175 = icmp eq i32 %174, -1
  br i1 %175, label %186, label %176

176:                                              ; preds = %170
  %177 = load i8, ptr %172, align 8, !tbaa !75
  %178 = icmp eq i8 %177, 0
  br i1 %178, label %186, label %179

179:                                              ; preds = %176
  %180 = call ptr @b2GetBodySim(ptr noundef nonnull %8, ptr noundef nonnull %172) #8
  %181 = getelementptr inbounds i8, ptr %180, i64 16
  %.sroa.0109.0.copyload = load <2 x float>, ptr %181, align 4
  %182 = getelementptr inbounds i8, ptr %180, i64 8
  %.sroa.4110.8.copyload = load <2 x float>, ptr %182, align 4
  %183 = call <2 x float> @b2TransformPoint(<2 x float> %.sroa.0109.0.copyload, <2 x float> %.sroa.4110.8.copyload, <2 x float> %.sroa.0121.0.copyload)
  %184 = load ptr, ptr %168, align 8, !tbaa !64
  %185 = load ptr, ptr %169, align 8, !tbaa !65
  call void %184(<2 x float> %183, ptr noundef nonnull %172, i32 noundef 9055202, ptr noundef %185) #8
  br label %186

186:                                              ; preds = %176, %170, %179
  %indvars.iv.next385 = add nuw nsw i64 %indvars.iv384, 1
  %exitcond388.not = icmp eq i64 %indvars.iv.next385, %wide.trip.count387
  br i1 %exitcond388.not, label %.loopexit295, label %170, !llvm.loop !76

.loopexit295:                                     ; preds = %186, %163, %.loopexit296
  %187 = getelementptr inbounds i8, ptr %1, i64 93
  %188 = load i8, ptr %187, align 1, !tbaa !77, !range !25, !noundef !26
  %189 = trunc nuw i8 %188 to i1
  br i1 %189, label %190, label %.loopexit294

190:                                              ; preds = %.loopexit295
  %.sroa.0107.0.copyload = load <2 x float>, ptr @__const.b2World_Draw.offset.20, align 4
  %191 = getelementptr inbounds i8, ptr %8, i64 1072
  %192 = getelementptr inbounds i8, ptr %8, i64 1080
  %193 = load i32, ptr %192, align 8, !tbaa !31
  %194 = icmp sgt i32 %193, 0
  br i1 %194, label %.lr.ph333, label %.loopexit294

.lr.ph333:                                        ; preds = %190
  %195 = getelementptr inbounds i8, ptr %1, i64 48
  %196 = getelementptr inbounds i8, ptr %1, i64 104
  %197 = getelementptr inbounds i8, ptr %1, i64 64
  br label %198

198:                                              ; preds = %.lr.ph333, %._crit_edge330
  %.0276331 = phi i32 [ 0, %.lr.ph333 ], [ %203, %._crit_edge330 ]
  %199 = call ptr @b2SolverSetArray_Get(ptr noundef nonnull %191, i32 noundef %.0276331)
  %200 = getelementptr inbounds i8, ptr %199, i64 8
  %201 = load i32, ptr %200, align 8, !tbaa !32
  %202 = icmp sgt i32 %201, 0
  br i1 %202, label %.lr.ph329.preheader, label %._crit_edge330

.lr.ph329.preheader:                              ; preds = %198
  %wide.trip.count392 = zext nneg i32 %201 to i64
  br label %.lr.ph329

._crit_edge330:                                   ; preds = %.lr.ph329, %198
  %203 = add nuw nsw i32 %.0276331, 1
  %exitcond394.not = icmp eq i32 %203, %193
  br i1 %exitcond394.not, label %.loopexit294, label %198, !llvm.loop !78

.lr.ph329:                                        ; preds = %.lr.ph329.preheader, %.lr.ph329
  %indvars.iv389 = phi i64 [ 0, %.lr.ph329.preheader ], [ %indvars.iv.next390, %.lr.ph329 ]
  %204 = load ptr, ptr %199, align 8, !tbaa !36
  %205 = getelementptr inbounds %struct.b2BodySim, ptr %204, i64 %indvars.iv389
  %206 = getelementptr inbounds i8, ptr %205, i64 16
  %.sroa.090.0.copyload = load <2 x float>, ptr %206, align 4
  %207 = getelementptr inbounds i8, ptr %205, i64 8
  %.sroa.5.8.copyload = load <2 x float>, ptr %207, align 4
  %208 = load ptr, ptr %195, align 8, !tbaa !79
  %209 = load ptr, ptr %196, align 8, !tbaa !65
  call void %208(<2 x float> %.sroa.090.0.copyload, <2 x float> %.sroa.5.8.copyload, ptr noundef %209) #8
  %210 = call <2 x float> @b2TransformPoint(<2 x float> %.sroa.090.0.copyload, <2 x float> %.sroa.5.8.copyload, <2 x float> %.sroa.0107.0.copyload)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %5) #8
  %211 = getelementptr inbounds i8, ptr %205, i64 60
  %212 = load float, ptr %211, align 4, !tbaa !80
  %213 = fcmp ogt float %212, 0.000000e+00
  %214 = fdiv float 1.000000e+00, %212
  %215 = select i1 %213, float %214, float 0.000000e+00
  %216 = fpext float %215 to double
  %217 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %5, i64 noundef 32, ptr noundef nonnull @.str.21, double noundef %216) #8
  %218 = load ptr, ptr %197, align 8, !tbaa !64
  %219 = load ptr, ptr %196, align 8, !tbaa !65
  call void %218(<2 x float> %210, ptr noundef nonnull %5, i32 noundef 16777215, ptr noundef %219) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %5) #8
  %indvars.iv.next390 = add nuw nsw i64 %indvars.iv389, 1
  %exitcond393.not = icmp eq i64 %indvars.iv.next390, %wide.trip.count392
  br i1 %exitcond393.not, label %._crit_edge330, label %.lr.ph329, !llvm.loop !81

.loopexit294:                                     ; preds = %._crit_edge330, %190, %.loopexit295
  %220 = getelementptr inbounds i8, ptr %1, i64 95
  %221 = load i8, ptr %220, align 1, !tbaa !82, !range !25, !noundef !26
  %222 = trunc nuw i8 %221 to i1
  br i1 %222, label %223, label %.loopexit293

223:                                              ; preds = %.loopexit294
  %224 = load float, ptr @b2_lengthUnitsPerMeter, align 4, !tbaa !67
  %225 = fmul float %224, 0x3F747AE140000000
  %226 = getelementptr inbounds i8, ptr %8, i64 336
  %227 = getelementptr inbounds i8, ptr %1, i64 96
  %228 = getelementptr inbounds i8, ptr %1, i64 56
  %229 = getelementptr inbounds i8, ptr %1, i64 104
  %230 = getelementptr inbounds i8, ptr %1, i64 97
  %231 = getelementptr inbounds i8, ptr %1, i64 98
  %232 = getelementptr inbounds i8, ptr %1, i64 40
  %233 = getelementptr inbounds i8, ptr %1, i64 64
  %234 = getelementptr inbounds i8, ptr %1, i64 99
  %235 = getelementptr inbounds i8, ptr %1, i64 100
  br label %236

236:                                              ; preds = %223, %._crit_edge341
  %indvars.iv405 = phi i64 [ 0, %223 ], [ %indvars.iv.next406, %._crit_edge341 ]
  %237 = getelementptr inbounds %struct.b2GraphColor, ptr %226, i64 %indvars.iv405, i32 1
  %238 = getelementptr inbounds i8, ptr %237, i64 8
  %239 = load i32, ptr %238, align 8, !tbaa !83
  %240 = icmp sgt i32 %239, 0
  br i1 %240, label %.lr.ph340, label %._crit_edge341

.lr.ph340:                                        ; preds = %236
  %241 = icmp eq i64 %indvars.iv405, 11
  %242 = select i1 %241, float 7.500000e+00, float 5.000000e+00
  %243 = getelementptr inbounds [12 x i32], ptr @__const.b2World_Draw.colors, i64 0, i64 %indvars.iv405
  %wide.trip.count403 = zext nneg i32 %239 to i64
  br label %244

._crit_edge341:                                   ; preds = %._crit_edge337, %236
  %indvars.iv.next406 = add nuw nsw i64 %indvars.iv405, 1
  %exitcond408.not = icmp eq i64 %indvars.iv.next406, 12
  br i1 %exitcond408.not, label %.loopexit293, label %236, !llvm.loop !85

244:                                              ; preds = %.lr.ph340, %._crit_edge337
  %indvars.iv400 = phi i64 [ 0, %.lr.ph340 ], [ %indvars.iv.next401, %._crit_edge337 ]
  %245 = load ptr, ptr %237, align 8, !tbaa !86
  %246 = getelementptr inbounds %struct.b2ContactSim, ptr %245, i64 %indvars.iv400, i32 9
  %247 = getelementptr inbounds i8, ptr %246, i64 108
  %248 = load i32, ptr %247, align 4, !tbaa !87
  %.sroa.061.0.copyload = load <2 x float>, ptr %246, align 4
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %6) #8
  %249 = icmp sgt i32 %248, 0
  br i1 %249, label %.lr.ph336, label %._crit_edge337

.lr.ph336:                                        ; preds = %244
  %250 = getelementptr inbounds i8, ptr %246, i64 12
  %wide.trip.count398 = zext nneg i32 %248 to i64
  br label %251

._crit_edge337:                                   ; preds = %325, %244
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #8
  %indvars.iv.next401 = add nuw nsw i64 %indvars.iv400, 1
  %exitcond404.not = icmp eq i64 %indvars.iv.next401, %wide.trip.count403
  br i1 %exitcond404.not, label %._crit_edge341, label %244, !llvm.loop !91

251:                                              ; preds = %.lr.ph336, %325
  %indvars.iv395 = phi i64 [ 0, %.lr.ph336 ], [ %indvars.iv.next396, %325 ]
  %252 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %250, i64 %indvars.iv395
  %253 = load i8, ptr %227, align 8, !tbaa !92, !range !25, !noundef !26
  %254 = trunc nuw i8 %253 to i1
  br i1 %254, label %255, label %260

255:                                              ; preds = %251
  %256 = load ptr, ptr %228, align 8, !tbaa !93
  %257 = load i32, ptr %243, align 4, !tbaa !43
  %258 = load ptr, ptr %229, align 8, !tbaa !65
  %259 = load <2 x float>, ptr %252, align 4
  call void %256(<2 x float> %259, float noundef %242, i32 noundef %257, ptr noundef %258) #8
  br label %277

260:                                              ; preds = %251
  %261 = getelementptr inbounds i8, ptr %252, i64 24
  %262 = load float, ptr %261, align 4, !tbaa !94
  %263 = fcmp ogt float %262, %225
  br i1 %263, label %264, label %268

264:                                              ; preds = %260
  %265 = load ptr, ptr %228, align 8, !tbaa !93
  %266 = load ptr, ptr %229, align 8, !tbaa !65
  %267 = load <2 x float>, ptr %252, align 4
  call void %265(<2 x float> %267, float noundef 5.000000e+00, i32 noundef 13882323, ptr noundef %266) #8
  br label %277

268:                                              ; preds = %260
  %269 = getelementptr inbounds i8, ptr %252, i64 46
  %270 = load i8, ptr %269, align 2, !tbaa !96, !range !25, !noundef !26
  %271 = icmp eq i8 %270, 0
  %272 = load ptr, ptr %228, align 8, !tbaa !93
  %273 = load ptr, ptr %229, align 8, !tbaa !65
  %274 = load <2 x float>, ptr %252, align 4
  br i1 %271, label %275, label %276

275:                                              ; preds = %268
  call void %272(<2 x float> %274, float noundef 1.000000e+01, i32 noundef 32768, ptr noundef %273) #8
  br label %277

276:                                              ; preds = %268
  call void %272(<2 x float> %274, float noundef 5.000000e+00, i32 noundef 255, ptr noundef %273) #8
  br label %277

277:                                              ; preds = %264, %276, %275, %255
  %278 = load i8, ptr %230, align 1, !tbaa !97, !range !25, !noundef !26
  %279 = trunc nuw i8 %278 to i1
  br i1 %279, label %280, label %284

280:                                              ; preds = %277
  %.sroa.039.0.copyload = load <2 x float>, ptr %252, align 4
  %281 = call <2 x float> @b2MulAdd(<2 x float> %.sroa.039.0.copyload, float noundef 0x3FD3333340000000, <2 x float> %.sroa.061.0.copyload)
  %282 = load ptr, ptr %232, align 8, !tbaa !98
  %283 = load ptr, ptr %229, align 8, !tbaa !65
  call void %282(<2 x float> %.sroa.039.0.copyload, <2 x float> %281, i32 noundef 6908265, ptr noundef %283) #8
  br label %299

284:                                              ; preds = %277
  %285 = load i8, ptr %231, align 2, !tbaa !99, !range !25, !noundef !26
  %286 = trunc nuw i8 %285 to i1
  br i1 %286, label %287, label %299

287:                                              ; preds = %284
  %.sroa.035.0.copyload = load <2 x float>, ptr %252, align 4
  %288 = getelementptr inbounds i8, ptr %252, i64 28
  %289 = load float, ptr %288, align 4, !tbaa !100
  %290 = call <2 x float> @b2MulAdd(<2 x float> %.sroa.035.0.copyload, float noundef %289, <2 x float> %.sroa.061.0.copyload)
  %291 = load ptr, ptr %232, align 8, !tbaa !98
  %292 = load ptr, ptr %229, align 8, !tbaa !65
  call void %291(<2 x float> %.sroa.035.0.copyload, <2 x float> %290, i32 noundef 16711935, ptr noundef %292) #8
  %293 = load float, ptr %288, align 4, !tbaa !100
  %294 = fmul float %293, 1.000000e+03
  %295 = fpext float %294 to double
  %296 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %6, i64 noundef 32, ptr noundef nonnull @.str.22, double noundef %295) #8
  %297 = load ptr, ptr %233, align 8, !tbaa !64
  %298 = load ptr, ptr %229, align 8, !tbaa !65
  call void %297(<2 x float> %.sroa.035.0.copyload, ptr noundef nonnull %6, i32 noundef 16777215, ptr noundef %298) #8
  br label %299

299:                                              ; preds = %284, %287, %280
  %300 = load i8, ptr %234, align 1, !tbaa !101, !range !25, !noundef !26
  %301 = trunc nuw i8 %300 to i1
  br i1 %301, label %302, label %310

302:                                              ; preds = %299
  %303 = getelementptr inbounds i8, ptr %252, i64 44
  %304 = load i16, ptr %303, align 4, !tbaa !102
  %305 = zext i16 %304 to i32
  %306 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %6, i64 noundef 32, ptr noundef nonnull @.str.19, i32 noundef %305) #8
  %307 = load ptr, ptr %233, align 8, !tbaa !64
  %308 = load ptr, ptr %229, align 8, !tbaa !65
  %309 = load <2 x float>, ptr %252, align 4
  call void %307(<2 x float> %309, ptr noundef nonnull %6, i32 noundef 16753920, ptr noundef %308) #8
  br label %310

310:                                              ; preds = %302, %299
  %311 = load i8, ptr %235, align 4, !tbaa !103, !range !25, !noundef !26
  %312 = trunc nuw i8 %311 to i1
  br i1 %312, label %313, label %325

313:                                              ; preds = %310
  %314 = call <2 x float> @b2RightPerp(<2 x float> %.sroa.061.0.copyload)
  %.sroa.030.0.copyload = load <2 x float>, ptr %252, align 4
  %315 = getelementptr inbounds i8, ptr %252, i64 32
  %316 = load float, ptr %315, align 4, !tbaa !104
  %317 = call <2 x float> @b2MulAdd(<2 x float> %.sroa.030.0.copyload, float noundef %316, <2 x float> %314)
  %318 = load ptr, ptr %232, align 8, !tbaa !98
  %319 = load ptr, ptr %229, align 8, !tbaa !65
  call void %318(<2 x float> %.sroa.030.0.copyload, <2 x float> %317, i32 noundef 16776960, ptr noundef %319) #8
  %320 = load float, ptr %315, align 4, !tbaa !104
  %321 = fpext float %320 to double
  %322 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr noundef nonnull dereferenceable(1) %6, i64 noundef 32, ptr noundef nonnull @.str.22, double noundef %321) #8
  %323 = load ptr, ptr %233, align 8, !tbaa !64
  %324 = load ptr, ptr %229, align 8, !tbaa !65
  call void %323(<2 x float> %.sroa.030.0.copyload, ptr noundef nonnull %6, i32 noundef 16777215, ptr noundef %324) #8
  br label %325

325:                                              ; preds = %313, %310
  %indvars.iv.next396 = add nuw nsw i64 %indvars.iv395, 1
  %exitcond399.not = icmp eq i64 %indvars.iv.next396, %wide.trip.count398
  br i1 %exitcond399.not, label %._crit_edge337, label %251, !llvm.loop !105

.loopexit293:                                     ; preds = %._crit_edge341, %.loopexit294
  %326 = getelementptr inbounds i8, ptr %1, i64 101
  %327 = load i8, ptr %326, align 1, !tbaa !106, !range !25, !noundef !26
  %328 = trunc nuw i8 %327 to i1
  br i1 %328, label %329, label %.loopexit

329:                                              ; preds = %.loopexit293
  %330 = getelementptr inbounds i8, ptr %8, i64 1192
  %331 = getelementptr inbounds i8, ptr %8, i64 1200
  %332 = load i32, ptr %331, align 8, !tbaa !107
  %333 = icmp sgt i32 %332, 0
  br i1 %333, label %.lr.ph368, label %.loopexit

.lr.ph368:                                        ; preds = %329
  %.sroa.010.0.copyload = load <2 x float>, ptr @__const.b2World_Draw.aabb, align 4
  %.sroa.9.0.copyload = load <2 x float>, ptr getelementptr inbounds (i8, ptr @__const.b2World_Draw.aabb, i64 8), align 4
  %334 = getelementptr inbounds i8, ptr %8, i64 1032
  %335 = getelementptr inbounds i8, ptr %8, i64 1256
  %336 = getelementptr inbounds i8, ptr %7, i64 16
  %337 = getelementptr inbounds i8, ptr %1, i64 104
  %wide.trip.count412 = zext nneg i32 %332 to i64
  br label %338

338:                                              ; preds = %.lr.ph368, %._crit_edge362.thread
  %indvars.iv409 = phi i64 [ 0, %.lr.ph368 ], [ %indvars.iv.next410, %._crit_edge362.thread ]
  %339 = load ptr, ptr %330, align 8, !tbaa !108
  %340 = getelementptr inbounds %struct.b2Island, ptr %339, i64 %indvars.iv409
  %341 = load i32, ptr %340, align 4, !tbaa !109
  %342 = icmp eq i32 %341, -1
  br i1 %342, label %._crit_edge362.thread, label %343

343:                                              ; preds = %338
  %344 = getelementptr inbounds i8, ptr %340, i64 12
  %.0267354 = load i32, ptr %344, align 4, !tbaa !43
  %.not285355 = icmp eq i32 %.0267354, -1
  br i1 %.not285355, label %._crit_edge362.thread, label %.lr.ph361

.lr.ph361:                                        ; preds = %343, %._crit_edge351
  %.0267359 = phi i32 [ %.0267, %._crit_edge351 ], [ %.0267354, %343 ]
  %.sroa.010.0358 = phi <2 x float> [ %.sroa.010.1.lcssa, %._crit_edge351 ], [ %.sroa.010.0.copyload, %343 ]
  %.sroa.9.0357 = phi <2 x float> [ %.sroa.9.1.lcssa, %._crit_edge351 ], [ %.sroa.9.0.copyload, %343 ]
  %.0268356 = phi i32 [ %.1.lcssa, %._crit_edge351 ], [ 0, %343 ]
  %345 = call ptr @b2BodyArray_Get(ptr noundef nonnull %334, i32 noundef %.0267359)
  %346 = getelementptr inbounds i8, ptr %345, i64 56
  %.0265343 = load i32, ptr %346, align 4, !tbaa !43
  %.not286344 = icmp eq i32 %.0265343, -1
  br i1 %.not286344, label %._crit_edge351, label %.lr.ph350

.lr.ph350:                                        ; preds = %.lr.ph361, %.lr.ph350
  %.0265348 = phi i32 [ %.0265, %.lr.ph350 ], [ %.0265343, %.lr.ph361 ]
  %.sroa.010.1347 = phi <2 x float> [ %353, %.lr.ph350 ], [ %.sroa.010.0358, %.lr.ph361 ]
  %.sroa.9.1346 = phi <2 x float> [ %354, %.lr.ph350 ], [ %.sroa.9.0357, %.lr.ph361 ]
  %.1345 = phi i32 [ %355, %.lr.ph350 ], [ %.0268356, %.lr.ph361 ]
  %347 = call ptr @b2ShapeArray_Get(ptr noundef nonnull %335, i32 noundef %.0265348)
  %348 = getelementptr inbounds i8, ptr %347, i64 64
  %349 = load <2 x float>, ptr %348, align 8
  %350 = getelementptr inbounds i8, ptr %347, i64 72
  %351 = load <2 x float>, ptr %350, align 8
  %352 = call { <2 x float>, <2 x float> } @b2AABB_Union(<2 x float> %.sroa.010.1347, <2 x float> %.sroa.9.1346, <2 x float> %349, <2 x float> %351)
  %353 = extractvalue { <2 x float>, <2 x float> } %352, 0
  %354 = extractvalue { <2 x float>, <2 x float> } %352, 1
  %355 = add nsw i32 %.1345, 1
  %356 = getelementptr inbounds i8, ptr %347, i64 12
  %.0265 = load i32, ptr %356, align 4, !tbaa !43
  %.not286 = icmp eq i32 %.0265, -1
  br i1 %.not286, label %._crit_edge351, label %.lr.ph350, !llvm.loop !111

._crit_edge351:                                   ; preds = %.lr.ph350, %.lr.ph361
  %.1.lcssa = phi i32 [ %.0268356, %.lr.ph361 ], [ %355, %.lr.ph350 ]
  %.sroa.9.1.lcssa = phi <2 x float> [ %.sroa.9.0357, %.lr.ph361 ], [ %354, %.lr.ph350 ]
  %.sroa.010.1.lcssa = phi <2 x float> [ %.sroa.010.0358, %.lr.ph361 ], [ %353, %.lr.ph350 ]
  %357 = getelementptr inbounds i8, ptr %345, i64 84
  %.0267 = load i32, ptr %357, align 4, !tbaa !43
  %.not285 = icmp eq i32 %.0267, -1
  br i1 %.not285, label %._crit_edge362, label %.lr.ph361, !llvm.loop !112

._crit_edge362:                                   ; preds = %._crit_edge351
  %358 = icmp sgt i32 %.1.lcssa, 0
  br i1 %358, label %359, label %._crit_edge362.thread

359:                                              ; preds = %._crit_edge362
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %7) #8
  %360 = shufflevector <2 x float> %.sroa.010.1.lcssa, <2 x float> %.sroa.9.1.lcssa, <4 x i32> <i32 0, i32 1, i32 2, i32 1>
  store <4 x float> %360, ptr %7, align 16, !tbaa !67
  %361 = shufflevector <2 x float> %.sroa.9.1.lcssa, <2 x float> %.sroa.010.1.lcssa, <4 x i32> <i32 0, i32 1, i32 2, i32 1>
  store <4 x float> %361, ptr %336, align 16, !tbaa !67
  %362 = load ptr, ptr %1, align 8, !tbaa !68
  %363 = load ptr, ptr %337, align 8, !tbaa !65
  call void %362(ptr noundef nonnull %7, i32 noundef 4, i32 noundef 16729344, ptr noundef %363) #8
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %7) #8
  br label %._crit_edge362.thread

._crit_edge362.thread:                            ; preds = %343, %._crit_edge362, %359, %338
  %indvars.iv.next410 = add nuw nsw i64 %indvars.iv409, 1
  %exitcond413.not = icmp eq i64 %indvars.iv.next410, %wide.trip.count412
  br i1 %exitcond413.not, label %.loopexit, label %338, !llvm.loop !113

.loopexit:                                        ; preds = %._crit_edge362.thread, %329, %.loopexit293, %15, %20
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden void @b2DrawWithBounds(ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2SolverSetArray_Get(ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2BodyArray_Get(ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
declare hidden void @b2DrawShape(ptr noundef, ptr noundef, <2 x float>, <2 x float>, i32 noundef) local_unnamed_addr #4

declare void @b2DrawJoint(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nofree nounwind
declare noundef i32 @snprintf(ptr noalias nocapture noundef writeonly, i64 noundef, ptr nocapture noundef readonly, ...) local_unnamed_addr #6

declare ptr @b2GetBodySim(ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2TransformPoint(<2 x float>, <2 x float>, <2 x float>) local_unnamed_addr #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2MulAdd(<2 x float>, float noundef, <2 x float>) local_unnamed_addr #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden <2 x float> @b2RightPerp(<2 x float>) local_unnamed_addr #7

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @b2ShapeArray_Get(ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint nounwind uwtable
declare hidden { <2 x float>, <2 x float> } @b2AABB_Union(<2 x float>, <2 x float>, <2 x float>, <2 x float>) local_unnamed_addr #7

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !24, i64 1799}
!6 = !{!"b2World", !7, i64 0, !13, i64 40, !16, i64 336, !17, i64 1008, !12, i64 1032, !17, i64 1048, !12, i64 1072, !17, i64 1088, !12, i64 1112, !17, i64 1128, !12, i64 1152, !17, i64 1168, !12, i64 1192, !17, i64 1208, !17, i64 1232, !12, i64 1256, !12, i64 1272, !12, i64 1288, !12, i64 1304, !12, i64 1320, !12, i64 1336, !12, i64 1352, !12, i64 1368, !9, i64 1384, !9, i64 1416, !11, i64 1448, !12, i64 1456, !18, i64 1472, !18, i64 1488, !18, i64 1504, !18, i64 1520, !19, i64 1536, !11, i64 1544, !20, i64 1548, !21, i64 1556, !21, i64 1560, !21, i64 1564, !21, i64 1568, !21, i64 1572, !21, i64 1576, !21, i64 1580, !21, i64 1584, !8, i64 1592, !8, i64 1600, !22, i64 1608, !23, i64 1612, !8, i64 1704, !8, i64 1712, !8, i64 1720, !8, i64 1728, !11, i64 1736, !8, i64 1744, !8, i64 1752, !8, i64 1760, !8, i64 1768, !8, i64 1776, !21, i64 1784, !11, i64 1788, !11, i64 1792, !22, i64 1796, !24, i64 1798, !24, i64 1799, !24, i64 1800, !24, i64 1801, !24, i64 1802, !24, i64 1803}
!7 = !{!"b2ArenaAllocator", !8, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !12, i64 24}
!8 = !{!"any pointer", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!"int", !9, i64 0}
!12 = !{!"", !8, i64 0, !11, i64 8, !11, i64 12}
!13 = !{!"b2BroadPhase", !9, i64 0, !11, i64 216, !14, i64 224, !12, i64 240, !8, i64 256, !8, i64 264, !11, i64 272, !15, i64 276, !14, i64 280}
!14 = !{!"b2HashSet", !8, i64 0, !11, i64 8, !11, i64 12}
!15 = !{!"b2AtomicInt", !11, i64 0}
!16 = !{!"b2ConstraintGraph", !9, i64 0}
!17 = !{!"b2IdPool", !12, i64 0, !11, i64 16}
!18 = !{!"b2BitSet", !8, i64 0, !11, i64 8, !11, i64 12}
!19 = !{!"long", !9, i64 0}
!20 = !{!"b2Vec2", !21, i64 0, !21, i64 4}
!21 = !{!"float", !9, i64 0}
!22 = !{!"short", !9, i64 0}
!23 = !{!"b2Profile", !21, i64 0, !21, i64 4, !21, i64 8, !21, i64 12, !21, i64 16, !21, i64 20, !21, i64 24, !21, i64 28, !21, i64 32, !21, i64 36, !21, i64 40, !21, i64 44, !21, i64 48, !21, i64 52, !21, i64 56, !21, i64 60, !21, i64 64, !21, i64 68, !21, i64 72, !21, i64 76, !21, i64 80, !21, i64 84}
!24 = !{!"_Bool", !9, i64 0}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!28, !24, i64 88}
!28 = !{!"b2DebugDraw", !8, i64 0, !8, i64 8, !8, i64 16, !8, i64 24, !8, i64 32, !8, i64 40, !8, i64 48, !8, i64 56, !8, i64 64, !29, i64 72, !24, i64 88, !24, i64 89, !24, i64 90, !24, i64 91, !24, i64 92, !24, i64 93, !24, i64 94, !24, i64 95, !24, i64 96, !24, i64 97, !24, i64 98, !24, i64 99, !24, i64 100, !24, i64 101, !8, i64 104}
!29 = !{!"b2AABB", !20, i64 0, !20, i64 8}
!30 = !{!28, !24, i64 89}
!31 = !{!6, !11, i64 1080}
!32 = !{!33, !11, i64 8}
!33 = !{!"b2SolverSet", !12, i64 0, !12, i64 16, !12, i64 32, !12, i64 48, !12, i64 64, !11, i64 80}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.mustprogress"}
!36 = !{!33, !8, i64 0}
!37 = !{!38, !11, i64 88}
!38 = !{!"b2BodySim", !39, i64 0, !20, i64 16, !40, i64 24, !20, i64 32, !20, i64 40, !20, i64 48, !21, i64 56, !21, i64 60, !21, i64 64, !21, i64 68, !21, i64 72, !21, i64 76, !21, i64 80, !21, i64 84, !11, i64 88, !24, i64 92, !24, i64 93, !24, i64 94, !24, i64 95, !24, i64 96}
!39 = !{!"b2Transform", !20, i64 0, !40, i64 8}
!40 = !{!"b2Rot", !21, i64 0, !21, i64 4}
!41 = !{!42, !11, i64 40}
!42 = !{!"b2Body", !9, i64 0, !8, i64 32, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !21, i64 88, !21, i64 92, !21, i64 96, !21, i64 100, !11, i64 104, !11, i64 108, !11, i64 112, !22, i64 116, !24, i64 118, !24, i64 119, !24, i64 120, !24, i64 121}
!43 = !{!11, !11, i64 0}
!44 = !{!6, !8, i64 1256}
!45 = !{!46, !11, i64 128}
!46 = !{!"b2Shape", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !21, i64 24, !21, i64 28, !21, i64 32, !21, i64 36, !21, i64 40, !11, i64 44, !29, i64 48, !29, i64 64, !20, i64 80, !11, i64 88, !47, i64 96, !8, i64 120, !11, i64 128, !9, i64 132, !22, i64 276, !24, i64 278, !24, i64 279, !24, i64 280, !24, i64 281, !24, i64 282}
!47 = !{!"b2Filter", !19, i64 0, !19, i64 8, !11, i64 16}
!48 = !{!42, !11, i64 112}
!49 = !{!42, !21, i64 88}
!50 = !{!46, !11, i64 16}
!51 = !{!38, !24, i64 93}
!52 = !{!42, !24, i64 120}
!53 = !{!38, !24, i64 92}
!54 = distinct !{!54, !35}
!55 = distinct !{!55, !35}
!56 = !{!28, !24, i64 90}
!57 = !{!6, !11, i64 1120}
!58 = !{!6, !8, i64 1112}
!59 = !{!60, !11, i64 8}
!60 = !{!"b2Joint", !8, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !9, i64 20, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !21, i64 60, !11, i64 64, !22, i64 68, !24, i64 70, !24, i64 71}
!61 = distinct !{!61, !35}
!62 = !{!28, !24, i64 92}
!63 = distinct !{!63, !35}
!64 = !{!28, !8, i64 64}
!65 = !{!28, !8, i64 104}
!66 = !{!42, !11, i64 56}
!67 = !{!21, !21, i64 0}
!68 = !{!28, !8, i64 0}
!69 = !{!46, !11, i64 12}
!70 = distinct !{!70, !35}
!71 = distinct !{!71, !35}
!72 = !{!28, !24, i64 94}
!73 = !{!6, !11, i64 1040}
!74 = !{!6, !8, i64 1032}
!75 = !{!9, !9, i64 0}
!76 = distinct !{!76, !35}
!77 = !{!28, !24, i64 93}
!78 = distinct !{!78, !35}
!79 = !{!28, !8, i64 48}
!80 = !{!38, !21, i64 60}
!81 = distinct !{!81, !35}
!82 = !{!28, !24, i64 95}
!83 = !{!84, !11, i64 24}
!84 = !{!"b2GraphColor", !18, i64 0, !12, i64 16, !12, i64 32, !9, i64 48}
!85 = distinct !{!85, !35}
!86 = !{!84, !8, i64 16}
!87 = !{!88, !11, i64 144}
!88 = !{!"b2ContactSim", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !21, i64 20, !21, i64 24, !21, i64 28, !21, i64 32, !89, i64 36, !21, i64 148, !21, i64 152, !21, i64 156, !21, i64 160, !11, i64 164, !90, i64 168}
!89 = !{!"b2Manifold", !20, i64 0, !21, i64 8, !9, i64 12, !11, i64 108}
!90 = !{!"b2SimplexCache", !22, i64 0, !9, i64 2, !9, i64 5}
!91 = distinct !{!91, !35}
!92 = !{!28, !24, i64 96}
!93 = !{!28, !8, i64 56}
!94 = !{!95, !21, i64 24}
!95 = !{!"b2ManifoldPoint", !20, i64 0, !20, i64 8, !20, i64 16, !21, i64 24, !21, i64 28, !21, i64 32, !21, i64 36, !21, i64 40, !22, i64 44, !24, i64 46}
!96 = !{!95, !24, i64 46}
!97 = !{!28, !24, i64 97}
!98 = !{!28, !8, i64 40}
!99 = !{!28, !24, i64 98}
!100 = !{!95, !21, i64 28}
!101 = !{!28, !24, i64 99}
!102 = !{!95, !22, i64 44}
!103 = !{!28, !24, i64 100}
!104 = !{!95, !21, i64 32}
!105 = distinct !{!105, !35}
!106 = !{!28, !24, i64 101}
!107 = !{!6, !11, i64 1200}
!108 = !{!6, !8, i64 1192}
!109 = !{!110, !11, i64 0}
!110 = !{!"b2Island", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52}
!111 = distinct !{!111, !35}
!112 = distinct !{!112, !35}
!113 = distinct !{!113, !35}


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