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

; 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.b2Softness = type { float, float, float }
%struct.b2Vec2 = type { float, float }
%struct.b2StepContext = type { float, float, float, float, i32, %struct.b2Softness, %struct.b2Softness, %struct.b2Softness, float, float, ptr, ptr, ptr, ptr, ptr, i32, ptr, %struct.b2AtomicInt, ptr, ptr, ptr, i32, i32, ptr, i32, i8, [64 x i8], %struct.b2AtomicU32, [64 x i8] }
%struct.b2AtomicInt = type { i32 }
%struct.b2AtomicU32 = type { i32 }
%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.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.b2ContactConstraintSIMD = type { [4 x i32], [4 x i32], <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> }
%struct.b2Vec2W = type { <4 x float>, <4 x float> }
%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.b2BodyState = type { %struct.b2Vec2, float, i32, %struct.b2Vec2, %struct.b2Rot }
%struct.b2Rot = type { float, float }

@.str = external hidden unnamed_addr constant [34 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [70 x i8], align 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

90:                                               ; preds = %930, %3
  %91 = load i32, ptr %14, align 4, !tbaa !5
  %92 = load i32, ptr %5, align 4, !tbaa !5
  %93 = icmp slt i32 %91, %92
  br i1 %93, label %95, label %94

94:                                               ; preds = %90
  store i32 2, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #8
  br label %933

95:                                               ; preds = %90
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #8
  %96 = load ptr, ptr %9, align 8, !tbaa !9
  %97 = load i32, ptr %14, align 4, !tbaa !5
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %96, i64 %98
  store ptr %99, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #8
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %100

100:                                              ; preds = %926, %95
  %101 = load i32, ptr %17, align 4, !tbaa !5
  %102 = icmp slt i32 %101, 4
  br i1 %102, label %104, label %103

103:                                              ; preds = %100
  store i32 5, ptr %15, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #8
  br label %929

104:                                              ; preds = %100
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #8
  %105 = load ptr, ptr %8, align 8, !tbaa !9
  %106 = load i32, ptr %14, align 4, !tbaa !5
  %107 = mul nsw i32 4, %106
  %108 = load i32, ptr %17, align 4, !tbaa !5
  %109 = add nsw i32 %107, %108
  %110 = sext i32 %109 to i64
  %111 = getelementptr inbounds ptr, ptr %105, i64 %110
  %112 = load ptr, ptr %111, align 8, !tbaa !9
  store ptr %112, ptr %18, align 8, !tbaa !9
  %113 = load ptr, ptr %18, align 8, !tbaa !9
  %114 = icmp ne ptr %113, null
  br i1 %114, label %115, label %719

115:                                              ; preds = %104
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #8
  %116 = load ptr, ptr %18, align 8, !tbaa !9
  %117 = getelementptr inbounds %struct.b2ContactSim, ptr %116, i32 0, i32 9
  store ptr %117, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #8
  %118 = load ptr, ptr %18, align 8, !tbaa !9
  %119 = getelementptr inbounds %struct.b2ContactSim, ptr %118, i32 0, i32 1
  %120 = load i32, ptr %119, align 4, !tbaa !38
  store i32 %120, ptr %20, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #8
  %121 = load ptr, ptr %18, align 8, !tbaa !9
  %122 = getelementptr inbounds %struct.b2ContactSim, ptr %121, i32 0, i32 2
  %123 = load i32, ptr %122, align 4, !tbaa !42
  store i32 %123, ptr %21, align 4, !tbaa !5
  %124 = load i32, ptr %20, align 4, !tbaa !5
  %125 = load ptr, ptr %16, align 8, !tbaa !9
  %126 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %125, i32 0, i32 0
  %127 = load i32, ptr %17, align 4, !tbaa !5
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds [4 x i32], ptr %126, i64 0, i64 %128
  store i32 %124, ptr %129, align 4, !tbaa !5
  %130 = load i32, ptr %21, align 4, !tbaa !5
  %131 = load ptr, ptr %16, align 8, !tbaa !9
  %132 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %131, i32 0, i32 1
  %133 = load i32, ptr %17, align 4, !tbaa !5
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds [4 x i32], ptr %132, i64 0, i64 %134
  store i32 %130, ptr %135, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #8
  call void @llvm.memset.p0.i64(ptr align 4 %22, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #8
  store float 0.000000e+00, ptr %23, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #8
  %136 = load ptr, ptr %18, align 8, !tbaa !9
  %137 = getelementptr inbounds %struct.b2ContactSim, ptr %136, i32 0, i32 5
  %138 = load float, ptr %137, align 4, !tbaa !43
  store float %138, ptr %24, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #8
  %139 = load ptr, ptr %18, align 8, !tbaa !9
  %140 = getelementptr inbounds %struct.b2ContactSim, ptr %139, i32 0, i32 6
  %141 = load float, ptr %140, align 4, !tbaa !44
  store float %141, ptr %25, align 4, !tbaa !22
  %142 = load i32, ptr %20, align 4, !tbaa !5
  %143 = icmp ne i32 %142, -1
  br i1 %143, label %144, label %154

144:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #8
  %145 = load ptr, ptr %10, align 8, !tbaa !9
  %146 = load i32, ptr %20, align 4, !tbaa !5
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds %struct.b2BodyState, ptr %145, i64 %147
  store ptr %148, ptr %26, align 8, !tbaa !9
  %149 = load ptr, ptr %26, align 8, !tbaa !9
  %150 = getelementptr inbounds %struct.b2BodyState, ptr %149, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %22, ptr align 4 %150, i64 8, i1 false), !tbaa.struct !45
  %151 = load ptr, ptr %26, align 8, !tbaa !9
  %152 = getelementptr inbounds %struct.b2BodyState, ptr %151, i32 0, i32 1
  %153 = load float, ptr %152, align 4, !tbaa !46
  store float %153, ptr %23, align 4, !tbaa !22
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #8
  br label %154

154:                                              ; preds = %144, %115
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  call void @llvm.memset.p0.i64(ptr align 4 %27, i8 0, i64 8, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #8
  store float 0.000000e+00, ptr %28, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #8
  %155 = load ptr, ptr %18, align 8, !tbaa !9
  %156 = getelementptr inbounds %struct.b2ContactSim, ptr %155, i32 0, i32 7
  %157 = load float, ptr %156, align 4, !tbaa !49
  store float %157, ptr %29, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #8
  %158 = load ptr, ptr %18, align 8, !tbaa !9
  %159 = getelementptr inbounds %struct.b2ContactSim, ptr %158, i32 0, i32 8
  %160 = load float, ptr %159, align 4, !tbaa !50
  store float %160, ptr %30, align 4, !tbaa !22
  %161 = load i32, ptr %21, align 4, !tbaa !5
  %162 = icmp ne i32 %161, -1
  br i1 %162, label %163, label %173

163:                                              ; preds = %154
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #8
  %164 = load ptr, ptr %10, align 8, !tbaa !9
  %165 = load i32, ptr %21, align 4, !tbaa !5
  %166 = sext i32 %165 to i64
  %167 = getelementptr inbounds %struct.b2BodyState, ptr %164, i64 %166
  store ptr %167, ptr %31, align 8, !tbaa !9
  %168 = load ptr, ptr %31, align 8, !tbaa !9
  %169 = getelementptr inbounds %struct.b2BodyState, ptr %168, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %27, ptr align 4 %169, i64 8, i1 false), !tbaa.struct !45
  %170 = load ptr, ptr %31, align 8, !tbaa !9
  %171 = getelementptr inbounds %struct.b2BodyState, ptr %170, i32 0, i32 1
  %172 = load float, ptr %171, align 4, !tbaa !46
  store float %172, ptr %28, align 4, !tbaa !22
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #8
  br label %173

173:                                              ; preds = %163, %154
  %174 = load float, ptr %24, align 4, !tbaa !22
  %175 = load ptr, ptr %16, align 8, !tbaa !9
  %176 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %175, i32 0, i32 2
  %177 = load i32, ptr %17, align 4, !tbaa !5
  %178 = sext i32 %177 to i64
  %179 = getelementptr inbounds float, ptr %176, i64 %178
  store float %174, ptr %179, align 4, !tbaa !51
  %180 = load float, ptr %29, align 4, !tbaa !22
  %181 = load ptr, ptr %16, align 8, !tbaa !9
  %182 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %181, i32 0, i32 3
  %183 = load i32, ptr %17, align 4, !tbaa !5
  %184 = sext i32 %183 to i64
  %185 = getelementptr inbounds float, ptr %182, i64 %184
  store float %180, ptr %185, align 4, !tbaa !51
  %186 = load float, ptr %25, align 4, !tbaa !22
  %187 = load ptr, ptr %16, align 8, !tbaa !9
  %188 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %187, i32 0, i32 4
  %189 = load i32, ptr %17, align 4, !tbaa !5
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds float, ptr %188, i64 %190
  store float %186, ptr %191, align 4, !tbaa !51
  %192 = load float, ptr %30, align 4, !tbaa !22
  %193 = load ptr, ptr %16, align 8, !tbaa !9
  %194 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %193, i32 0, i32 5
  %195 = load i32, ptr %17, align 4, !tbaa !5
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds float, ptr %194, i64 %196
  store float %192, ptr %197, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #8
  %198 = load float, ptr %25, align 4, !tbaa !22
  %199 = load float, ptr %30, align 4, !tbaa !22
  %200 = fadd float %198, %199
  store float %200, ptr %32, align 4, !tbaa !22
  %201 = load float, ptr %32, align 4, !tbaa !22
  %202 = fcmp ogt float %201, 0.000000e+00
  br i1 %202, label %203, label %206

203:                                              ; preds = %173
  %204 = load float, ptr %32, align 4, !tbaa !22
  %205 = fdiv float 1.000000e+00, %204
  br label %207

206:                                              ; preds = %173
  br label %207

207:                                              ; preds = %206, %203
  %208 = phi float [ %205, %203 ], [ 0.000000e+00, %206 ]
  %209 = load ptr, ptr %16, align 8, !tbaa !9
  %210 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %209, i32 0, i32 10
  %211 = load i32, ptr %17, align 4, !tbaa !5
  %212 = sext i32 %211 to i64
  %213 = getelementptr inbounds float, ptr %210, i64 %212
  store float %208, ptr %213, align 4, !tbaa !51
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #8
  call void @llvm.lifetime.start.p0(i64 12, ptr %33) #8
  %214 = load i32, ptr %20, align 4, !tbaa !5
  %215 = icmp eq i32 %214, -1
  br i1 %215, label %219, label %216

216:                                              ; preds = %207
  %217 = load i32, ptr %21, align 4, !tbaa !5
  %218 = icmp eq i32 %217, -1
  br i1 %218, label %219, label %220

219:                                              ; preds = %216, %207
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %12, i64 12, i1 false), !tbaa.struct !21
  br label %221

220:                                              ; preds = %216
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %11, i64 12, i1 false), !tbaa.struct !21
  br label %221

221:                                              ; preds = %220, %219
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  %222 = load ptr, ptr %19, align 8, !tbaa !9
  %223 = getelementptr inbounds %struct.b2Manifold, ptr %222, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %34, ptr align 4 %223, i64 8, i1 false), !tbaa.struct !45
  %224 = getelementptr inbounds %struct.b2Vec2, ptr %34, i32 0, i32 0
  %225 = load float, ptr %224, align 4, !tbaa !52
  %226 = load ptr, ptr %16, align 8, !tbaa !9
  %227 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %226, i32 0, i32 6
  %228 = getelementptr inbounds %struct.b2Vec2W, ptr %227, i32 0, i32 0
  %229 = load i32, ptr %17, align 4, !tbaa !5
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds float, ptr %228, i64 %230
  store float %225, ptr %231, align 4, !tbaa !51
  %232 = getelementptr inbounds %struct.b2Vec2, ptr %34, i32 0, i32 1
  %233 = load float, ptr %232, align 4, !tbaa !53
  %234 = load ptr, ptr %16, align 8, !tbaa !9
  %235 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %234, i32 0, i32 6
  %236 = getelementptr inbounds %struct.b2Vec2W, ptr %235, i32 0, i32 1
  %237 = load i32, ptr %17, align 4, !tbaa !5
  %238 = sext i32 %237 to i64
  %239 = getelementptr inbounds float, ptr %236, i64 %238
  store float %233, ptr %239, align 4, !tbaa !51
  %240 = load ptr, ptr %18, align 8, !tbaa !9
  %241 = getelementptr inbounds %struct.b2ContactSim, ptr %240, i32 0, i32 10
  %242 = load float, ptr %241, align 4, !tbaa !54
  %243 = load ptr, ptr %16, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %243, i32 0, i32 7
  %245 = load i32, ptr %17, align 4, !tbaa !5
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds float, ptr %244, i64 %246
  store float %242, ptr %247, align 4, !tbaa !51
  %248 = load ptr, ptr %18, align 8, !tbaa !9
  %249 = getelementptr inbounds %struct.b2ContactSim, ptr %248, i32 0, i32 13
  %250 = load float, ptr %249, align 4, !tbaa !55
  %251 = load ptr, ptr %16, align 8, !tbaa !9
  %252 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %251, i32 0, i32 8
  %253 = load i32, ptr %17, align 4, !tbaa !5
  %254 = sext i32 %253 to i64
  %255 = getelementptr inbounds float, ptr %252, i64 %254
  store float %250, ptr %255, align 4, !tbaa !51
  %256 = load ptr, ptr %18, align 8, !tbaa !9
  %257 = getelementptr inbounds %struct.b2ContactSim, ptr %256, i32 0, i32 11
  %258 = load float, ptr %257, align 4, !tbaa !56
  %259 = load ptr, ptr %16, align 8, !tbaa !9
  %260 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %259, i32 0, i32 31
  %261 = load i32, ptr %17, align 4, !tbaa !5
  %262 = sext i32 %261 to i64
  %263 = getelementptr inbounds float, ptr %260, i64 %262
  store float %258, ptr %263, align 4, !tbaa !51
  %264 = load ptr, ptr %18, align 8, !tbaa !9
  %265 = getelementptr inbounds %struct.b2ContactSim, ptr %264, i32 0, i32 12
  %266 = load float, ptr %265, align 4, !tbaa !57
  %267 = load ptr, ptr %16, align 8, !tbaa !9
  %268 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %267, i32 0, i32 9
  %269 = load i32, ptr %17, align 4, !tbaa !5
  %270 = sext i32 %269 to i64
  %271 = getelementptr inbounds float, ptr %268, i64 %270
  store float %266, ptr %271, align 4, !tbaa !51
  %272 = load float, ptr %13, align 4, !tbaa !22
  %273 = load ptr, ptr %19, align 8, !tbaa !9
  %274 = getelementptr inbounds %struct.b2Manifold, ptr %273, i32 0, i32 1
  %275 = load float, ptr %274, align 4, !tbaa !58
  %276 = fmul float %272, %275
  %277 = load ptr, ptr %16, align 8, !tbaa !9
  %278 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %277, i32 0, i32 11
  %279 = load i32, ptr %17, align 4, !tbaa !5
  %280 = sext i32 %279 to i64
  %281 = getelementptr inbounds float, ptr %278, i64 %280
  store float %276, ptr %281, align 4, !tbaa !51
  %282 = getelementptr inbounds %struct.b2Softness, ptr %33, i32 0, i32 0
  %283 = load float, ptr %282, align 4, !tbaa !59
  %284 = load ptr, ptr %16, align 8, !tbaa !9
  %285 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %284, i32 0, i32 12
  %286 = load i32, ptr %17, align 4, !tbaa !5
  %287 = sext i32 %286 to i64
  %288 = getelementptr inbounds float, ptr %285, i64 %287
  store float %283, ptr %288, align 4, !tbaa !51
  %289 = getelementptr inbounds %struct.b2Softness, ptr %33, i32 0, i32 1
  %290 = load float, ptr %289, align 4, !tbaa !60
  %291 = load ptr, ptr %16, align 8, !tbaa !9
  %292 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %291, i32 0, i32 13
  %293 = load i32, ptr %17, align 4, !tbaa !5
  %294 = sext i32 %293 to i64
  %295 = getelementptr inbounds float, ptr %292, i64 %294
  store float %290, ptr %295, align 4, !tbaa !51
  %296 = getelementptr inbounds %struct.b2Softness, ptr %33, i32 0, i32 2
  %297 = load float, ptr %296, align 4, !tbaa !61
  %298 = load ptr, ptr %16, align 8, !tbaa !9
  %299 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %298, i32 0, i32 14
  %300 = load i32, ptr %17, align 4, !tbaa !5
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds float, ptr %299, i64 %301
  store float %297, ptr %302, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #8
  %303 = load <2 x float>, ptr %34, align 4
  %304 = call <2 x float> @b2RightPerp(<2 x float> %303)
  store <2 x float> %304, ptr %35, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #8
  %305 = load ptr, ptr %19, align 8, !tbaa !9
  %306 = getelementptr inbounds %struct.b2Manifold, ptr %305, i32 0, i32 2
  %307 = getelementptr inbounds [2 x %struct.b2ManifoldPoint], ptr %306, i64 0, i64 0
  %308 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %307, i64 0
  store ptr %308, ptr %36, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #8
  %309 = load ptr, ptr %36, align 8, !tbaa !9
  %310 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %309, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %37, ptr align 4 %310, i64 8, i1 false), !tbaa.struct !45
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #8
  %311 = load ptr, ptr %36, align 8, !tbaa !9
  %312 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %311, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %38, ptr align 4 %312, i64 8, i1 false), !tbaa.struct !45
  %313 = getelementptr inbounds %struct.b2Vec2, ptr %37, i32 0, i32 0
  %314 = load float, ptr %313, align 4, !tbaa !52
  %315 = load ptr, ptr %16, align 8, !tbaa !9
  %316 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %315, i32 0, i32 15
  %317 = getelementptr inbounds %struct.b2Vec2W, ptr %316, i32 0, i32 0
  %318 = load i32, ptr %17, align 4, !tbaa !5
  %319 = sext i32 %318 to i64
  %320 = getelementptr inbounds float, ptr %317, i64 %319
  store float %314, ptr %320, align 4, !tbaa !51
  %321 = getelementptr inbounds %struct.b2Vec2, ptr %37, i32 0, i32 1
  %322 = load float, ptr %321, align 4, !tbaa !53
  %323 = load ptr, ptr %16, align 8, !tbaa !9
  %324 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %323, i32 0, i32 15
  %325 = getelementptr inbounds %struct.b2Vec2W, ptr %324, i32 0, i32 1
  %326 = load i32, ptr %17, align 4, !tbaa !5
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds float, ptr %325, i64 %327
  store float %322, ptr %328, align 4, !tbaa !51
  %329 = getelementptr inbounds %struct.b2Vec2, ptr %38, i32 0, i32 0
  %330 = load float, ptr %329, align 4, !tbaa !52
  %331 = load ptr, ptr %16, align 8, !tbaa !9
  %332 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %331, i32 0, i32 16
  %333 = getelementptr inbounds %struct.b2Vec2W, ptr %332, i32 0, i32 0
  %334 = load i32, ptr %17, align 4, !tbaa !5
  %335 = sext i32 %334 to i64
  %336 = getelementptr inbounds float, ptr %333, i64 %335
  store float %330, ptr %336, align 4, !tbaa !51
  %337 = getelementptr inbounds %struct.b2Vec2, ptr %38, i32 0, i32 1
  %338 = load float, ptr %337, align 4, !tbaa !53
  %339 = load ptr, ptr %16, align 8, !tbaa !9
  %340 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %339, i32 0, i32 16
  %341 = getelementptr inbounds %struct.b2Vec2W, ptr %340, i32 0, i32 1
  %342 = load i32, ptr %17, align 4, !tbaa !5
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds float, ptr %341, i64 %343
  store float %338, ptr %344, align 4, !tbaa !51
  %345 = load ptr, ptr %36, align 8, !tbaa !9
  %346 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %345, i32 0, i32 3
  %347 = load float, ptr %346, align 4, !tbaa !62
  %348 = load <2 x float>, ptr %38, align 4
  %349 = load <2 x float>, ptr %37, align 4
  %350 = call <2 x float> @b2Sub(<2 x float> %348, <2 x float> %349)
  store <2 x float> %350, ptr %39, align 4
  %351 = load <2 x float>, ptr %39, align 4
  %352 = load <2 x float>, ptr %34, align 4
  %353 = call float @b2Dot(<2 x float> %351, <2 x float> %352)
  %354 = fsub float %347, %353
  %355 = load ptr, ptr %16, align 8, !tbaa !9
  %356 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %355, i32 0, i32 19
  %357 = load i32, ptr %17, align 4, !tbaa !5
  %358 = sext i32 %357 to i64
  %359 = getelementptr inbounds float, ptr %356, i64 %358
  store float %354, ptr %359, align 4, !tbaa !51
  %360 = load float, ptr %13, align 4, !tbaa !22
  %361 = load ptr, ptr %36, align 8, !tbaa !9
  %362 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %361, i32 0, i32 4
  %363 = load float, ptr %362, align 4, !tbaa !64
  %364 = fmul float %360, %363
  %365 = load ptr, ptr %16, align 8, !tbaa !9
  %366 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %365, i32 0, i32 20
  %367 = load i32, ptr %17, align 4, !tbaa !5
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds float, ptr %366, i64 %368
  store float %364, ptr %369, align 4, !tbaa !51
  %370 = load float, ptr %13, align 4, !tbaa !22
  %371 = load ptr, ptr %36, align 8, !tbaa !9
  %372 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %371, i32 0, i32 5
  %373 = load float, ptr %372, align 4, !tbaa !65
  %374 = fmul float %370, %373
  %375 = load ptr, ptr %16, align 8, !tbaa !9
  %376 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %375, i32 0, i32 22
  %377 = load i32, ptr %17, align 4, !tbaa !5
  %378 = sext i32 %377 to i64
  %379 = getelementptr inbounds float, ptr %376, i64 %378
  store float %374, ptr %379, align 4, !tbaa !51
  %380 = load ptr, ptr %16, align 8, !tbaa !9
  %381 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %380, i32 0, i32 21
  %382 = load i32, ptr %17, align 4, !tbaa !5
  %383 = sext i32 %382 to i64
  %384 = getelementptr inbounds float, ptr %381, i64 %383
  store float 0.000000e+00, ptr %384, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #8
  %385 = load <2 x float>, ptr %37, align 4
  %386 = load <2 x float>, ptr %34, align 4
  %387 = call float @b2Cross(<2 x float> %385, <2 x float> %386)
  store float %387, ptr %40, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #8
  %388 = load <2 x float>, ptr %38, align 4
  %389 = load <2 x float>, ptr %34, align 4
  %390 = call float @b2Cross(<2 x float> %388, <2 x float> %389)
  store float %390, ptr %41, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #8
  %391 = load float, ptr %24, align 4, !tbaa !22
  %392 = load float, ptr %29, align 4, !tbaa !22
  %393 = fadd float %391, %392
  %394 = load float, ptr %25, align 4, !tbaa !22
  %395 = load float, ptr %40, align 4, !tbaa !22
  %396 = fmul float %394, %395
  %397 = load float, ptr %40, align 4, !tbaa !22
  %398 = call float @llvm.fmuladd.f32(float %396, float %397, float %393)
  %399 = load float, ptr %30, align 4, !tbaa !22
  %400 = load float, ptr %41, align 4, !tbaa !22
  %401 = fmul float %399, %400
  %402 = load float, ptr %41, align 4, !tbaa !22
  %403 = call float @llvm.fmuladd.f32(float %401, float %402, float %398)
  store float %403, ptr %42, align 4, !tbaa !22
  %404 = load float, ptr %42, align 4, !tbaa !22
  %405 = fcmp ogt float %404, 0.000000e+00
  br i1 %405, label %406, label %409

406:                                              ; preds = %221
  %407 = load float, ptr %42, align 4, !tbaa !22
  %408 = fdiv float 1.000000e+00, %407
  br label %410

409:                                              ; preds = %221
  br label %410

410:                                              ; preds = %409, %406
  %411 = phi float [ %408, %406 ], [ 0.000000e+00, %409 ]
  %412 = load ptr, ptr %16, align 8, !tbaa !9
  %413 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %412, i32 0, i32 17
  %414 = load i32, ptr %17, align 4, !tbaa !5
  %415 = sext i32 %414 to i64
  %416 = getelementptr inbounds float, ptr %413, i64 %415
  store float %411, ptr %416, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #8
  %417 = load <2 x float>, ptr %37, align 4
  %418 = load <2 x float>, ptr %35, align 4
  %419 = call float @b2Cross(<2 x float> %417, <2 x float> %418)
  store float %419, ptr %43, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #8
  %420 = load <2 x float>, ptr %38, align 4
  %421 = load <2 x float>, ptr %35, align 4
  %422 = call float @b2Cross(<2 x float> %420, <2 x float> %421)
  store float %422, ptr %44, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #8
  %423 = load float, ptr %24, align 4, !tbaa !22
  %424 = load float, ptr %29, align 4, !tbaa !22
  %425 = fadd float %423, %424
  %426 = load float, ptr %25, align 4, !tbaa !22
  %427 = load float, ptr %43, align 4, !tbaa !22
  %428 = fmul float %426, %427
  %429 = load float, ptr %43, align 4, !tbaa !22
  %430 = call float @llvm.fmuladd.f32(float %428, float %429, float %425)
  %431 = load float, ptr %30, align 4, !tbaa !22
  %432 = load float, ptr %44, align 4, !tbaa !22
  %433 = fmul float %431, %432
  %434 = load float, ptr %44, align 4, !tbaa !22
  %435 = call float @llvm.fmuladd.f32(float %433, float %434, float %430)
  store float %435, ptr %45, align 4, !tbaa !22
  %436 = load float, ptr %45, align 4, !tbaa !22
  %437 = fcmp ogt float %436, 0.000000e+00
  br i1 %437, label %438, label %441

438:                                              ; preds = %410
  %439 = load float, ptr %45, align 4, !tbaa !22
  %440 = fdiv float 1.000000e+00, %439
  br label %442

441:                                              ; preds = %410
  br label %442

442:                                              ; preds = %441, %438
  %443 = phi float [ %440, %438 ], [ 0.000000e+00, %441 ]
  %444 = load ptr, ptr %16, align 8, !tbaa !9
  %445 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %444, i32 0, i32 18
  %446 = load i32, ptr %17, align 4, !tbaa !5
  %447 = sext i32 %446 to i64
  %448 = getelementptr inbounds float, ptr %445, i64 %447
  store float %443, ptr %448, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #8
  %449 = load float, ptr %23, align 4, !tbaa !22
  %450 = load <2 x float>, ptr %37, align 4
  %451 = call <2 x float> @b2CrossSV(float noundef %449, <2 x float> %450)
  store <2 x float> %451, ptr %47, align 4
  %452 = load <2 x float>, ptr %22, align 4
  %453 = load <2 x float>, ptr %47, align 4
  %454 = call <2 x float> @b2Add(<2 x float> %452, <2 x float> %453)
  store <2 x float> %454, ptr %46, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #8
  %455 = load float, ptr %28, align 4, !tbaa !22
  %456 = load <2 x float>, ptr %38, align 4
  %457 = call <2 x float> @b2CrossSV(float noundef %455, <2 x float> %456)
  store <2 x float> %457, ptr %49, align 4
  %458 = load <2 x float>, ptr %27, align 4
  %459 = load <2 x float>, ptr %49, align 4
  %460 = call <2 x float> @b2Add(<2 x float> %458, <2 x float> %459)
  store <2 x float> %460, ptr %48, align 4
  %461 = load <2 x float>, ptr %48, align 4
  %462 = load <2 x float>, ptr %46, align 4
  %463 = call <2 x float> @b2Sub(<2 x float> %461, <2 x float> %462)
  store <2 x float> %463, ptr %50, align 4
  %464 = load <2 x float>, ptr %34, align 4
  %465 = load <2 x float>, ptr %50, align 4
  %466 = call float @b2Dot(<2 x float> %464, <2 x float> %465)
  %467 = load ptr, ptr %16, align 8, !tbaa !9
  %468 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %467, i32 0, i32 32
  %469 = load i32, ptr %17, align 4, !tbaa !5
  %470 = sext i32 %469 to i64
  %471 = getelementptr inbounds float, ptr %468, i64 %470
  store float %466, ptr %471, align 4, !tbaa !51
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #8
  %472 = load ptr, ptr %19, align 8, !tbaa !9
  %473 = getelementptr inbounds %struct.b2Manifold, ptr %472, i32 0, i32 3
  %474 = load i32, ptr %473, align 4, !tbaa !66
  store i32 %474, ptr %51, align 4, !tbaa !5
  br label %475

475:                                              ; preds = %442
  %476 = load i32, ptr %51, align 4, !tbaa !5
  %477 = icmp slt i32 0, %476
  br i1 %477, label %478, label %481

478:                                              ; preds = %475
  %479 = load i32, ptr %51, align 4, !tbaa !5
  %480 = icmp sle i32 %479, 2
  br i1 %480, label %485, label %481

481:                                              ; preds = %478, %475
  %482 = call i32 @b2InternalAssertFcn(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 1566)
  %483 = icmp ne i32 %482, 0
  br i1 %483, label %484, label %485

484:                                              ; preds = %481
  call void @llvm.trap()
  br label %485

485:                                              ; preds = %484, %481, %478
  br label %486

486:                                              ; preds = %485
  br label %487

487:                                              ; preds = %486
  %488 = load i32, ptr %51, align 4, !tbaa !5
  %489 = icmp eq i32 %488, 2
  br i1 %489, label %490, label %658

490:                                              ; preds = %487
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  %491 = load ptr, ptr %19, align 8, !tbaa !9
  %492 = getelementptr inbounds %struct.b2Manifold, ptr %491, i32 0, i32 2
  %493 = getelementptr inbounds [2 x %struct.b2ManifoldPoint], ptr %492, i64 0, i64 0
  %494 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %493, i64 1
  store ptr %494, ptr %52, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #8
  %495 = load ptr, ptr %52, align 8, !tbaa !9
  %496 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %495, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %53, ptr align 4 %496, i64 8, i1 false), !tbaa.struct !45
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #8
  %497 = load ptr, ptr %52, align 8, !tbaa !9
  %498 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %497, i32 0, i32 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %54, ptr align 4 %498, i64 8, i1 false), !tbaa.struct !45
  %499 = getelementptr inbounds %struct.b2Vec2, ptr %53, i32 0, i32 0
  %500 = load float, ptr %499, align 4, !tbaa !52
  %501 = load ptr, ptr %16, align 8, !tbaa !9
  %502 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %501, i32 0, i32 23
  %503 = getelementptr inbounds %struct.b2Vec2W, ptr %502, i32 0, i32 0
  %504 = load i32, ptr %17, align 4, !tbaa !5
  %505 = sext i32 %504 to i64
  %506 = getelementptr inbounds float, ptr %503, i64 %505
  store float %500, ptr %506, align 4, !tbaa !51
  %507 = getelementptr inbounds %struct.b2Vec2, ptr %53, i32 0, i32 1
  %508 = load float, ptr %507, align 4, !tbaa !53
  %509 = load ptr, ptr %16, align 8, !tbaa !9
  %510 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %509, i32 0, i32 23
  %511 = getelementptr inbounds %struct.b2Vec2W, ptr %510, i32 0, i32 1
  %512 = load i32, ptr %17, align 4, !tbaa !5
  %513 = sext i32 %512 to i64
  %514 = getelementptr inbounds float, ptr %511, i64 %513
  store float %508, ptr %514, align 4, !tbaa !51
  %515 = getelementptr inbounds %struct.b2Vec2, ptr %54, i32 0, i32 0
  %516 = load float, ptr %515, align 4, !tbaa !52
  %517 = load ptr, ptr %16, align 8, !tbaa !9
  %518 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %517, i32 0, i32 24
  %519 = getelementptr inbounds %struct.b2Vec2W, ptr %518, i32 0, i32 0
  %520 = load i32, ptr %17, align 4, !tbaa !5
  %521 = sext i32 %520 to i64
  %522 = getelementptr inbounds float, ptr %519, i64 %521
  store float %516, ptr %522, align 4, !tbaa !51
  %523 = getelementptr inbounds %struct.b2Vec2, ptr %54, i32 0, i32 1
  %524 = load float, ptr %523, align 4, !tbaa !53
  %525 = load ptr, ptr %16, align 8, !tbaa !9
  %526 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %525, i32 0, i32 24
  %527 = getelementptr inbounds %struct.b2Vec2W, ptr %526, i32 0, i32 1
  %528 = load i32, ptr %17, align 4, !tbaa !5
  %529 = sext i32 %528 to i64
  %530 = getelementptr inbounds float, ptr %527, i64 %529
  store float %524, ptr %530, align 4, !tbaa !51
  %531 = load ptr, ptr %52, align 8, !tbaa !9
  %532 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %531, i32 0, i32 3
  %533 = load float, ptr %532, align 4, !tbaa !62
  %534 = load <2 x float>, ptr %54, align 4
  %535 = load <2 x float>, ptr %53, align 4
  %536 = call <2 x float> @b2Sub(<2 x float> %534, <2 x float> %535)
  store <2 x float> %536, ptr %55, align 4
  %537 = load <2 x float>, ptr %55, align 4
  %538 = load <2 x float>, ptr %34, align 4
  %539 = call float @b2Dot(<2 x float> %537, <2 x float> %538)
  %540 = fsub float %533, %539
  %541 = load ptr, ptr %16, align 8, !tbaa !9
  %542 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %541, i32 0, i32 25
  %543 = load i32, ptr %17, align 4, !tbaa !5
  %544 = sext i32 %543 to i64
  %545 = getelementptr inbounds float, ptr %542, i64 %544
  store float %540, ptr %545, align 4, !tbaa !51
  %546 = load float, ptr %13, align 4, !tbaa !22
  %547 = load ptr, ptr %52, align 8, !tbaa !9
  %548 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %547, i32 0, i32 4
  %549 = load float, ptr %548, align 4, !tbaa !64
  %550 = fmul float %546, %549
  %551 = load ptr, ptr %16, align 8, !tbaa !9
  %552 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %551, i32 0, i32 26
  %553 = load i32, ptr %17, align 4, !tbaa !5
  %554 = sext i32 %553 to i64
  %555 = getelementptr inbounds float, ptr %552, i64 %554
  store float %550, ptr %555, align 4, !tbaa !51
  %556 = load float, ptr %13, align 4, !tbaa !22
  %557 = load ptr, ptr %52, align 8, !tbaa !9
  %558 = getelementptr inbounds %struct.b2ManifoldPoint, ptr %557, i32 0, i32 5
  %559 = load float, ptr %558, align 4, !tbaa !65
  %560 = fmul float %556, %559
  %561 = load ptr, ptr %16, align 8, !tbaa !9
  %562 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %561, i32 0, i32 28
  %563 = load i32, ptr %17, align 4, !tbaa !5
  %564 = sext i32 %563 to i64
  %565 = getelementptr inbounds float, ptr %562, i64 %564
  store float %560, ptr %565, align 4, !tbaa !51
  %566 = load ptr, ptr %16, align 8, !tbaa !9
  %567 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %566, i32 0, i32 27
  %568 = load i32, ptr %17, align 4, !tbaa !5
  %569 = sext i32 %568 to i64
  %570 = getelementptr inbounds float, ptr %567, i64 %569
  store float 0.000000e+00, ptr %570, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #8
  %571 = load <2 x float>, ptr %53, align 4
  %572 = load <2 x float>, ptr %34, align 4
  %573 = call float @b2Cross(<2 x float> %571, <2 x float> %572)
  store float %573, ptr %56, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #8
  %574 = load <2 x float>, ptr %54, align 4
  %575 = load <2 x float>, ptr %34, align 4
  %576 = call float @b2Cross(<2 x float> %574, <2 x float> %575)
  store float %576, ptr %57, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #8
  %577 = load float, ptr %24, align 4, !tbaa !22
  %578 = load float, ptr %29, align 4, !tbaa !22
  %579 = fadd float %577, %578
  %580 = load float, ptr %25, align 4, !tbaa !22
  %581 = load float, ptr %56, align 4, !tbaa !22
  %582 = fmul float %580, %581
  %583 = load float, ptr %56, align 4, !tbaa !22
  %584 = call float @llvm.fmuladd.f32(float %582, float %583, float %579)
  %585 = load float, ptr %30, align 4, !tbaa !22
  %586 = load float, ptr %57, align 4, !tbaa !22
  %587 = fmul float %585, %586
  %588 = load float, ptr %57, align 4, !tbaa !22
  %589 = call float @llvm.fmuladd.f32(float %587, float %588, float %584)
  store float %589, ptr %58, align 4, !tbaa !22
  %590 = load float, ptr %58, align 4, !tbaa !22
  %591 = fcmp ogt float %590, 0.000000e+00
  br i1 %591, label %592, label %595

592:                                              ; preds = %490
  %593 = load float, ptr %58, align 4, !tbaa !22
  %594 = fdiv float 1.000000e+00, %593
  br label %596

595:                                              ; preds = %490
  br label %596

596:                                              ; preds = %595, %592
  %597 = phi float [ %594, %592 ], [ 0.000000e+00, %595 ]
  %598 = load ptr, ptr %16, align 8, !tbaa !9
  %599 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %598, i32 0, i32 29
  %600 = load i32, ptr %17, align 4, !tbaa !5
  %601 = sext i32 %600 to i64
  %602 = getelementptr inbounds float, ptr %599, i64 %601
  store float %597, ptr %602, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #8
  %603 = load <2 x float>, ptr %53, align 4
  %604 = load <2 x float>, ptr %35, align 4
  %605 = call float @b2Cross(<2 x float> %603, <2 x float> %604)
  store float %605, ptr %59, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #8
  %606 = load <2 x float>, ptr %54, align 4
  %607 = load <2 x float>, ptr %35, align 4
  %608 = call float @b2Cross(<2 x float> %606, <2 x float> %607)
  store float %608, ptr %60, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #8
  %609 = load float, ptr %24, align 4, !tbaa !22
  %610 = load float, ptr %29, align 4, !tbaa !22
  %611 = fadd float %609, %610
  %612 = load float, ptr %25, align 4, !tbaa !22
  %613 = load float, ptr %59, align 4, !tbaa !22
  %614 = fmul float %612, %613
  %615 = load float, ptr %59, align 4, !tbaa !22
  %616 = call float @llvm.fmuladd.f32(float %614, float %615, float %611)
  %617 = load float, ptr %30, align 4, !tbaa !22
  %618 = load float, ptr %60, align 4, !tbaa !22
  %619 = fmul float %617, %618
  %620 = load float, ptr %60, align 4, !tbaa !22
  %621 = call float @llvm.fmuladd.f32(float %619, float %620, float %616)
  store float %621, ptr %61, align 4, !tbaa !22
  %622 = load float, ptr %61, align 4, !tbaa !22
  %623 = fcmp ogt float %622, 0.000000e+00
  br i1 %623, label %624, label %627

624:                                              ; preds = %596
  %625 = load float, ptr %61, align 4, !tbaa !22
  %626 = fdiv float 1.000000e+00, %625
  br label %628

627:                                              ; preds = %596
  br label %628

628:                                              ; preds = %627, %624
  %629 = phi float [ %626, %624 ], [ 0.000000e+00, %627 ]
  %630 = load ptr, ptr %16, align 8, !tbaa !9
  %631 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %630, i32 0, i32 30
  %632 = load i32, ptr %17, align 4, !tbaa !5
  %633 = sext i32 %632 to i64
  %634 = getelementptr inbounds float, ptr %631, i64 %633
  store float %629, ptr %634, align 4, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  %635 = load float, ptr %23, align 4, !tbaa !22
  %636 = load <2 x float>, ptr %53, align 4
  %637 = call <2 x float> @b2CrossSV(float noundef %635, <2 x float> %636)
  store <2 x float> %637, ptr %63, align 4
  %638 = load <2 x float>, ptr %22, align 4
  %639 = load <2 x float>, ptr %63, align 4
  %640 = call <2 x float> @b2Add(<2 x float> %638, <2 x float> %639)
  store <2 x float> %640, ptr %62, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #8
  %641 = load float, ptr %28, align 4, !tbaa !22
  %642 = load <2 x float>, ptr %54, align 4
  %643 = call <2 x float> @b2CrossSV(float noundef %641, <2 x float> %642)
  store <2 x float> %643, ptr %65, align 4
  %644 = load <2 x float>, ptr %27, align 4
  %645 = load <2 x float>, ptr %65, align 4
  %646 = call <2 x float> @b2Add(<2 x float> %644, <2 x float> %645)
  store <2 x float> %646, ptr %64, align 4
  %647 = load <2 x float>, ptr %64, align 4
  %648 = load <2 x float>, ptr %62, align 4
  %649 = call <2 x float> @b2Sub(<2 x float> %647, <2 x float> %648)
  store <2 x float> %649, ptr %66, align 4
  %650 = load <2 x float>, ptr %34, align 4
  %651 = load <2 x float>, ptr %66, align 4
  %652 = call float @b2Dot(<2 x float> %650, <2 x float> %651)
  %653 = load ptr, ptr %16, align 8, !tbaa !9
  %654 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %653, i32 0, i32 33
  %655 = load i32, ptr %17, align 4, !tbaa !5
  %656 = sext i32 %655 to i64
  %657 = getelementptr inbounds float, ptr %654, i64 %656
  store float %652, ptr %657, align 4, !tbaa !51
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  br label %718

658:                                              ; preds = %487
  %659 = load ptr, ptr %16, align 8, !tbaa !9
  %660 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %659, i32 0, i32 25
  %661 = load i32, ptr %17, align 4, !tbaa !5
  %662 = sext i32 %661 to i64
  %663 = getelementptr inbounds float, ptr %660, i64 %662
  store float 0.000000e+00, ptr %663, align 4, !tbaa !51
  %664 = load ptr, ptr %16, align 8, !tbaa !9
  %665 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %664, i32 0, i32 26
  %666 = load i32, ptr %17, align 4, !tbaa !5
  %667 = sext i32 %666 to i64
  %668 = getelementptr inbounds float, ptr %665, i64 %667
  store float 0.000000e+00, ptr %668, align 4, !tbaa !51
  %669 = load ptr, ptr %16, align 8, !tbaa !9
  %670 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %669, i32 0, i32 28
  %671 = load i32, ptr %17, align 4, !tbaa !5
  %672 = sext i32 %671 to i64
  %673 = getelementptr inbounds float, ptr %670, i64 %672
  store float 0.000000e+00, ptr %673, align 4, !tbaa !51
  %674 = load ptr, ptr %16, align 8, !tbaa !9
  %675 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %674, i32 0, i32 27
  %676 = load i32, ptr %17, align 4, !tbaa !5
  %677 = sext i32 %676 to i64
  %678 = getelementptr inbounds float, ptr %675, i64 %677
  store float 0.000000e+00, ptr %678, align 4, !tbaa !51
  %679 = load ptr, ptr %16, align 8, !tbaa !9
  %680 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %679, i32 0, i32 23
  %681 = getelementptr inbounds %struct.b2Vec2W, ptr %680, i32 0, i32 0
  %682 = load i32, ptr %17, align 4, !tbaa !5
  %683 = sext i32 %682 to i64
  %684 = getelementptr inbounds float, ptr %681, i64 %683
  store float 0.000000e+00, ptr %684, align 4, !tbaa !51
  %685 = load ptr, ptr %16, align 8, !tbaa !9
  %686 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %685, i32 0, i32 23
  %687 = getelementptr inbounds %struct.b2Vec2W, ptr %686, i32 0, i32 1
  %688 = load i32, ptr %17, align 4, !tbaa !5
  %689 = sext i32 %688 to i64
  %690 = getelementptr inbounds float, ptr %687, i64 %689
  store float 0.000000e+00, ptr %690, align 4, !tbaa !51
  %691 = load ptr, ptr %16, align 8, !tbaa !9
  %692 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %691, i32 0, i32 24
  %693 = getelementptr inbounds %struct.b2Vec2W, ptr %692, i32 0, i32 0
  %694 = load i32, ptr %17, align 4, !tbaa !5
  %695 = sext i32 %694 to i64
  %696 = getelementptr inbounds float, ptr %693, i64 %695
  store float 0.000000e+00, ptr %696, align 4, !tbaa !51
  %697 = load ptr, ptr %16, align 8, !tbaa !9
  %698 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %697, i32 0, i32 24
  %699 = getelementptr inbounds %struct.b2Vec2W, ptr %698, i32 0, i32 1
  %700 = load i32, ptr %17, align 4, !tbaa !5
  %701 = sext i32 %700 to i64
  %702 = getelementptr inbounds float, ptr %699, i64 %701
  store float 0.000000e+00, ptr %702, align 4, !tbaa !51
  %703 = load ptr, ptr %16, align 8, !tbaa !9
  %704 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %703, i32 0, i32 29
  %705 = load i32, ptr %17, align 4, !tbaa !5
  %706 = sext i32 %705 to i64
  %707 = getelementptr inbounds float, ptr %704, i64 %706
  store float 0.000000e+00, ptr %707, align 4, !tbaa !51
  %708 = load ptr, ptr %16, align 8, !tbaa !9
  %709 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %708, i32 0, i32 30
  %710 = load i32, ptr %17, align 4, !tbaa !5
  %711 = sext i32 %710 to i64
  %712 = getelementptr inbounds float, ptr %709, i64 %711
  store float 0.000000e+00, ptr %712, align 4, !tbaa !51
  %713 = load ptr, ptr %16, align 8, !tbaa !9
  %714 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %713, i32 0, i32 33
  %715 = load i32, ptr %17, align 4, !tbaa !5
  %716 = sext i32 %715 to i64
  %717 = getelementptr inbounds float, ptr %714, i64 %716
  store float 0.000000e+00, ptr %717, align 4, !tbaa !51
  br label %718

718:                                              ; preds = %658, %628
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #8
  br label %925

719:                                              ; preds = %104
  %720 = load ptr, ptr %16, align 8, !tbaa !9
  %721 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %720, i32 0, i32 0
  %722 = load i32, ptr %17, align 4, !tbaa !5
  %723 = sext i32 %722 to i64
  %724 = getelementptr inbounds [4 x i32], ptr %721, i64 0, i64 %723
  store i32 -1, ptr %724, align 4, !tbaa !5
  %725 = load ptr, ptr %16, align 8, !tbaa !9
  %726 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %725, i32 0, i32 1
  %727 = load i32, ptr %17, align 4, !tbaa !5
  %728 = sext i32 %727 to i64
  %729 = getelementptr inbounds [4 x i32], ptr %726, i64 0, i64 %728
  store i32 -1, ptr %729, align 4, !tbaa !5
  %730 = load ptr, ptr %16, align 8, !tbaa !9
  %731 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %730, i32 0, i32 2
  %732 = load i32, ptr %17, align 4, !tbaa !5
  %733 = sext i32 %732 to i64
  %734 = getelementptr inbounds float, ptr %731, i64 %733
  store float 0.000000e+00, ptr %734, align 4, !tbaa !51
  %735 = load ptr, ptr %16, align 8, !tbaa !9
  %736 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %735, i32 0, i32 3
  %737 = load i32, ptr %17, align 4, !tbaa !5
  %738 = sext i32 %737 to i64
  %739 = getelementptr inbounds float, ptr %736, i64 %738
  store float 0.000000e+00, ptr %739, align 4, !tbaa !51
  %740 = load ptr, ptr %16, align 8, !tbaa !9
  %741 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %740, i32 0, i32 4
  %742 = load i32, ptr %17, align 4, !tbaa !5
  %743 = sext i32 %742 to i64
  %744 = getelementptr inbounds float, ptr %741, i64 %743
  store float 0.000000e+00, ptr %744, align 4, !tbaa !51
  %745 = load ptr, ptr %16, align 8, !tbaa !9
  %746 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %745, i32 0, i32 5
  %747 = load i32, ptr %17, align 4, !tbaa !5
  %748 = sext i32 %747 to i64
  %749 = getelementptr inbounds float, ptr %746, i64 %748
  store float 0.000000e+00, ptr %749, align 4, !tbaa !51
  %750 = load ptr, ptr %16, align 8, !tbaa !9
  %751 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %750, i32 0, i32 6
  %752 = getelementptr inbounds %struct.b2Vec2W, ptr %751, i32 0, i32 0
  %753 = load i32, ptr %17, align 4, !tbaa !5
  %754 = sext i32 %753 to i64
  %755 = getelementptr inbounds float, ptr %752, i64 %754
  store float 0.000000e+00, ptr %755, align 4, !tbaa !51
  %756 = load ptr, ptr %16, align 8, !tbaa !9
  %757 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %756, i32 0, i32 6
  %758 = getelementptr inbounds %struct.b2Vec2W, ptr %757, i32 0, i32 1
  %759 = load i32, ptr %17, align 4, !tbaa !5
  %760 = sext i32 %759 to i64
  %761 = getelementptr inbounds float, ptr %758, i64 %760
  store float 0.000000e+00, ptr %761, align 4, !tbaa !51
  %762 = load ptr, ptr %16, align 8, !tbaa !9
  %763 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %762, i32 0, i32 7
  %764 = load i32, ptr %17, align 4, !tbaa !5
  %765 = sext i32 %764 to i64
  %766 = getelementptr inbounds float, ptr %763, i64 %765
  store float 0.000000e+00, ptr %766, align 4, !tbaa !51
  %767 = load ptr, ptr %16, align 8, !tbaa !9
  %768 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %767, i32 0, i32 8
  %769 = load i32, ptr %17, align 4, !tbaa !5
  %770 = sext i32 %769 to i64
  %771 = getelementptr inbounds float, ptr %768, i64 %770
  store float 0.000000e+00, ptr %771, align 4, !tbaa !51
  %772 = load ptr, ptr %16, align 8, !tbaa !9
  %773 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %772, i32 0, i32 9
  %774 = load i32, ptr %17, align 4, !tbaa !5
  %775 = sext i32 %774 to i64
  %776 = getelementptr inbounds float, ptr %773, i64 %775
  store float 0.000000e+00, ptr %776, align 4, !tbaa !51
  %777 = load ptr, ptr %16, align 8, !tbaa !9
  %778 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %777, i32 0, i32 10
  %779 = load i32, ptr %17, align 4, !tbaa !5
  %780 = sext i32 %779 to i64
  %781 = getelementptr inbounds float, ptr %778, i64 %780
  store float 0.000000e+00, ptr %781, align 4, !tbaa !51
  %782 = load ptr, ptr %16, align 8, !tbaa !9
  %783 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %782, i32 0, i32 11
  %784 = load i32, ptr %17, align 4, !tbaa !5
  %785 = sext i32 %784 to i64
  %786 = getelementptr inbounds float, ptr %783, i64 %785
  store float 0.000000e+00, ptr %786, align 4, !tbaa !51
  %787 = load ptr, ptr %16, align 8, !tbaa !9
  %788 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %787, i32 0, i32 12
  %789 = load i32, ptr %17, align 4, !tbaa !5
  %790 = sext i32 %789 to i64
  %791 = getelementptr inbounds float, ptr %788, i64 %790
  store float 0.000000e+00, ptr %791, align 4, !tbaa !51
  %792 = load ptr, ptr %16, align 8, !tbaa !9
  %793 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %792, i32 0, i32 13
  %794 = load i32, ptr %17, align 4, !tbaa !5
  %795 = sext i32 %794 to i64
  %796 = getelementptr inbounds float, ptr %793, i64 %795
  store float 0.000000e+00, ptr %796, align 4, !tbaa !51
  %797 = load ptr, ptr %16, align 8, !tbaa !9
  %798 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %797, i32 0, i32 14
  %799 = load i32, ptr %17, align 4, !tbaa !5
  %800 = sext i32 %799 to i64
  %801 = getelementptr inbounds float, ptr %798, i64 %800
  store float 0.000000e+00, ptr %801, align 4, !tbaa !51
  %802 = load ptr, ptr %16, align 8, !tbaa !9
  %803 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %802, i32 0, i32 15
  %804 = getelementptr inbounds %struct.b2Vec2W, ptr %803, i32 0, i32 0
  %805 = load i32, ptr %17, align 4, !tbaa !5
  %806 = sext i32 %805 to i64
  %807 = getelementptr inbounds float, ptr %804, i64 %806
  store float 0.000000e+00, ptr %807, align 4, !tbaa !51
  %808 = load ptr, ptr %16, align 8, !tbaa !9
  %809 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %808, i32 0, i32 15
  %810 = getelementptr inbounds %struct.b2Vec2W, ptr %809, i32 0, i32 1
  %811 = load i32, ptr %17, align 4, !tbaa !5
  %812 = sext i32 %811 to i64
  %813 = getelementptr inbounds float, ptr %810, i64 %812
  store float 0.000000e+00, ptr %813, align 4, !tbaa !51
  %814 = load ptr, ptr %16, align 8, !tbaa !9
  %815 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %814, i32 0, i32 16
  %816 = getelementptr inbounds %struct.b2Vec2W, ptr %815, i32 0, i32 0
  %817 = load i32, ptr %17, align 4, !tbaa !5
  %818 = sext i32 %817 to i64
  %819 = getelementptr inbounds float, ptr %816, i64 %818
  store float 0.000000e+00, ptr %819, align 4, !tbaa !51
  %820 = load ptr, ptr %16, align 8, !tbaa !9
  %821 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %820, i32 0, i32 16
  %822 = getelementptr inbounds %struct.b2Vec2W, ptr %821, i32 0, i32 1
  %823 = load i32, ptr %17, align 4, !tbaa !5
  %824 = sext i32 %823 to i64
  %825 = getelementptr inbounds float, ptr %822, i64 %824
  store float 0.000000e+00, ptr %825, align 4, !tbaa !51
  %826 = load ptr, ptr %16, align 8, !tbaa !9
  %827 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %826, i32 0, i32 19
  %828 = load i32, ptr %17, align 4, !tbaa !5
  %829 = sext i32 %828 to i64
  %830 = getelementptr inbounds float, ptr %827, i64 %829
  store float 0.000000e+00, ptr %830, align 4, !tbaa !51
  %831 = load ptr, ptr %16, align 8, !tbaa !9
  %832 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %831, i32 0, i32 20
  %833 = load i32, ptr %17, align 4, !tbaa !5
  %834 = sext i32 %833 to i64
  %835 = getelementptr inbounds float, ptr %832, i64 %834
  store float 0.000000e+00, ptr %835, align 4, !tbaa !51
  %836 = load ptr, ptr %16, align 8, !tbaa !9
  %837 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %836, i32 0, i32 22
  %838 = load i32, ptr %17, align 4, !tbaa !5
  %839 = sext i32 %838 to i64
  %840 = getelementptr inbounds float, ptr %837, i64 %839
  store float 0.000000e+00, ptr %840, align 4, !tbaa !51
  %841 = load ptr, ptr %16, align 8, !tbaa !9
  %842 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %841, i32 0, i32 21
  %843 = load i32, ptr %17, align 4, !tbaa !5
  %844 = sext i32 %843 to i64
  %845 = getelementptr inbounds float, ptr %842, i64 %844
  store float 0.000000e+00, ptr %845, align 4, !tbaa !51
  %846 = load ptr, ptr %16, align 8, !tbaa !9
  %847 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %846, i32 0, i32 17
  %848 = load i32, ptr %17, align 4, !tbaa !5
  %849 = sext i32 %848 to i64
  %850 = getelementptr inbounds float, ptr %847, i64 %849
  store float 0.000000e+00, ptr %850, align 4, !tbaa !51
  %851 = load ptr, ptr %16, align 8, !tbaa !9
  %852 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %851, i32 0, i32 18
  %853 = load i32, ptr %17, align 4, !tbaa !5
  %854 = sext i32 %853 to i64
  %855 = getelementptr inbounds float, ptr %852, i64 %854
  store float 0.000000e+00, ptr %855, align 4, !tbaa !51
  %856 = load ptr, ptr %16, align 8, !tbaa !9
  %857 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %856, i32 0, i32 23
  %858 = getelementptr inbounds %struct.b2Vec2W, ptr %857, i32 0, i32 0
  %859 = load i32, ptr %17, align 4, !tbaa !5
  %860 = sext i32 %859 to i64
  %861 = getelementptr inbounds float, ptr %858, i64 %860
  store float 0.000000e+00, ptr %861, align 4, !tbaa !51
  %862 = load ptr, ptr %16, align 8, !tbaa !9
  %863 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %862, i32 0, i32 23
  %864 = getelementptr inbounds %struct.b2Vec2W, ptr %863, i32 0, i32 1
  %865 = load i32, ptr %17, align 4, !tbaa !5
  %866 = sext i32 %865 to i64
  %867 = getelementptr inbounds float, ptr %864, i64 %866
  store float 0.000000e+00, ptr %867, align 4, !tbaa !51
  %868 = load ptr, ptr %16, align 8, !tbaa !9
  %869 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %868, i32 0, i32 24
  %870 = getelementptr inbounds %struct.b2Vec2W, ptr %869, i32 0, i32 0
  %871 = load i32, ptr %17, align 4, !tbaa !5
  %872 = sext i32 %871 to i64
  %873 = getelementptr inbounds float, ptr %870, i64 %872
  store float 0.000000e+00, ptr %873, align 4, !tbaa !51
  %874 = load ptr, ptr %16, align 8, !tbaa !9
  %875 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %874, i32 0, i32 24
  %876 = getelementptr inbounds %struct.b2Vec2W, ptr %875, i32 0, i32 1
  %877 = load i32, ptr %17, align 4, !tbaa !5
  %878 = sext i32 %877 to i64
  %879 = getelementptr inbounds float, ptr %876, i64 %878
  store float 0.000000e+00, ptr %879, align 4, !tbaa !51
  %880 = load ptr, ptr %16, align 8, !tbaa !9
  %881 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %880, i32 0, i32 25
  %882 = load i32, ptr %17, align 4, !tbaa !5
  %883 = sext i32 %882 to i64
  %884 = getelementptr inbounds float, ptr %881, i64 %883
  store float 0.000000e+00, ptr %884, align 4, !tbaa !51
  %885 = load ptr, ptr %16, align 8, !tbaa !9
  %886 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %885, i32 0, i32 26
  %887 = load i32, ptr %17, align 4, !tbaa !5
  %888 = sext i32 %887 to i64
  %889 = getelementptr inbounds float, ptr %886, i64 %888
  store float 0.000000e+00, ptr %889, align 4, !tbaa !51
  %890 = load ptr, ptr %16, align 8, !tbaa !9
  %891 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %890, i32 0, i32 28
  %892 = load i32, ptr %17, align 4, !tbaa !5
  %893 = sext i32 %892 to i64
  %894 = getelementptr inbounds float, ptr %891, i64 %893
  store float 0.000000e+00, ptr %894, align 4, !tbaa !51
  %895 = load ptr, ptr %16, align 8, !tbaa !9
  %896 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %895, i32 0, i32 27
  %897 = load i32, ptr %17, align 4, !tbaa !5
  %898 = sext i32 %897 to i64
  %899 = getelementptr inbounds float, ptr %896, i64 %898
  store float 0.000000e+00, ptr %899, align 4, !tbaa !51
  %900 = load ptr, ptr %16, align 8, !tbaa !9
  %901 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %900, i32 0, i32 29
  %902 = load i32, ptr %17, align 4, !tbaa !5
  %903 = sext i32 %902 to i64
  %904 = getelementptr inbounds float, ptr %901, i64 %903
  store float 0.000000e+00, ptr %904, align 4, !tbaa !51
  %905 = load ptr, ptr %16, align 8, !tbaa !9
  %906 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %905, i32 0, i32 30
  %907 = load i32, ptr %17, align 4, !tbaa !5
  %908 = sext i32 %907 to i64
  %909 = getelementptr inbounds float, ptr %906, i64 %908
  store float 0.000000e+00, ptr %909, align 4, !tbaa !51
  %910 = load ptr, ptr %16, align 8, !tbaa !9
  %911 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %910, i32 0, i32 31
  %912 = load i32, ptr %17, align 4, !tbaa !5
  %913 = sext i32 %912 to i64
  %914 = getelementptr inbounds float, ptr %911, i64 %913
  store float 0.000000e+00, ptr %914, align 4, !tbaa !51
  %915 = load ptr, ptr %16, align 8, !tbaa !9
  %916 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %915, i32 0, i32 32
  %917 = load i32, ptr %17, align 4, !tbaa !5
  %918 = sext i32 %917 to i64
  %919 = getelementptr inbounds float, ptr %916, i64 %918
  store float 0.000000e+00, ptr %919, align 4, !tbaa !51
  %920 = load ptr, ptr %16, align 8, !tbaa !9
  %921 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %920, i32 0, i32 33
  %922 = load i32, ptr %17, align 4, !tbaa !5
  %923 = sext i32 %922 to i64
  %924 = getelementptr inbounds float, ptr %921, i64 %923
  store float 0.000000e+00, ptr %924, align 4, !tbaa !51
  br label %925

925:                                              ; preds = %719, %718
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  br label %926

926:                                              ; preds = %925
  %927 = load i32, ptr %17, align 4, !tbaa !5
  %928 = add nsw i32 %927, 1
  store i32 %928, ptr %17, align 4, !tbaa !5
  br label %100, !llvm.loop !67

929:                                              ; preds = %103
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  br label %930

930:                                              ; preds = %929
  %931 = load i32, ptr %14, align 4, !tbaa !5
  %932 = add nsw i32 %931, 1
  store i32 %932, ptr %14, align 4, !tbaa !5
  br label %90, !llvm.loop !69

933:                                              ; preds = %94
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 12, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #8
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { cold noreturn nounwind memory(inaccessiblemem: write) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { 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 #6 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { 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, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !10, i64 64}
!12 = !{!"b2StepContext", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !6, i64 16, !14, i64 20, !14, i64 32, !14, i64 44, !13, i64 56, !13, i64 60, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !6, i64 104, !10, i64 112, !15, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !6, i64 152, !6, i64 156, !10, i64 160, !6, i64 168, !16, i64 172, !7, i64 173, !17, i64 240, !7, i64 244}
!13 = !{!"float", !7, i64 0}
!14 = !{!"b2Softness", !13, i64 0, !13, i64 4, !13, i64 8}
!15 = !{!"b2AtomicInt", !6, i64 0}
!16 = !{!"_Bool", !7, i64 0}
!17 = !{!"b2AtomicU32", !6, i64 0}
!18 = !{!12, !10, i64 136}
!19 = !{!12, !10, i64 144}
!20 = !{!12, !10, i64 80}
!21 = !{i64 0, i64 4, !22, i64 4, i64 4, !22, i64 8, i64 4, !22}
!22 = !{!13, !13, i64 0}
!23 = !{!24, !16, i64 1800}
!24 = !{!"b2World", !25, i64 0, !27, i64 40, !29, i64 336, !30, i64 1008, !26, i64 1032, !30, i64 1048, !26, i64 1072, !30, i64 1088, !26, i64 1112, !30, i64 1128, !26, i64 1152, !30, i64 1168, !26, i64 1192, !30, i64 1208, !30, i64 1232, !26, i64 1256, !26, i64 1272, !26, i64 1288, !26, i64 1304, !26, i64 1320, !26, i64 1336, !26, i64 1352, !26, i64 1368, !7, i64 1384, !7, i64 1416, !6, i64 1448, !26, i64 1456, !31, i64 1472, !31, i64 1488, !31, i64 1504, !31, i64 1520, !32, i64 1536, !6, i64 1544, !33, i64 1548, !13, i64 1556, !13, i64 1560, !13, i64 1564, !13, i64 1568, !13, i64 1572, !13, i64 1576, !13, i64 1580, !13, i64 1584, !10, i64 1592, !10, i64 1600, !34, i64 1608, !35, i64 1612, !10, i64 1704, !10, i64 1712, !10, i64 1720, !10, i64 1728, !6, i64 1736, !10, i64 1744, !10, i64 1752, !10, i64 1760, !10, i64 1768, !10, i64 1776, !13, i64 1784, !6, i64 1788, !6, i64 1792, !34, i64 1796, !16, i64 1798, !16, i64 1799, !16, i64 1800, !16, i64 1801, !16, i64 1802, !16, i64 1803}
!25 = !{!"b2ArenaAllocator", !10, i64 0, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !26, i64 24}
!26 = !{!"", !10, i64 0, !6, i64 8, !6, i64 12}
!27 = !{!"b2BroadPhase", !7, i64 0, !6, i64 216, !28, i64 224, !26, i64 240, !10, i64 256, !10, i64 264, !6, i64 272, !15, i64 276, !28, i64 280}
!28 = !{!"b2HashSet", !10, i64 0, !6, i64 8, !6, i64 12}
!29 = !{!"b2ConstraintGraph", !7, i64 0}
!30 = !{!"b2IdPool", !26, i64 0, !6, i64 16}
!31 = !{!"b2BitSet", !10, i64 0, !6, i64 8, !6, i64 12}
!32 = !{!"long", !7, i64 0}
!33 = !{!"b2Vec2", !13, i64 0, !13, i64 4}
!34 = !{!"short", !7, i64 0}
!35 = !{!"b2Profile", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !13, i64 44, !13, i64 48, !13, i64 52, !13, i64 56, !13, i64 60, !13, i64 64, !13, i64 68, !13, i64 72, !13, i64 76, !13, i64 80, !13, i64 84}
!36 = !{i8 0, i8 2}
!37 = !{}
!38 = !{!39, !6, i64 4}
!39 = !{!"b2ContactSim", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !40, i64 36, !13, i64 148, !13, i64 152, !13, i64 156, !13, i64 160, !6, i64 164, !41, i64 168}
!40 = !{!"b2Manifold", !33, i64 0, !13, i64 8, !7, i64 12, !6, i64 108}
!41 = !{!"b2SimplexCache", !34, i64 0, !7, i64 2, !7, i64 5}
!42 = !{!39, !6, i64 8}
!43 = !{!39, !13, i64 20}
!44 = !{!39, !13, i64 24}
!45 = !{i64 0, i64 4, !22, i64 4, i64 4, !22}
!46 = !{!47, !13, i64 8}
!47 = !{!"b2BodyState", !33, i64 0, !13, i64 8, !6, i64 12, !33, i64 16, !48, i64 24}
!48 = !{!"b2Rot", !13, i64 0, !13, i64 4}
!49 = !{!39, !13, i64 28}
!50 = !{!39, !13, i64 32}
!51 = !{!7, !7, i64 0}
!52 = !{!33, !13, i64 0}
!53 = !{!33, !13, i64 4}
!54 = !{!39, !13, i64 148}
!55 = !{!39, !13, i64 160}
!56 = !{!39, !13, i64 152}
!57 = !{!39, !13, i64 156}
!58 = !{!40, !13, i64 8}
!59 = !{!14, !13, i64 0}
!60 = !{!14, !13, i64 4}
!61 = !{!14, !13, i64 8}
!62 = !{!63, !13, i64 24}
!63 = !{!"b2ManifoldPoint", !33, i64 0, !33, i64 8, !33, i64 16, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !34, i64 44, !16, i64 46}
!64 = !{!63, !13, i64 28}
!65 = !{!63, !13, i64 32}
!66 = !{!40, !6, i64 108}
!67 = distinct !{!67, !68}
!68 = !{!"llvm.loop.mustprogress"}
!69 = distinct !{!69, !68}


; 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.b2ContactConstraintSIMD = type { [4 x i32], [4 x i32], <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, %struct.b2Vec2W, %struct.b2Vec2W, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float> }
%struct.b2Vec2W = type { <4 x float>, <4 x float> }
%struct.b2BodyState = type { %struct.b2Vec2, float, i32, %struct.b2Vec2, %struct.b2Rot }
%struct.b2Vec2 = type { float, float }
%struct.b2Rot = type { float, float }

@.str = external hidden unnamed_addr constant [34 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [70 x i8], align 1

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

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

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

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

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

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local void @b2PrepareContactsTask(i32 noundef %0, i32 noundef %1, ptr nocapture noundef readonly %2) local_unnamed_addr #4 {
  %4 = getelementptr inbounds i8, ptr %2, i64 64
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %6 = getelementptr inbounds i8, ptr %2, i64 136
  %7 = load ptr, ptr %6, align 8, !tbaa !16
  %8 = getelementptr inbounds i8, ptr %2, i64 144
  %9 = load ptr, ptr %8, align 8, !tbaa !17
  %10 = getelementptr inbounds i8, ptr %2, i64 80
  %11 = load ptr, ptr %10, align 8, !tbaa !18
  %12 = getelementptr inbounds i8, ptr %2, i64 32
  %.sroa.0343.0.copyload = load float, ptr %12, align 8, !tbaa !19
  %.sroa.4344.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 36
  %.sroa.4344.0.copyload = load float, ptr %.sroa.4344.0..sroa_idx, align 4, !tbaa !19
  %.sroa.5345.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 40
  %.sroa.5345.0.copyload = load float, ptr %.sroa.5345.0..sroa_idx, align 8, !tbaa !19
  %13 = getelementptr inbounds i8, ptr %2, i64 44
  %.sroa.0341.0.copyload = load float, ptr %13, align 4, !tbaa !19
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 48
  %.sroa.4.0.copyload = load float, ptr %.sroa.4.0..sroa_idx, align 4, !tbaa !19
  %.sroa.5342.0..sroa_idx = getelementptr inbounds i8, ptr %2, i64 52
  %.sroa.5342.0.copyload = load float, ptr %.sroa.5342.0..sroa_idx, align 4, !tbaa !19
  %14 = getelementptr inbounds i8, ptr %5, i64 1800
  %15 = load i8, ptr %14, align 8, !tbaa !20, !range !33, !noundef !34
  %16 = trunc nuw i8 %15 to i1
  %17 = select i1 %16, float 1.000000e+00, float 0.000000e+00
  %18 = icmp slt i32 %0, %1
  br i1 %18, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %3
  %19 = sext i32 %0 to i64
  %wide.trip.count = sext i32 %1 to i64
  br label %.lr.ph

._crit_edge:                                      ; preds = %59, %3
  ret void

.lr.ph:                                           ; preds = %.lr.ph.preheader, %59
  %indvars.iv377 = phi i64 [ %19, %.lr.ph.preheader ], [ %indvars.iv.next378, %59 ]
  %20 = getelementptr inbounds %struct.b2ContactConstraintSIMD, ptr %9, i64 %indvars.iv377
  %21 = getelementptr inbounds i8, ptr %20, i64 16
  %22 = getelementptr inbounds i8, ptr %20, i64 32
  %23 = getelementptr inbounds i8, ptr %20, i64 48
  %24 = getelementptr inbounds i8, ptr %20, i64 64
  %25 = getelementptr inbounds i8, ptr %20, i64 80
  %26 = getelementptr inbounds i8, ptr %20, i64 176
  %27 = getelementptr inbounds i8, ptr %20, i64 96
  %28 = getelementptr inbounds i8, ptr %20, i64 112
  %29 = getelementptr inbounds i8, ptr %20, i64 128
  %30 = getelementptr inbounds i8, ptr %20, i64 144
  %31 = getelementptr inbounds i8, ptr %20, i64 576
  %32 = getelementptr inbounds i8, ptr %20, i64 160
  %33 = getelementptr inbounds i8, ptr %20, i64 192
  %34 = getelementptr inbounds i8, ptr %20, i64 208
  %35 = getelementptr inbounds i8, ptr %20, i64 224
  %36 = getelementptr inbounds i8, ptr %20, i64 240
  %37 = getelementptr inbounds i8, ptr %20, i64 256
  %38 = getelementptr inbounds i8, ptr %20, i64 272
  %39 = getelementptr inbounds i8, ptr %20, i64 288
  %40 = getelementptr inbounds i8, ptr %20, i64 304
  %41 = getelementptr inbounds i8, ptr %20, i64 352
  %42 = getelementptr inbounds i8, ptr %20, i64 368
  %43 = getelementptr inbounds i8, ptr %20, i64 400
  %44 = getelementptr inbounds i8, ptr %20, i64 384
  %45 = getelementptr inbounds i8, ptr %20, i64 320
  %46 = getelementptr inbounds i8, ptr %20, i64 336
  %47 = getelementptr inbounds i8, ptr %20, i64 592
  %48 = getelementptr inbounds i8, ptr %20, i64 480
  %49 = getelementptr inbounds i8, ptr %20, i64 496
  %50 = getelementptr inbounds i8, ptr %20, i64 528
  %51 = getelementptr inbounds i8, ptr %20, i64 512
  %52 = getelementptr inbounds i8, ptr %20, i64 416
  %53 = getelementptr inbounds i8, ptr %20, i64 432
  %54 = getelementptr inbounds i8, ptr %20, i64 448
  %55 = getelementptr inbounds i8, ptr %20, i64 464
  %56 = getelementptr inbounds i8, ptr %20, i64 544
  %57 = getelementptr inbounds i8, ptr %20, i64 560
  %58 = getelementptr inbounds i8, ptr %20, i64 608
  %.idx = shl i64 %indvars.iv377, 5
  %invariant.gep = getelementptr i8, ptr %7, i64 %.idx
  br label %60

59:                                               ; preds = %275
  %indvars.iv.next378 = add nsw i64 %indvars.iv377, 1
  %exitcond380.not = icmp eq i64 %indvars.iv.next378, %wide.trip.count
  br i1 %exitcond380.not, label %._crit_edge, label %.lr.ph, !llvm.loop !35

60:                                               ; preds = %.lr.ph, %275
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %275 ]
  %gep = getelementptr ptr, ptr %invariant.gep, i64 %indvars.iv
  %61 = load ptr, ptr %gep, align 8, !tbaa !37
  %.not = icmp eq ptr %61, null
  br i1 %.not, label %236, label %62

62:                                               ; preds = %60
  %63 = getelementptr inbounds i8, ptr %61, i64 36
  %64 = getelementptr inbounds i8, ptr %61, i64 4
  %65 = load i32, ptr %64, align 4, !tbaa !38
  %66 = getelementptr inbounds i8, ptr %61, i64 8
  %67 = load i32, ptr %66, align 4, !tbaa !42
  %68 = getelementptr inbounds [4 x i32], ptr %20, i64 0, i64 %indvars.iv
  store i32 %65, ptr %68, align 4, !tbaa !43
  %69 = getelementptr inbounds [4 x i32], ptr %21, i64 0, i64 %indvars.iv
  store i32 %67, ptr %69, align 4, !tbaa !43
  %70 = getelementptr inbounds i8, ptr %61, i64 20
  %71 = load float, ptr %70, align 4, !tbaa !44
  %72 = getelementptr inbounds i8, ptr %61, i64 24
  %73 = load float, ptr %72, align 4, !tbaa !45
  %.not365 = icmp eq i32 %65, -1
  br i1 %.not365, label %79, label %74

74:                                               ; preds = %62
  %75 = sext i32 %65 to i64
  %76 = getelementptr inbounds %struct.b2BodyState, ptr %11, i64 %75
  %.sroa.0124.0.copyload = load <2 x float>, ptr %76, align 4
  %77 = getelementptr inbounds i8, ptr %76, i64 8
  %78 = load float, ptr %77, align 4, !tbaa !46
  br label %79

79:                                               ; preds = %74, %62
  %.0360 = phi float [ %78, %74 ], [ 0.000000e+00, %62 ]
  %.sroa.0124.2 = phi <2 x float> [ %.sroa.0124.0.copyload, %74 ], [ zeroinitializer, %62 ]
  %80 = getelementptr inbounds i8, ptr %61, i64 28
  %81 = load float, ptr %80, align 4, !tbaa !49
  %82 = getelementptr inbounds i8, ptr %61, i64 32
  %83 = load float, ptr %82, align 4, !tbaa !50
  %.not366 = icmp eq i32 %67, -1
  br i1 %.not366, label %89, label %84

84:                                               ; preds = %79
  %85 = sext i32 %67 to i64
  %86 = getelementptr inbounds %struct.b2BodyState, ptr %11, i64 %85
  %.sroa.0107.0.copyload = load <2 x float>, ptr %86, align 4
  %87 = getelementptr inbounds i8, ptr %86, i64 8
  %88 = load float, ptr %87, align 4, !tbaa !46
  br label %89

89:                                               ; preds = %84, %79
  %.0361 = phi float [ %88, %84 ], [ 0.000000e+00, %79 ]
  %.sroa.0107.2 = phi <2 x float> [ %.sroa.0107.0.copyload, %84 ], [ zeroinitializer, %79 ]
  %90 = getelementptr inbounds float, ptr %22, i64 %indvars.iv
  store float %71, ptr %90, align 4, !tbaa !51
  %91 = getelementptr inbounds float, ptr %23, i64 %indvars.iv
  store float %81, ptr %91, align 4, !tbaa !51
  %92 = getelementptr inbounds float, ptr %24, i64 %indvars.iv
  store float %73, ptr %92, align 4, !tbaa !51
  %93 = getelementptr inbounds float, ptr %25, i64 %indvars.iv
  store float %83, ptr %93, align 4, !tbaa !51
  %94 = fadd float %73, %83
  %95 = fcmp ogt float %94, 0.000000e+00
  %96 = fdiv float 1.000000e+00, %94
  %97 = select i1 %95, float %96, float 0.000000e+00
  %98 = getelementptr inbounds float, ptr %26, i64 %indvars.iv
  store float %97, ptr %98, align 4, !tbaa !51
  %or.cond = or i1 %.not365, %.not366
  %.sroa.0341.0.copyload..sroa.0343.0.copyload = select i1 %or.cond, float %.sroa.0341.0.copyload, float %.sroa.0343.0.copyload
  %.sroa.4.0.copyload..sroa.4344.0.copyload = select i1 %or.cond, float %.sroa.4.0.copyload, float %.sroa.4344.0.copyload
  %.sroa.5342.0.copyload..sroa.5345.0.copyload = select i1 %or.cond, float %.sroa.5342.0.copyload, float %.sroa.5345.0.copyload
  %.sroa.074.0.copyload = load <2 x float>, ptr %63, align 4
  %.sroa.074.0.vec.extract = extractelement <2 x float> %.sroa.074.0.copyload, i64 0
  %99 = getelementptr inbounds float, ptr %27, i64 %indvars.iv
  store float %.sroa.074.0.vec.extract, ptr %99, align 4, !tbaa !51
  %.sroa.074.4.vec.extract = extractelement <2 x float> %.sroa.074.0.copyload, i64 1
  %100 = getelementptr inbounds float, ptr %28, i64 %indvars.iv
  store float %.sroa.074.4.vec.extract, ptr %100, align 4, !tbaa !51
  %101 = getelementptr inbounds i8, ptr %61, i64 148
  %102 = load float, ptr %101, align 4, !tbaa !52
  %103 = getelementptr inbounds float, ptr %29, i64 %indvars.iv
  store float %102, ptr %103, align 4, !tbaa !51
  %104 = getelementptr inbounds i8, ptr %61, i64 160
  %105 = load float, ptr %104, align 4, !tbaa !53
  %106 = getelementptr inbounds float, ptr %30, i64 %indvars.iv
  store float %105, ptr %106, align 4, !tbaa !51
  %107 = getelementptr inbounds i8, ptr %61, i64 152
  %108 = load float, ptr %107, align 4, !tbaa !54
  %109 = getelementptr inbounds float, ptr %31, i64 %indvars.iv
  store float %108, ptr %109, align 4, !tbaa !51
  %110 = getelementptr inbounds i8, ptr %61, i64 156
  %111 = load float, ptr %110, align 4, !tbaa !55
  %112 = getelementptr inbounds float, ptr %32, i64 %indvars.iv
  store float %111, ptr %112, align 4, !tbaa !51
  %113 = getelementptr inbounds i8, ptr %61, i64 44
  %114 = load float, ptr %113, align 4, !tbaa !56
  %115 = fmul float %17, %114
  %116 = getelementptr inbounds float, ptr %33, i64 %indvars.iv
  store float %115, ptr %116, align 4, !tbaa !51
  %117 = getelementptr inbounds float, ptr %34, i64 %indvars.iv
  store float %.sroa.0341.0.copyload..sroa.0343.0.copyload, ptr %117, align 4, !tbaa !51
  %118 = getelementptr inbounds float, ptr %35, i64 %indvars.iv
  store float %.sroa.4.0.copyload..sroa.4344.0.copyload, ptr %118, align 4, !tbaa !51
  %119 = getelementptr inbounds float, ptr %36, i64 %indvars.iv
  store float %.sroa.5342.0.copyload..sroa.5345.0.copyload, ptr %119, align 4, !tbaa !51
  %120 = tail call <2 x float> @b2RightPerp(<2 x float> %.sroa.074.0.copyload)
  %121 = getelementptr inbounds i8, ptr %61, i64 56
  %.sroa.060.0.copyload = load <2 x float>, ptr %121, align 4
  %122 = getelementptr inbounds i8, ptr %61, i64 64
  %.sroa.055.0.copyload = load <2 x float>, ptr %122, align 4
  %.sroa.060.0.vec.extract = extractelement <2 x float> %.sroa.060.0.copyload, i64 0
  %123 = getelementptr inbounds float, ptr %37, i64 %indvars.iv
  store float %.sroa.060.0.vec.extract, ptr %123, align 4, !tbaa !51
  %.sroa.060.4.vec.extract = extractelement <2 x float> %.sroa.060.0.copyload, i64 1
  %124 = getelementptr inbounds float, ptr %38, i64 %indvars.iv
  store float %.sroa.060.4.vec.extract, ptr %124, align 4, !tbaa !51
  %.sroa.055.0.vec.extract = extractelement <2 x float> %.sroa.055.0.copyload, i64 0
  %125 = getelementptr inbounds float, ptr %39, i64 %indvars.iv
  store float %.sroa.055.0.vec.extract, ptr %125, align 4, !tbaa !51
  %.sroa.055.4.vec.extract = extractelement <2 x float> %.sroa.055.0.copyload, i64 1
  %126 = getelementptr inbounds float, ptr %40, i64 %indvars.iv
  store float %.sroa.055.4.vec.extract, ptr %126, align 4, !tbaa !51
  %127 = getelementptr inbounds i8, ptr %61, i64 72
  %128 = load float, ptr %127, align 4, !tbaa !57
  %129 = tail call <2 x float> @b2Sub(<2 x float> %.sroa.055.0.copyload, <2 x float> %.sroa.060.0.copyload)
  %130 = tail call float @b2Dot(<2 x float> %129, <2 x float> %.sroa.074.0.copyload)
  %131 = fsub float %128, %130
  %132 = getelementptr inbounds float, ptr %41, i64 %indvars.iv
  store float %131, ptr %132, align 4, !tbaa !51
  %133 = getelementptr inbounds i8, ptr %61, i64 76
  %134 = load float, ptr %133, align 4, !tbaa !59
  %135 = fmul float %17, %134
  %136 = getelementptr inbounds float, ptr %42, i64 %indvars.iv
  store float %135, ptr %136, align 4, !tbaa !51
  %137 = getelementptr inbounds i8, ptr %61, i64 80
  %138 = load float, ptr %137, align 4, !tbaa !60
  %139 = fmul float %17, %138
  %140 = getelementptr inbounds float, ptr %43, i64 %indvars.iv
  store float %139, ptr %140, align 4, !tbaa !51
  %141 = getelementptr inbounds float, ptr %44, i64 %indvars.iv
  store float 0.000000e+00, ptr %141, align 4, !tbaa !51
  %142 = tail call float @b2Cross(<2 x float> %.sroa.060.0.copyload, <2 x float> %.sroa.074.0.copyload)
  %143 = tail call float @b2Cross(<2 x float> %.sroa.055.0.copyload, <2 x float> %.sroa.074.0.copyload)
  %144 = fadd float %71, %81
  %145 = fmul float %73, %142
  %146 = tail call float @llvm.fmuladd.f32(float %145, float %142, float %144)
  %147 = fmul float %83, %143
  %148 = tail call float @llvm.fmuladd.f32(float %147, float %143, float %146)
  %149 = fcmp ogt float %148, 0.000000e+00
  %150 = fdiv float 1.000000e+00, %148
  %151 = select i1 %149, float %150, float 0.000000e+00
  %152 = getelementptr inbounds float, ptr %45, i64 %indvars.iv
  store float %151, ptr %152, align 4, !tbaa !51
  %153 = tail call float @b2Cross(<2 x float> %.sroa.060.0.copyload, <2 x float> %120)
  %154 = tail call float @b2Cross(<2 x float> %.sroa.055.0.copyload, <2 x float> %120)
  %155 = fmul float %73, %153
  %156 = tail call float @llvm.fmuladd.f32(float %155, float %153, float %144)
  %157 = fmul float %83, %154
  %158 = tail call float @llvm.fmuladd.f32(float %157, float %154, float %156)
  %159 = fcmp ogt float %158, 0.000000e+00
  %160 = fdiv float 1.000000e+00, %158
  %161 = select i1 %159, float %160, float 0.000000e+00
  %162 = getelementptr inbounds float, ptr %46, i64 %indvars.iv
  store float %161, ptr %162, align 4, !tbaa !51
  %163 = tail call <2 x float> @b2CrossSV(float noundef %.0360, <2 x float> %.sroa.060.0.copyload)
  %164 = tail call <2 x float> @b2Add(<2 x float> %.sroa.0124.2, <2 x float> %163)
  %165 = tail call <2 x float> @b2CrossSV(float noundef %.0361, <2 x float> %.sroa.055.0.copyload)
  %166 = tail call <2 x float> @b2Add(<2 x float> %.sroa.0107.2, <2 x float> %165)
  %167 = tail call <2 x float> @b2Sub(<2 x float> %166, <2 x float> %164)
  %168 = tail call float @b2Dot(<2 x float> %.sroa.074.0.copyload, <2 x float> %167)
  %169 = getelementptr inbounds float, ptr %47, i64 %indvars.iv
  store float %168, ptr %169, align 4, !tbaa !51
  %170 = getelementptr inbounds i8, ptr %61, i64 144
  %171 = load i32, ptr %170, align 4, !tbaa !61
  %172 = add i32 %171, -1
  %or.cond3 = icmp ult i32 %172, 2
  br i1 %or.cond3, label %176, label %173

173:                                              ; preds = %89
  %174 = tail call i32 @b2InternalAssertFcn(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 1566) #5
  %.not367 = icmp eq i32 %174, 0
  br i1 %.not367, label %.thread, label %175

175:                                              ; preds = %173
  tail call void @llvm.trap()
  unreachable

176:                                              ; preds = %89
  %177 = icmp eq i32 %171, 2
  br i1 %177, label %178, label %.thread

178:                                              ; preds = %176
  %179 = getelementptr inbounds i8, ptr %61, i64 104
  %.sroa.025.0.copyload = load <2 x float>, ptr %179, align 4
  %180 = getelementptr inbounds i8, ptr %61, i64 112
  %.sroa.020.0.copyload = load <2 x float>, ptr %180, align 4
  %.sroa.025.0.vec.extract = extractelement <2 x float> %.sroa.025.0.copyload, i64 0
  %181 = getelementptr inbounds float, ptr %52, i64 %indvars.iv
  store float %.sroa.025.0.vec.extract, ptr %181, align 4, !tbaa !51
  %.sroa.025.4.vec.extract = extractelement <2 x float> %.sroa.025.0.copyload, i64 1
  %182 = getelementptr inbounds float, ptr %53, i64 %indvars.iv
  store float %.sroa.025.4.vec.extract, ptr %182, align 4, !tbaa !51
  %.sroa.020.0.vec.extract = extractelement <2 x float> %.sroa.020.0.copyload, i64 0
  %183 = getelementptr inbounds float, ptr %54, i64 %indvars.iv
  store float %.sroa.020.0.vec.extract, ptr %183, align 4, !tbaa !51
  %.sroa.020.4.vec.extract = extractelement <2 x float> %.sroa.020.0.copyload, i64 1
  %184 = getelementptr inbounds float, ptr %55, i64 %indvars.iv
  store float %.sroa.020.4.vec.extract, ptr %184, align 4, !tbaa !51
  %185 = getelementptr inbounds i8, ptr %61, i64 120
  %186 = load float, ptr %185, align 4, !tbaa !57
  %187 = tail call <2 x float> @b2Sub(<2 x float> %.sroa.020.0.copyload, <2 x float> %.sroa.025.0.copyload)
  %188 = tail call float @b2Dot(<2 x float> %187, <2 x float> %.sroa.074.0.copyload)
  %189 = fsub float %186, %188
  %190 = getelementptr inbounds float, ptr %48, i64 %indvars.iv
  store float %189, ptr %190, align 4, !tbaa !51
  %191 = getelementptr inbounds i8, ptr %61, i64 124
  %192 = load float, ptr %191, align 4, !tbaa !59
  %193 = fmul float %17, %192
  %194 = getelementptr inbounds float, ptr %49, i64 %indvars.iv
  store float %193, ptr %194, align 4, !tbaa !51
  %195 = getelementptr inbounds i8, ptr %61, i64 128
  %196 = load float, ptr %195, align 4, !tbaa !60
  %197 = fmul float %17, %196
  %198 = getelementptr inbounds float, ptr %50, i64 %indvars.iv
  store float %197, ptr %198, align 4, !tbaa !51
  %199 = getelementptr inbounds float, ptr %51, i64 %indvars.iv
  store float 0.000000e+00, ptr %199, align 4, !tbaa !51
  %200 = tail call float @b2Cross(<2 x float> %.sroa.025.0.copyload, <2 x float> %.sroa.074.0.copyload)
  %201 = tail call float @b2Cross(<2 x float> %.sroa.020.0.copyload, <2 x float> %.sroa.074.0.copyload)
  %202 = fmul float %73, %200
  %203 = tail call float @llvm.fmuladd.f32(float %202, float %200, float %144)
  %204 = fmul float %83, %201
  %205 = tail call float @llvm.fmuladd.f32(float %204, float %201, float %203)
  %206 = fcmp ogt float %205, 0.000000e+00
  %207 = fdiv float 1.000000e+00, %205
  %208 = select i1 %206, float %207, float 0.000000e+00
  %209 = getelementptr inbounds float, ptr %56, i64 %indvars.iv
  store float %208, ptr %209, align 4, !tbaa !51
  %210 = tail call float @b2Cross(<2 x float> %.sroa.025.0.copyload, <2 x float> %120)
  %211 = tail call float @b2Cross(<2 x float> %.sroa.020.0.copyload, <2 x float> %120)
  %212 = fmul float %73, %210
  %213 = tail call float @llvm.fmuladd.f32(float %212, float %210, float %144)
  %214 = fmul float %83, %211
  %215 = tail call float @llvm.fmuladd.f32(float %214, float %211, float %213)
  %216 = fcmp ogt float %215, 0.000000e+00
  %217 = fdiv float 1.000000e+00, %215
  %218 = select i1 %216, float %217, float 0.000000e+00
  %219 = getelementptr inbounds float, ptr %57, i64 %indvars.iv
  store float %218, ptr %219, align 4, !tbaa !51
  %220 = tail call <2 x float> @b2CrossSV(float noundef %.0360, <2 x float> %.sroa.025.0.copyload)
  %221 = tail call <2 x float> @b2Add(<2 x float> %.sroa.0124.2, <2 x float> %220)
  %222 = tail call <2 x float> @b2CrossSV(float noundef %.0361, <2 x float> %.sroa.020.0.copyload)
  %223 = tail call <2 x float> @b2Add(<2 x float> %.sroa.0107.2, <2 x float> %222)
  %224 = tail call <2 x float> @b2Sub(<2 x float> %223, <2 x float> %221)
  %225 = tail call float @b2Dot(<2 x float> %.sroa.074.0.copyload, <2 x float> %224)
  br label %275

.thread:                                          ; preds = %173, %176
  %226 = getelementptr inbounds float, ptr %48, i64 %indvars.iv
  store float 0.000000e+00, ptr %226, align 4, !tbaa !51
  %227 = getelementptr inbounds float, ptr %49, i64 %indvars.iv
  store float 0.000000e+00, ptr %227, align 4, !tbaa !51
  %228 = getelementptr inbounds float, ptr %50, i64 %indvars.iv
  store float 0.000000e+00, ptr %228, align 4, !tbaa !51
  %229 = getelementptr inbounds float, ptr %51, i64 %indvars.iv
  store float 0.000000e+00, ptr %229, align 4, !tbaa !51
  %230 = getelementptr inbounds float, ptr %52, i64 %indvars.iv
  store float 0.000000e+00, ptr %230, align 4, !tbaa !51
  %231 = getelementptr inbounds float, ptr %53, i64 %indvars.iv
  store float 0.000000e+00, ptr %231, align 4, !tbaa !51
  %232 = getelementptr inbounds float, ptr %54, i64 %indvars.iv
  store float 0.000000e+00, ptr %232, align 4, !tbaa !51
  %233 = getelementptr inbounds float, ptr %55, i64 %indvars.iv
  store float 0.000000e+00, ptr %233, align 4, !tbaa !51
  %234 = getelementptr inbounds float, ptr %56, i64 %indvars.iv
  store float 0.000000e+00, ptr %234, align 4, !tbaa !51
  %235 = getelementptr inbounds float, ptr %57, i64 %indvars.iv
  store float 0.000000e+00, ptr %235, align 4, !tbaa !51
  br label %275

236:                                              ; preds = %60
  %237 = getelementptr inbounds [4 x i32], ptr %20, i64 0, i64 %indvars.iv
  store i32 -1, ptr %237, align 4, !tbaa !43
  %238 = getelementptr inbounds [4 x i32], ptr %21, i64 0, i64 %indvars.iv
  store i32 -1, ptr %238, align 4, !tbaa !43
  %239 = getelementptr inbounds float, ptr %22, i64 %indvars.iv
  store float 0.000000e+00, ptr %239, align 4, !tbaa !51
  %240 = getelementptr inbounds float, ptr %23, i64 %indvars.iv
  store float 0.000000e+00, ptr %240, align 4, !tbaa !51
  %241 = getelementptr inbounds float, ptr %24, i64 %indvars.iv
  store float 0.000000e+00, ptr %241, align 4, !tbaa !51
  %242 = getelementptr inbounds float, ptr %25, i64 %indvars.iv
  store float 0.000000e+00, ptr %242, align 4, !tbaa !51
  %243 = getelementptr inbounds float, ptr %27, i64 %indvars.iv
  store float 0.000000e+00, ptr %243, align 4, !tbaa !51
  %244 = getelementptr inbounds float, ptr %28, i64 %indvars.iv
  store float 0.000000e+00, ptr %244, align 4, !tbaa !51
  %245 = getelementptr inbounds float, ptr %29, i64 %indvars.iv
  store float 0.000000e+00, ptr %245, align 4, !tbaa !51
  %246 = getelementptr inbounds float, ptr %30, i64 %indvars.iv
  store float 0.000000e+00, ptr %246, align 4, !tbaa !51
  %247 = getelementptr inbounds float, ptr %32, i64 %indvars.iv
  store float 0.000000e+00, ptr %247, align 4, !tbaa !51
  %248 = getelementptr inbounds float, ptr %26, i64 %indvars.iv
  store float 0.000000e+00, ptr %248, align 4, !tbaa !51
  %249 = getelementptr inbounds float, ptr %33, i64 %indvars.iv
  store float 0.000000e+00, ptr %249, align 4, !tbaa !51
  %250 = getelementptr inbounds float, ptr %34, i64 %indvars.iv
  store float 0.000000e+00, ptr %250, align 4, !tbaa !51
  %251 = getelementptr inbounds float, ptr %35, i64 %indvars.iv
  store float 0.000000e+00, ptr %251, align 4, !tbaa !51
  %252 = getelementptr inbounds float, ptr %36, i64 %indvars.iv
  store float 0.000000e+00, ptr %252, align 4, !tbaa !51
  %253 = getelementptr inbounds float, ptr %37, i64 %indvars.iv
  store float 0.000000e+00, ptr %253, align 4, !tbaa !51
  %254 = getelementptr inbounds float, ptr %38, i64 %indvars.iv
  store float 0.000000e+00, ptr %254, align 4, !tbaa !51
  %255 = getelementptr inbounds float, ptr %39, i64 %indvars.iv
  store float 0.000000e+00, ptr %255, align 4, !tbaa !51
  %256 = getelementptr inbounds float, ptr %40, i64 %indvars.iv
  store float 0.000000e+00, ptr %256, align 4, !tbaa !51
  %257 = getelementptr inbounds float, ptr %41, i64 %indvars.iv
  store float 0.000000e+00, ptr %257, align 4, !tbaa !51
  %258 = getelementptr inbounds float, ptr %42, i64 %indvars.iv
  store float 0.000000e+00, ptr %258, align 4, !tbaa !51
  %259 = getelementptr inbounds float, ptr %43, i64 %indvars.iv
  store float 0.000000e+00, ptr %259, align 4, !tbaa !51
  %260 = getelementptr inbounds float, ptr %44, i64 %indvars.iv
  store float 0.000000e+00, ptr %260, align 4, !tbaa !51
  %261 = getelementptr inbounds float, ptr %45, i64 %indvars.iv
  store float 0.000000e+00, ptr %261, align 4, !tbaa !51
  %262 = getelementptr inbounds float, ptr %46, i64 %indvars.iv
  store float 0.000000e+00, ptr %262, align 4, !tbaa !51
  %263 = getelementptr inbounds float, ptr %52, i64 %indvars.iv
  store float 0.000000e+00, ptr %263, align 4, !tbaa !51
  %264 = getelementptr inbounds float, ptr %53, i64 %indvars.iv
  store float 0.000000e+00, ptr %264, align 4, !tbaa !51
  %265 = getelementptr inbounds float, ptr %54, i64 %indvars.iv
  store float 0.000000e+00, ptr %265, align 4, !tbaa !51
  %266 = getelementptr inbounds float, ptr %55, i64 %indvars.iv
  store float 0.000000e+00, ptr %266, align 4, !tbaa !51
  %267 = getelementptr inbounds float, ptr %48, i64 %indvars.iv
  store float 0.000000e+00, ptr %267, align 4, !tbaa !51
  %268 = getelementptr inbounds float, ptr %49, i64 %indvars.iv
  store float 0.000000e+00, ptr %268, align 4, !tbaa !51
  %269 = getelementptr inbounds float, ptr %50, i64 %indvars.iv
  store float 0.000000e+00, ptr %269, align 4, !tbaa !51
  %270 = getelementptr inbounds float, ptr %51, i64 %indvars.iv
  store float 0.000000e+00, ptr %270, align 4, !tbaa !51
  %271 = getelementptr inbounds float, ptr %56, i64 %indvars.iv
  store float 0.000000e+00, ptr %271, align 4, !tbaa !51
  %272 = getelementptr inbounds float, ptr %57, i64 %indvars.iv
  store float 0.000000e+00, ptr %272, align 4, !tbaa !51
  %273 = getelementptr inbounds float, ptr %31, i64 %indvars.iv
  store float 0.000000e+00, ptr %273, align 4, !tbaa !51
  %274 = getelementptr inbounds float, ptr %47, i64 %indvars.iv
  store float 0.000000e+00, ptr %274, align 4, !tbaa !51
  br label %275

275:                                              ; preds = %178, %.thread, %236
  %.sink = phi float [ %225, %178 ], [ 0.000000e+00, %.thread ], [ 0.000000e+00, %236 ]
  %276 = getelementptr inbounds float, ptr %58, i64 %indvars.iv
  store float %.sink, ptr %276, align 4, !tbaa !51
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 4
  br i1 %exitcond.not, label %59, label %60, !llvm.loop !62
}

attributes #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 = { cold noreturn nounwind memory(inaccessiblemem: write) }
attributes #2 = { 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 #3 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { 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, !12, i64 64}
!6 = !{!"b2StepContext", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !10, i64 16, !11, i64 20, !11, i64 32, !11, i64 44, !7, i64 56, !7, i64 60, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !10, i64 104, !12, i64 112, !13, i64 120, !12, i64 128, !12, i64 136, !12, i64 144, !10, i64 152, !10, i64 156, !12, i64 160, !10, i64 168, !14, i64 172, !8, i64 173, !15, i64 240, !8, i64 244}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"b2Softness", !7, i64 0, !7, i64 4, !7, i64 8}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!"b2AtomicInt", !10, i64 0}
!14 = !{!"_Bool", !8, i64 0}
!15 = !{!"b2AtomicU32", !10, i64 0}
!16 = !{!6, !12, i64 136}
!17 = !{!6, !12, i64 144}
!18 = !{!6, !12, i64 80}
!19 = !{!7, !7, i64 0}
!20 = !{!21, !14, i64 1800}
!21 = !{!"b2World", !22, i64 0, !24, i64 40, !26, i64 336, !27, i64 1008, !23, i64 1032, !27, i64 1048, !23, i64 1072, !27, i64 1088, !23, i64 1112, !27, i64 1128, !23, i64 1152, !27, i64 1168, !23, i64 1192, !27, i64 1208, !27, i64 1232, !23, i64 1256, !23, i64 1272, !23, i64 1288, !23, i64 1304, !23, i64 1320, !23, i64 1336, !23, i64 1352, !23, i64 1368, !8, i64 1384, !8, i64 1416, !10, i64 1448, !23, i64 1456, !28, i64 1472, !28, i64 1488, !28, i64 1504, !28, i64 1520, !29, i64 1536, !10, i64 1544, !30, i64 1548, !7, i64 1556, !7, i64 1560, !7, i64 1564, !7, i64 1568, !7, i64 1572, !7, i64 1576, !7, i64 1580, !7, i64 1584, !12, i64 1592, !12, i64 1600, !31, i64 1608, !32, i64 1612, !12, i64 1704, !12, i64 1712, !12, i64 1720, !12, i64 1728, !10, i64 1736, !12, i64 1744, !12, i64 1752, !12, i64 1760, !12, i64 1768, !12, i64 1776, !7, i64 1784, !10, i64 1788, !10, i64 1792, !31, i64 1796, !14, i64 1798, !14, i64 1799, !14, i64 1800, !14, i64 1801, !14, i64 1802, !14, i64 1803}
!22 = !{!"b2ArenaAllocator", !12, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !23, i64 24}
!23 = !{!"", !12, i64 0, !10, i64 8, !10, i64 12}
!24 = !{!"b2BroadPhase", !8, i64 0, !10, i64 216, !25, i64 224, !23, i64 240, !12, i64 256, !12, i64 264, !10, i64 272, !13, i64 276, !25, i64 280}
!25 = !{!"b2HashSet", !12, i64 0, !10, i64 8, !10, i64 12}
!26 = !{!"b2ConstraintGraph", !8, i64 0}
!27 = !{!"b2IdPool", !23, i64 0, !10, i64 16}
!28 = !{!"b2BitSet", !12, i64 0, !10, i64 8, !10, i64 12}
!29 = !{!"long", !8, i64 0}
!30 = !{!"b2Vec2", !7, i64 0, !7, i64 4}
!31 = !{!"short", !8, i64 0}
!32 = !{!"b2Profile", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !7, i64 44, !7, i64 48, !7, i64 52, !7, i64 56, !7, i64 60, !7, i64 64, !7, i64 68, !7, i64 72, !7, i64 76, !7, i64 80, !7, i64 84}
!33 = !{i8 0, i8 2}
!34 = !{}
!35 = distinct !{!35, !36}
!36 = !{!"llvm.loop.mustprogress"}
!37 = !{!12, !12, i64 0}
!38 = !{!39, !10, i64 4}
!39 = !{!"b2ContactSim", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !40, i64 36, !7, i64 148, !7, i64 152, !7, i64 156, !7, i64 160, !10, i64 164, !41, i64 168}
!40 = !{!"b2Manifold", !30, i64 0, !7, i64 8, !8, i64 12, !10, i64 108}
!41 = !{!"b2SimplexCache", !31, i64 0, !8, i64 2, !8, i64 5}
!42 = !{!39, !10, i64 8}
!43 = !{!10, !10, i64 0}
!44 = !{!39, !7, i64 20}
!45 = !{!39, !7, i64 24}
!46 = !{!47, !7, i64 8}
!47 = !{!"b2BodyState", !30, i64 0, !7, i64 8, !10, i64 12, !30, i64 16, !48, i64 24}
!48 = !{!"b2Rot", !7, i64 0, !7, i64 4}
!49 = !{!39, !7, i64 28}
!50 = !{!39, !7, i64 32}
!51 = !{!8, !8, i64 0}
!52 = !{!39, !7, i64 148}
!53 = !{!39, !7, i64 160}
!54 = !{!39, !7, i64 152}
!55 = !{!39, !7, i64 156}
!56 = !{!40, !7, i64 8}
!57 = !{!58, !7, i64 24}
!58 = !{!"b2ManifoldPoint", !30, i64 0, !30, i64 8, !30, i64 16, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !31, i64 44, !14, i64 46}
!59 = !{!58, !7, i64 28}
!60 = !{!58, !7, i64 32}
!61 = !{!40, !10, i64 108}
!62 = distinct !{!62, !36}


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