; LLVM IR from erincatto/box2d-lite :: src/Collide.ll (Z7CollideP7ContactP4BodyS2_)

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

%struct.Vec2 = type { float, float }
%struct.Mat22 = type { %struct.Vec2, %struct.Vec2 }
%struct.ClipVertex = type { %struct.Vec2, %union.FeaturePair }
%union.FeaturePair = type { i32 }
%struct.Body = type { %struct.Vec2, float, %struct.Vec2, float, %struct.Vec2, float, %struct.Vec2, float, float, float, float, float }
%struct.Contact = type { %struct.Vec2, %struct.Vec2, %struct.Vec2, %struct.Vec2, float, float, float, float, float, float, float, %union.FeaturePair }

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z4FlipR11FeaturePair(ptr noundef nonnull align 4 dereferenceable(4)) #0

; Function Attrs: mustprogress uwtable
declare dso_local noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef, ptr noundef, ptr noundef nonnull align 4 dereferenceable(8), float noundef, i8 noundef signext) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #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)) #3

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

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

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

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

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

114:                                              ; preds = %3
  %115 = getelementptr inbounds %struct.Vec2, ptr %22, i32 0, i32 1
  %116 = load float, ptr %115, align 4, !tbaa !16
  %117 = fcmp ogt float %116, 0.000000e+00
  br i1 %117, label %118, label %119

118:                                              ; preds = %114, %3
  store i32 0, ptr %4, align 4
  store i32 1, ptr %26, align 4
  br label %388

119:                                              ; preds = %114
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #8
  %120 = call <2 x float> @_Z3AbsRK4Vec2(ptr noundef nonnull align 4 dereferenceable(8) %18)
  store <2 x float> %120, ptr %29, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #8
  %121 = call <2 x float> @_ZmlRK5Mat22RK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %21, ptr noundef nonnull align 4 dereferenceable(8) %8)
  store <2 x float> %121, ptr %30, align 4
  %122 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %29, ptr noundef nonnull align 4 dereferenceable(8) %30)
  store <2 x float> %122, ptr %28, align 4
  %123 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %28, ptr noundef nonnull align 4 dereferenceable(8) %9)
  store <2 x float> %123, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #8
  %124 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 0
  %125 = load float, ptr %124, align 4, !tbaa !15
  %126 = fcmp ogt float %125, 0.000000e+00
  br i1 %126, label %131, label %127

127:                                              ; preds = %119
  %128 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 1
  %129 = load float, ptr %128, align 4, !tbaa !16
  %130 = fcmp ogt float %129, 0.000000e+00
  br i1 %130, label %131, label %132

131:                                              ; preds = %127, %119
  store i32 0, ptr %4, align 4
  store i32 1, ptr %26, align 4
  br label %387

132:                                              ; preds = %127
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #8
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %33)
  store i32 0, ptr %31, align 4, !tbaa !17
  %133 = getelementptr inbounds %struct.Vec2, ptr %22, i32 0, i32 0
  %134 = load float, ptr %133, align 4, !tbaa !15
  store float %134, ptr %32, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #8
  %135 = getelementptr inbounds %struct.Vec2, ptr %17, i32 0, i32 0
  %136 = load float, ptr %135, align 4, !tbaa !15
  %137 = fcmp ogt float %136, 0.000000e+00
  br i1 %137, label %138, label %140

138:                                              ; preds = %132
  %139 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %34, ptr align 4 %139, i64 8, i1 false), !tbaa.struct !9
  br label %143

140:                                              ; preds = %132
  %141 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 0
  %142 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %141)
  store <2 x float> %142, ptr %34, align 4
  br label %143

143:                                              ; preds = %140, %138
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %34, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #8
  store float 0x3FEE666660000000, ptr %35, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #8
  store float 0x3F847AE140000000, ptr %36, align 4, !tbaa !10
  %144 = getelementptr inbounds %struct.Vec2, ptr %22, i32 0, i32 1
  %145 = load float, ptr %144, align 4, !tbaa !16
  %146 = load float, ptr %32, align 4, !tbaa !10
  %147 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 1
  %148 = load float, ptr %147, align 4, !tbaa !16
  %149 = fmul float 0x3F847AE140000000, %148
  %150 = call float @llvm.fmuladd.f32(float 0x3FEE666660000000, float %146, float %149)
  %151 = fcmp ogt float %145, %150
  br i1 %151, label %152, label %164

152:                                              ; preds = %143
  store i32 1, ptr %31, align 4, !tbaa !17
  %153 = getelementptr inbounds %struct.Vec2, ptr %22, i32 0, i32 1
  %154 = load float, ptr %153, align 4, !tbaa !16
  store float %154, ptr %32, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #8
  %155 = getelementptr inbounds %struct.Vec2, ptr %17, i32 0, i32 1
  %156 = load float, ptr %155, align 4, !tbaa !16
  %157 = fcmp ogt float %156, 0.000000e+00
  br i1 %157, label %158, label %160

158:                                              ; preds = %152
  %159 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %37, ptr align 4 %159, i64 8, i1 false), !tbaa.struct !9
  br label %163

160:                                              ; preds = %152
  %161 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 1
  %162 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %161)
  store <2 x float> %162, ptr %37, align 4
  br label %163

163:                                              ; preds = %160, %158
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %37, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #8
  br label %164

164:                                              ; preds = %163, %143
  %165 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 0
  %166 = load float, ptr %165, align 4, !tbaa !15
  %167 = load float, ptr %32, align 4, !tbaa !10
  %168 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 0
  %169 = load float, ptr %168, align 4, !tbaa !15
  %170 = fmul float 0x3F847AE140000000, %169
  %171 = call float @llvm.fmuladd.f32(float 0x3FEE666660000000, float %167, float %170)
  %172 = fcmp ogt float %166, %171
  br i1 %172, label %173, label %185

173:                                              ; preds = %164
  store i32 2, ptr %31, align 4, !tbaa !17
  %174 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 0
  %175 = load float, ptr %174, align 4, !tbaa !15
  store float %175, ptr %32, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #8
  %176 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 0
  %177 = load float, ptr %176, align 4, !tbaa !15
  %178 = fcmp ogt float %177, 0.000000e+00
  br i1 %178, label %179, label %181

179:                                              ; preds = %173
  %180 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %38, ptr align 4 %180, i64 8, i1 false), !tbaa.struct !9
  br label %184

181:                                              ; preds = %173
  %182 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 0
  %183 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %182)
  store <2 x float> %183, ptr %38, align 4
  br label %184

184:                                              ; preds = %181, %179
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %38, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #8
  br label %185

185:                                              ; preds = %184, %164
  %186 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 1
  %187 = load float, ptr %186, align 4, !tbaa !16
  %188 = load float, ptr %32, align 4, !tbaa !10
  %189 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 1
  %190 = load float, ptr %189, align 4, !tbaa !16
  %191 = fmul float 0x3F847AE140000000, %190
  %192 = call float @llvm.fmuladd.f32(float 0x3FEE666660000000, float %188, float %191)
  %193 = fcmp ogt float %187, %192
  br i1 %193, label %194, label %206

194:                                              ; preds = %185
  store i32 3, ptr %31, align 4, !tbaa !17
  %195 = getelementptr inbounds %struct.Vec2, ptr %27, i32 0, i32 1
  %196 = load float, ptr %195, align 4, !tbaa !16
  store float %196, ptr %32, align 4, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #8
  %197 = getelementptr inbounds %struct.Vec2, ptr %18, i32 0, i32 1
  %198 = load float, ptr %197, align 4, !tbaa !16
  %199 = fcmp ogt float %198, 0.000000e+00
  br i1 %199, label %200, label %202

200:                                              ; preds = %194
  %201 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %39, ptr align 4 %201, i64 8, i1 false), !tbaa.struct !9
  br label %205

202:                                              ; preds = %194
  %203 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 1
  %204 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %203)
  store <2 x float> %204, ptr %39, align 4
  br label %205

205:                                              ; preds = %202, %200
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %33, ptr align 4 %39, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #8
  br label %206

206:                                              ; preds = %205, %185
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #8
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %40)
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #8
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %41)
  call void @llvm.lifetime.start.p0(i64 24, ptr %42) #8
  %207 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i32 0, i32 0
  %208 = getelementptr inbounds %struct.ClipVertex, ptr %207, i64 2
  br label %209

209:                                              ; preds = %209, %206
  %210 = phi ptr [ %207, %206 ], [ %211, %209 ]
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %210)
  %211 = getelementptr inbounds %struct.ClipVertex, ptr %210, i64 1
  %212 = icmp eq ptr %211, %208
  br i1 %212, label %213, label %209

213:                                              ; preds = %209
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #8
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #8
  call void @llvm.lifetime.start.p0(i64 1, ptr %46) #8
  call void @llvm.lifetime.start.p0(i64 1, ptr %47) #8
  %214 = load i32, ptr %31, align 4, !tbaa !17
  switch i32 %214, label %285 [
    i32 0, label %215
    i32 1, label %232
    i32 2, label %249
    i32 3, label %267
  ]

215:                                              ; preds = %213
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 4 %33, i64 8, i1 false), !tbaa.struct !9
  %216 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(8) %40)
  %217 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 0
  %218 = load float, ptr %217, align 4, !tbaa !15
  %219 = fadd float %216, %218
  store float %219, ptr %43, align 4, !tbaa !10
  %220 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %41, ptr align 4 %220, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #8
  %221 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(8) %41)
  store float %221, ptr %48, align 4, !tbaa !10
  %222 = load float, ptr %48, align 4, !tbaa !10
  %223 = fneg float %222
  %224 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 1
  %225 = load float, ptr %224, align 4, !tbaa !16
  %226 = fadd float %223, %225
  store float %226, ptr %44, align 4, !tbaa !10
  %227 = load float, ptr %48, align 4, !tbaa !10
  %228 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 1
  %229 = load float, ptr %228, align 4, !tbaa !16
  %230 = fadd float %227, %229
  store float %230, ptr %45, align 4, !tbaa !10
  store i8 3, ptr %46, align 1, !tbaa !19
  store i8 1, ptr %47, align 1, !tbaa !19
  %231 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i64 0, i64 0
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef %231, ptr noundef nonnull align 4 dereferenceable(8) %9, ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(8) %40)
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #8
  br label %285

232:                                              ; preds = %213
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 4 %33, i64 8, i1 false), !tbaa.struct !9
  %233 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(8) %40)
  %234 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 1
  %235 = load float, ptr %234, align 4, !tbaa !16
  %236 = fadd float %233, %235
  store float %236, ptr %43, align 4, !tbaa !10
  %237 = getelementptr inbounds %struct.Mat22, ptr %12, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %41, ptr align 4 %237, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #8
  %238 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(8) %41)
  store float %238, ptr %49, align 4, !tbaa !10
  %239 = load float, ptr %49, align 4, !tbaa !10
  %240 = fneg float %239
  %241 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 0
  %242 = load float, ptr %241, align 4, !tbaa !15
  %243 = fadd float %240, %242
  store float %243, ptr %44, align 4, !tbaa !10
  %244 = load float, ptr %49, align 4, !tbaa !10
  %245 = getelementptr inbounds %struct.Vec2, ptr %8, i32 0, i32 0
  %246 = load float, ptr %245, align 4, !tbaa !15
  %247 = fadd float %244, %246
  store float %247, ptr %45, align 4, !tbaa !10
  store i8 2, ptr %46, align 1, !tbaa !19
  store i8 4, ptr %47, align 1, !tbaa !19
  %248 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i64 0, i64 0
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef %248, ptr noundef nonnull align 4 dereferenceable(8) %9, ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(16) %13, ptr noundef nonnull align 4 dereferenceable(8) %40)
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #8
  br label %285

249:                                              ; preds = %213
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #8
  %250 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %33)
  store <2 x float> %250, ptr %50, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 4 %50, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #8
  %251 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(8) %40)
  %252 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 0
  %253 = load float, ptr %252, align 4, !tbaa !15
  %254 = fadd float %251, %253
  store float %254, ptr %43, align 4, !tbaa !10
  %255 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %41, ptr align 4 %255, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #8
  %256 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(8) %41)
  store float %256, ptr %51, align 4, !tbaa !10
  %257 = load float, ptr %51, align 4, !tbaa !10
  %258 = fneg float %257
  %259 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 1
  %260 = load float, ptr %259, align 4, !tbaa !16
  %261 = fadd float %258, %260
  store float %261, ptr %44, align 4, !tbaa !10
  %262 = load float, ptr %51, align 4, !tbaa !10
  %263 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 1
  %264 = load float, ptr %263, align 4, !tbaa !16
  %265 = fadd float %262, %264
  store float %265, ptr %45, align 4, !tbaa !10
  store i8 3, ptr %46, align 1, !tbaa !19
  store i8 1, ptr %47, align 1, !tbaa !19
  %266 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i64 0, i64 0
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef %266, ptr noundef nonnull align 4 dereferenceable(8) %8, ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(8) %40)
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #8
  br label %285

267:                                              ; preds = %213
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #8
  %268 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %33)
  store <2 x float> %268, ptr %52, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 4 %52, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #8
  %269 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(8) %40)
  %270 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 1
  %271 = load float, ptr %270, align 4, !tbaa !16
  %272 = fadd float %269, %271
  store float %272, ptr %43, align 4, !tbaa !10
  %273 = getelementptr inbounds %struct.Mat22, ptr %13, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %41, ptr align 4 %273, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #8
  %274 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %11, ptr noundef nonnull align 4 dereferenceable(8) %41)
  store float %274, ptr %53, align 4, !tbaa !10
  %275 = load float, ptr %53, align 4, !tbaa !10
  %276 = fneg float %275
  %277 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 0
  %278 = load float, ptr %277, align 4, !tbaa !15
  %279 = fadd float %276, %278
  store float %279, ptr %44, align 4, !tbaa !10
  %280 = load float, ptr %53, align 4, !tbaa !10
  %281 = getelementptr inbounds %struct.Vec2, ptr %9, i32 0, i32 0
  %282 = load float, ptr %281, align 4, !tbaa !15
  %283 = fadd float %280, %282
  store float %283, ptr %45, align 4, !tbaa !10
  store i8 2, ptr %46, align 1, !tbaa !19
  store i8 4, ptr %47, align 1, !tbaa !19
  %284 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i64 0, i64 0
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef %284, ptr noundef nonnull align 4 dereferenceable(8) %8, ptr noundef nonnull align 4 dereferenceable(8) %10, ptr noundef nonnull align 4 dereferenceable(16) %12, ptr noundef nonnull align 4 dereferenceable(8) %40)
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #8
  br label %285

285:                                              ; preds = %267, %249, %232, %215, %213
  call void @llvm.lifetime.start.p0(i64 24, ptr %54) #8
  %286 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %54, i32 0, i32 0
  %287 = getelementptr inbounds %struct.ClipVertex, ptr %286, i64 2
  br label %288

288:                                              ; preds = %288, %285
  %289 = phi ptr [ %286, %285 ], [ %290, %288 ]
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %289)
  %290 = getelementptr inbounds %struct.ClipVertex, ptr %289, i64 1
  %291 = icmp eq ptr %290, %287
  br i1 %291, label %292, label %288

292:                                              ; preds = %288
  call void @llvm.lifetime.start.p0(i64 24, ptr %55) #8
  %293 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %55, i32 0, i32 0
  %294 = getelementptr inbounds %struct.ClipVertex, ptr %293, i64 2
  br label %295

295:                                              ; preds = %295, %292
  %296 = phi ptr [ %293, %292 ], [ %297, %295 ]
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %296)
  %297 = getelementptr inbounds %struct.ClipVertex, ptr %296, i64 1
  %298 = icmp eq ptr %297, %294
  br i1 %298, label %299, label %295

299:                                              ; preds = %295
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #8
  %300 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %54, i64 0, i64 0
  %301 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %42, i64 0, i64 0
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #8
  %302 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %41)
  store <2 x float> %302, ptr %57, align 4
  %303 = load float, ptr %44, align 4, !tbaa !10
  %304 = load i8, ptr %46, align 1, !tbaa !19
  %305 = call noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef %300, ptr noundef %301, ptr noundef nonnull align 4 dereferenceable(8) %57, float noundef %303, i8 noundef signext %304)
  store i32 %305, ptr %56, align 4, !tbaa !20
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #8
  %306 = load i32, ptr %56, align 4, !tbaa !20
  %307 = icmp slt i32 %306, 2
  br i1 %307, label %308, label %309

308:                                              ; preds = %299
  store i32 0, ptr %4, align 4
  store i32 1, ptr %26, align 4
  br label %386

309:                                              ; preds = %299
  %310 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %55, i64 0, i64 0
  %311 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %54, i64 0, i64 0
  %312 = load float, ptr %45, align 4, !tbaa !10
  %313 = load i8, ptr %47, align 1, !tbaa !19
  %314 = call noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef %310, ptr noundef %311, ptr noundef nonnull align 4 dereferenceable(8) %41, float noundef %312, i8 noundef signext %313)
  store i32 %314, ptr %56, align 4, !tbaa !20
  %315 = load i32, ptr %56, align 4, !tbaa !20
  %316 = icmp slt i32 %315, 2
  br i1 %316, label %317, label %318

317:                                              ; preds = %309
  store i32 0, ptr %4, align 4
  store i32 1, ptr %26, align 4
  br label %386

318:                                              ; preds = %309
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #8
  store i32 0, ptr %58, align 4, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #8
  store i32 0, ptr %59, align 4, !tbaa !20
  br label %319

319:                                              ; preds = %381, %318
  %320 = load i32, ptr %59, align 4, !tbaa !20
  %321 = icmp slt i32 %320, 2
  br i1 %321, label %323, label %322

322:                                              ; preds = %319
  store i32 3, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #8
  br label %384

323:                                              ; preds = %319
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #8
  %324 = load i32, ptr %59, align 4, !tbaa !20
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %55, i64 0, i64 %325
  %327 = getelementptr inbounds %struct.ClipVertex, ptr %326, i32 0, i32 0
  %328 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %40, ptr noundef nonnull align 4 dereferenceable(8) %327)
  %329 = load float, ptr %43, align 4, !tbaa !10
  %330 = fsub float %328, %329
  store float %330, ptr %60, align 4, !tbaa !10
  %331 = load float, ptr %60, align 4, !tbaa !10
  %332 = fcmp ole float %331, 0.000000e+00
  br i1 %332, label %333, label %380

333:                                              ; preds = %323
  %334 = load float, ptr %60, align 4, !tbaa !10
  %335 = load ptr, ptr %5, align 8, !tbaa !5
  %336 = load i32, ptr %58, align 4, !tbaa !20
  %337 = sext i32 %336 to i64
  %338 = getelementptr inbounds %struct.Contact, ptr %335, i64 %337
  %339 = getelementptr inbounds %struct.Contact, ptr %338, i32 0, i32 4
  store float %334, ptr %339, align 4, !tbaa !22
  %340 = load ptr, ptr %5, align 8, !tbaa !5
  %341 = load i32, ptr %58, align 4, !tbaa !20
  %342 = sext i32 %341 to i64
  %343 = getelementptr inbounds %struct.Contact, ptr %340, i64 %342
  %344 = getelementptr inbounds %struct.Contact, ptr %343, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %344, ptr align 4 %33, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #8
  %345 = load i32, ptr %59, align 4, !tbaa !20
  %346 = sext i32 %345 to i64
  %347 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %55, i64 0, i64 %346
  %348 = getelementptr inbounds %struct.ClipVertex, ptr %347, i32 0, i32 0
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #8
  %349 = load float, ptr %60, align 4, !tbaa !10
  %350 = call <2 x float> @_ZmlfRK4Vec2(float noundef %349, ptr noundef nonnull align 4 dereferenceable(8) %40)
  store <2 x float> %350, ptr %62, align 4
  %351 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %348, ptr noundef nonnull align 4 dereferenceable(8) %62)
  store <2 x float> %351, ptr %61, align 4
  %352 = load ptr, ptr %5, align 8, !tbaa !5
  %353 = load i32, ptr %58, align 4, !tbaa !20
  %354 = sext i32 %353 to i64
  %355 = getelementptr inbounds %struct.Contact, ptr %352, i64 %354
  %356 = getelementptr inbounds %struct.Contact, ptr %355, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %356, ptr align 4 %61, i64 8, i1 false), !tbaa.struct !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #8
  %357 = load i32, ptr %59, align 4, !tbaa !20
  %358 = sext i32 %357 to i64
  %359 = getelementptr inbounds [2 x %struct.ClipVertex], ptr %55, i64 0, i64 %358
  %360 = getelementptr inbounds %struct.ClipVertex, ptr %359, i32 0, i32 1
  %361 = load ptr, ptr %5, align 8, !tbaa !5
  %362 = load i32, ptr %58, align 4, !tbaa !20
  %363 = sext i32 %362 to i64
  %364 = getelementptr inbounds %struct.Contact, ptr %361, i64 %363
  %365 = getelementptr inbounds %struct.Contact, ptr %364, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %365, ptr align 4 %360, i64 4, i1 false), !tbaa.struct !24
  %366 = load i32, ptr %31, align 4, !tbaa !17
  %367 = icmp eq i32 %366, 2
  br i1 %367, label %371, label %368

368:                                              ; preds = %333
  %369 = load i32, ptr %31, align 4, !tbaa !17
  %370 = icmp eq i32 %369, 3
  br i1 %370, label %371, label %377

371:                                              ; preds = %368, %333
  %372 = load ptr, ptr %5, align 8, !tbaa !5
  %373 = load i32, ptr %58, align 4, !tbaa !20
  %374 = sext i32 %373 to i64
  %375 = getelementptr inbounds %struct.Contact, ptr %372, i64 %374
  %376 = getelementptr inbounds %struct.Contact, ptr %375, i32 0, i32 11
  call void @_Z4FlipR11FeaturePair(ptr noundef nonnull align 4 dereferenceable(4) %376)
  br label %377

377:                                              ; preds = %371, %368
  %378 = load i32, ptr %58, align 4, !tbaa !20
  %379 = add nsw i32 %378, 1
  store i32 %379, ptr %58, align 4, !tbaa !20
  br label %380

380:                                              ; preds = %377, %323
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #8
  br label %381

381:                                              ; preds = %380
  %382 = load i32, ptr %59, align 4, !tbaa !20
  %383 = add nsw i32 %382, 1
  store i32 %383, ptr %59, align 4, !tbaa !20
  br label %319, !llvm.loop !25

384:                                              ; preds = %322
  %385 = load i32, ptr %58, align 4, !tbaa !20
  store i32 %385, ptr %4, align 4
  store i32 1, ptr %26, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #8
  br label %386

386:                                              ; preds = %384, %317, %308
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %55) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %54) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %47) #8
  call void @llvm.lifetime.end.p0(i64 1, ptr %46) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #8
  call void @llvm.lifetime.end.p0(i64 24, ptr %42) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #8
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #8
  br label %387

387:                                              ; preds = %386, %131
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #8
  br label %388

388:                                              ; preds = %387, %118
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %21) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %15) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %14) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %13) #8
  call void @llvm.lifetime.end.p0(i64 16, ptr %12) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #8
  %389 = load i32, ptr %4, align 4
  ret i32 %389
}

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

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

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

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8)) unnamed_addr #6 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: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #7

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12)) unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
declare hidden void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef, ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(8)) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{i64 0, i64 4, !10, i64 4, i64 4, !10}
!10 = !{!11, !11, i64 0}
!11 = !{!"float", !7, i64 0}
!12 = !{!13, !11, i64 8}
!13 = !{!"_ZTS4Body", !14, i64 0, !11, i64 8, !14, i64 12, !11, i64 20, !14, i64 24, !11, i64 32, !14, i64 36, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60}
!14 = !{!"_ZTS4Vec2", !11, i64 0, !11, i64 4}
!15 = !{!14, !11, i64 0}
!16 = !{!14, !11, i64 4}
!17 = !{!18, !18, i64 0}
!18 = !{!"_ZTS4Axis", !7, i64 0}
!19 = !{!7, !7, i64 0}
!20 = !{!21, !21, i64 0}
!21 = !{!"int", !7, i64 0}
!22 = !{!23, !11, i64 32}
!23 = !{!"_ZTS7Contact", !14, i64 0, !14, i64 8, !14, i64 16, !14, i64 24, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !11, i64 56, !7, i64 60}
!24 = !{i64 0, i64 4, !19}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}


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

%struct.Vec2 = type { float, float }
%struct.Mat22 = type { %struct.Vec2, %struct.Vec2 }
%struct.ClipVertex = type { %struct.Vec2, %union.FeaturePair }
%union.FeaturePair = type { i32 }
%struct.Contact = type { %struct.Vec2, %struct.Vec2, %struct.Vec2, %struct.Vec2, float, float, float, float, float, float, float, %union.FeaturePair }

; Function Attrs: mustprogress uwtable
declare dso_local void @_Z4FlipR11FeaturePair(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #0

; Function Attrs: mustprogress uwtable
declare dso_local noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef, ptr noundef, ptr noundef nonnull align 4 dereferenceable(8), float noundef, i8 noundef signext) local_unnamed_addr #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #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 uwtable
declare dso_local <2 x float> @_ZmlfRK4Vec2(float noundef, ptr noundef nonnull align 4 dereferenceable(8)) local_unnamed_addr #4

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

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

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_Z7CollideP7ContactP4BodyS2_(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #1 {
  %4 = alloca %struct.Vec2, align 8
  %5 = alloca %struct.Vec2, align 8
  %6 = alloca %struct.Vec2, align 8
  %7 = alloca %struct.Vec2, align 8
  %8 = alloca %struct.Mat22, align 8
  %9 = alloca %struct.Mat22, align 8
  %10 = alloca %struct.Mat22, align 8
  %11 = alloca %struct.Mat22, align 8
  %12 = alloca %struct.Vec2, align 8
  %13 = alloca %struct.Vec2, align 8
  %14 = alloca %struct.Vec2, align 8
  %15 = alloca %struct.Mat22, align 8
  %16 = alloca %struct.Mat22, align 8
  %17 = alloca %struct.Mat22, align 8
  %18 = alloca %struct.Vec2, align 8
  %19 = alloca %struct.Vec2, align 8
  %20 = alloca %struct.Vec2, align 8
  %21 = alloca %struct.Vec2, align 8
  %22 = alloca %struct.Vec2, align 8
  %23 = alloca %struct.Vec2, align 8
  %24 = alloca %struct.Vec2, align 8
  %25 = alloca %struct.Vec2, align 8
  %26 = alloca %struct.Vec2, align 8
  %27 = alloca [2 x %struct.ClipVertex], align 16
  %28 = alloca [2 x %struct.ClipVertex], align 16
  %29 = alloca [2 x %struct.ClipVertex], align 16
  %30 = alloca %struct.Vec2, align 8
  %31 = alloca %struct.Vec2, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #7
  %32 = getelementptr inbounds i8, ptr %1, i64 36
  %33 = tail call <2 x float> @_ZmlfRK4Vec2(float noundef 5.000000e-01, ptr noundef nonnull align 4 dereferenceable(8) %32)
  store <2 x float> %33, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #7
  %34 = getelementptr inbounds i8, ptr %2, i64 36
  %35 = tail call <2 x float> @_ZmlfRK4Vec2(float noundef 5.000000e-01, ptr noundef nonnull align 4 dereferenceable(8) %34)
  store <2 x float> %35, ptr %5, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #7
  %36 = load i64, ptr %1, align 4
  store i64 %36, ptr %6, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #7
  %37 = load i64, ptr %2, align 4
  store i64 %37, ptr %7, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #7
  %38 = getelementptr inbounds i8, ptr %1, i64 8
  %39 = load float, ptr %38, align 4, !tbaa !5
  call void @_ZN5Mat22C2Ef(ptr noundef nonnull align 4 dereferenceable(16) %8, float noundef %39)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #7
  %40 = getelementptr inbounds i8, ptr %2, i64 8
  %41 = load float, ptr %40, align 4, !tbaa !5
  call void @_ZN5Mat22C2Ef(ptr noundef nonnull align 4 dereferenceable(16) %9, float noundef %41)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #7
  %42 = call { <2 x float>, <2 x float> } @_ZNK5Mat229TransposeEv(ptr noundef nonnull align 4 dereferenceable(16) %8)
  %43 = extractvalue { <2 x float>, <2 x float> } %42, 0
  store <2 x float> %43, ptr %10, align 8
  %44 = getelementptr inbounds i8, ptr %10, i64 8
  %45 = extractvalue { <2 x float>, <2 x float> } %42, 1
  store <2 x float> %45, ptr %44, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #7
  %46 = call { <2 x float>, <2 x float> } @_ZNK5Mat229TransposeEv(ptr noundef nonnull align 4 dereferenceable(16) %9)
  %47 = extractvalue { <2 x float>, <2 x float> } %46, 0
  store <2 x float> %47, ptr %11, align 8
  %48 = getelementptr inbounds i8, ptr %11, i64 8
  %49 = extractvalue { <2 x float>, <2 x float> } %46, 1
  store <2 x float> %49, ptr %48, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #7
  %50 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(8) %6)
  store <2 x float> %50, ptr %12, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #7
  %51 = call <2 x float> @_ZmlRK5Mat22RK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %10, ptr noundef nonnull align 4 dereferenceable(8) %12)
  store <2 x float> %51, ptr %13, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #7
  %52 = call <2 x float> @_ZmlRK5Mat22RK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %11, ptr noundef nonnull align 4 dereferenceable(8) %12)
  store <2 x float> %52, ptr %14, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #7
  %53 = call { <2 x float>, <2 x float> } @_ZmlRK5Mat22S1_(ptr noundef nonnull align 4 dereferenceable(16) %10, ptr noundef nonnull align 4 dereferenceable(16) %9)
  %54 = extractvalue { <2 x float>, <2 x float> } %53, 0
  store <2 x float> %54, ptr %15, align 8
  %55 = getelementptr inbounds i8, ptr %15, i64 8
  %56 = extractvalue { <2 x float>, <2 x float> } %53, 1
  store <2 x float> %56, ptr %55, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #7
  %57 = call { <2 x float>, <2 x float> } @_Z3AbsRK5Mat22(ptr noundef nonnull align 4 dereferenceable(16) %15)
  %58 = extractvalue { <2 x float>, <2 x float> } %57, 0
  store <2 x float> %58, ptr %16, align 8
  %59 = getelementptr inbounds i8, ptr %16, i64 8
  %60 = extractvalue { <2 x float>, <2 x float> } %57, 1
  store <2 x float> %60, ptr %59, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #7
  %61 = call { <2 x float>, <2 x float> } @_ZNK5Mat229TransposeEv(ptr noundef nonnull align 4 dereferenceable(16) %16)
  %62 = extractvalue { <2 x float>, <2 x float> } %61, 0
  store <2 x float> %62, ptr %17, align 8
  %63 = getelementptr inbounds i8, ptr %17, i64 8
  %64 = extractvalue { <2 x float>, <2 x float> } %61, 1
  store <2 x float> %64, ptr %63, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %18) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #7
  %65 = call <2 x float> @_Z3AbsRK4Vec2(ptr noundef nonnull align 4 dereferenceable(8) %13)
  store <2 x float> %65, ptr %19, align 8
  %66 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %19, ptr noundef nonnull align 4 dereferenceable(8) %4)
  store <2 x float> %66, ptr %18, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %20) #7
  %67 = call <2 x float> @_ZmlRK5Mat22RK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %16, ptr noundef nonnull align 4 dereferenceable(8) %5)
  store <2 x float> %67, ptr %20, align 8
  %68 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %18, ptr noundef nonnull align 4 dereferenceable(8) %20)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %20) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %18) #7
  %.sroa.061.0.vec.extract = extractelement <2 x float> %68, i64 0
  %69 = fcmp ogt float %.sroa.061.0.vec.extract, 0.000000e+00
  %.sroa.061.4.vec.extract67 = extractelement <2 x float> %68, i64 1
  %70 = fcmp ogt float %.sroa.061.4.vec.extract67, 0.000000e+00
  %or.cond = select i1 %69, i1 true, i1 %70
  br i1 %or.cond, label %208, label %71

71:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %21) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %22) #7
  %72 = call <2 x float> @_Z3AbsRK4Vec2(ptr noundef nonnull align 4 dereferenceable(8) %14)
  store <2 x float> %72, ptr %22, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %23) #7
  %73 = call <2 x float> @_ZmlRK5Mat22RK4Vec2(ptr noundef nonnull align 4 dereferenceable(16) %17, ptr noundef nonnull align 4 dereferenceable(8) %4)
  store <2 x float> %73, ptr %23, align 8
  %74 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %22, ptr noundef nonnull align 4 dereferenceable(8) %23)
  store <2 x float> %74, ptr %21, align 8
  %75 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %21, ptr noundef nonnull align 4 dereferenceable(8) %5)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %22) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %21) #7
  %.sroa.052.0.vec.extract = extractelement <2 x float> %75, i64 0
  %76 = fcmp ogt float %.sroa.052.0.vec.extract, 0.000000e+00
  %.sroa.052.4.vec.extract60 = extractelement <2 x float> %75, i64 1
  %77 = fcmp ogt float %.sroa.052.4.vec.extract60, 0.000000e+00
  %or.cond5 = select i1 %76, i1 true, i1 %77
  br i1 %or.cond5, label %208, label %78

78:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %24) #7
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %24)
  %79 = load float, ptr %13, align 8, !tbaa !11
  %80 = fcmp ogt float %79, 0.000000e+00
  br i1 %80, label %81, label %82

81:                                               ; preds = %78
  %.sroa.044.0.copyload = load <2 x float>, ptr %8, align 8
  br label %84

82:                                               ; preds = %78
  %83 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %8)
  br label %84

84:                                               ; preds = %82, %81
  %.sroa.044.0 = phi <2 x float> [ %.sroa.044.0.copyload, %81 ], [ %83, %82 ]
  store <2 x float> %.sroa.044.0, ptr %24, align 8
  %85 = getelementptr inbounds i8, ptr %4, i64 4
  %86 = load float, ptr %85, align 4, !tbaa !12
  %87 = fmul float %86, 0x3F847AE140000000
  %88 = call float @llvm.fmuladd.f32(float %.sroa.061.0.vec.extract, float 0x3FEE666660000000, float %87)
  %89 = fcmp ogt float %.sroa.061.4.vec.extract67, %88
  br i1 %89, label %90, label %99

90:                                               ; preds = %84
  %91 = getelementptr inbounds i8, ptr %13, i64 4
  %92 = load float, ptr %91, align 4, !tbaa !12
  %93 = fcmp ogt float %92, 0.000000e+00
  %94 = getelementptr inbounds i8, ptr %8, i64 8
  br i1 %93, label %95, label %96

95:                                               ; preds = %90
  %.sroa.042.0.copyload = load <2 x float>, ptr %94, align 8
  br label %98

96:                                               ; preds = %90
  %97 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %94)
  br label %98

98:                                               ; preds = %96, %95
  %.sroa.042.0 = phi <2 x float> [ %.sroa.042.0.copyload, %95 ], [ %97, %96 ]
  store <2 x float> %.sroa.042.0, ptr %24, align 8
  br label %99

99:                                               ; preds = %98, %84
  %.086 = phi float [ %.sroa.061.4.vec.extract67, %98 ], [ %.sroa.061.0.vec.extract, %84 ]
  %.083 = phi i32 [ 1, %98 ], [ 0, %84 ]
  %100 = load float, ptr %5, align 8, !tbaa !11
  %101 = fmul float %100, 0x3F847AE140000000
  %102 = call float @llvm.fmuladd.f32(float %.086, float 0x3FEE666660000000, float %101)
  %103 = fcmp ogt float %.sroa.052.0.vec.extract, %102
  br i1 %103, label %104, label %111

104:                                              ; preds = %99
  %105 = load float, ptr %14, align 8, !tbaa !11
  %106 = fcmp ogt float %105, 0.000000e+00
  br i1 %106, label %107, label %108

107:                                              ; preds = %104
  %.sroa.040.0.copyload = load <2 x float>, ptr %9, align 8
  br label %110

108:                                              ; preds = %104
  %109 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %9)
  br label %110

110:                                              ; preds = %108, %107
  %.sroa.040.0 = phi <2 x float> [ %.sroa.040.0.copyload, %107 ], [ %109, %108 ]
  store <2 x float> %.sroa.040.0, ptr %24, align 8
  br label %111

111:                                              ; preds = %110, %99
  %.187 = phi float [ %.sroa.052.0.vec.extract, %110 ], [ %.086, %99 ]
  %.184 = phi i32 [ 2, %110 ], [ %.083, %99 ]
  %112 = getelementptr inbounds i8, ptr %5, i64 4
  %113 = load float, ptr %112, align 4, !tbaa !12
  %114 = fmul float %113, 0x3F847AE140000000
  %115 = call float @llvm.fmuladd.f32(float %.187, float 0x3FEE666660000000, float %114)
  %116 = fcmp ogt float %.sroa.052.4.vec.extract60, %115
  br i1 %116, label %117, label %126

117:                                              ; preds = %111
  %118 = getelementptr inbounds i8, ptr %14, i64 4
  %119 = load float, ptr %118, align 4, !tbaa !12
  %120 = fcmp ogt float %119, 0.000000e+00
  %121 = getelementptr inbounds i8, ptr %9, i64 8
  br i1 %120, label %122, label %123

122:                                              ; preds = %117
  %.sroa.038.0.copyload = load <2 x float>, ptr %121, align 8
  br label %125

123:                                              ; preds = %117
  %124 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %121)
  br label %125

125:                                              ; preds = %123, %122
  %.sroa.038.0 = phi <2 x float> [ %.sroa.038.0.copyload, %122 ], [ %124, %123 ]
  store <2 x float> %.sroa.038.0, ptr %24, align 8
  br label %126

126:                                              ; preds = %125, %111
  %.285 = phi i32 [ 3, %125 ], [ %.184, %111 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %25) #7
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %25)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %26) #7
  call void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8) %26)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %27) #7
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %27)
  %.ptr.1 = getelementptr inbounds i8, ptr %27, i64 12
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr.1)
  switch i32 %.285, label %default.unreachable106 [
    i32 0, label %127
    i32 1, label %138
    i32 2, label %148
    i32 3, label %159
  ]

127:                                              ; preds = %126
  %128 = load i64, ptr %24, align 8
  store i64 %128, ptr %25, align 8
  %129 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(8) %25)
  %130 = load float, ptr %4, align 8, !tbaa !11
  %131 = fadd float %129, %130
  %132 = getelementptr inbounds i8, ptr %8, i64 8
  %133 = load i64, ptr %132, align 8
  store i64 %133, ptr %26, align 8
  %134 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(8) %26)
  %135 = load float, ptr %85, align 4, !tbaa !12
  %136 = fsub float %135, %134
  %137 = fadd float %134, %135
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef nonnull %27, ptr noundef nonnull align 4 dereferenceable(8) %5, ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %25)
  br label %169

138:                                              ; preds = %126
  %139 = load i64, ptr %24, align 8
  store i64 %139, ptr %25, align 8
  %140 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(8) %25)
  %141 = load float, ptr %85, align 4, !tbaa !12
  %142 = fadd float %140, %141
  %143 = load i64, ptr %8, align 8
  store i64 %143, ptr %26, align 8
  %144 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(8) %26)
  %145 = load float, ptr %4, align 8, !tbaa !11
  %146 = fsub float %145, %144
  %147 = fadd float %144, %145
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef nonnull %27, ptr noundef nonnull align 4 dereferenceable(8) %5, ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(16) %9, ptr noundef nonnull align 4 dereferenceable(8) %25)
  br label %169

148:                                              ; preds = %126
  %149 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %24)
  store <2 x float> %149, ptr %25, align 8
  %150 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(8) %25)
  %151 = load float, ptr %5, align 8, !tbaa !11
  %152 = fadd float %150, %151
  %153 = getelementptr inbounds i8, ptr %9, i64 8
  %154 = load i64, ptr %153, align 8
  store i64 %154, ptr %26, align 8
  %155 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(8) %26)
  %156 = load float, ptr %112, align 4, !tbaa !12
  %157 = fsub float %156, %155
  %158 = fadd float %155, %156
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef nonnull %27, ptr noundef nonnull align 4 dereferenceable(8) %4, ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(16) %8, ptr noundef nonnull align 4 dereferenceable(8) %25)
  br label %169

159:                                              ; preds = %126
  %160 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %24)
  store <2 x float> %160, ptr %25, align 8
  %161 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(8) %25)
  %162 = load float, ptr %112, align 4, !tbaa !12
  %163 = fadd float %161, %162
  %164 = load i64, ptr %9, align 8
  store i64 %164, ptr %26, align 8
  %165 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %7, ptr noundef nonnull align 4 dereferenceable(8) %26)
  %166 = load float, ptr %5, align 8, !tbaa !11
  %167 = fsub float %166, %165
  %168 = fadd float %165, %166
  call void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef nonnull %27, ptr noundef nonnull align 4 dereferenceable(8) %4, ptr noundef nonnull align 4 dereferenceable(8) %6, ptr noundef nonnull align 4 dereferenceable(16) %8, ptr noundef nonnull align 4 dereferenceable(8) %25)
  br label %169

default.unreachable106:                           ; preds = %126
  unreachable

169:                                              ; preds = %159, %148, %138, %127
  %.092 = phi float [ %163, %159 ], [ %152, %148 ], [ %142, %138 ], [ %131, %127 ]
  %.091 = phi float [ %167, %159 ], [ %157, %148 ], [ %146, %138 ], [ %136, %127 ]
  %.090 = phi float [ %168, %159 ], [ %158, %148 ], [ %147, %138 ], [ %137, %127 ]
  %.089 = phi i8 [ 2, %159 ], [ 3, %148 ], [ 2, %138 ], [ 3, %127 ]
  %.088 = phi i8 [ 4, %159 ], [ 1, %148 ], [ 4, %138 ], [ 1, %127 ]
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %28) #7
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %28)
  %.ptr97.1 = getelementptr inbounds i8, ptr %28, i64 12
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr97.1)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %29) #7
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %29)
  %.ptr101.1 = getelementptr inbounds i8, ptr %29, i64 12
  call void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12) %.ptr101.1)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %30) #7
  %170 = call <2 x float> @_ZN4Vec2ngEv(ptr noundef nonnull align 4 dereferenceable(8) %26)
  store <2 x float> %170, ptr %30, align 8
  %171 = call noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef nonnull %28, ptr noundef nonnull %27, ptr noundef nonnull align 4 dereferenceable(8) %30, float noundef %.091, i8 noundef signext %.089)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %30) #7
  %172 = icmp slt i32 %171, 2
  br i1 %172, label %.loopexit, label %173

173:                                              ; preds = %169
  %174 = call noundef i32 @_Z17ClipSegmentToLineP10ClipVertexS0_RK4Vec2fc(ptr noundef nonnull %29, ptr noundef nonnull %28, ptr noundef nonnull align 4 dereferenceable(8) %26, float noundef %.090, i8 noundef signext %.088)
  %175 = icmp slt i32 %174, 2
  br i1 %175, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %173
  %176 = and i32 %.285, -2
  %or.cond7 = icmp eq i32 %176, 2
  %177 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %25, ptr noundef nonnull align 4 dereferenceable(8) %29)
  %178 = fsub float %177, %.092
  %179 = fcmp ugt float %178, 0.000000e+00
  br i1 %179, label %190, label %180

180:                                              ; preds = %.preheader
  %181 = getelementptr inbounds i8, ptr %0, i64 32
  store float %178, ptr %181, align 4, !tbaa !13
  %182 = getelementptr inbounds i8, ptr %0, i64 8
  %183 = load i64, ptr %24, align 8
  store i64 %183, ptr %182, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %31) #7
  %184 = call <2 x float> @_ZmlfRK4Vec2(float noundef %178, ptr noundef nonnull align 4 dereferenceable(8) %25)
  store <2 x float> %184, ptr %31, align 8
  %185 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %29, ptr noundef nonnull align 4 dereferenceable(8) %31)
  store <2 x float> %185, ptr %0, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %31) #7
  %186 = getelementptr inbounds i8, ptr %29, i64 8
  %187 = getelementptr inbounds i8, ptr %0, i64 60
  %188 = load i32, ptr %186, align 8, !tbaa !15
  store i32 %188, ptr %187, align 4, !tbaa !15
  br i1 %or.cond7, label %189, label %190

189:                                              ; preds = %180
  call void @_Z4FlipR11FeaturePair(ptr noundef nonnull align 4 dereferenceable(4) %187)
  br label %190

190:                                              ; preds = %189, %180, %.preheader
  %.182 = phi i32 [ 0, %.preheader ], [ 1, %180 ], [ 1, %189 ]
  %191 = call noundef float @_Z3DotRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %25, ptr noundef nonnull align 4 dereferenceable(8) %.ptr101.1)
  %192 = fsub float %191, %.092
  %193 = fcmp ugt float %192, 0.000000e+00
  br i1 %193, label %.loopexit, label %194

194:                                              ; preds = %190
  %195 = zext nneg i32 %.182 to i64
  %196 = getelementptr inbounds %struct.Contact, ptr %0, i64 %195
  %197 = getelementptr inbounds i8, ptr %196, i64 32
  store float %192, ptr %197, align 4, !tbaa !13
  %198 = getelementptr inbounds i8, ptr %196, i64 8
  %199 = load i64, ptr %24, align 8
  store i64 %199, ptr %198, align 4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %31) #7
  %200 = call <2 x float> @_ZmlfRK4Vec2(float noundef %192, ptr noundef nonnull align 4 dereferenceable(8) %25)
  store <2 x float> %200, ptr %31, align 8
  %201 = call <2 x float> @_ZmiRK4Vec2S1_(ptr noundef nonnull align 4 dereferenceable(8) %.ptr101.1, ptr noundef nonnull align 4 dereferenceable(8) %31)
  store <2 x float> %201, ptr %196, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %31) #7
  %202 = getelementptr inbounds i8, ptr %29, i64 20
  %203 = getelementptr inbounds i8, ptr %196, i64 60
  %204 = load i32, ptr %202, align 4, !tbaa !15
  store i32 %204, ptr %203, align 4, !tbaa !15
  br i1 %or.cond7, label %205, label %206

205:                                              ; preds = %194
  call void @_Z4FlipR11FeaturePair(ptr noundef nonnull align 4 dereferenceable(4) %203)
  br label %206

206:                                              ; preds = %205, %194
  %207 = add nuw nsw i32 %.182, 1
  br label %.loopexit

.loopexit:                                        ; preds = %190, %206, %173, %169
  %.0 = phi i32 [ 0, %169 ], [ 0, %173 ], [ %207, %206 ], [ %.182, %190 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %29) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %28) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %27) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %26) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %25) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %24) #7
  br label %208

208:                                              ; preds = %.loopexit, %71, %3
  %.2 = phi i32 [ 0, %3 ], [ %.0, %.loopexit ], [ 0, %71 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #7
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #7
  ret i32 %.2
}

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

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

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

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN4Vec2C2Ev(ptr noundef nonnull align 4 dereferenceable(8)) unnamed_addr #5 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: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #6

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN10ClipVertexC2Ev(ptr noundef nonnull align 4 dereferenceable(12)) unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
declare hidden void @_ZL19ComputeIncidentEdgeP10ClipVertexRK4Vec2S3_RK5Mat22S3_(ptr noundef, ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(8), ptr noundef nonnull align 4 dereferenceable(16), ptr noundef nonnull align 4 dereferenceable(8)) local_unnamed_addr #1

attributes #0 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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 nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { 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, !8, i64 8}
!6 = !{!"_ZTS4Body", !7, i64 0, !8, i64 8, !7, i64 12, !8, i64 20, !7, i64 24, !8, i64 32, !7, i64 36, !8, i64 44, !8, i64 48, !8, i64 52, !8, i64 56, !8, i64 60}
!7 = !{!"_ZTS4Vec2", !8, i64 0, !8, i64 4}
!8 = !{!"float", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C++ TBAA"}
!11 = !{!7, !8, i64 0}
!12 = !{!7, !8, i64 4}
!13 = !{!14, !8, i64 32}
!14 = !{!"_ZTS7Contact", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !8, i64 32, !8, i64 36, !8, i64 40, !8, i64 44, !8, i64 48, !8, i64 52, !8, i64 56, !9, i64 60}
!15 = !{!9, !9, i64 0}


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