; LLVM IR from jonpena/Cirobb :: cirobb/Collision.ll (Z8OBBToOBBR8ManifoldP5ShapeS2_)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%class.Mat2 = type { float, float, float, float }
%struct.Vec2 = type { float, float }
%struct.Shape = type { ptr, float, %struct.Vec2, i32, ptr }
%struct.RigidBody = type { %struct.Vec2, %struct.Vec2, %struct.Vec2, float, float, float, float, float, float, float, float, float, float, float, float, ptr }
%struct.Manifold = type { i32, [2 x %struct.Contact], %struct.PostPosition, float, float, ptr, ptr, %struct.Vec2 }
%struct.Contact = type { %struct.Vec2, %struct.Vec2, float, float, float, float, float, float, float }
%struct.PostPosition = type { float, float, [2 x %struct.Vec2], [2 x %struct.Vec2] }

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

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

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

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

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_Z8OBBToOBBR8ManifoldP5ShapeS2_(ptr noundef nonnull align 8 dereferenceable(168) %0, ptr noundef %1, ptr noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca %class.Mat2, align 4
  %8 = alloca float, align 4
  %9 = alloca %class.Mat2, align 4
  %10 = alloca float, align 4
  %11 = alloca %struct.Vec2, align 4
  %12 = alloca float, align 4
  %13 = alloca %struct.Vec2, align 4
  %14 = alloca float, align 4
  %15 = alloca %struct.Vec2, align 4
  %16 = alloca %struct.Vec2, align 4
  %17 = alloca %struct.Vec2, align 4
  %18 = alloca %struct.Vec2, align 4
  %19 = alloca %struct.Vec2, align 4
  %20 = alloca float, align 4
  %21 = alloca i32, align 4
  %22 = alloca float, align 4
  %23 = alloca %struct.Vec2, align 4
  %24 = alloca %struct.Vec2, align 4
  %25 = alloca [4 x %struct.Vec2], align 16
  %26 = alloca [4 x %struct.Vec2], align 16
  %27 = alloca float, align 4
  %28 = alloca float, align 4
  %29 = alloca float, align 4
  %30 = alloca float, align 4
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca float, align 4
  %34 = alloca float, align 4
  %35 = alloca float, align 4
  %36 = alloca float, align 4
  %37 = alloca [4 x %struct.Vec2], align 16
  %38 = alloca float, align 4
  %39 = alloca [4 x float], align 16
  %40 = alloca [4 x float], align 16
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca float, align 4
  %44 = alloca i32, align 4
  %45 = alloca float, align 4
  %46 = alloca [2 x %struct.Vec2], align 16
  %47 = alloca [2 x %struct.Vec2], align 16
  %48 = alloca i32, align 4
  %49 = alloca %struct.Vec2, align 4
  %50 = alloca float, align 4
  %51 = alloca float, align 4
  %52 = alloca float, align 4
  %53 = alloca float, align 4
  %54 = alloca %struct.Vec2, align 4
  %55 = alloca %struct.Vec2, align 4
  %56 = alloca i32, align 4
  %57 = alloca %struct.Vec2, align 4
  %58 = alloca %struct.Vec2, align 4
  %59 = alloca %struct.Vec2, align 4
  %60 = alloca %struct.Vec2, align 4
  %61 = alloca %struct.Vec2, align 4
  %62 = alloca %struct.Vec2, align 4
  %63 = alloca %struct.Vec2, align 4
  %64 = alloca %struct.Vec2, align 4
  %65 = alloca %struct.Vec2, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %7) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #6
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.Shape, ptr %66, i32 0, i32 4
  %68 = load ptr, ptr %67, align 8, !tbaa !9
  %69 = getelementptr inbounds %struct.RigidBody, ptr %68, i32 0, i32 3
  %70 = load float, ptr %69, align 8, !tbaa !14
  %71 = load ptr, ptr %5, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct.Shape, ptr %71, i32 0, i32 4
  %73 = load ptr, ptr %72, align 8, !tbaa !9
  %74 = getelementptr inbounds %struct.RigidBody, ptr %73, i32 0, i32 3
  %75 = load float, ptr %74, align 8, !tbaa !14
  %76 = fsub float %70, %75
  store float %76, ptr %8, align 4, !tbaa !16
  call void @_ZN4Mat2C2ERKf(ptr noundef nonnull align 4 dereferenceable(16) %7, ptr noundef nonnull align 4 dereferenceable(4) %8)
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.Shape, ptr %77, i32 0, i32 4
  %79 = load ptr, ptr %78, align 8, !tbaa !9
  %80 = getelementptr inbounds %struct.RigidBody, ptr %79, i32 0, i32 3
  %81 = load float, ptr %80, align 8, !tbaa !14
  %82 = fneg float %81
  store float %82, ptr %10, align 4, !tbaa !16
  call void @_ZN4Mat2C2ERKf(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(4) %10)
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  %83 = load ptr, ptr %5, align 8, !tbaa !5
  %84 = getelementptr inbounds %struct.Shape, ptr %83, i32 0, i32 2
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  store float 5.000000e-01, ptr %12, align 4, !tbaa !16
  %85 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %84, ptr noundef nonnull align 4 dereferenceable(4) %12)
  store <2 x float> %85, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.Shape, ptr %86, i32 0, i32 2
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  store float 5.000000e-01, ptr %14, align 4, !tbaa !16
  %88 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %87, ptr noundef nonnull align 4 dereferenceable(4) %14)
  store <2 x float> %88, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  %89 = call <2 x float> @_ZN4Mat2mlERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %7, ptr noundef nonnull align 4 dereferenceable(8) %13)
  store <2 x float> %89, ptr %15, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #6
  %90 = getelementptr inbounds %struct.Vec2, ptr %13, i32 0, i32 0
  %91 = load float, ptr %90, align 4, !tbaa !17
  %92 = fneg float %91
  %93 = getelementptr inbounds %struct.Vec2, ptr %13, i32 0, i32 1
  %94 = load float, ptr %93, align 4, !tbaa !18
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %17, float noundef %92, float noundef %94)
  %95 = call <2 x float> @_ZN4Mat2mlERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %7, ptr noundef nonnull align 4 dereferenceable(8) %17)
  store <2 x float> %95, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  %96 = load ptr, ptr %6, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.Shape, ptr %96, i32 0, i32 4
  %98 = load ptr, ptr %97, align 8, !tbaa !9
  %99 = getelementptr inbounds %struct.RigidBody, ptr %98, i32 0, i32 0
  %100 = load ptr, ptr %5, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.Shape, ptr %100, i32 0, i32 4
  %102 = load ptr, ptr %101, align 8, !tbaa !9
  %103 = getelementptr inbounds %struct.RigidBody, ptr %102, i32 0, i32 0
  %104 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %99, ptr noundef nonnull align 4 dereferenceable(8) %103)
  store <2 x float> %104, ptr %19, align 4
  %105 = call <2 x float> @_ZN4Mat26RotateERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %19)
  store <2 x float> %105, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  %106 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 0
  %107 = load float, ptr %106, align 4, !tbaa !17
  %108 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %109 = load float, ptr %108, align 4, !tbaa !17
  %110 = fcmp olt float %109, 0.000000e+00
  br i1 %110, label %111, label %115

111:                                              ; preds = %3
  %112 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %113 = load float, ptr %112, align 4, !tbaa !17
  %114 = fneg float %113
  br label %118

115:                                              ; preds = %3
  %116 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %117 = load float, ptr %116, align 4, !tbaa !17
  br label %118

118:                                              ; preds = %115, %111
  %119 = phi float [ %114, %111 ], [ %117, %115 ]
  %120 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %121 = load float, ptr %120, align 4, !tbaa !17
  %122 = fcmp olt float %121, 0.000000e+00
  br i1 %122, label %123, label %127

123:                                              ; preds = %118
  %124 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %125 = load float, ptr %124, align 4, !tbaa !17
  %126 = fneg float %125
  br label %130

127:                                              ; preds = %118
  %128 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %129 = load float, ptr %128, align 4, !tbaa !17
  br label %130

130:                                              ; preds = %127, %123
  %131 = phi float [ %126, %123 ], [ %129, %127 ]
  %132 = fcmp olt float %119, %131
  br i1 %132, label %133, label %146

133:                                              ; preds = %130
  %134 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %135 = load float, ptr %134, align 4, !tbaa !17
  %136 = fcmp olt float %135, 0.000000e+00
  br i1 %136, label %137, label %141

137:                                              ; preds = %133
  %138 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %139 = load float, ptr %138, align 4, !tbaa !17
  %140 = fneg float %139
  br label %144

141:                                              ; preds = %133
  %142 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 0
  %143 = load float, ptr %142, align 4, !tbaa !17
  br label %144

144:                                              ; preds = %141, %137
  %145 = phi float [ %140, %137 ], [ %143, %141 ]
  br label %159

146:                                              ; preds = %130
  %147 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %148 = load float, ptr %147, align 4, !tbaa !17
  %149 = fcmp olt float %148, 0.000000e+00
  br i1 %149, label %150, label %154

150:                                              ; preds = %146
  %151 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %152 = load float, ptr %151, align 4, !tbaa !17
  %153 = fneg float %152
  br label %157

154:                                              ; preds = %146
  %155 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 0
  %156 = load float, ptr %155, align 4, !tbaa !17
  br label %157

157:                                              ; preds = %154, %150
  %158 = phi float [ %153, %150 ], [ %156, %154 ]
  br label %159

159:                                              ; preds = %157, %144
  %160 = phi float [ %145, %144 ], [ %158, %157 ]
  %161 = fadd float %107, %160
  store float %161, ptr %20, align 4, !tbaa !16
  %162 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 0
  %163 = load float, ptr %162, align 4, !tbaa !17
  %164 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 0
  %165 = load float, ptr %164, align 4, !tbaa !17
  %166 = fmul float %163, %165
  %167 = load float, ptr %20, align 4, !tbaa !16
  %168 = load float, ptr %20, align 4, !tbaa !16
  %169 = fmul float %167, %168
  %170 = fcmp ogt float %166, %169
  br i1 %170, label %171, label %172

171:                                              ; preds = %159
  store i32 1, ptr %21, align 4
  br label %688

172:                                              ; preds = %159
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  %173 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 1
  %174 = load float, ptr %173, align 4, !tbaa !18
  %175 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %176 = load float, ptr %175, align 4, !tbaa !18
  %177 = fcmp olt float %176, 0.000000e+00
  br i1 %177, label %178, label %182

178:                                              ; preds = %172
  %179 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %180 = load float, ptr %179, align 4, !tbaa !18
  %181 = fneg float %180
  br label %185

182:                                              ; preds = %172
  %183 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %184 = load float, ptr %183, align 4, !tbaa !18
  br label %185

185:                                              ; preds = %182, %178
  %186 = phi float [ %181, %178 ], [ %184, %182 ]
  %187 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %188 = load float, ptr %187, align 4, !tbaa !18
  %189 = fcmp olt float %188, 0.000000e+00
  br i1 %189, label %190, label %194

190:                                              ; preds = %185
  %191 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %192 = load float, ptr %191, align 4, !tbaa !18
  %193 = fneg float %192
  br label %197

194:                                              ; preds = %185
  %195 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %196 = load float, ptr %195, align 4, !tbaa !18
  br label %197

197:                                              ; preds = %194, %190
  %198 = phi float [ %193, %190 ], [ %196, %194 ]
  %199 = fcmp olt float %186, %198
  br i1 %199, label %200, label %213

200:                                              ; preds = %197
  %201 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %202 = load float, ptr %201, align 4, !tbaa !18
  %203 = fcmp olt float %202, 0.000000e+00
  br i1 %203, label %204, label %208

204:                                              ; preds = %200
  %205 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %206 = load float, ptr %205, align 4, !tbaa !18
  %207 = fneg float %206
  br label %211

208:                                              ; preds = %200
  %209 = getelementptr inbounds %struct.Vec2, ptr %16, i32 0, i32 1
  %210 = load float, ptr %209, align 4, !tbaa !18
  br label %211

211:                                              ; preds = %208, %204
  %212 = phi float [ %207, %204 ], [ %210, %208 ]
  br label %226

213:                                              ; preds = %197
  %214 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %215 = load float, ptr %214, align 4, !tbaa !18
  %216 = fcmp olt float %215, 0.000000e+00
  br i1 %216, label %217, label %221

217:                                              ; preds = %213
  %218 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %219 = load float, ptr %218, align 4, !tbaa !18
  %220 = fneg float %219
  br label %224

221:                                              ; preds = %213
  %222 = getelementptr inbounds %struct.Vec2, ptr %15, i32 0, i32 1
  %223 = load float, ptr %222, align 4, !tbaa !18
  br label %224

224:                                              ; preds = %221, %217
  %225 = phi float [ %220, %217 ], [ %223, %221 ]
  br label %226

226:                                              ; preds = %224, %211
  %227 = phi float [ %212, %211 ], [ %225, %224 ]
  %228 = fadd float %174, %227
  store float %228, ptr %22, align 4, !tbaa !16
  %229 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 1
  %230 = load float, ptr %229, align 4, !tbaa !18
  %231 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 1
  %232 = load float, ptr %231, align 4, !tbaa !18
  %233 = fmul float %230, %232
  %234 = load float, ptr %22, align 4, !tbaa !16
  %235 = load float, ptr %22, align 4, !tbaa !16
  %236 = fmul float %234, %235
  %237 = fcmp ogt float %233, %236
  br i1 %237, label %238, label %239

238:                                              ; preds = %226
  store i32 1, ptr %21, align 4
  br label %687

239:                                              ; preds = %226
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %240 = call <2 x float> @_ZN4Mat27Column0Ev(ptr noundef nonnull align 4 dereferenceable(16) %7)
  store <2 x float> %240, ptr %24, align 4
  %241 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %24)
  store <2 x float> %241, ptr %23, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.start.p0(i64 32, ptr %25) #6
  %242 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 0
  %243 = load float, ptr %242, align 4, !tbaa !17
  %244 = fneg float %243
  %245 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 1
  %246 = load float, ptr %245, align 4, !tbaa !18
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %25, float noundef %244, float noundef %246)
  %247 = getelementptr inbounds %struct.Vec2, ptr %25, i64 1
  %248 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %11)
  store <2 x float> %248, ptr %247, align 8
  %249 = getelementptr inbounds %struct.Vec2, ptr %25, i64 2
  %250 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 0
  %251 = load float, ptr %250, align 4, !tbaa !17
  %252 = getelementptr inbounds %struct.Vec2, ptr %11, i32 0, i32 1
  %253 = load float, ptr %252, align 4, !tbaa !18
  %254 = fneg float %253
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %249, float noundef %251, float noundef %254)
  %255 = getelementptr inbounds %struct.Vec2, ptr %25, i64 3
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %255, ptr align 4 %11, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 32, ptr %26) #6
  %256 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %16)
  store <2 x float> %256, ptr %26, align 8
  %257 = getelementptr inbounds %struct.Vec2, ptr %26, i64 1
  %258 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %15)
  store <2 x float> %258, ptr %257, align 8
  %259 = getelementptr inbounds %struct.Vec2, ptr %26, i64 2
  %260 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %16)
  store <2 x float> %260, ptr %259, align 8
  %261 = getelementptr inbounds %struct.Vec2, ptr %26, i64 3
  %262 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %15)
  store <2 x float> %262, ptr %261, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #6
  %263 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 0
  %264 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %263)
  store float %264, ptr %27, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #6
  %265 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 1
  %266 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %265)
  store float %266, ptr %28, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #6
  %267 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 3
  %268 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %267)
  store float %268, ptr %29, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #6
  %269 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 1
  %270 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %269)
  store float %270, ptr %30, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #6
  %271 = load float, ptr %27, align 4, !tbaa !16
  %272 = fcmp olt float %271, 0.000000e+00
  br i1 %272, label %273, label %276

273:                                              ; preds = %239
  %274 = load float, ptr %27, align 4, !tbaa !16
  %275 = fneg float %274
  br label %278

276:                                              ; preds = %239
  %277 = load float, ptr %27, align 4, !tbaa !16
  br label %278

278:                                              ; preds = %276, %273
  %279 = phi float [ %275, %273 ], [ %277, %276 ]
  %280 = load float, ptr %28, align 4, !tbaa !16
  %281 = fcmp olt float %280, 0.000000e+00
  br i1 %281, label %282, label %285

282:                                              ; preds = %278
  %283 = load float, ptr %28, align 4, !tbaa !16
  %284 = fneg float %283
  br label %287

285:                                              ; preds = %278
  %286 = load float, ptr %28, align 4, !tbaa !16
  br label %287

287:                                              ; preds = %285, %282
  %288 = phi float [ %284, %282 ], [ %286, %285 ]
  %289 = fcmp olt float %279, %288
  br i1 %289, label %290, label %300

290:                                              ; preds = %287
  %291 = load float, ptr %28, align 4, !tbaa !16
  %292 = fcmp olt float %291, 0.000000e+00
  br i1 %292, label %293, label %296

293:                                              ; preds = %290
  %294 = load float, ptr %28, align 4, !tbaa !16
  %295 = fneg float %294
  br label %298

296:                                              ; preds = %290
  %297 = load float, ptr %28, align 4, !tbaa !16
  br label %298

298:                                              ; preds = %296, %293
  %299 = phi float [ %295, %293 ], [ %297, %296 ]
  br label %310

300:                                              ; preds = %287
  %301 = load float, ptr %27, align 4, !tbaa !16
  %302 = fcmp olt float %301, 0.000000e+00
  br i1 %302, label %303, label %306

303:                                              ; preds = %300
  %304 = load float, ptr %27, align 4, !tbaa !16
  %305 = fneg float %304
  br label %308

306:                                              ; preds = %300
  %307 = load float, ptr %27, align 4, !tbaa !16
  br label %308

308:                                              ; preds = %306, %303
  %309 = phi float [ %305, %303 ], [ %307, %306 ]
  br label %310

310:                                              ; preds = %308, %298
  %311 = phi float [ %299, %298 ], [ %309, %308 ]
  store float %311, ptr %31, align 4, !tbaa !16
  %312 = load float, ptr %31, align 4, !tbaa !16
  %313 = fneg float %312
  %314 = load float, ptr %29, align 4, !tbaa !16
  %315 = fadd float %313, %314
  %316 = load float, ptr %31, align 4, !tbaa !16
  %317 = load float, ptr %30, align 4, !tbaa !16
  %318 = fadd float %316, %317
  %319 = fmul float %315, %318
  %320 = fcmp ogt float %319, 0.000000e+00
  br i1 %320, label %321, label %322

321:                                              ; preds = %310
  store i32 1, ptr %21, align 4
  br label %686

322:                                              ; preds = %310
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #6
  %323 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 0
  %324 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %323)
  store float %324, ptr %32, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #6
  %325 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 1
  %326 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %325)
  store float %326, ptr %33, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  %327 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 3
  %328 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %327)
  store float %328, ptr %34, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #6
  %329 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 1
  %330 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(8) %329)
  store float %330, ptr %35, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #6
  %331 = load float, ptr %32, align 4, !tbaa !16
  %332 = fcmp olt float %331, 0.000000e+00
  br i1 %332, label %333, label %336

333:                                              ; preds = %322
  %334 = load float, ptr %32, align 4, !tbaa !16
  %335 = fneg float %334
  br label %338

336:                                              ; preds = %322
  %337 = load float, ptr %32, align 4, !tbaa !16
  br label %338

338:                                              ; preds = %336, %333
  %339 = phi float [ %335, %333 ], [ %337, %336 ]
  %340 = load float, ptr %33, align 4, !tbaa !16
  %341 = fcmp olt float %340, 0.000000e+00
  br i1 %341, label %342, label %345

342:                                              ; preds = %338
  %343 = load float, ptr %33, align 4, !tbaa !16
  %344 = fneg float %343
  br label %347

345:                                              ; preds = %338
  %346 = load float, ptr %33, align 4, !tbaa !16
  br label %347

347:                                              ; preds = %345, %342
  %348 = phi float [ %344, %342 ], [ %346, %345 ]
  %349 = fcmp olt float %339, %348
  br i1 %349, label %350, label %360

350:                                              ; preds = %347
  %351 = load float, ptr %33, align 4, !tbaa !16
  %352 = fcmp olt float %351, 0.000000e+00
  br i1 %352, label %353, label %356

353:                                              ; preds = %350
  %354 = load float, ptr %33, align 4, !tbaa !16
  %355 = fneg float %354
  br label %358

356:                                              ; preds = %350
  %357 = load float, ptr %33, align 4, !tbaa !16
  br label %358

358:                                              ; preds = %356, %353
  %359 = phi float [ %355, %353 ], [ %357, %356 ]
  br label %370

360:                                              ; preds = %347
  %361 = load float, ptr %32, align 4, !tbaa !16
  %362 = fcmp olt float %361, 0.000000e+00
  br i1 %362, label %363, label %366

363:                                              ; preds = %360
  %364 = load float, ptr %32, align 4, !tbaa !16
  %365 = fneg float %364
  br label %368

366:                                              ; preds = %360
  %367 = load float, ptr %32, align 4, !tbaa !16
  br label %368

368:                                              ; preds = %366, %363
  %369 = phi float [ %365, %363 ], [ %367, %366 ]
  br label %370

370:                                              ; preds = %368, %358
  %371 = phi float [ %359, %358 ], [ %369, %368 ]
  store float %371, ptr %36, align 4, !tbaa !16
  %372 = load float, ptr %36, align 4, !tbaa !16
  %373 = fneg float %372
  %374 = load float, ptr %34, align 4, !tbaa !16
  %375 = fadd float %373, %374
  %376 = load float, ptr %36, align 4, !tbaa !16
  %377 = load float, ptr %35, align 4, !tbaa !16
  %378 = fadd float %376, %377
  %379 = fmul float %375, %378
  %380 = fcmp ogt float %379, 0.000000e+00
  br i1 %380, label %381, label %382

381:                                              ; preds = %370
  store i32 1, ptr %21, align 4
  br label %685

382:                                              ; preds = %370
  call void @llvm.lifetime.start.p0(i64 32, ptr %37) #6
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %37, float noundef -1.000000e+00, float noundef 0.000000e+00)
  %383 = getelementptr inbounds %struct.Vec2, ptr %37, i64 1
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %383, float noundef 0.000000e+00, float noundef -1.000000e+00)
  %384 = getelementptr inbounds %struct.Vec2, ptr %37, i64 2
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %384, ptr align 4 %23, i64 8, i1 false), !tbaa.struct !19
  %385 = getelementptr inbounds %struct.Vec2, ptr %37, i64 3
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  store float -1.000000e+00, ptr %38, align 4, !tbaa !16
  %386 = call <2 x float> @_Z5CrossRK4Vec2RKf(ptr noundef nonnull align 4 dereferenceable(8) %23, ptr noundef nonnull align 4 dereferenceable(4) %38)
  store <2 x float> %386, ptr %385, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr %39) #6
  %387 = load float, ptr %20, align 4, !tbaa !16
  %388 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 0
  %389 = load float, ptr %388, align 4, !tbaa !17
  %390 = fadd float %387, %389
  store float %390, ptr %39, align 4, !tbaa !16
  %391 = getelementptr inbounds float, ptr %39, i64 1
  %392 = load float, ptr %22, align 4, !tbaa !16
  %393 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 1
  %394 = load float, ptr %393, align 4, !tbaa !18
  %395 = fadd float %392, %394
  store float %395, ptr %391, align 4, !tbaa !16
  %396 = getelementptr inbounds float, ptr %39, i64 2
  %397 = load float, ptr %31, align 4, !tbaa !16
  %398 = load float, ptr %29, align 4, !tbaa !16
  %399 = fsub float %397, %398
  store float %399, ptr %396, align 4, !tbaa !16
  %400 = getelementptr inbounds float, ptr %39, i64 3
  %401 = load float, ptr %36, align 4, !tbaa !16
  %402 = load float, ptr %34, align 4, !tbaa !16
  %403 = fsub float %401, %402
  store float %403, ptr %400, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #6
  %404 = load float, ptr %20, align 4, !tbaa !16
  %405 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 0
  %406 = load float, ptr %405, align 4, !tbaa !17
  %407 = fsub float %404, %406
  store float %407, ptr %40, align 4, !tbaa !16
  %408 = getelementptr inbounds float, ptr %40, i64 1
  %409 = load float, ptr %22, align 4, !tbaa !16
  %410 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 1
  %411 = load float, ptr %410, align 4, !tbaa !18
  %412 = fsub float %409, %411
  store float %412, ptr %408, align 4, !tbaa !16
  %413 = getelementptr inbounds float, ptr %40, i64 2
  %414 = load float, ptr %31, align 4, !tbaa !16
  %415 = load float, ptr %30, align 4, !tbaa !16
  %416 = fadd float %414, %415
  store float %416, ptr %413, align 4, !tbaa !16
  %417 = getelementptr inbounds float, ptr %40, i64 3
  %418 = load float, ptr %36, align 4, !tbaa !16
  %419 = load float, ptr %35, align 4, !tbaa !16
  %420 = fadd float %418, %419
  store float %420, ptr %417, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #6
  store i32 0, ptr %41, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #6
  store i32 0, ptr %42, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #6
  %421 = getelementptr inbounds [4 x float], ptr %39, i64 0, i64 0
  %422 = load float, ptr %421, align 16, !tbaa !16
  %423 = getelementptr inbounds [4 x float], ptr %40, i64 0, i64 0
  %424 = load float, ptr %423, align 16, !tbaa !16
  %425 = fcmp ogt float %422, %424
  br i1 %425, label %426, label %429

426:                                              ; preds = %382
  %427 = getelementptr inbounds [4 x float], ptr %40, i64 0, i64 0
  %428 = load float, ptr %427, align 16, !tbaa !16
  br label %432

429:                                              ; preds = %382
  %430 = getelementptr inbounds [4 x float], ptr %39, i64 0, i64 0
  %431 = load float, ptr %430, align 16, !tbaa !16
  br label %432

432:                                              ; preds = %429, %426
  %433 = phi float [ %428, %426 ], [ %431, %429 ]
  store float %433, ptr %43, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #6
  store i32 1, ptr %44, align 4, !tbaa !20
  br label %434

434:                                              ; preds = %468, %432
  %435 = load i32, ptr %44, align 4, !tbaa !20
  %436 = icmp slt i32 %435, 4
  br i1 %436, label %438, label %437

437:                                              ; preds = %434
  store i32 2, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #6
  br label %471

438:                                              ; preds = %434
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #6
  %439 = load i32, ptr %44, align 4, !tbaa !20
  %440 = sext i32 %439 to i64
  %441 = getelementptr inbounds [4 x float], ptr %39, i64 0, i64 %440
  %442 = load float, ptr %441, align 4, !tbaa !16
  %443 = load i32, ptr %44, align 4, !tbaa !20
  %444 = sext i32 %443 to i64
  %445 = getelementptr inbounds [4 x float], ptr %40, i64 0, i64 %444
  %446 = load float, ptr %445, align 4, !tbaa !16
  %447 = fcmp ogt float %442, %446
  br i1 %447, label %448, label %453

448:                                              ; preds = %438
  %449 = load i32, ptr %44, align 4, !tbaa !20
  %450 = sext i32 %449 to i64
  %451 = getelementptr inbounds [4 x float], ptr %40, i64 0, i64 %450
  %452 = load float, ptr %451, align 4, !tbaa !16
  br label %458

453:                                              ; preds = %438
  %454 = load i32, ptr %44, align 4, !tbaa !20
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds [4 x float], ptr %39, i64 0, i64 %455
  %457 = load float, ptr %456, align 4, !tbaa !16
  br label %458

458:                                              ; preds = %453, %448
  %459 = phi float [ %452, %448 ], [ %457, %453 ]
  store float %459, ptr %45, align 4, !tbaa !16
  %460 = load float, ptr %45, align 4, !tbaa !16
  %461 = load float, ptr %43, align 4, !tbaa !16
  %462 = fadd float %461, 0x3F7CAC0840000000
  %463 = fcmp ole float %460, %462
  br i1 %463, label %464, label %467

464:                                              ; preds = %458
  %465 = load i32, ptr %44, align 4, !tbaa !20
  store i32 %465, ptr %41, align 4, !tbaa !20
  %466 = load float, ptr %45, align 4, !tbaa !16
  store float %466, ptr %43, align 4, !tbaa !16
  br label %467

467:                                              ; preds = %464, %458
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #6
  br label %468

468:                                              ; preds = %467
  %469 = load i32, ptr %44, align 4, !tbaa !20
  %470 = add nsw i32 %469, 1
  store i32 %470, ptr %44, align 4, !tbaa !20
  br label %434, !llvm.loop !22

471:                                              ; preds = %437
  call void @llvm.lifetime.start.p0(i64 16, ptr %46) #6
  %472 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i32 0, i32 0
  %473 = getelementptr inbounds %struct.Vec2, ptr %472, i64 2
  br label %474

474:                                              ; preds = %474, %471
  %475 = phi ptr [ %472, %471 ], [ %476, %474 ]
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %475)
  %476 = getelementptr inbounds %struct.Vec2, ptr %475, i64 1
  %477 = icmp eq ptr %476, %473
  br i1 %477, label %478, label %474

478:                                              ; preds = %474
  call void @llvm.lifetime.start.p0(i64 16, ptr %47) #6
  %479 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i32 0, i32 0
  %480 = getelementptr inbounds %struct.Vec2, ptr %479, i64 2
  br label %481

481:                                              ; preds = %481, %478
  %482 = phi ptr [ %479, %478 ], [ %483, %481 ]
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %482)
  %483 = getelementptr inbounds %struct.Vec2, ptr %482, i64 1
  %484 = icmp eq ptr %483, %480
  br i1 %484, label %485, label %481

485:                                              ; preds = %481
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #6
  %486 = load i32, ptr %41, align 4, !tbaa !20
  %487 = sext i32 %486 to i64
  %488 = getelementptr inbounds [4 x float], ptr %39, i64 0, i64 %487
  %489 = load float, ptr %488, align 4, !tbaa !16
  %490 = load i32, ptr %41, align 4, !tbaa !20
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds [4 x float], ptr %40, i64 0, i64 %491
  %493 = load float, ptr %492, align 4, !tbaa !16
  %494 = fcmp olt float %489, %493
  %495 = zext i1 %494 to i64
  %496 = select i1 %494, i32 1, i32 -1
  store i32 %496, ptr %48, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #6
  %497 = load i32, ptr %41, align 4, !tbaa !20
  %498 = sext i32 %497 to i64
  %499 = getelementptr inbounds [4 x %struct.Vec2], ptr %37, i64 0, i64 %498
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #6
  %500 = load i32, ptr %48, align 4, !tbaa !20
  %501 = sitofp i32 %500 to float
  store float %501, ptr %50, align 4, !tbaa !16
  %502 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %499, ptr noundef nonnull align 4 dereferenceable(4) %50)
  store <2 x float> %502, ptr %49, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #6
  %503 = load i32, ptr %41, align 4, !tbaa !20
  %504 = icmp slt i32 %503, 2
  br i1 %504, label %505, label %547

505:                                              ; preds = %485
  %506 = load ptr, ptr %6, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.Shape, ptr %506, i32 0, i32 4
  %508 = load ptr, ptr %507, align 8, !tbaa !9
  %509 = load ptr, ptr %4, align 8, !tbaa !5
  %510 = getelementptr inbounds %struct.Manifold, ptr %509, i32 0, i32 5
  store ptr %508, ptr %510, align 8, !tbaa !24
  %511 = load ptr, ptr %5, align 8, !tbaa !5
  %512 = getelementptr inbounds %struct.Shape, ptr %511, i32 0, i32 4
  %513 = load ptr, ptr %512, align 8, !tbaa !9
  %514 = load ptr, ptr %4, align 8, !tbaa !5
  %515 = getelementptr inbounds %struct.Manifold, ptr %514, i32 0, i32 6
  store ptr %513, ptr %515, align 8, !tbaa !27
  %516 = load i32, ptr %48, align 4, !tbaa !20
  %517 = icmp eq i32 %516, -1
  br i1 %517, label %518, label %521

518:                                              ; preds = %505
  %519 = load i32, ptr %41, align 4, !tbaa !20
  %520 = add nsw i32 %519, 2
  store i32 %520, ptr %41, align 4, !tbaa !20
  br label %521

521:                                              ; preds = %518, %505
  %522 = load i32, ptr %41, align 4, !tbaa !20
  %523 = sext i32 %522 to i64
  %524 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 %523
  %525 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %525, ptr align 8 %524, i64 8, i1 false), !tbaa.struct !19
  %526 = load i32, ptr %41, align 4, !tbaa !20
  %527 = add nsw i32 %526, 1
  %528 = srem i32 %527, 4
  %529 = sext i32 %528 to i64
  %530 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 %529
  %531 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %531, ptr align 8 %530, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #6
  %532 = getelementptr inbounds [4 x %struct.Vec2], ptr %37, i64 0, i64 2
  %533 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %49, ptr noundef nonnull align 4 dereferenceable(8) %532)
  store float %533, ptr %51, align 4, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #6
  %534 = getelementptr inbounds [4 x %struct.Vec2], ptr %37, i64 0, i64 3
  %535 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %49, ptr noundef nonnull align 4 dereferenceable(8) %534)
  store float %535, ptr %52, align 4, !tbaa !16
  %536 = call noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4) %51, ptr noundef nonnull align 4 dereferenceable(4) %52)
  store i32 %536, ptr %41, align 4, !tbaa !20
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #6
  %537 = load i32, ptr %41, align 4, !tbaa !20
  %538 = sext i32 %537 to i64
  %539 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 %538
  %540 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %540, ptr align 8 %539, i64 8, i1 false), !tbaa.struct !19
  %541 = load i32, ptr %41, align 4, !tbaa !20
  %542 = add nsw i32 %541, 1
  %543 = srem i32 %542, 4
  %544 = sext i32 %543 to i64
  %545 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 %544
  %546 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %546, ptr align 8 %545, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #6
  store float -1.000000e+00, ptr %53, align 4, !tbaa !16
  call void @_ZN4Vec2mLERKf(ptr noundef nonnull align 4 dereferenceable(8) %49, ptr noundef nonnull align 4 dereferenceable(4) %53)
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #6
  br label %577

547:                                              ; preds = %485
  %548 = load i32, ptr %48, align 4, !tbaa !20
  %549 = icmp eq i32 %548, -1
  br i1 %549, label %550, label %553

550:                                              ; preds = %547
  %551 = load i32, ptr %41, align 4, !tbaa !20
  %552 = sub nsw i32 %551, 2
  store i32 %552, ptr %41, align 4, !tbaa !20
  br label %553

553:                                              ; preds = %550, %547
  %554 = load i32, ptr %41, align 4, !tbaa !20
  %555 = sext i32 %554 to i64
  %556 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 %555
  %557 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %557, ptr align 8 %556, i64 8, i1 false), !tbaa.struct !19
  %558 = load i32, ptr %41, align 4, !tbaa !20
  %559 = add nsw i32 %558, 1
  %560 = srem i32 %559, 4
  %561 = sext i32 %560 to i64
  %562 = getelementptr inbounds [4 x %struct.Vec2], ptr %26, i64 0, i64 %561
  %563 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %563, ptr align 8 %562, i64 8, i1 false), !tbaa.struct !19
  %564 = getelementptr inbounds %struct.Vec2, ptr %49, i32 0, i32 0
  %565 = getelementptr inbounds %struct.Vec2, ptr %49, i32 0, i32 1
  %566 = call noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4) %564, ptr noundef nonnull align 4 dereferenceable(4) %565)
  store i32 %566, ptr %41, align 4, !tbaa !20
  %567 = load i32, ptr %41, align 4, !tbaa !20
  %568 = sext i32 %567 to i64
  %569 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 %568
  %570 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %570, ptr align 8 %569, i64 8, i1 false), !tbaa.struct !19
  %571 = load i32, ptr %41, align 4, !tbaa !20
  %572 = add nsw i32 %571, 1
  %573 = srem i32 %572, 4
  %574 = sext i32 %573 to i64
  %575 = getelementptr inbounds [4 x %struct.Vec2], ptr %25, i64 0, i64 %574
  %576 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %576, ptr align 8 %575, i64 8, i1 false), !tbaa.struct !19
  br label %577

577:                                              ; preds = %553, %521
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #6
  %578 = call <2 x float> @_ZN4Mat29TransposeERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %49)
  store <2 x float> %578, ptr %54, align 4
  %579 = load ptr, ptr %4, align 8, !tbaa !5
  %580 = getelementptr inbounds %struct.Manifold, ptr %579, i32 0, i32 7
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %580, ptr align 4 %54, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #6
  %581 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 0
  %582 = call <2 x float> @_ZN4Mat29TransposeERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %581)
  store <2 x float> %582, ptr %55, align 4
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #6
  store i32 0, ptr %56, align 4, !tbaa !20
  br label %583

583:                                              ; preds = %662, %577
  %584 = load i32, ptr %56, align 4, !tbaa !20
  %585 = icmp slt i32 %584, 2
  br i1 %585, label %587, label %586

586:                                              ; preds = %583
  store i32 5, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #6
  br label %665

587:                                              ; preds = %583
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #6
  %588 = load i32, ptr %56, align 4, !tbaa !20
  %589 = sub nsw i32 1, %588
  %590 = sext i32 %589 to i64
  %591 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 %590
  %592 = load i32, ptr %56, align 4, !tbaa !20
  %593 = sext i32 %592 to i64
  %594 = getelementptr inbounds [2 x %struct.Vec2], ptr %47, i64 0, i64 %593
  %595 = load i32, ptr %56, align 4, !tbaa !20
  %596 = sext i32 %595 to i64
  %597 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 %596
  %598 = call <2 x float> @_ZL11ClipSegmentR4Vec2S0_S0_RKS_(ptr noundef nonnull align 4 dereferenceable(8) %591, ptr noundef nonnull align 4 dereferenceable(8) %594, ptr noundef nonnull align 4 dereferenceable(8) %597, ptr noundef nonnull align 4 dereferenceable(8) %49)
  store <2 x float> %598, ptr %57, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #6
  %599 = getelementptr inbounds [2 x %struct.Vec2], ptr %46, i64 0, i64 0
  %600 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %599, ptr noundef nonnull align 4 dereferenceable(8) %57)
  store <2 x float> %600, ptr %58, align 4
  %601 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %49, ptr noundef nonnull align 4 dereferenceable(8) %58)
  store float %601, ptr %43, align 4, !tbaa !16
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #6
  %602 = load float, ptr %43, align 4, !tbaa !16
  %603 = fcmp ole float %602, 0.000000e+00
  br i1 %603, label %604, label %661

604:                                              ; preds = %587
  call void @_ZN4Mat212SetTransposeER4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %57)
  %605 = load float, ptr %43, align 4, !tbaa !16
  %606 = load ptr, ptr %4, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.Manifold, ptr %606, i32 0, i32 1
  %608 = load i32, ptr %42, align 4, !tbaa !20
  %609 = sext i32 %608 to i64
  %610 = getelementptr inbounds [2 x %struct.Contact], ptr %607, i64 0, i64 %609
  %611 = getelementptr inbounds %struct.Contact, ptr %610, i32 0, i32 2
  store float %605, ptr %611, align 4, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #6
  %612 = load ptr, ptr %5, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.Shape, ptr %612, i32 0, i32 4
  %614 = load ptr, ptr %613, align 8, !tbaa !9
  %615 = getelementptr inbounds %struct.RigidBody, ptr %614, i32 0, i32 0
  %616 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %615, ptr noundef nonnull align 4 dereferenceable(8) %57)
  store <2 x float> %616, ptr %60, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #6
  %617 = load ptr, ptr %4, align 8, !tbaa !5
  %618 = getelementptr inbounds %struct.Manifold, ptr %617, i32 0, i32 7
  %619 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %618, ptr noundef nonnull align 4 dereferenceable(4) %43)
  store <2 x float> %619, ptr %61, align 4
  %620 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %60, ptr noundef nonnull align 4 dereferenceable(8) %61)
  store <2 x float> %620, ptr %59, align 4
  %621 = load ptr, ptr %4, align 8, !tbaa !5
  %622 = getelementptr inbounds %struct.Manifold, ptr %621, i32 0, i32 1
  %623 = load i32, ptr %42, align 4, !tbaa !20
  %624 = sext i32 %623 to i64
  %625 = getelementptr inbounds [2 x %struct.Contact], ptr %622, i64 0, i64 %624
  %626 = getelementptr inbounds %struct.Contact, ptr %625, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %626, ptr align 4 %59, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #6
  %627 = load ptr, ptr %5, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.Shape, ptr %627, i32 0, i32 4
  %629 = load ptr, ptr %628, align 8, !tbaa !9
  %630 = getelementptr inbounds %struct.RigidBody, ptr %629, i32 0, i32 0
  %631 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %630, ptr noundef nonnull align 4 dereferenceable(8) %57)
  store <2 x float> %631, ptr %63, align 4
  %632 = load ptr, ptr %4, align 8, !tbaa !5
  %633 = getelementptr inbounds %struct.Manifold, ptr %632, i32 0, i32 5
  %634 = load ptr, ptr %633, align 8, !tbaa !24
  %635 = getelementptr inbounds %struct.RigidBody, ptr %634, i32 0, i32 0
  %636 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %63, ptr noundef nonnull align 4 dereferenceable(8) %635)
  store <2 x float> %636, ptr %62, align 4
  %637 = load ptr, ptr %4, align 8, !tbaa !5
  %638 = getelementptr inbounds %struct.Manifold, ptr %637, i32 0, i32 2
  %639 = getelementptr inbounds %struct.PostPosition, ptr %638, i32 0, i32 2
  %640 = load i32, ptr %42, align 4, !tbaa !20
  %641 = sext i32 %640 to i64
  %642 = getelementptr inbounds [2 x %struct.Vec2], ptr %639, i64 0, i64 %641
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %642, ptr align 4 %62, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #6
  %643 = load ptr, ptr %5, align 8, !tbaa !5
  %644 = getelementptr inbounds %struct.Shape, ptr %643, i32 0, i32 4
  %645 = load ptr, ptr %644, align 8, !tbaa !9
  %646 = getelementptr inbounds %struct.RigidBody, ptr %645, i32 0, i32 0
  %647 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %646, ptr noundef nonnull align 4 dereferenceable(8) %55)
  store <2 x float> %647, ptr %65, align 4
  %648 = load ptr, ptr %4, align 8, !tbaa !5
  %649 = getelementptr inbounds %struct.Manifold, ptr %648, i32 0, i32 6
  %650 = load ptr, ptr %649, align 8, !tbaa !27
  %651 = getelementptr inbounds %struct.RigidBody, ptr %650, i32 0, i32 0
  %652 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %65, ptr noundef nonnull align 4 dereferenceable(8) %651)
  store <2 x float> %652, ptr %64, align 4
  %653 = load ptr, ptr %4, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.Manifold, ptr %653, i32 0, i32 2
  %655 = getelementptr inbounds %struct.PostPosition, ptr %654, i32 0, i32 3
  %656 = load i32, ptr %42, align 4, !tbaa !20
  %657 = sext i32 %656 to i64
  %658 = getelementptr inbounds [2 x %struct.Vec2], ptr %655, i64 0, i64 %657
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %658, ptr align 4 %64, i64 8, i1 false), !tbaa.struct !19
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #6
  %659 = load i32, ptr %42, align 4, !tbaa !20
  %660 = add nsw i32 %659, 1
  store i32 %660, ptr %42, align 4, !tbaa !20
  br label %661

661:                                              ; preds = %604, %587
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #6
  br label %662

662:                                              ; preds = %661
  %663 = load i32, ptr %56, align 4, !tbaa !20
  %664 = add nsw i32 %663, 1
  store i32 %664, ptr %56, align 4, !tbaa !20
  br label %583, !llvm.loop !30

665:                                              ; preds = %586
  %666 = load ptr, ptr %4, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.Manifold, ptr %666, i32 0, i32 5
  %668 = load ptr, ptr %667, align 8, !tbaa !24
  %669 = getelementptr inbounds %struct.RigidBody, ptr %668, i32 0, i32 3
  %670 = load float, ptr %669, align 8, !tbaa !14
  %671 = load ptr, ptr %4, align 8, !tbaa !5
  %672 = getelementptr inbounds %struct.Manifold, ptr %671, i32 0, i32 2
  %673 = getelementptr inbounds %struct.PostPosition, ptr %672, i32 0, i32 0
  store float %670, ptr %673, align 4, !tbaa !31
  %674 = load ptr, ptr %4, align 8, !tbaa !5
  %675 = getelementptr inbounds %struct.Manifold, ptr %674, i32 0, i32 6
  %676 = load ptr, ptr %675, align 8, !tbaa !27
  %677 = getelementptr inbounds %struct.RigidBody, ptr %676, i32 0, i32 3
  %678 = load float, ptr %677, align 8, !tbaa !14
  %679 = load ptr, ptr %4, align 8, !tbaa !5
  %680 = getelementptr inbounds %struct.Manifold, ptr %679, i32 0, i32 2
  %681 = getelementptr inbounds %struct.PostPosition, ptr %680, i32 0, i32 1
  store float %678, ptr %681, align 4, !tbaa !32
  %682 = load i32, ptr %42, align 4, !tbaa !20
  %683 = load ptr, ptr %4, align 8, !tbaa !5
  %684 = getelementptr inbounds %struct.Manifold, ptr %683, i32 0, i32 0
  store i32 %682, ptr %684, align 8, !tbaa !33
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %47) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %46) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr %37) #6
  store i32 0, ptr %21, align 4
  br label %685

685:                                              ; preds = %665, %381
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #6
  br label %686

686:                                              ; preds = %685, %321
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  br label %687

687:                                              ; preds = %686, %238
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  br label %688

688:                                              ; preds = %687, %171
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %7) #6
  %689 = load i32, ptr %21, align 4
  switch i32 %689, label %691 [
    i32 0, label %690
    i32 1, label %690
  ]

690:                                              ; preds = %688, %688
  ret void

691:                                              ; preds = %688
  unreachable
}

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

; Function Attrs: mustprogress uwtable
declare dso_local <2 x float> @_ZN4Mat27Column0Ev(ptr noundef nonnull align 4 dereferenceable(16)) #1 align 2

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) #4

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

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !6, i64 24}
!10 = !{!"_ZTS5Shape", !11, i64 8, !12, i64 12, !13, i64 20, !6, i64 24}
!11 = !{!"float", !7, i64 0}
!12 = !{!"_ZTS4Vec2", !11, i64 0, !11, i64 4}
!13 = !{!"_ZTS9typeShape", !7, i64 0}
!14 = !{!15, !11, i64 24}
!15 = !{!"_ZTS9RigidBody", !12, i64 0, !12, i64 8, !12, i64 16, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !6, i64 72}
!16 = !{!11, !11, i64 0}
!17 = !{!12, !11, i64 0}
!18 = !{!12, !11, i64 4}
!19 = !{i64 0, i64 4, !16, i64 4, i64 4, !16}
!20 = !{!21, !21, i64 0}
!21 = !{!"int", !7, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!25, !6, i64 144}
!25 = !{!"_ZTS8Manifold", !21, i64 0, !7, i64 4, !26, i64 92, !11, i64 132, !11, i64 136, !6, i64 144, !6, i64 152, !12, i64 160}
!26 = !{!"_ZTS12PostPosition", !11, i64 0, !11, i64 4, !7, i64 8, !7, i64 24}
!27 = !{!25, !6, i64 152}
!28 = !{!29, !11, i64 16}
!29 = !{!"_ZTS7Contact", !12, i64 0, !12, i64 8, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40}
!30 = distinct !{!30, !23}
!31 = !{!25, !11, i64 92}
!32 = !{!25, !11, i64 96}
!33 = !{!25, !21, i64 0}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%class.Mat2 = type { float, float, float, float }
%struct.Vec2 = type { float, float }
%struct.Contact = type { %struct.Vec2, %struct.Vec2, float, float, float, float, float, float, float }

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

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

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

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_Z8OBBToOBBR8ManifoldP5ShapeS2_(ptr noundef nonnull align 8 dereferenceable(168) %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #1 {
  %4 = alloca %class.Mat2, align 4
  %5 = alloca float, align 4
  %6 = alloca %class.Mat2, align 4
  %7 = alloca float, align 4
  %8 = alloca %struct.Vec2, align 8
  %9 = alloca float, align 4
  %10 = alloca %struct.Vec2, align 8
  %11 = alloca float, align 4
  %12 = alloca %struct.Vec2, align 8
  %13 = alloca %struct.Vec2, align 8
  %14 = alloca %struct.Vec2, align 4
  %15 = alloca %struct.Vec2, align 8
  %16 = alloca %struct.Vec2, align 8
  %17 = alloca %struct.Vec2, align 8
  %18 = alloca %struct.Vec2, align 8
  %19 = alloca [4 x %struct.Vec2], align 16
  %20 = alloca [4 x %struct.Vec2], align 16
  %21 = alloca [4 x %struct.Vec2], align 16
  %22 = alloca float, align 4
  %23 = alloca [4 x float], align 16
  %24 = alloca [4 x float], align 16
  %25 = alloca float, align 4
  %26 = alloca [2 x %struct.Vec2], align 16
  %27 = alloca [2 x %struct.Vec2], align 16
  %28 = alloca %struct.Vec2, align 8
  %29 = alloca float, align 4
  %30 = alloca float, align 4
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca %struct.Vec2, align 8
  %34 = alloca %struct.Vec2, align 8
  %35 = alloca %struct.Vec2, align 8
  %36 = alloca %struct.Vec2, align 8
  %37 = alloca %struct.Vec2, align 8
  %38 = alloca %struct.Vec2, align 8
  %39 = alloca %struct.Vec2, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %4) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #5
  %40 = getelementptr inbounds i8, ptr %2, i64 24
  %41 = load ptr, ptr %40, align 8, !tbaa !5
  %42 = getelementptr inbounds i8, ptr %41, i64 24
  %43 = load float, ptr %42, align 8, !tbaa !13
  %44 = getelementptr inbounds i8, ptr %1, i64 24
  %45 = load ptr, ptr %44, align 8, !tbaa !5
  %46 = getelementptr inbounds i8, ptr %45, i64 24
  %47 = load float, ptr %46, align 8, !tbaa !13
  %48 = fsub float %43, %47
  store float %48, ptr %5, align 4, !tbaa !15
  call void @_ZN4Mat2C2ERKf(ptr noundef nonnull align 4 dereferenceable(16) %4, ptr noundef nonnull align 4 dereferenceable(4) %5)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %7) #5
  %49 = load ptr, ptr %44, align 8, !tbaa !5
  %50 = getelementptr inbounds i8, ptr %49, i64 24
  %51 = load float, ptr %50, align 8, !tbaa !13
  %52 = fneg float %51
  store float %52, ptr %7, align 4, !tbaa !15
  call void @_ZN4Mat2C2ERKf(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(4) %7)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %7) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #5
  %53 = getelementptr inbounds i8, ptr %1, i64 12
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #5
  store float 5.000000e-01, ptr %9, align 4, !tbaa !15
  %54 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %53, ptr noundef nonnull align 4 dereferenceable(4) %9)
  store <2 x float> %54, ptr %8, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #5
  %55 = getelementptr inbounds i8, ptr %2, i64 12
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #5
  store float 5.000000e-01, ptr %11, align 4, !tbaa !15
  %56 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %55, ptr noundef nonnull align 4 dereferenceable(4) %11)
  store <2 x float> %56, ptr %10, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #5
  %57 = call <2 x float> @_ZN4Mat2mlERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %4, ptr noundef nonnull align 4 dereferenceable(8) %10)
  store <2 x float> %57, ptr %12, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #5
  %58 = load float, ptr %10, align 8, !tbaa !16
  %59 = fneg float %58
  %60 = getelementptr inbounds i8, ptr %10, i64 4
  %61 = load float, ptr %60, align 4, !tbaa !17
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %14, float noundef %59, float noundef %61)
  %62 = call <2 x float> @_ZN4Mat2mlERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %4, ptr noundef nonnull align 4 dereferenceable(8) %14)
  store <2 x float> %62, ptr %13, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #5
  %63 = load ptr, ptr %40, align 8, !tbaa !5
  %64 = load ptr, ptr %44, align 8, !tbaa !5
  %65 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %63, ptr noundef nonnull align 4 dereferenceable(8) %64)
  store <2 x float> %65, ptr %16, align 8
  %66 = call <2 x float> @_ZN4Mat26RotateERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(8) %16)
  store <2 x float> %66, ptr %15, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #5
  %67 = extractelement <2 x float> %54, i64 0
  %68 = extractelement <2 x float> %57, i64 0
  %69 = fcmp olt float %68, 0.000000e+00
  %70 = fneg float %68
  %71 = select i1 %69, float %70, float %68
  %72 = extractelement <2 x float> %62, i64 0
  %73 = fcmp olt float %72, 0.000000e+00
  %74 = fneg float %72
  %75 = select i1 %73, float %74, float %72
  %76 = fcmp olt float %71, %75
  %. = select i1 %76, float %75, float %71
  %77 = fadd float %., %67
  %78 = fmul <2 x float> %66, %66
  %79 = extractelement <2 x float> %78, i64 0
  %80 = fmul float %77, %77
  %81 = fcmp ogt float %79, %80
  %82 = extractelement <2 x float> %54, i64 1
  br i1 %81, label %299, label %83

83:                                               ; preds = %3
  %84 = shufflevector <2 x float> %57, <2 x float> %62, <2 x i32> <i32 1, i32 3>
  %85 = fcmp olt <2 x float> %84, zeroinitializer
  %86 = fneg <2 x float> %84
  %87 = select <2 x i1> %85, <2 x float> %86, <2 x float> %84
  %88 = extractelement <2 x float> %87, i64 0
  %89 = extractelement <2 x float> %87, i64 1
  %90 = fcmp olt float %88, %89
  %.134 = select i1 %90, float %89, float %88
  %91 = fadd float %82, %.134
  %92 = fmul <2 x float> %66, %66
  %93 = extractelement <2 x float> %92, i64 1
  %94 = fmul float %91, %91
  %95 = fcmp ogt float %93, %94
  br i1 %95, label %299, label %96

96:                                               ; preds = %83
  %97 = getelementptr inbounds i8, ptr %8, i64 4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %18) #5
  %98 = call <2 x float> @_ZN4Mat27Column0Ev(ptr noundef nonnull align 4 dereferenceable(16) %4)
  store <2 x float> %98, ptr %18, align 8
  %99 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %18)
  store <2 x float> %99, ptr %17, align 8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #5
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %19) #5
  %100 = fneg float %67
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %19, float noundef %100, float noundef %82)
  %101 = getelementptr inbounds i8, ptr %19, i64 8
  %102 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %8)
  store <2 x float> %102, ptr %101, align 8
  %103 = getelementptr inbounds i8, ptr %19, i64 16
  %104 = load float, ptr %8, align 8, !tbaa !16
  %105 = load float, ptr %97, align 4, !tbaa !17
  %106 = fneg float %105
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %103, float noundef %104, float noundef %106)
  %107 = getelementptr inbounds i8, ptr %19, i64 24
  %108 = load i64, ptr %8, align 8
  store i64 %108, ptr %107, align 8
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %20) #5
  %109 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %15, ptr noundef nonnull align 4 dereferenceable(8) %13)
  store <2 x float> %109, ptr %20, align 16
  %110 = getelementptr inbounds i8, ptr %20, i64 8
  %111 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %15, ptr noundef nonnull align 4 dereferenceable(8) %12)
  store <2 x float> %111, ptr %110, align 8
  %112 = getelementptr inbounds i8, ptr %20, i64 16
  %113 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %15, ptr noundef nonnull align 4 dereferenceable(8) %13)
  store <2 x float> %113, ptr %112, align 16
  %114 = getelementptr inbounds i8, ptr %20, i64 24
  %115 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %15, ptr noundef nonnull align 4 dereferenceable(8) %12)
  store <2 x float> %115, ptr %114, align 8
  %116 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %19)
  %117 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %101)
  %118 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %114)
  %119 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %110)
  %120 = insertelement <2 x float> poison, float %116, i64 0
  %121 = insertelement <2 x float> %120, float %117, i64 1
  %122 = fcmp olt <2 x float> %121, zeroinitializer
  %123 = fneg <2 x float> %121
  %124 = select <2 x i1> %122, <2 x float> %123, <2 x float> %121
  %125 = extractelement <2 x float> %124, i64 0
  %126 = extractelement <2 x float> %124, i64 1
  %127 = fcmp olt float %125, %126
  %.135 = select i1 %127, float %126, float %125
  %128 = fsub float %118, %.135
  %129 = fadd float %119, %.135
  %130 = fmul float %128, %129
  %131 = fcmp ogt float %130, 0.000000e+00
  br i1 %131, label %298, label %132

132:                                              ; preds = %96
  %133 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %19)
  %134 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %101)
  %135 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %114)
  %136 = call noundef float @_Z5CrossRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(8) %110)
  %137 = insertelement <2 x float> poison, float %133, i64 0
  %138 = insertelement <2 x float> %137, float %134, i64 1
  %139 = fcmp olt <2 x float> %138, zeroinitializer
  %140 = fneg <2 x float> %138
  %141 = select <2 x i1> %139, <2 x float> %140, <2 x float> %138
  %142 = extractelement <2 x float> %141, i64 0
  %143 = extractelement <2 x float> %141, i64 1
  %144 = fcmp olt float %142, %143
  %.136 = select i1 %144, float %143, float %142
  %145 = fsub float %135, %.136
  %146 = fadd float %136, %.136
  %147 = fmul float %145, %146
  %148 = fcmp ogt float %147, 0.000000e+00
  br i1 %148, label %298, label %149

149:                                              ; preds = %132
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %21) #5
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %21, float noundef -1.000000e+00, float noundef 0.000000e+00)
  %150 = getelementptr inbounds i8, ptr %21, i64 8
  call void @_ZN4Vec2C2Eff(ptr noundef nonnull align 4 dereferenceable(8) %150, float noundef 0.000000e+00, float noundef -1.000000e+00)
  %151 = getelementptr inbounds i8, ptr %21, i64 16
  %152 = load i64, ptr %17, align 8
  store i64 %152, ptr %151, align 16
  %153 = getelementptr inbounds i8, ptr %21, i64 24
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %22) #5
  store float -1.000000e+00, ptr %22, align 4, !tbaa !15
  %154 = call <2 x float> @_Z5CrossRK4Vec2RKf(ptr noundef nonnull align 4 dereferenceable(8) %17, ptr noundef nonnull align 4 dereferenceable(4) %22)
  store <2 x float> %154, ptr %153, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %22) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %23) #5
  %155 = load <2 x float>, ptr %15, align 8, !tbaa !15
  %156 = insertelement <2 x float> poison, float %77, i64 0
  %157 = insertelement <2 x float> %156, float %91, i64 1
  %158 = fadd <2 x float> %157, %155
  store <2 x float> %158, ptr %23, align 16, !tbaa !15
  %159 = getelementptr inbounds i8, ptr %23, i64 8
  %160 = fsub float %.135, %118
  store float %160, ptr %159, align 8, !tbaa !15
  %161 = getelementptr inbounds i8, ptr %23, i64 12
  %162 = fsub float %.136, %135
  store float %162, ptr %161, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %24) #5
  %163 = fsub <2 x float> %157, %155
  store <2 x float> %163, ptr %24, align 16, !tbaa !15
  %164 = getelementptr inbounds i8, ptr %24, i64 8
  store float %129, ptr %164, align 8, !tbaa !15
  %165 = getelementptr inbounds i8, ptr %24, i64 12
  store float %146, ptr %165, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %25) #5
  %166 = extractelement <2 x float> %158, i64 0
  %167 = extractelement <2 x float> %163, i64 0
  %168 = fcmp ogt float %166, %167
  %169 = select i1 %168, float %167, float %166
  %170 = extractelement <2 x float> %158, i64 1
  %171 = extractelement <2 x float> %163, i64 1
  %172 = fcmp ogt float %170, %171
  %.137 = select i1 %172, float %171, float %170
  %173 = fadd float %169, 0x3F7CAC0840000000
  %174 = fcmp ole float %.137, %173
  %.137138 = select i1 %174, float %.137, float %169
  %175 = fcmp ogt float %160, %129
  %.137.1 = select i1 %175, float %129, float %160
  %176 = fadd float %.137138, 0x3F7CAC0840000000
  %177 = fcmp ugt float %.137.1, %176
  %.137138.1 = select i1 %177, float %.137138, float %.137.1
  %178 = fcmp ogt float %162, %146
  %.137.2 = select i1 %178, float %146, float %162
  %179 = fadd float %.137138.1, 0x3F7CAC0840000000
  %180 = fcmp ugt float %.137.2, %179
  %.137138.2 = select i1 %180, float %.137138.1, float %.137.2
  store float %.137138.2, ptr %25, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #5
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %26)
  %.ptr.1 = getelementptr inbounds i8, ptr %26, i64 8
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %.ptr.1)
  %.1 = zext i1 %174 to i32
  %.1.1 = select i1 %177, i32 %.1, i32 2
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %27) #5
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %27)
  %.ptr132.1 = getelementptr inbounds i8, ptr %27, i64 8
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %.ptr132.1)
  %.1.2 = select i1 %180, i32 %.1.1, i32 3
  %181 = zext nneg i32 %.1.2 to i64
  %182 = getelementptr inbounds [4 x float], ptr %23, i64 0, i64 %181
  %183 = load float, ptr %182, align 4, !tbaa !15
  %184 = getelementptr inbounds [4 x float], ptr %24, i64 0, i64 %181
  %185 = load float, ptr %184, align 4, !tbaa !15
  %186 = fcmp uge float %183, %185
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %28) #5
  %187 = getelementptr inbounds [4 x %struct.Vec2], ptr %21, i64 0, i64 %181
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %29) #5
  %188 = select i1 %186, float -1.000000e+00, float 1.000000e+00
  store float %188, ptr %29, align 4, !tbaa !15
  %189 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %187, ptr noundef nonnull align 4 dereferenceable(4) %29)
  store <2 x float> %189, ptr %28, align 8
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %29) #5
  %190 = select i1 %180, i1 %177, i1 false
  br i1 %190, label %191, label %216

191:                                              ; preds = %149
  %192 = load ptr, ptr %40, align 8, !tbaa !5
  %193 = getelementptr inbounds i8, ptr %0, i64 144
  store ptr %192, ptr %193, align 8, !tbaa !18
  %194 = load ptr, ptr %44, align 8, !tbaa !5
  %195 = getelementptr inbounds i8, ptr %0, i64 152
  store ptr %194, ptr %195, align 8, !tbaa !22
  %196 = add nuw nsw i32 %.1.2, 2
  %.2 = select i1 %186, i32 %196, i32 %.1.2
  %197 = zext nneg i32 %.2 to i64
  %198 = getelementptr inbounds [4 x %struct.Vec2], ptr %19, i64 0, i64 %197
  %199 = load i64, ptr %198, align 8
  store i64 %199, ptr %26, align 16
  %200 = add nuw nsw i32 %.2, 1
  %201 = and i32 %200, 3
  %202 = zext nneg i32 %201 to i64
  %203 = getelementptr inbounds [4 x %struct.Vec2], ptr %19, i64 0, i64 %202
  %204 = load i64, ptr %203, align 8
  store i64 %204, ptr %.ptr.1, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %30) #5
  %205 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(8) %151)
  store float %205, ptr %30, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %31) #5
  %206 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(8) %153)
  store float %206, ptr %31, align 4, !tbaa !15
  %207 = call noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4) %30, ptr noundef nonnull align 4 dereferenceable(4) %31)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %31) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %30) #5
  %208 = sext i32 %207 to i64
  %209 = getelementptr inbounds [4 x %struct.Vec2], ptr %20, i64 0, i64 %208
  %210 = load i64, ptr %209, align 8
  store i64 %210, ptr %27, align 16
  %211 = add nsw i32 %207, 1
  %212 = srem i32 %211, 4
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds [4 x %struct.Vec2], ptr %20, i64 0, i64 %213
  %215 = load i64, ptr %214, align 8
  store i64 %215, ptr %.ptr132.1, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %32) #5
  store float -1.000000e+00, ptr %32, align 4, !tbaa !15
  call void @_ZN4Vec2mLERKf(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(4) %32)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %32) #5
  br label %236

216:                                              ; preds = %149
  %217 = add nsw i32 %.1.2, -2
  %.3 = select i1 %186, i32 %217, i32 %.1.2
  %218 = zext nneg i32 %.3 to i64
  %219 = getelementptr inbounds [4 x %struct.Vec2], ptr %20, i64 0, i64 %218
  %220 = load i64, ptr %219, align 8
  store i64 %220, ptr %26, align 16
  %221 = add nuw nsw i32 %.3, 1
  %222 = and i32 %221, 3
  %223 = zext nneg i32 %222 to i64
  %224 = getelementptr inbounds [4 x %struct.Vec2], ptr %20, i64 0, i64 %223
  %225 = load i64, ptr %224, align 8
  store i64 %225, ptr %.ptr.1, align 8
  %226 = getelementptr inbounds i8, ptr %28, i64 4
  %227 = call noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4) %28, ptr noundef nonnull align 4 dereferenceable(4) %226)
  %228 = sext i32 %227 to i64
  %229 = getelementptr inbounds [4 x %struct.Vec2], ptr %19, i64 0, i64 %228
  %230 = load i64, ptr %229, align 8
  store i64 %230, ptr %27, align 16
  %231 = add nsw i32 %227, 1
  %232 = srem i32 %231, 4
  %233 = sext i32 %232 to i64
  %234 = getelementptr inbounds [4 x %struct.Vec2], ptr %19, i64 0, i64 %233
  %235 = load i64, ptr %234, align 8
  store i64 %235, ptr %.ptr132.1, align 8
  br label %236

236:                                              ; preds = %216, %191
  %237 = call <2 x float> @_ZN4Mat29TransposeERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(8) %28)
  %238 = getelementptr inbounds i8, ptr %0, i64 160
  store <2 x float> %237, ptr %238, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %33) #5
  %239 = call <2 x float> @_ZN4Mat29TransposeERK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(8) %26)
  store <2 x float> %239, ptr %33, align 8
  %240 = getelementptr inbounds i8, ptr %0, i64 4
  %241 = getelementptr inbounds i8, ptr %0, i64 144
  %242 = getelementptr inbounds i8, ptr %0, i64 100
  %243 = getelementptr inbounds i8, ptr %0, i64 152
  %244 = getelementptr inbounds i8, ptr %0, i64 116
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #5
  %245 = call <2 x float> @_ZL11ClipSegmentR4Vec2S0_S0_RKS_(ptr noundef nonnull align 4 dereferenceable(8) %.ptr132.1, ptr noundef nonnull align 4 dereferenceable(8) %27, ptr noundef nonnull align 4 dereferenceable(8) %26, ptr noundef nonnull align 4 dereferenceable(8) %28)
  store <2 x float> %245, ptr %34, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #5
  %246 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %26, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %246, ptr %35, align 8
  %247 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(8) %35)
  store float %247, ptr %25, align 4, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #5
  %248 = fcmp ugt float %247, 0.000000e+00
  br i1 %248, label %264, label %249

249:                                              ; preds = %236
  call void @_ZN4Mat212SetTransposeER4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(8) %34)
  %250 = load float, ptr %25, align 4, !tbaa !15
  %251 = getelementptr inbounds i8, ptr %0, i64 20
  store float %250, ptr %251, align 4, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #5
  %252 = load ptr, ptr %44, align 8, !tbaa !5
  %253 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %252, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %253, ptr %36, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %37) #5
  %254 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %238, ptr noundef nonnull align 4 dereferenceable(4) %25)
  store <2 x float> %254, ptr %37, align 8
  %255 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %36, ptr noundef nonnull align 4 dereferenceable(8) %37)
  store <2 x float> %255, ptr %240, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %38) #5
  %256 = load ptr, ptr %44, align 8, !tbaa !5
  %257 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %256, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %257, ptr %38, align 8
  %258 = load ptr, ptr %241, align 8, !tbaa !18
  %259 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %38, ptr noundef nonnull align 4 dereferenceable(8) %258)
  store <2 x float> %259, ptr %242, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %38) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %39) #5
  %260 = load ptr, ptr %44, align 8, !tbaa !5
  %261 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %260, ptr noundef nonnull align 4 dereferenceable(8) %33)
  store <2 x float> %261, ptr %39, align 8
  %262 = load ptr, ptr %243, align 8, !tbaa !22
  %263 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %39, ptr noundef nonnull align 4 dereferenceable(8) %262)
  store <2 x float> %263, ptr %244, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %39) #5
  br label %264

264:                                              ; preds = %249, %236
  %.1115 = phi i32 [ 1, %249 ], [ 0, %236 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %34) #5
  %265 = call <2 x float> @_ZL11ClipSegmentR4Vec2S0_S0_RKS_(ptr noundef nonnull align 4 dereferenceable(8) %27, ptr noundef nonnull align 4 dereferenceable(8) %.ptr132.1, ptr noundef nonnull align 4 dereferenceable(8) %.ptr.1, ptr noundef nonnull align 4 dereferenceable(8) %28)
  store <2 x float> %265, ptr %34, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #5
  %266 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %26, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %266, ptr %35, align 8
  %267 = call noundef float @_ZN4Vec2mlERKS_(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(8) %35)
  store float %267, ptr %25, align 4, !tbaa !15
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #5
  %268 = fcmp ugt float %267, 0.000000e+00
  br i1 %268, label %289, label %269

269:                                              ; preds = %264
  call void @_ZN4Mat212SetTransposeER4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %6, ptr noundef nonnull align 4 dereferenceable(8) %34)
  %270 = load float, ptr %25, align 4, !tbaa !15
  %271 = zext nneg i32 %.1115 to i64
  %272 = getelementptr inbounds [2 x %struct.Contact], ptr %240, i64 0, i64 %271
  %273 = getelementptr inbounds i8, ptr %272, i64 16
  store float %270, ptr %273, align 4, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %36) #5
  %274 = load ptr, ptr %44, align 8, !tbaa !5
  %275 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %274, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %275, ptr %36, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %37) #5
  %276 = call <2 x float> @_ZN4Vec2mlERKf(ptr noundef nonnull align 4 dereferenceable(8) %238, ptr noundef nonnull align 4 dereferenceable(4) %25)
  store <2 x float> %276, ptr %37, align 8
  %277 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %36, ptr noundef nonnull align 4 dereferenceable(8) %37)
  store <2 x float> %277, ptr %272, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %36) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %38) #5
  %278 = load ptr, ptr %44, align 8, !tbaa !5
  %279 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %278, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %279, ptr %38, align 8
  %280 = load ptr, ptr %241, align 8, !tbaa !18
  %281 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %38, ptr noundef nonnull align 4 dereferenceable(8) %280)
  %282 = getelementptr inbounds [2 x %struct.Vec2], ptr %242, i64 0, i64 %271
  store <2 x float> %281, ptr %282, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %38) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %39) #5
  %283 = load ptr, ptr %44, align 8, !tbaa !5
  %284 = call <2 x float> @_ZN4Vec2plERKS_(ptr noundef nonnull align 4 dereferenceable(8) %283, ptr noundef nonnull align 4 dereferenceable(8) %33)
  store <2 x float> %284, ptr %39, align 8
  %285 = load ptr, ptr %243, align 8, !tbaa !22
  %286 = call <2 x float> @_ZN4Vec2miERKS_(ptr noundef nonnull align 4 dereferenceable(8) %39, ptr noundef nonnull align 4 dereferenceable(8) %285)
  %287 = getelementptr inbounds [2 x %struct.Vec2], ptr %244, i64 0, i64 %271
  store <2 x float> %286, ptr %287, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %39) #5
  %288 = add nuw nsw i32 %.1115, 1
  br label %289

289:                                              ; preds = %269, %264
  %.1115.1 = phi i32 [ %288, %269 ], [ %.1115, %264 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %34) #5
  %290 = load ptr, ptr %241, align 8, !tbaa !18
  %291 = getelementptr inbounds i8, ptr %290, i64 24
  %292 = load float, ptr %291, align 8, !tbaa !13
  %293 = getelementptr inbounds i8, ptr %0, i64 92
  store float %292, ptr %293, align 4, !tbaa !25
  %294 = load ptr, ptr %243, align 8, !tbaa !22
  %295 = getelementptr inbounds i8, ptr %294, i64 24
  %296 = load float, ptr %295, align 8, !tbaa !13
  %297 = getelementptr inbounds i8, ptr %0, i64 96
  store float %296, ptr %297, align 8, !tbaa !26
  store i32 %.1115.1, ptr %0, align 8, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %28) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %27) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %25) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %24) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %23) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %21) #5
  br label %298

298:                                              ; preds = %289, %132, %96
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %20) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #5
  br label %299

299:                                              ; preds = %298, %83, %3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #5
  ret void
}

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

; Function Attrs: mustprogress uwtable
declare dso_local <2 x float> @_ZN4Mat27Column0Ev(ptr noundef nonnull align 4 dereferenceable(16)) local_unnamed_addr #1 align 2

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL21FindIncidentEdgeIndexRKfS0_(ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #3

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

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

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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 24}
!6 = !{!"_ZTS5Shape", !7, i64 8, !10, i64 12, !11, i64 20, !12, i64 24}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTS4Vec2", !7, i64 0, !7, i64 4}
!11 = !{!"_ZTS9typeShape", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!14, !7, i64 24}
!14 = !{!"_ZTS9RigidBody", !10, i64 0, !10, i64 8, !10, i64 16, !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, !12, i64 72}
!15 = !{!7, !7, i64 0}
!16 = !{!10, !7, i64 0}
!17 = !{!10, !7, i64 4}
!18 = !{!19, !12, i64 144}
!19 = !{!"_ZTS8Manifold", !20, i64 0, !8, i64 4, !21, i64 92, !7, i64 132, !7, i64 136, !12, i64 144, !12, i64 152, !10, i64 160}
!20 = !{!"int", !8, i64 0}
!21 = !{!"_ZTS12PostPosition", !7, i64 0, !7, i64 4, !8, i64 8, !8, i64 24}
!22 = !{!19, !12, i64 152}
!23 = !{!24, !7, i64 16}
!24 = !{!"_ZTS7Contact", !10, i64 0, !10, i64 8, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40}
!25 = !{!19, !7, i64 92}
!26 = !{!19, !7, i64 96}
!27 = !{!19, !20, i64 0}


; Effective O3 passes: BDCEPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LCSSAPass,LICMPass,LoopRotatePass,ReassociatePass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,VectorCombinePass