; LLVM IR from jrouwe/JoltPhysics :: Samples/Tests/Vehicle (TankTest)

; 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.JPH::Color" = type { %union.anon.79 }
%union.anon.79 = type { i32 }
%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.43 }
%union.anon.43 = type { <4 x float> }
%"struct.JPH::RRayCast" = type { %"struct.JPH::RayCastT" }
%"struct.JPH::RayCastT" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::RayCastSettings" = type { i8, i8, i8 }
%"class.JPH::ClosestHitCollisionCollector" = type <{ %"class.JPH::CollisionCollector", %"class.JPH::RayCastResult", i8, [3 x i8] }>
%"class.JPH::CollisionCollector" = type { ptr, float, ptr }
%"class.JPH::RayCastResult" = type { %"class.JPH::BroadPhaseCastResult", %"class.JPH::SubShapeID" }
%"class.JPH::BroadPhaseCastResult" = type { %"class.JPH::BodyID", float }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::IgnoreMultipleBodiesFilter" = type { %"class.JPH::BodyFilter", %"class.JPH::Array.11" }
%"class.JPH::BodyFilter" = type { ptr }
%"class.JPH::Array.11" = type { i64, i64, ptr }
%"class.JPH::BroadPhaseLayerFilter" = type { ptr }
%"class.JPH::ObjectLayerFilter" = type { ptr }
%"class.JPH::ShapeFilter" = type <{ ptr, %"class.JPH::BodyID", [4 x i8] }>
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }
%class.TankTest = type <{ %class.VehicleTest, ptr, ptr, ptr, %"class.JPH::Ref", %"class.JPH::Ref.4", %"class.JPH::Ref.4", float, [4 x i8], %"class.JPH::Vec3", float, float, float, float, float, float, float, i8, [3 x i8] }>
%class.VehicleTest = type { %class.Test, %"class.JPH::Array" }
%class.Test = type { ptr, ptr, ptr, ptr, ptr, ptr, i8, %"class.std::unordered_map" }
%"class.std::unordered_map" = type { %"class.std::_Hashtable" }
%"class.std::_Hashtable" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"struct.std::__detail::_Hash_node_base" = type { ptr }
%"struct.std::__detail::_Prime_rehash_policy" = type { float, i64 }
%"class.JPH::Array" = type { i64, i64, ptr }
%"class.JPH::Ref" = type { ptr }
%"class.JPH::Ref.4" = type { ptr }
%"class.Test::ProcessInputParams" = type { float, ptr, %struct.CameraState }
%struct.CameraState = type <{ %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, [12 x i8] }>

@_ZN3JPH5Color6sGreenE = external global %"class.JPH::Color", align 4

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

declare i32 @__gxx_personality_v0(...)

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122)) #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #3 align 2

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8TankTest12ProcessInputERKN4Test18ProcessInputParamsE(ptr noundef nonnull align 16 dereferenceable(237) %0, ptr noundef nonnull align 16 dereferenceable(80) %1) unnamed_addr #4 align 2 personality ptr @__gxx_personality_v0 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca float, align 4
  %6 = alloca float, align 4
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca %"class.JPH::Quat", align 16
  %9 = alloca %"class.JPH::Quat", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca %"struct.JPH::RRayCast", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Vec3", align 16
  %15 = alloca %"class.JPH::RayCastSettings", align 1
  %16 = alloca %"class.JPH::ClosestHitCollisionCollector", align 8
  %17 = alloca %"class.JPH::IgnoreMultipleBodiesFilter", align 8
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca %"class.JPH::BroadPhaseLayerFilter", align 8
  %21 = alloca %"class.JPH::ObjectLayerFilter", align 8
  %22 = alloca %"class.JPH::ShapeFilter", align 8
  %23 = alloca %"class.JPH::Vec3", align 16
  %24 = alloca %"class.JPH::Vec3", align 16
  %25 = alloca %"class.JPH::Vec3", align 16
  %26 = alloca %"class.JPH::Color", align 4
  %27 = alloca %"class.JPH::Mat44", align 16
  %28 = alloca %"class.JPH::Mat44", align 16
  %29 = alloca %"class.JPH::Mat44", align 16
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca %"class.JPH::Mat44", align 16
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca %"class.JPH::Mat44", align 16
  %34 = alloca %"class.JPH::Mat44", align 16
  %35 = alloca %"class.JPH::Mat44", align 16
  %36 = alloca %"class.JPH::Vec3", align 16
  %37 = alloca %"class.JPH::Mat44", align 16
  %38 = alloca %"class.JPH::Vec3", align 16
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  %39 = load ptr, ptr %3, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #12
  store float 1.000000e+00, ptr %5, align 4, !tbaa !9
  %40 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float 0.000000e+00, ptr %40, align 16, !tbaa !11
  %41 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 14
  store float 0.000000e+00, ptr %41, align 16, !tbaa !25
  %42 = load ptr, ptr %4, align 8, !tbaa !5
  %43 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %42, i32 0, i32 1
  %44 = load ptr, ptr %43, align 8, !tbaa !26
  %45 = load ptr, ptr %44, align 8, !tbaa !29
  %46 = getelementptr inbounds ptr, ptr %45, i64 5
  %47 = load ptr, ptr %46, align 8
  %48 = call noundef zeroext i1 %47(ptr noundef nonnull align 8 dereferenceable(8) %44, i32 noundef 43)
  br i1 %48, label %49, label %51

49:                                               ; preds = %2
  %50 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 14
  store float 1.000000e+00, ptr %50, align 16, !tbaa !25
  br label %73

51:                                               ; preds = %2
  %52 = load ptr, ptr %4, align 8, !tbaa !5
  %53 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %52, i32 0, i32 1
  %54 = load ptr, ptr %53, align 8, !tbaa !26
  %55 = load ptr, ptr %54, align 8, !tbaa !29
  %56 = getelementptr inbounds ptr, ptr %55, i64 5
  %57 = load ptr, ptr %56, align 8
  %58 = call noundef zeroext i1 %57(ptr noundef nonnull align 8 dereferenceable(8) %54, i32 noundef 50)
  br i1 %58, label %59, label %61

59:                                               ; preds = %51
  %60 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float 1.000000e+00, ptr %60, align 16, !tbaa !11
  br label %72

61:                                               ; preds = %51
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %62, i32 0, i32 1
  %64 = load ptr, ptr %63, align 8, !tbaa !26
  %65 = load ptr, ptr %64, align 8, !tbaa !29
  %66 = getelementptr inbounds ptr, ptr %65, i64 5
  %67 = load ptr, ptr %66, align 8
  %68 = call noundef zeroext i1 %67(ptr noundef nonnull align 8 dereferenceable(8) %64, i32 noundef 51)
  br i1 %68, label %69, label %71

69:                                               ; preds = %61
  %70 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float -1.000000e+00, ptr %70, align 16, !tbaa !11
  br label %71

71:                                               ; preds = %69, %61
  br label %72

72:                                               ; preds = %71, %59
  br label %73

73:                                               ; preds = %72, %49
  %74 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 12
  store float 1.000000e+00, ptr %74, align 8, !tbaa !31
  %75 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 13
  store float 1.000000e+00, ptr %75, align 4, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %7) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %8) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #12
  %76 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 1
  %77 = load ptr, ptr %76, align 8, !tbaa !33
  %78 = call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %77)
  %79 = getelementptr inbounds %"class.JPH::Quat", ptr %9, i32 0, i32 0
  %80 = getelementptr inbounds %"class.JPH::Vec4", ptr %79, i32 0, i32 0
  %81 = getelementptr inbounds %union.anon.43, ptr %80, i32 0, i32 0
  %82 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 0
  %83 = extractvalue { double, double } %78, 0
  store double %83, ptr %82, align 16
  %84 = getelementptr inbounds { double, double }, ptr %81, i32 0, i32 1
  %85 = extractvalue { double, double } %78, 1
  store double %85, ptr %84, align 8
  %86 = call { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %9)
  %87 = getelementptr inbounds %"class.JPH::Quat", ptr %8, i32 0, i32 0
  %88 = getelementptr inbounds %"class.JPH::Vec4", ptr %87, i32 0, i32 0
  %89 = getelementptr inbounds %union.anon.43, ptr %88, i32 0, i32 0
  %90 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 0
  %91 = extractvalue { double, double } %86, 0
  store double %91, ptr %90, align 16
  %92 = getelementptr inbounds { double, double }, ptr %89, i32 0, i32 1
  %93 = extractvalue { double, double } %86, 1
  store double %93, ptr %92, align 8
  %94 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 1
  %95 = load ptr, ptr %94, align 8, !tbaa !33
  %96 = call { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %95)
  %97 = getelementptr inbounds %"class.JPH::Vec3", ptr %10, i32 0, i32 0
  %98 = getelementptr inbounds %union.anon, ptr %97, i32 0, i32 0
  %99 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 0
  %100 = extractvalue { double, double } %96, 0
  store double %100, ptr %99, align 16
  %101 = getelementptr inbounds { double, double }, ptr %98, i32 0, i32 1
  %102 = extractvalue { double, double } %96, 1
  store double %102, ptr %101, align 8
  %103 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 0
  %104 = load double, ptr %103, align 16
  %105 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 1
  %106 = load double, ptr %105, align 8
  %107 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %8, double %104, double %106)
  %108 = getelementptr inbounds %"class.JPH::Vec3", ptr %7, i32 0, i32 0
  %109 = getelementptr inbounds %union.anon, ptr %108, i32 0, i32 0
  %110 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 0
  %111 = extractvalue { double, double } %107, 0
  store double %111, ptr %110, align 16
  %112 = getelementptr inbounds { double, double }, ptr %109, i32 0, i32 1
  %113 = extractvalue { double, double } %107, 1
  store double %113, ptr %112, align 8
  %114 = call noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %7)
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %8) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %7) #12
  store float %114, ptr %6, align 4, !tbaa !9
  %115 = load ptr, ptr %4, align 8, !tbaa !5
  %116 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %115, i32 0, i32 1
  %117 = load ptr, ptr %116, align 8, !tbaa !26
  %118 = load ptr, ptr %117, align 8, !tbaa !29
  %119 = getelementptr inbounds ptr, ptr %118, i64 5
  %120 = load ptr, ptr %119, align 8
  %121 = call noundef zeroext i1 %120(ptr noundef nonnull align 8 dereferenceable(8) %117, i32 noundef 48)
  br i1 %121, label %122, label %140

122:                                              ; preds = %73
  %123 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 14
  %124 = load float, ptr %123, align 16, !tbaa !25
  %125 = fcmp oeq float %124, 0.000000e+00
  br i1 %125, label %126, label %137

126:                                              ; preds = %122
  %127 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %128 = load float, ptr %127, align 16, !tbaa !11
  %129 = fcmp oeq float %128, 0.000000e+00
  br i1 %129, label %130, label %137

130:                                              ; preds = %126
  %131 = load float, ptr %6, align 4, !tbaa !9
  %132 = call noundef float @_ZSt3absf(float noundef %131)
  %133 = fcmp olt float %132, 1.000000e+00
  br i1 %133, label %134, label %137

134:                                              ; preds = %130
  %135 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 12
  store float -1.000000e+00, ptr %135, align 8, !tbaa !31
  %136 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float 1.000000e+00, ptr %136, align 16, !tbaa !11
  br label %139

137:                                              ; preds = %130, %126, %122
  %138 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 12
  store float 0x3FE3333340000000, ptr %138, align 8, !tbaa !31
  br label %139

139:                                              ; preds = %137, %134
  br label %167

140:                                              ; preds = %73
  %141 = load ptr, ptr %4, align 8, !tbaa !5
  %142 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %141, i32 0, i32 1
  %143 = load ptr, ptr %142, align 8, !tbaa !26
  %144 = load ptr, ptr %143, align 8, !tbaa !29
  %145 = getelementptr inbounds ptr, ptr %144, i64 5
  %146 = load ptr, ptr %145, align 8
  %147 = call noundef zeroext i1 %146(ptr noundef nonnull align 8 dereferenceable(8) %143, i32 noundef 49)
  br i1 %147, label %148, label %166

148:                                              ; preds = %140
  %149 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 14
  %150 = load float, ptr %149, align 16, !tbaa !25
  %151 = fcmp oeq float %150, 0.000000e+00
  br i1 %151, label %152, label %163

152:                                              ; preds = %148
  %153 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %154 = load float, ptr %153, align 16, !tbaa !11
  %155 = fcmp oeq float %154, 0.000000e+00
  br i1 %155, label %156, label %163

156:                                              ; preds = %152
  %157 = load float, ptr %6, align 4, !tbaa !9
  %158 = call noundef float @_ZSt3absf(float noundef %157)
  %159 = fcmp olt float %158, 1.000000e+00
  br i1 %159, label %160, label %163

160:                                              ; preds = %156
  %161 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 13
  store float -1.000000e+00, ptr %161, align 4, !tbaa !32
  %162 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float 1.000000e+00, ptr %162, align 16, !tbaa !11
  br label %165

163:                                              ; preds = %156, %152, %148
  %164 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 13
  store float 0x3FE3333340000000, ptr %164, align 4, !tbaa !32
  br label %165

165:                                              ; preds = %163, %160
  br label %166

166:                                              ; preds = %165, %140
  br label %167

167:                                              ; preds = %166, %139
  %168 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 11
  %169 = load float, ptr %168, align 4, !tbaa !34
  %170 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %171 = load float, ptr %170, align 16, !tbaa !11
  %172 = fmul float %169, %171
  %173 = fcmp olt float %172, 0.000000e+00
  br i1 %173, label %174, label %196

174:                                              ; preds = %167
  %175 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %176 = load float, ptr %175, align 16, !tbaa !11
  %177 = fcmp ogt float %176, 0.000000e+00
  br i1 %177, label %178, label %181

178:                                              ; preds = %174
  %179 = load float, ptr %6, align 4, !tbaa !9
  %180 = fcmp olt float %179, 0xBFB99999A0000000
  br i1 %180, label %188, label %181

181:                                              ; preds = %178, %174
  %182 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %183 = load float, ptr %182, align 16, !tbaa !11
  %184 = fcmp olt float %183, 0.000000e+00
  br i1 %184, label %185, label %191

185:                                              ; preds = %181
  %186 = load float, ptr %6, align 4, !tbaa !9
  %187 = fcmp ogt float %186, 0x3FB99999A0000000
  br i1 %187, label %188, label %191

188:                                              ; preds = %185, %178
  %189 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  store float 0.000000e+00, ptr %189, align 16, !tbaa !11
  %190 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 14
  store float 1.000000e+00, ptr %190, align 16, !tbaa !25
  br label %195

191:                                              ; preds = %185, %181
  %192 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 10
  %193 = load float, ptr %192, align 16, !tbaa !11
  %194 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 11
  store float %193, ptr %194, align 4, !tbaa !34
  br label %195

195:                                              ; preds = %191, %188
  br label %196

196:                                              ; preds = %195, %167
  call void @llvm.lifetime.start.p0(i64 32, ptr %11) #12
  %197 = load ptr, ptr %4, align 8, !tbaa !5
  %198 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %197, i32 0, i32 2
  %199 = getelementptr inbounds %struct.CameraState, ptr %198, i32 0, i32 0
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %12, ptr align 16 %199, i64 16, i1 false), !tbaa.struct !35
  %200 = load ptr, ptr %4, align 8, !tbaa !5
  %201 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %200, i32 0, i32 2
  %202 = getelementptr inbounds %struct.CameraState, ptr %201, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %14, ptr align 16 %202, i64 16, i1 false), !tbaa.struct !35
  %203 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 0
  %204 = load double, ptr %203, align 16
  %205 = getelementptr inbounds { double, double }, ptr %14, i32 0, i32 1
  %206 = load double, ptr %205, align 8
  %207 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef 1.000000e+03, double %204, double %206)
  %208 = getelementptr inbounds %"class.JPH::Vec3", ptr %13, i32 0, i32 0
  %209 = getelementptr inbounds %union.anon, ptr %208, i32 0, i32 0
  %210 = getelementptr inbounds { double, double }, ptr %209, i32 0, i32 0
  %211 = extractvalue { double, double } %207, 0
  store double %211, ptr %210, align 16
  %212 = getelementptr inbounds { double, double }, ptr %209, i32 0, i32 1
  %213 = extractvalue { double, double } %207, 1
  store double %213, ptr %212, align 8
  %214 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 0
  %215 = load double, ptr %214, align 16
  %216 = getelementptr inbounds { double, double }, ptr %12, i32 0, i32 1
  %217 = load double, ptr %216, align 8
  %218 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 0
  %219 = load double, ptr %218, align 16
  %220 = getelementptr inbounds { double, double }, ptr %13, i32 0, i32 1
  %221 = load double, ptr %220, align 8
  call void @_ZN3JPH8RRayCastCI2NS_8RayCastTINS_4Vec3ENS_5Mat44ES0_EEES2_S2_(ptr noundef nonnull align 16 dereferenceable(32) %11, double %215, double %217, double %219, double %221)
  call void @llvm.lifetime.start.p0(i64 3, ptr %15) #12
  call void @_ZN3JPH15RayCastSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(3) %15) #12
  call void @llvm.lifetime.start.p0(i64 40, ptr %16) #12
  call void @_ZN3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEEC2Ev(ptr noundef nonnull align 8 dereferenceable(37) %16)
  call void @llvm.lifetime.start.p0(i64 32, ptr %17) #12
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #12
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter7ReserveEj(ptr noundef nonnull align 8 dereferenceable(32) %17, i32 noundef 3)
          to label %222 unwind label %350

222:                                              ; preds = %196
  %223 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 1
  %224 = load ptr, ptr %223, align 8, !tbaa !33
  %225 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %224)
          to label %226 unwind label %350

226:                                              ; preds = %222
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %17, ptr noundef nonnull align 4 dereferenceable(4) %225)
          to label %227 unwind label %350

227:                                              ; preds = %226
  %228 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 2
  %229 = load ptr, ptr %228, align 16, !tbaa !37
  %230 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %229)
          to label %231 unwind label %350

231:                                              ; preds = %227
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %17, ptr noundef nonnull align 4 dereferenceable(4) %230)
          to label %232 unwind label %350

232:                                              ; preds = %231
  %233 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 3
  %234 = load ptr, ptr %233, align 8, !tbaa !38
  %235 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %234)
          to label %236 unwind label %350

236:                                              ; preds = %232
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %17, ptr noundef nonnull align 4 dereferenceable(4) %235)
          to label %237 unwind label %350

237:                                              ; preds = %236
  %238 = getelementptr inbounds %class.Test, ptr %39, i32 0, i32 2
  %239 = load ptr, ptr %238, align 16, !tbaa !39
  %240 = invoke noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem19GetNarrowPhaseQueryEv(ptr noundef nonnull align 16 dereferenceable(1172) %239)
          to label %241 unwind label %350

241:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #12
  call void @llvm.memset.p0.i64(ptr align 8 %20, i8 0, i64 8, i1 false)
  call void @_ZN3JPH21BroadPhaseLayerFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %20) #12
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #12
  call void @llvm.memset.p0.i64(ptr align 8 %21, i8 0, i64 8, i1 false)
  call void @_ZN3JPH17ObjectLayerFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %21) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %22) #12
  call void @llvm.memset.p0.i64(ptr align 8 %22, i8 0, i64 16, i1 false)
  invoke void @_ZN3JPH11ShapeFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(12) %22)
          to label %242 unwind label %354

242:                                              ; preds = %241
  invoke void @_ZNK3JPH16NarrowPhaseQuery7CastRayERKNS_8RRayCastERKNS_15RayCastSettingsERNS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 8 dereferenceable(16) %240, ptr noundef nonnull align 16 dereferenceable(32) %11, ptr noundef nonnull align 1 dereferenceable(3) %15, ptr noundef nonnull align 8 dereferenceable(24) %16, ptr noundef nonnull align 8 dereferenceable(8) %20, ptr noundef nonnull align 8 dereferenceable(8) %21, ptr noundef nonnull align 8 dereferenceable(8) %17, ptr noundef nonnull align 8 dereferenceable(12) %22)
          to label %243 unwind label %358

243:                                              ; preds = %242
  call void @_ZN3JPH11ShapeFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(12) %22) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #12
  call void @_ZN3JPH17ObjectLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %21) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #12
  call void @_ZN3JPH21BroadPhaseLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %20) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #12
  %244 = invoke noundef zeroext i1 @_ZNK3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEE6HadHitEv(ptr noundef nonnull align 8 dereferenceable(37) %16)
          to label %245 unwind label %363

245:                                              ; preds = %243
  br i1 %244, label %246, label %258

246:                                              ; preds = %245
  %247 = getelementptr inbounds %"class.JPH::ClosestHitCollisionCollector", ptr %16, i32 0, i32 1
  %248 = getelementptr inbounds %"class.JPH::BroadPhaseCastResult", ptr %247, i32 0, i32 1
  %249 = load float, ptr %248, align 4, !tbaa !40
  %250 = invoke { double, double } @_ZNK3JPH8RayCastTINS_4Vec3ENS_5Mat44ENS_8RRayCastEE13GetPointOnRayEf(ptr noundef nonnull align 16 dereferenceable(32) %11, float noundef %249)
          to label %251 unwind label %363

251:                                              ; preds = %246
  %252 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %253 = getelementptr inbounds %union.anon, ptr %252, i32 0, i32 0
  %254 = getelementptr inbounds { double, double }, ptr %253, i32 0, i32 0
  %255 = extractvalue { double, double } %250, 0
  store double %255, ptr %254, align 16
  %256 = getelementptr inbounds { double, double }, ptr %253, i32 0, i32 1
  %257 = extractvalue { double, double } %250, 1
  store double %257, ptr %256, align 8
  br label %273

258:                                              ; preds = %245
  %259 = getelementptr inbounds %"struct.JPH::RayCastT", ptr %11, i32 0, i32 0
  %260 = getelementptr inbounds %"struct.JPH::RayCastT", ptr %11, i32 0, i32 1
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %24, ptr align 16 %260, i64 16, i1 false), !tbaa.struct !35
  %261 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 0
  %262 = load double, ptr %261, align 16
  %263 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 1
  %264 = load double, ptr %263, align 8
  %265 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %259, double %262, double %264)
          to label %266 unwind label %363

266:                                              ; preds = %258
  %267 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, i32 0, i32 0
  %268 = getelementptr inbounds %union.anon, ptr %267, i32 0, i32 0
  %269 = getelementptr inbounds { double, double }, ptr %268, i32 0, i32 0
  %270 = extractvalue { double, double } %265, 0
  store double %270, ptr %269, align 16
  %271 = getelementptr inbounds { double, double }, ptr %268, i32 0, i32 1
  %272 = extractvalue { double, double } %265, 1
  store double %272, ptr %271, align 8
  br label %273

273:                                              ; preds = %266, %251
  %274 = getelementptr inbounds %class.Test, ptr %39, i32 0, i32 4
  %275 = load ptr, ptr %274, align 16, !tbaa !44
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %25, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !35
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %26, ptr align 4 @_ZN3JPH5Color6sGreenE, i64 4, i1 false), !tbaa.struct !45
  %276 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 0
  %277 = load double, ptr %276, align 16
  %278 = getelementptr inbounds { double, double }, ptr %25, i32 0, i32 1
  %279 = load double, ptr %278, align 8
  %280 = getelementptr inbounds %"class.JPH::Color", ptr %26, i32 0, i32 0
  %281 = getelementptr inbounds %union.anon.79, ptr %280, i32 0, i32 0
  %282 = load i32, ptr %281, align 4
  invoke void @_ZN3JPH13DebugRenderer10DrawMarkerENS_4Vec3ENS_5ColorEf(ptr noundef nonnull align 8 dereferenceable(320) %275, double %277, double %279, i32 %282, float noundef 1.000000e+00)
          to label %283 unwind label %363

283:                                              ; preds = %273
  call void @llvm.lifetime.start.p0(i64 64, ptr %27) #12
  call void @llvm.lifetime.start.p0(i64 64, ptr %28) #12
  %284 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 1
  %285 = load ptr, ptr %284, align 8, !tbaa !33
  invoke void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %28, ptr noundef nonnull align 16 dereferenceable(122) %285)
          to label %286 unwind label %367

286:                                              ; preds = %283
  call void @llvm.lifetime.start.p0(i64 64, ptr %29) #12
  %287 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 5
  %288 = invoke noundef ptr @_ZNK3JPH3RefINS_15HingeConstraintEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %287)
          to label %289 unwind label %371

289:                                              ; preds = %286
  invoke void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %29, ptr noundef nonnull align 16 dereferenceable(832) %288)
          to label %290 unwind label %371

290:                                              ; preds = %289
  invoke void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %27, ptr noundef nonnull align 16 dereferenceable(64) %28, ptr noundef nonnull align 16 dereferenceable(64) %29)
          to label %291 unwind label %371

291:                                              ; preds = %290
  call void @llvm.lifetime.end.p0(i64 64, ptr %29) #12
  call void @llvm.lifetime.end.p0(i64 64, ptr %28) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %30) #12
  call void @llvm.lifetime.start.p0(i64 64, ptr %31) #12
  invoke void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %31, ptr noundef nonnull align 16 dereferenceable(64) %27)
          to label %292 unwind label %376

292:                                              ; preds = %291
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %32, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !35
  %293 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 0
  %294 = load double, ptr %293, align 16
  %295 = getelementptr inbounds { double, double }, ptr %32, i32 0, i32 1
  %296 = load double, ptr %295, align 8
  %297 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %31, double %294, double %296)
          to label %298 unwind label %376

298:                                              ; preds = %292
  %299 = getelementptr inbounds %"class.JPH::Vec3", ptr %30, i32 0, i32 0
  %300 = getelementptr inbounds %union.anon, ptr %299, i32 0, i32 0
  %301 = getelementptr inbounds { double, double }, ptr %300, i32 0, i32 0
  %302 = extractvalue { double, double } %297, 0
  store double %302, ptr %301, align 16
  %303 = getelementptr inbounds { double, double }, ptr %300, i32 0, i32 1
  %304 = extractvalue { double, double } %297, 1
  store double %304, ptr %303, align 8
  call void @llvm.lifetime.end.p0(i64 64, ptr %31) #12
  %305 = invoke noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %30)
          to label %306 unwind label %380

306:                                              ; preds = %298
  %307 = invoke noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16) %30)
          to label %308 unwind label %380

308:                                              ; preds = %306
  %309 = invoke noundef float @_ZN3JPH5ATan2Eff(float noundef %305, float noundef %307)
          to label %310 unwind label %380

310:                                              ; preds = %308
  %311 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 15
  store float %309, ptr %311, align 4, !tbaa !46
  call void @llvm.lifetime.start.p0(i64 64, ptr %33) #12
  call void @llvm.lifetime.start.p0(i64 64, ptr %34) #12
  %312 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 2
  %313 = load ptr, ptr %312, align 16, !tbaa !37
  invoke void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %34, ptr noundef nonnull align 16 dereferenceable(122) %313)
          to label %314 unwind label %384

314:                                              ; preds = %310
  call void @llvm.lifetime.start.p0(i64 64, ptr %35) #12
  %315 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 6
  %316 = invoke noundef ptr @_ZNK3JPH3RefINS_15HingeConstraintEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %315)
          to label %317 unwind label %388

317:                                              ; preds = %314
  invoke void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %35, ptr noundef nonnull align 16 dereferenceable(832) %316)
          to label %318 unwind label %388

318:                                              ; preds = %317
  invoke void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %33, ptr noundef nonnull align 16 dereferenceable(64) %34, ptr noundef nonnull align 16 dereferenceable(64) %35)
          to label %319 unwind label %388

319:                                              ; preds = %318
  call void @llvm.lifetime.end.p0(i64 64, ptr %35) #12
  call void @llvm.lifetime.end.p0(i64 64, ptr %34) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #12
  call void @llvm.lifetime.start.p0(i64 64, ptr %37) #12
  invoke void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16 %37, ptr noundef nonnull align 16 dereferenceable(64) %33)
          to label %320 unwind label %393

320:                                              ; preds = %319
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %38, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !35
  %321 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 0
  %322 = load double, ptr %321, align 16
  %323 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 1
  %324 = load double, ptr %323, align 8
  %325 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %37, double %322, double %324)
          to label %326 unwind label %393

326:                                              ; preds = %320
  %327 = getelementptr inbounds %"class.JPH::Vec3", ptr %36, i32 0, i32 0
  %328 = getelementptr inbounds %union.anon, ptr %327, i32 0, i32 0
  %329 = getelementptr inbounds { double, double }, ptr %328, i32 0, i32 0
  %330 = extractvalue { double, double } %325, 0
  store double %330, ptr %329, align 16
  %331 = getelementptr inbounds { double, double }, ptr %328, i32 0, i32 1
  %332 = extractvalue { double, double } %325, 1
  store double %332, ptr %331, align 8
  call void @llvm.lifetime.end.p0(i64 64, ptr %37) #12
  %333 = invoke noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %36)
          to label %334 unwind label %397

334:                                              ; preds = %326
  %335 = invoke noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16) %36)
          to label %336 unwind label %397

336:                                              ; preds = %334
  %337 = invoke noundef float @_ZN3JPH5ATan2Eff(float noundef %333, float noundef %335)
          to label %338 unwind label %397

338:                                              ; preds = %336
  %339 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 16
  store float %337, ptr %339, align 8, !tbaa !47
  %340 = load ptr, ptr %4, align 8, !tbaa !5
  %341 = getelementptr inbounds %"class.Test::ProcessInputParams", ptr %340, i32 0, i32 1
  %342 = load ptr, ptr %341, align 8, !tbaa !26
  %343 = load ptr, ptr %342, align 8, !tbaa !29
  %344 = getelementptr inbounds ptr, ptr %343, i64 5
  %345 = load ptr, ptr %344, align 8
  %346 = invoke noundef zeroext i1 %345(ptr noundef nonnull align 8 dereferenceable(8) %342, i32 noundef 52)
          to label %347 unwind label %397

347:                                              ; preds = %338
  %348 = getelementptr inbounds %class.TankTest, ptr %39, i32 0, i32 17
  %349 = zext i1 %346 to i8
  store i8 %349, ptr %348, align 4, !tbaa !48
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #12
  call void @llvm.lifetime.end.p0(i64 64, ptr %33) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #12
  call void @llvm.lifetime.end.p0(i64 64, ptr %27) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #12
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #12
  call void @llvm.lifetime.end.p0(i64 32, ptr %17) #12
  call void @_ZN3JPH18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEED2Ev(ptr noundef nonnull align 8 dereferenceable(37) %16) #12
  call void @llvm.lifetime.end.p0(i64 40, ptr %16) #12
  call void @llvm.lifetime.end.p0(i64 3, ptr %15) #12
  call void @llvm.lifetime.end.p0(i64 32, ptr %11) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #12
  ret void

350:                                              ; preds = %237, %236, %232, %231, %227, %226, %222, %196
  %351 = landingpad { ptr, i32 }
          cleanup
  %352 = extractvalue { ptr, i32 } %351, 0
  store ptr %352, ptr %18, align 8
  %353 = extractvalue { ptr, i32 } %351, 1
  store i32 %353, ptr %19, align 4
  br label %406

354:                                              ; preds = %241
  %355 = landingpad { ptr, i32 }
          cleanup
  %356 = extractvalue { ptr, i32 } %355, 0
  store ptr %356, ptr %18, align 8
  %357 = extractvalue { ptr, i32 } %355, 1
  store i32 %357, ptr %19, align 4
  br label %362

358:                                              ; preds = %242
  %359 = landingpad { ptr, i32 }
          cleanup
  %360 = extractvalue { ptr, i32 } %359, 0
  store ptr %360, ptr %18, align 8
  %361 = extractvalue { ptr, i32 } %359, 1
  store i32 %361, ptr %19, align 4
  call void @_ZN3JPH11ShapeFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(12) %22) #12
  br label %362

362:                                              ; preds = %358, %354
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #12
  call void @_ZN3JPH17ObjectLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %21) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #12
  call void @_ZN3JPH21BroadPhaseLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %20) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #12
  br label %406

363:                                              ; preds = %273, %258, %246, %243
  %364 = landingpad { ptr, i32 }
          cleanup
  %365 = extractvalue { ptr, i32 } %364, 0
  store ptr %365, ptr %18, align 8
  %366 = extractvalue { ptr, i32 } %364, 1
  store i32 %366, ptr %19, align 4
  br label %405

367:                                              ; preds = %283
  %368 = landingpad { ptr, i32 }
          cleanup
  %369 = extractvalue { ptr, i32 } %368, 0
  store ptr %369, ptr %18, align 8
  %370 = extractvalue { ptr, i32 } %368, 1
  store i32 %370, ptr %19, align 4
  br label %375

371:                                              ; preds = %290, %289, %286
  %372 = landingpad { ptr, i32 }
          cleanup
  %373 = extractvalue { ptr, i32 } %372, 0
  store ptr %373, ptr %18, align 8
  %374 = extractvalue { ptr, i32 } %372, 1
  store i32 %374, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %29) #12
  br label %375

375:                                              ; preds = %371, %367
  call void @llvm.lifetime.end.p0(i64 64, ptr %28) #12
  br label %404

376:                                              ; preds = %292, %291
  %377 = landingpad { ptr, i32 }
          cleanup
  %378 = extractvalue { ptr, i32 } %377, 0
  store ptr %378, ptr %18, align 8
  %379 = extractvalue { ptr, i32 } %377, 1
  store i32 %379, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %31) #12
  br label %403

380:                                              ; preds = %308, %306, %298
  %381 = landingpad { ptr, i32 }
          cleanup
  %382 = extractvalue { ptr, i32 } %381, 0
  store ptr %382, ptr %18, align 8
  %383 = extractvalue { ptr, i32 } %381, 1
  store i32 %383, ptr %19, align 4
  br label %403

384:                                              ; preds = %310
  %385 = landingpad { ptr, i32 }
          cleanup
  %386 = extractvalue { ptr, i32 } %385, 0
  store ptr %386, ptr %18, align 8
  %387 = extractvalue { ptr, i32 } %385, 1
  store i32 %387, ptr %19, align 4
  br label %392

388:                                              ; preds = %318, %317, %314
  %389 = landingpad { ptr, i32 }
          cleanup
  %390 = extractvalue { ptr, i32 } %389, 0
  store ptr %390, ptr %18, align 8
  %391 = extractvalue { ptr, i32 } %389, 1
  store i32 %391, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %35) #12
  br label %392

392:                                              ; preds = %388, %384
  call void @llvm.lifetime.end.p0(i64 64, ptr %34) #12
  br label %402

393:                                              ; preds = %320, %319
  %394 = landingpad { ptr, i32 }
          cleanup
  %395 = extractvalue { ptr, i32 } %394, 0
  store ptr %395, ptr %18, align 8
  %396 = extractvalue { ptr, i32 } %394, 1
  store i32 %396, ptr %19, align 4
  call void @llvm.lifetime.end.p0(i64 64, ptr %37) #12
  br label %401

397:                                              ; preds = %338, %336, %334, %326
  %398 = landingpad { ptr, i32 }
          cleanup
  %399 = extractvalue { ptr, i32 } %398, 0
  store ptr %399, ptr %18, align 8
  %400 = extractvalue { ptr, i32 } %398, 1
  store i32 %400, ptr %19, align 4
  br label %401

401:                                              ; preds = %397, %393
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #12
  br label %402

402:                                              ; preds = %401, %392
  call void @llvm.lifetime.end.p0(i64 64, ptr %33) #12
  br label %403

403:                                              ; preds = %402, %380, %376
  call void @llvm.lifetime.end.p0(i64 16, ptr %30) #12
  br label %404

404:                                              ; preds = %403, %375
  call void @llvm.lifetime.end.p0(i64 64, ptr %27) #12
  br label %405

405:                                              ; preds = %404, %363
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #12
  br label %406

406:                                              ; preds = %405, %362, %350
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %17) #12
  call void @llvm.lifetime.end.p0(i64 32, ptr %17) #12
  call void @_ZN3JPH18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEED2Ev(ptr noundef nonnull align 8 dereferenceable(37) %16) #12
  call void @llvm.lifetime.end.p0(i64 40, ptr %16) #12
  call void @llvm.lifetime.end.p0(i64 3, ptr %15) #12
  call void @llvm.lifetime.end.p0(i64 32, ptr %11) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #12
  br label %407

407:                                              ; preds = %406
  %408 = load ptr, ptr %18, align 8
  %409 = load i32, ptr %19, align 4
  %410 = insertvalue { ptr, i32 } poison, ptr %408, 0
  %411 = insertvalue { ptr, i32 } %410, i32 %409, 1
  resume { ptr, i32 } %411
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122)) #5 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16)) #6 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16), double, double) #6 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122)) #5 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16)) #7 align 2

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) #3

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH8RRayCastCI2NS_8RayCastTINS_4Vec3ENS_5Mat44ES0_EEES2_S2_(ptr noundef nonnull align 16 dereferenceable(32), double, double, double, double) unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH15RayCastSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(3)) unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEEC2Ev(ptr noundef nonnull align 8 dereferenceable(37)) unnamed_addr #5 align 2

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

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

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem19GetNarrowPhaseQueryEv(ptr noundef nonnull align 16 dereferenceable(1172)) #8 align 2

declare void @_ZNK3JPH16NarrowPhaseQuery7CastRayERKNS_8RRayCastERKNS_15RayCastSettingsERNS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(32), ptr noundef nonnull align 1 dereferenceable(3), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12)) #9

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH11ShapeFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(12)) unnamed_addr #5 align 2

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEE6HadHitEv(ptr noundef nonnull align 8 dereferenceable(37)) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH8RayCastTINS_4Vec3ENS_5Mat44ENS_8RRayCastEE13GetPointOnRayEf(ptr noundef nonnull align 16 dereferenceable(32), float noundef) #5 align 2

declare void @_ZN3JPH13DebugRenderer10DrawMarkerENS_4Vec3ENS_5ColorEf(ptr noundef nonnull align 8 dereferenceable(320), double, double, i32, float noundef) #9

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) #5 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(64), ptr noundef nonnull align 16 dereferenceable(64)) #11 align 2

declare void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(832)) unnamed_addr #9

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(64)) #6 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64), double, double) #3 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH5ATan2Eff(float noundef, float noundef) #6

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16)) #7 align 2

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !10, i64 208}
!12 = !{!"_ZTS8TankTest", !13, i64 0, !6, i64 136, !6, i64 144, !6, i64 152, !22, i64 160, !23, i64 168, !23, i64 176, !10, i64 184, !24, i64 192, !10, i64 208, !10, i64 212, !10, i64 216, !10, i64 220, !10, i64 224, !10, i64 228, !10, i64 232, !15, i64 236}
!13 = !{!"_ZTS11VehicleTest", !14, i64 0, !21, i64 112}
!14 = !{!"_ZTS4Test", !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !15, i64 48, !16, i64 56}
!15 = !{!"bool", !7, i64 0}
!16 = !{!"_ZTSSt13unordered_mapIN3JPH6BodyIDENSt7__cxx1112basic_stringIcSt11char_traitsIcENS0_12STLAllocatorIcEEEESt4hashIS1_ESt8equal_toIS1_ESaISt4pairIKS1_S8_EEE", !17, i64 0}
!17 = !{!"_ZTSSt10_HashtableIN3JPH6BodyIDESt4pairIKS1_NSt7__cxx1112basic_stringIcSt11char_traitsIcENS0_12STLAllocatorIcEEEEESaISB_ENSt8__detail10_Select1stESt8equal_toIS1_ESt4hashIS1_ENSD_18_Mod_range_hashingENSD_20_Default_ranged_hashENSD_20_Prime_rehash_policyENSD_17_Hashtable_traitsILb1ELb0ELb1EEEE", !6, i64 0, !18, i64 8, !19, i64 16, !18, i64 24, !20, i64 32, !6, i64 48}
!18 = !{!"long", !7, i64 0}
!19 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !6, i64 0}
!20 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !10, i64 0, !18, i64 8}
!21 = !{!"_ZTSN3JPH5ArrayIN11VehicleTest4LineENS_12STLAllocatorIS2_EEEE", !18, i64 0, !18, i64 8, !6, i64 16}
!22 = !{!"_ZTSN3JPH3RefINS_17VehicleConstraintEEE", !6, i64 0}
!23 = !{!"_ZTSN3JPH3RefINS_15HingeConstraintEEE", !6, i64 0}
!24 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!25 = !{!12, !10, i64 224}
!26 = !{!27, !6, i64 8}
!27 = !{!"_ZTSN4Test18ProcessInputParamsE", !10, i64 0, !6, i64 8, !28, i64 16}
!28 = !{!"_ZTS11CameraState", !24, i64 0, !24, i64 16, !24, i64 32, !10, i64 48}
!29 = !{!30, !30, i64 0}
!30 = !{!"vtable pointer", !8, i64 0}
!31 = !{!12, !10, i64 216}
!32 = !{!12, !10, i64 220}
!33 = !{!12, !6, i64 136}
!34 = !{!12, !10, i64 212}
!35 = !{i64 0, i64 16, !36}
!36 = !{!7, !7, i64 0}
!37 = !{!12, !6, i64 144}
!38 = !{!12, !6, i64 152}
!39 = !{!14, !6, i64 16}
!40 = !{!41, !10, i64 4}
!41 = !{!"_ZTSN3JPH20BroadPhaseCastResultE", !42, i64 0, !10, i64 4}
!42 = !{!"_ZTSN3JPH6BodyIDE", !43, i64 0}
!43 = !{!"int", !7, i64 0}
!44 = !{!14, !6, i64 32}
!45 = !{i64 0, i64 4, !36}
!46 = !{!12, !10, i64 228}
!47 = !{!12, !10, i64 232}
!48 = !{!12, !15, i64 236}


; 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.JPH::Color" = type { %union.anon.79 }
%union.anon.79 = type { i32 }
%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.43 }
%union.anon.43 = type { <4 x float> }
%"struct.JPH::RRayCast" = type { %"struct.JPH::RayCastT" }
%"struct.JPH::RayCastT" = type { %"class.JPH::Vec3", %"class.JPH::Vec3" }
%"class.JPH::RayCastSettings" = type { i8, i8, i8 }
%"class.JPH::ClosestHitCollisionCollector" = type <{ %"class.JPH::CollisionCollector", %"class.JPH::RayCastResult", i8, [3 x i8] }>
%"class.JPH::CollisionCollector" = type { ptr, float, ptr }
%"class.JPH::RayCastResult" = type { %"class.JPH::BroadPhaseCastResult", %"class.JPH::SubShapeID" }
%"class.JPH::BroadPhaseCastResult" = type { %"class.JPH::BodyID", float }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::IgnoreMultipleBodiesFilter" = type { %"class.JPH::BodyFilter", %"class.JPH::Array.11" }
%"class.JPH::BodyFilter" = type { ptr }
%"class.JPH::Array.11" = type { i64, i64, ptr }
%"class.JPH::BroadPhaseLayerFilter" = type { ptr }
%"class.JPH::ObjectLayerFilter" = type { ptr }
%"class.JPH::ShapeFilter" = type <{ ptr, %"class.JPH::BodyID", [4 x i8] }>
%"class.JPH::Mat44" = type { [4 x %"class.JPH::Vec4"] }

@_ZN3JPH5Color6sGreenE = external local_unnamed_addr global %"class.JPH::Color", align 4

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

declare i32 @__gxx_personality_v0(...)

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #1 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #2 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH3RefINS_15HingeConstraintEEptEv(ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN8TankTest12ProcessInputERKN4Test18ProcessInputParamsE(ptr noundef nonnull align 16 dereferenceable(237) %0, ptr nocapture noundef nonnull readonly align 16 dereferenceable(80) %1) unnamed_addr #3 align 2 personality ptr @__gxx_personality_v0 {
  %3 = alloca %"class.JPH::Vec3", align 16
  %4 = alloca %"class.JPH::Quat", align 16
  %5 = alloca %"class.JPH::Quat", align 16
  %6 = alloca %"struct.JPH::RRayCast", align 16
  %7 = alloca %"class.JPH::RayCastSettings", align 1
  %8 = alloca %"class.JPH::ClosestHitCollisionCollector", align 8
  %9 = alloca %"class.JPH::IgnoreMultipleBodiesFilter", align 8
  %10 = alloca %"class.JPH::BroadPhaseLayerFilter", align 8
  %11 = alloca %"class.JPH::ObjectLayerFilter", align 8
  %12 = alloca %"class.JPH::ShapeFilter", align 8
  %13 = alloca %"class.JPH::Mat44", align 16
  %14 = alloca %"class.JPH::Mat44", align 16
  %15 = alloca %"class.JPH::Mat44", align 16
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::Mat44", align 16
  %18 = alloca %"class.JPH::Mat44", align 16
  %19 = alloca %"class.JPH::Mat44", align 16
  %20 = alloca %"class.JPH::Mat44", align 16
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca %"class.JPH::Mat44", align 16
  %23 = getelementptr inbounds i8, ptr %0, i64 208
  store float 0.000000e+00, ptr %23, align 16, !tbaa !5
  %24 = getelementptr inbounds i8, ptr %0, i64 224
  store float 0.000000e+00, ptr %24, align 16, !tbaa !23
  %25 = getelementptr inbounds i8, ptr %1, i64 8
  %26 = load ptr, ptr %25, align 8, !tbaa !24
  %27 = load ptr, ptr %26, align 8, !tbaa !27
  %28 = getelementptr inbounds i8, ptr %27, i64 40
  %29 = load ptr, ptr %28, align 8
  %30 = tail call noundef zeroext i1 %29(ptr noundef nonnull align 8 dereferenceable(8) %26, i32 noundef 43)
  br i1 %30, label %31, label %32

31:                                               ; preds = %2
  store float 1.000000e+00, ptr %24, align 16, !tbaa !23
  br label %46

32:                                               ; preds = %2
  %33 = load ptr, ptr %25, align 8, !tbaa !24
  %34 = load ptr, ptr %33, align 8, !tbaa !27
  %35 = getelementptr inbounds i8, ptr %34, i64 40
  %36 = load ptr, ptr %35, align 8
  %37 = tail call noundef zeroext i1 %36(ptr noundef nonnull align 8 dereferenceable(8) %33, i32 noundef 50)
  br i1 %37, label %38, label %39

38:                                               ; preds = %32
  store float 1.000000e+00, ptr %23, align 16, !tbaa !5
  br label %46

39:                                               ; preds = %32
  %40 = load ptr, ptr %25, align 8, !tbaa !24
  %41 = load ptr, ptr %40, align 8, !tbaa !27
  %42 = getelementptr inbounds i8, ptr %41, i64 40
  %43 = load ptr, ptr %42, align 8
  %44 = tail call noundef zeroext i1 %43(ptr noundef nonnull align 8 dereferenceable(8) %40, i32 noundef 51)
  br i1 %44, label %45, label %46

45:                                               ; preds = %39
  store float -1.000000e+00, ptr %23, align 16, !tbaa !5
  br label %46

46:                                               ; preds = %38, %45, %39, %31
  %47 = getelementptr inbounds i8, ptr %0, i64 216
  %48 = getelementptr inbounds i8, ptr %0, i64 220
  store <2 x float> <float 1.000000e+00, float 1.000000e+00>, ptr %47, align 8, !tbaa !29
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %4) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #11
  %49 = getelementptr inbounds i8, ptr %0, i64 136
  %50 = load ptr, ptr %49, align 8, !tbaa !30
  %51 = tail call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %50)
  %52 = extractvalue { double, double } %51, 0
  store double %52, ptr %5, align 16
  %53 = getelementptr inbounds i8, ptr %5, i64 8
  %54 = extractvalue { double, double } %51, 1
  store double %54, ptr %53, align 8
  %55 = call { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16) %5)
  %56 = extractvalue { double, double } %55, 0
  store double %56, ptr %4, align 16
  %57 = getelementptr inbounds i8, ptr %4, i64 8
  %58 = extractvalue { double, double } %55, 1
  store double %58, ptr %57, align 8
  %59 = load ptr, ptr %49, align 8, !tbaa !30
  %60 = call { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %59)
  %61 = extractvalue { double, double } %60, 0
  %62 = extractvalue { double, double } %60, 1
  %63 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %4, double %61, double %62)
  %64 = extractvalue { double, double } %63, 0
  store double %64, ptr %3, align 16
  %65 = getelementptr inbounds i8, ptr %3, i64 8
  %66 = extractvalue { double, double } %63, 1
  store double %66, ptr %65, align 8
  %67 = call noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %3)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3) #11
  %68 = load ptr, ptr %25, align 8, !tbaa !24
  %69 = load ptr, ptr %68, align 8, !tbaa !27
  %70 = getelementptr inbounds i8, ptr %69, i64 40
  %71 = load ptr, ptr %70, align 8
  %72 = call noundef zeroext i1 %71(ptr noundef nonnull align 8 dereferenceable(8) %68, i32 noundef 48)
  br i1 %72, label %73, label %83

73:                                               ; preds = %46
  %74 = load float, ptr %24, align 16, !tbaa !23
  %75 = fcmp oeq float %74, 0.000000e+00
  %76 = load float, ptr %23, align 16
  %77 = fcmp oeq float %76, 0.000000e+00
  %or.cond57 = select i1 %75, i1 %77, i1 false
  br i1 %or.cond57, label %78, label %82

78:                                               ; preds = %73
  %79 = call noundef float @_ZSt3absf(float noundef %67)
  %80 = fcmp olt float %79, 1.000000e+00
  br i1 %80, label %81, label %82

81:                                               ; preds = %78
  store float -1.000000e+00, ptr %47, align 8, !tbaa !31
  store float 1.000000e+00, ptr %23, align 16, !tbaa !5
  br label %99

82:                                               ; preds = %78, %73
  store float 0x3FE3333340000000, ptr %47, align 8, !tbaa !31
  br label %99

83:                                               ; preds = %46
  %84 = load ptr, ptr %25, align 8, !tbaa !24
  %85 = load ptr, ptr %84, align 8, !tbaa !27
  %86 = getelementptr inbounds i8, ptr %85, i64 40
  %87 = load ptr, ptr %86, align 8
  %88 = call noundef zeroext i1 %87(ptr noundef nonnull align 8 dereferenceable(8) %84, i32 noundef 49)
  br i1 %88, label %89, label %99

89:                                               ; preds = %83
  %90 = load float, ptr %24, align 16, !tbaa !23
  %91 = fcmp oeq float %90, 0.000000e+00
  %92 = load float, ptr %23, align 16
  %93 = fcmp oeq float %92, 0.000000e+00
  %or.cond59 = select i1 %91, i1 %93, i1 false
  br i1 %or.cond59, label %94, label %98

94:                                               ; preds = %89
  %95 = call noundef float @_ZSt3absf(float noundef %67)
  %96 = fcmp olt float %95, 1.000000e+00
  br i1 %96, label %97, label %98

97:                                               ; preds = %94
  store float -1.000000e+00, ptr %48, align 4, !tbaa !32
  store float 1.000000e+00, ptr %23, align 16, !tbaa !5
  br label %99

98:                                               ; preds = %94, %89
  store float 0x3FE3333340000000, ptr %48, align 4, !tbaa !32
  br label %99

99:                                               ; preds = %83, %98, %97, %81, %82
  %100 = getelementptr inbounds i8, ptr %0, i64 212
  %101 = load float, ptr %100, align 4, !tbaa !33
  %102 = load float, ptr %23, align 16, !tbaa !5
  %103 = fmul float %101, %102
  %104 = fcmp olt float %103, 0.000000e+00
  br i1 %104, label %105, label %113

105:                                              ; preds = %99
  %106 = fcmp ogt float %102, 0.000000e+00
  %107 = fcmp olt float %67, 0xBFB99999A0000000
  %or.cond = and i1 %107, %106
  br i1 %or.cond, label %111, label %108

108:                                              ; preds = %105
  %109 = fcmp olt float %102, 0.000000e+00
  %110 = fcmp ogt float %67, 0x3FB99999A0000000
  %or.cond3 = and i1 %110, %109
  br i1 %or.cond3, label %111, label %112

111:                                              ; preds = %108, %105
  store float 0.000000e+00, ptr %23, align 16, !tbaa !5
  store float 1.000000e+00, ptr %24, align 16, !tbaa !23
  br label %113

112:                                              ; preds = %108
  store float %102, ptr %100, align 4, !tbaa !33
  br label %113

113:                                              ; preds = %111, %112, %99
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %6) #11
  %114 = getelementptr inbounds i8, ptr %1, i64 16
  %.sroa.016.0.copyload = load double, ptr %114, align 16
  %.sroa.217.0..sroa_idx = getelementptr inbounds i8, ptr %1, i64 24
  %.sroa.217.0.copyload = load double, ptr %.sroa.217.0..sroa_idx, align 8, !tbaa !34
  %115 = getelementptr inbounds i8, ptr %1, i64 32
  %.sroa.012.0.copyload = load double, ptr %115, align 16
  %.sroa.213.0..sroa_idx = getelementptr inbounds i8, ptr %1, i64 40
  %.sroa.213.0.copyload = load double, ptr %.sroa.213.0..sroa_idx, align 8, !tbaa !34
  %116 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef 1.000000e+03, double %.sroa.012.0.copyload, double %.sroa.213.0.copyload)
  %117 = extractvalue { double, double } %116, 0
  %118 = extractvalue { double, double } %116, 1
  call void @_ZN3JPH8RRayCastCI2NS_8RayCastTINS_4Vec3ENS_5Mat44ES0_EEES2_S2_(ptr noundef nonnull align 16 dereferenceable(32) %6, double %.sroa.016.0.copyload, double %.sroa.217.0.copyload, double %117, double %118)
  call void @llvm.lifetime.start.p0(i64 3, ptr nonnull %7) #11
  call void @_ZN3JPH15RayCastSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(3) %7) #11
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %8) #11
  call void @_ZN3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEEC2Ev(ptr noundef nonnull align 8 dereferenceable(37) %8)
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %9) #11
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(32) %9) #11
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter7ReserveEj(ptr noundef nonnull align 8 dereferenceable(32) %9, i32 noundef 3)
          to label %119 unwind label %188

119:                                              ; preds = %113
  %120 = load ptr, ptr %49, align 8, !tbaa !30
  %121 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %120)
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %9, ptr noundef nonnull align 4 dereferenceable(4) %121)
          to label %122 unwind label %188

122:                                              ; preds = %119
  %123 = getelementptr inbounds i8, ptr %0, i64 144
  %124 = load ptr, ptr %123, align 16, !tbaa !35
  %125 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %124)
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %9, ptr noundef nonnull align 4 dereferenceable(4) %125)
          to label %126 unwind label %188

126:                                              ; preds = %122
  %127 = getelementptr inbounds i8, ptr %0, i64 152
  %128 = load ptr, ptr %127, align 8, !tbaa !36
  %129 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNK3JPH4Body5GetIDEv(ptr noundef nonnull align 16 dereferenceable(122) %128)
  invoke void @_ZN3JPH26IgnoreMultipleBodiesFilter10IgnoreBodyERKNS_6BodyIDE(ptr noundef nonnull align 8 dereferenceable(32) %9, ptr noundef nonnull align 4 dereferenceable(4) %129)
          to label %130 unwind label %188

130:                                              ; preds = %126
  %131 = getelementptr inbounds i8, ptr %0, i64 16
  %132 = load ptr, ptr %131, align 16, !tbaa !37
  %133 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem19GetNarrowPhaseQueryEv(ptr noundef nonnull align 16 dereferenceable(1172) %132)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #11
  store i64 0, ptr %10, align 8
  call void @_ZN3JPH21BroadPhaseLayerFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %10) #11
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #11
  store i64 0, ptr %11, align 8
  call void @_ZN3JPH17ObjectLayerFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %11) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #11
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %12, i8 0, i64 16, i1 false)
  invoke void @_ZN3JPH11ShapeFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(12) %12)
          to label %134 unwind label %190

134:                                              ; preds = %130
  invoke void @_ZNK3JPH16NarrowPhaseQuery7CastRayERKNS_8RRayCastERKNS_15RayCastSettingsERNS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 8 dereferenceable(16) %133, ptr noundef nonnull align 16 dereferenceable(32) %6, ptr noundef nonnull align 1 dereferenceable(3) %7, ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 8 dereferenceable(8) %10, ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(12) %12)
          to label %135 unwind label %192

135:                                              ; preds = %134
  call void @_ZN3JPH11ShapeFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(12) %12) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #11
  call void @_ZN3JPH17ObjectLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %11) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #11
  call void @_ZN3JPH21BroadPhaseLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %10) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #11
  %136 = call noundef zeroext i1 @_ZNK3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEE6HadHitEv(ptr noundef nonnull align 8 dereferenceable(37) %8)
  br i1 %136, label %137, label %141

137:                                              ; preds = %135
  %138 = getelementptr inbounds i8, ptr %8, i64 28
  %139 = load float, ptr %138, align 4, !tbaa !38
  %140 = invoke { double, double } @_ZNK3JPH8RayCastTINS_4Vec3ENS_5Mat44ENS_8RRayCastEE13GetPointOnRayEf(ptr noundef nonnull align 16 dereferenceable(32) %6, float noundef %139)
          to label %144 unwind label %195

141:                                              ; preds = %135
  %142 = getelementptr inbounds i8, ptr %6, i64 16
  %.sroa.09.0.copyload = load double, ptr %142, align 16
  %.sroa.210.0..sroa_idx = getelementptr inbounds i8, ptr %6, i64 24
  %.sroa.210.0.copyload = load double, ptr %.sroa.210.0..sroa_idx, align 8, !tbaa !34
  %143 = invoke { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.09.0.copyload, double %.sroa.210.0.copyload)
          to label %144 unwind label %195

144:                                              ; preds = %141, %137
  %.pn43 = phi { double, double } [ %140, %137 ], [ %143, %141 ]
  %.sroa.8.0 = extractvalue { double, double } %.pn43, 1
  %.sroa.011.0 = extractvalue { double, double } %.pn43, 0
  %145 = getelementptr inbounds i8, ptr %0, i64 32
  %146 = load ptr, ptr %145, align 16, !tbaa !42
  %.sroa.06.0.copyload = load i32, ptr @_ZN3JPH5Color6sGreenE, align 4, !tbaa !34
  invoke void @_ZN3JPH13DebugRenderer10DrawMarkerENS_4Vec3ENS_5ColorEf(ptr noundef nonnull align 8 dereferenceable(320) %146, double %.sroa.011.0, double %.sroa.8.0, i32 %.sroa.06.0.copyload, float noundef 1.000000e+00)
          to label %147 unwind label %195

147:                                              ; preds = %144
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %13) #11
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %14) #11
  %148 = load ptr, ptr %49, align 8, !tbaa !30
  invoke void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %14, ptr noundef nonnull align 16 dereferenceable(122) %148)
          to label %149 unwind label %197

149:                                              ; preds = %147
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %15) #11
  %150 = getelementptr inbounds i8, ptr %0, i64 168
  %151 = call noundef ptr @_ZNK3JPH3RefINS_15HingeConstraintEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %150)
  invoke void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %15, ptr noundef nonnull align 16 dereferenceable(832) %151)
          to label %152 unwind label %199

152:                                              ; preds = %149
  call void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %13, ptr noundef nonnull align 16 dereferenceable(64) %14, ptr noundef nonnull align 16 dereferenceable(64) %15)
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %14) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #11
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %17) #11
  invoke void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %17, ptr noundef nonnull align 16 dereferenceable(64) %13)
          to label %153 unwind label %202

153:                                              ; preds = %152
  %154 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %17, double %.sroa.011.0, double %.sroa.8.0)
          to label %155 unwind label %202

155:                                              ; preds = %153
  %156 = extractvalue { double, double } %154, 0
  store double %156, ptr %16, align 16
  %157 = getelementptr inbounds i8, ptr %16, i64 8
  %158 = extractvalue { double, double } %154, 1
  store double %158, ptr %157, align 8
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %17) #11
  %159 = call noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %16)
  %160 = call noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16) %16)
  %161 = invoke noundef float @_ZN3JPH5ATan2Eff(float noundef %159, float noundef %160)
          to label %162 unwind label %204

162:                                              ; preds = %155
  %163 = getelementptr inbounds i8, ptr %0, i64 228
  store float %161, ptr %163, align 4, !tbaa !43
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %18) #11
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %19) #11
  %164 = load ptr, ptr %123, align 16, !tbaa !35
  invoke void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %19, ptr noundef nonnull align 16 dereferenceable(122) %164)
          to label %165 unwind label %206

165:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %20) #11
  %166 = getelementptr inbounds i8, ptr %0, i64 176
  %167 = call noundef ptr @_ZNK3JPH3RefINS_15HingeConstraintEEptEv(ptr noundef nonnull align 8 dereferenceable(8) %166)
  invoke void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %20, ptr noundef nonnull align 16 dereferenceable(832) %167)
          to label %168 unwind label %208

168:                                              ; preds = %165
  call void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %18, ptr noundef nonnull align 16 dereferenceable(64) %19, ptr noundef nonnull align 16 dereferenceable(64) %20)
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %20) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %19) #11
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %21) #11
  call void @llvm.lifetime.start.p0(i64 64, ptr nonnull %22) #11
  invoke void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind nonnull writable sret(%"class.JPH::Mat44") align 16 %22, ptr noundef nonnull align 16 dereferenceable(64) %18)
          to label %169 unwind label %211

169:                                              ; preds = %168
  %170 = invoke { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64) %22, double %.sroa.011.0, double %.sroa.8.0)
          to label %171 unwind label %211

171:                                              ; preds = %169
  %172 = extractvalue { double, double } %170, 0
  store double %172, ptr %21, align 16
  %173 = getelementptr inbounds i8, ptr %21, i64 8
  %174 = extractvalue { double, double } %170, 1
  store double %174, ptr %173, align 8
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %22) #11
  %175 = call noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %176 = call noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16) %21)
  %177 = invoke noundef float @_ZN3JPH5ATan2Eff(float noundef %175, float noundef %176)
          to label %178 unwind label %213

178:                                              ; preds = %171
  %179 = getelementptr inbounds i8, ptr %0, i64 232
  store float %177, ptr %179, align 8, !tbaa !44
  %180 = load ptr, ptr %25, align 8, !tbaa !24
  %181 = load ptr, ptr %180, align 8, !tbaa !27
  %182 = getelementptr inbounds i8, ptr %181, i64 40
  %183 = load ptr, ptr %182, align 8
  %184 = invoke noundef zeroext i1 %183(ptr noundef nonnull align 8 dereferenceable(8) %180, i32 noundef 52)
          to label %185 unwind label %213

185:                                              ; preds = %178
  %186 = getelementptr inbounds i8, ptr %0, i64 236
  %187 = zext i1 %184 to i8
  store i8 %187, ptr %186, align 4, !tbaa !45
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %18) #11
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #11
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %13) #11
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %9) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #11
  call void @_ZN3JPH18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEED2Ev(ptr noundef nonnull align 8 dereferenceable(37) %8) #11
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #11
  call void @llvm.lifetime.end.p0(i64 3, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #11
  ret void

188:                                              ; preds = %126, %122, %119, %113
  %189 = landingpad { ptr, i32 }
          cleanup
  br label %219

190:                                              ; preds = %130
  %191 = landingpad { ptr, i32 }
          cleanup
  br label %194

192:                                              ; preds = %134
  %193 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN3JPH11ShapeFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(12) %12) #11
  br label %194

194:                                              ; preds = %192, %190
  %.pn = phi { ptr, i32 } [ %193, %192 ], [ %191, %190 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #11
  call void @_ZN3JPH17ObjectLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %11) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #11
  call void @_ZN3JPH21BroadPhaseLayerFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(8) %10) #11
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #11
  br label %219

195:                                              ; preds = %144, %141, %137
  %196 = landingpad { ptr, i32 }
          cleanup
  br label %219

197:                                              ; preds = %147
  %198 = landingpad { ptr, i32 }
          cleanup
  br label %201

199:                                              ; preds = %149
  %200 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %15) #11
  br label %201

201:                                              ; preds = %199, %197
  %.pn45 = phi { ptr, i32 } [ %200, %199 ], [ %198, %197 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %14) #11
  br label %218

202:                                              ; preds = %153, %152
  %203 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %17) #11
  br label %217

204:                                              ; preds = %155
  %205 = landingpad { ptr, i32 }
          cleanup
  br label %217

206:                                              ; preds = %162
  %207 = landingpad { ptr, i32 }
          cleanup
  br label %210

208:                                              ; preds = %165
  %209 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %20) #11
  br label %210

210:                                              ; preds = %208, %206
  %.pn47 = phi { ptr, i32 } [ %209, %208 ], [ %207, %206 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %19) #11
  br label %216

211:                                              ; preds = %169, %168
  %212 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %22) #11
  br label %215

213:                                              ; preds = %178, %171
  %214 = landingpad { ptr, i32 }
          cleanup
  br label %215

215:                                              ; preds = %213, %211
  %.pn49 = phi { ptr, i32 } [ %214, %213 ], [ %212, %211 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %21) #11
  br label %216

216:                                              ; preds = %215, %210
  %.pn49.pn = phi { ptr, i32 } [ %.pn49, %215 ], [ %.pn47, %210 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %18) #11
  br label %217

217:                                              ; preds = %216, %204, %202
  %.pn49.pn.pn = phi { ptr, i32 } [ %.pn49.pn, %216 ], [ %205, %204 ], [ %203, %202 ]
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #11
  br label %218

218:                                              ; preds = %217, %201
  %.pn49.pn.pn.pn = phi { ptr, i32 } [ %.pn49.pn.pn, %217 ], [ %.pn45, %201 ]
  call void @llvm.lifetime.end.p0(i64 64, ptr nonnull %13) #11
  br label %219

219:                                              ; preds = %195, %218, %194, %188
  %.pn49.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn, %194 ], [ %189, %188 ], [ %.pn49.pn.pn.pn, %218 ], [ %196, %195 ]
  call void @_ZN3JPH26IgnoreMultipleBodiesFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(32) %9) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %9) #11
  call void @_ZN3JPH18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEED2Ev(ptr noundef nonnull align 8 dereferenceable(37) %8) #11
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #11
  call void @llvm.lifetime.end.p0(i64 3, ptr nonnull %7) #11
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %6) #11
  resume { ptr, i32 } %.pn49.pn.pn.pn.pn.pn
}

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #4 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Quat10ConjugatedEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #5 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #5 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #4 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec34GetZEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #6 align 2

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef, double, double) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZN3JPH8RRayCastCI2NS_8RayCastTINS_4Vec3ENS_5Mat44ES0_EEES2_S2_(ptr noundef nonnull align 16 dereferenceable(32), double, double, double, double) unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH15RayCastSettingsC2Ev(ptr noundef nonnull align 1 dereferenceable(3)) unnamed_addr #1 align 2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH26IgnoreMultipleBodiesFilterC2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH26IgnoreMultipleBodiesFilter7ReserveEj(ptr noundef nonnull align 8 dereferenceable(32), i32 noundef) local_unnamed_addr #3 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(16) ptr @_ZNK3JPH13PhysicsSystem19GetNarrowPhaseQueryEv(ptr noundef nonnull align 16 dereferenceable(1172)) local_unnamed_addr #7 align 2

declare void @_ZNK3JPH16NarrowPhaseQuery7CastRayERKNS_8RRayCastERKNS_15RayCastSettingsERNS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEERKNS_21BroadPhaseLayerFilterERKNS_17ObjectLayerFilterERKNS_10BodyFilterERKNS_11ShapeFilterE(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 16 dereferenceable(32), ptr noundef nonnull align 1 dereferenceable(3), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(12)) local_unnamed_addr #8

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

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH28ClosestHitCollisionCollectorINS_18CollisionCollectorINS_13RayCastResultENS_31CollisionCollectorTraitsCastRayEEEE6HadHitEv(ptr noundef nonnull align 8 dereferenceable(37)) local_unnamed_addr #1 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH8RayCastTINS_4Vec3ENS_5Mat44ENS_8RRayCastEE13GetPointOnRayEf(ptr noundef nonnull align 16 dereferenceable(32), float noundef) local_unnamed_addr #4 align 2

declare void @_ZN3JPH13DebugRenderer10DrawMarkerENS_4Vec3ENS_5ColorEf(ptr noundef nonnull align 8 dereferenceable(320), double, double, i32, float noundef) local_unnamed_addr #8

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local void @_ZNK3JPH4Body24GetCenterOfMassTransformEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #4 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZNK3JPH5Mat44mlERKS0_(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(64), ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #10 align 2

declare void @_ZNK3JPH15HingeConstraint26GetConstraintToBody1MatrixEv(ptr dead_on_unwind writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(832)) unnamed_addr #8

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZNK3JPH5Mat4427InversedRotationTranslationEv(ptr dead_on_unwind noalias writable sret(%"class.JPH::Mat44") align 16, ptr noundef nonnull align 16 dereferenceable(64)) local_unnamed_addr #5 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH5Mat44mlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(64), double, double) local_unnamed_addr #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH5ATan2Eff(float noundef, float noundef) local_unnamed_addr #5

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH4Vec34GetYEv(ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH26IgnoreMultipleBodiesFilterD2Ev(ptr noundef nonnull align 8 dereferenceable(32)) unnamed_addr #1 align 2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !18, i64 208}
!6 = !{!"_ZTS8TankTest", !7, i64 0, !9, i64 136, !9, i64 144, !9, i64 152, !20, i64 160, !21, i64 168, !21, i64 176, !18, i64 184, !22, i64 192, !18, i64 208, !18, i64 212, !18, i64 216, !18, i64 220, !18, i64 224, !18, i64 228, !18, i64 232, !12, i64 236}
!7 = !{!"_ZTS11VehicleTest", !8, i64 0, !19, i64 112}
!8 = !{!"_ZTS4Test", !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40, !12, i64 48, !13, i64 56}
!9 = !{!"any pointer", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C++ TBAA"}
!12 = !{!"bool", !10, i64 0}
!13 = !{!"_ZTSSt13unordered_mapIN3JPH6BodyIDENSt7__cxx1112basic_stringIcSt11char_traitsIcENS0_12STLAllocatorIcEEEESt4hashIS1_ESt8equal_toIS1_ESaISt4pairIKS1_S8_EEE", !14, i64 0}
!14 = !{!"_ZTSSt10_HashtableIN3JPH6BodyIDESt4pairIKS1_NSt7__cxx1112basic_stringIcSt11char_traitsIcENS0_12STLAllocatorIcEEEEESaISB_ENSt8__detail10_Select1stESt8equal_toIS1_ESt4hashIS1_ENSD_18_Mod_range_hashingENSD_20_Default_ranged_hashENSD_20_Prime_rehash_policyENSD_17_Hashtable_traitsILb1ELb0ELb1EEEE", !9, i64 0, !15, i64 8, !16, i64 16, !15, i64 24, !17, i64 32, !9, i64 48}
!15 = !{!"long", !10, i64 0}
!16 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !9, i64 0}
!17 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !18, i64 0, !15, i64 8}
!18 = !{!"float", !10, i64 0}
!19 = !{!"_ZTSN3JPH5ArrayIN11VehicleTest4LineENS_12STLAllocatorIS2_EEEE", !15, i64 0, !15, i64 8, !9, i64 16}
!20 = !{!"_ZTSN3JPH3RefINS_17VehicleConstraintEEE", !9, i64 0}
!21 = !{!"_ZTSN3JPH3RefINS_15HingeConstraintEEE", !9, i64 0}
!22 = !{!"_ZTSN3JPH4Vec3E", !10, i64 0}
!23 = !{!6, !18, i64 224}
!24 = !{!25, !9, i64 8}
!25 = !{!"_ZTSN4Test18ProcessInputParamsE", !18, i64 0, !9, i64 8, !26, i64 16}
!26 = !{!"_ZTS11CameraState", !22, i64 0, !22, i64 16, !22, i64 32, !18, i64 48}
!27 = !{!28, !28, i64 0}
!28 = !{!"vtable pointer", !11, i64 0}
!29 = !{!18, !18, i64 0}
!30 = !{!6, !9, i64 136}
!31 = !{!6, !18, i64 216}
!32 = !{!6, !18, i64 220}
!33 = !{!6, !18, i64 212}
!34 = !{!10, !10, i64 0}
!35 = !{!6, !9, i64 144}
!36 = !{!6, !9, i64 152}
!37 = !{!8, !9, i64 16}
!38 = !{!39, !18, i64 4}
!39 = !{!"_ZTSN3JPH20BroadPhaseCastResultE", !40, i64 0, !18, i64 4}
!40 = !{!"_ZTSN3JPH6BodyIDE", !41, i64 0}
!41 = !{!"int", !10, i64 0}
!42 = !{!8, !9, i64 32}
!43 = !{!6, !18, i64 228}
!44 = !{!6, !18, i64 232}
!45 = !{!6, !12, i64 236}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass