; LLVM IR from jrouwe/JoltPhysics :: Jolt/Physics/Vehicle (MotorcycleController)

; 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::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.40 }
%union.anon.40 = type { <4 x float> }
%"class.JPH::VehicleController" = type { ptr, ptr }
%"class.JPH::MotorcycleController" = type <{ %"class.JPH::WheeledVehicleController", i8, i8, [2 x i8], float, float, float, float, float, float, [4 x i8], %"class.JPH::Vec3", float, float, [8 x i8] }>
%"class.JPH::WheeledVehicleController" = type { %"class.JPH::VehicleController", float, float, float, float, %"class.JPH::VehicleEngine", %"class.JPH::VehicleTransmission", %"class.JPH::Array.5", float, float, %"class.std::function" }
%"class.JPH::VehicleEngine" = type <{ %"class.JPH::VehicleEngineSettings", float, [4 x i8] }>
%"class.JPH::VehicleEngineSettings" = type { float, float, float, %"class.JPH::LinearCurve", float, float }
%"class.JPH::LinearCurve" = type { %"class.JPH::Array" }
%"class.JPH::Array" = type { i64, i64, ptr }
%"class.JPH::VehicleTransmission" = type <{ %"class.JPH::VehicleTransmissionSettings", i32, float, float, float, float, [4 x i8] }>
%"class.JPH::VehicleTransmissionSettings" = type { i8, %"class.JPH::Array.2", %"class.JPH::Array.2", float, float, float, float, float, float }
%"class.JPH::Array.2" = type { i64, i64, ptr }
%"class.JPH::Array.5" = type { i64, i64, ptr }
%"class.std::function" = type { %"class.std::_Function_base", ptr }
%"class.std::_Function_base" = type { %"union.std::_Any_data", ptr }
%"union.std::_Any_data" = type { %"union.std::_Nocopy_types" }
%"union.std::_Nocopy_types" = type { { i64, i64 } }
%"class.JPH::WheelSettingsWV" = type { %"class.JPH::WheelSettings.base", float, float, float, %"class.JPH::LinearCurve", %"class.JPH::LinearCurve", float, float, [8 x i8] }
%"class.JPH::WheelSettings.base" = type <{ %"class.JPH::SerializableObject", %"class.JPH::RefTarget.20", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, float, %"class.JPH::SpringSettings", float, float, i8 }>
%"class.JPH::SerializableObject" = type { ptr }
%"class.JPH::RefTarget.20" = type { %"struct.std::atomic" }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::SpringSettings" = type { i8, %union.anon.21, float }
%union.anon.21 = type { float }
%"class.JPH::WheelSettings" = type <{ %"class.JPH::SerializableObject", %"class.JPH::RefTarget.20", [4 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, float, %"class.JPH::SpringSettings", float, float, i8, [15 x i8] }>

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH20MotorcycleController12GetWheelBaseEv(ptr noundef nonnull align 16 dereferenceable(312)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408)) #3 align 2

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

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH20MotorcycleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 16 dereferenceable(312) %0, float noundef %1, ptr noundef nonnull align 16 dereferenceable(1172) %2) unnamed_addr #2 align 2 {
  %4 = alloca ptr, align 8
  %5 = alloca float, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Quat", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca float, align 4
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca %"class.JPH::Vec3", align 16
  %19 = alloca %"class.JPH::Vec3", align 16
  %20 = alloca %"class.JPH::Vec3", align 16
  %21 = alloca %"class.JPH::Vec3", align 16
  %22 = alloca %"class.JPH::Vec3", align 16
  %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::Vec3", align 16
  %27 = alloca %"class.JPH::Vec3", align 16
  %28 = alloca %"class.JPH::Vec3", align 16
  %29 = alloca %"class.JPH::Vec3", align 16
  %30 = alloca %"class.JPH::Vec3", align 16
  %31 = alloca %"class.JPH::Vec3", align 16
  %32 = alloca %"class.JPH::Vec3", align 16
  %33 = alloca %"class.JPH::Vec3", align 16
  %34 = alloca %"class.JPH::Vec3", align 16
  %35 = alloca %"class.JPH::Vec3", align 16
  %36 = alloca %"class.JPH::Vec3", align 16
  %37 = alloca %"class.JPH::Vec3", align 16
  %38 = alloca %"class.JPH::Vec3", align 16
  %39 = alloca float, align 4
  %40 = alloca %"class.JPH::Vec3", align 16
  %41 = alloca %"class.JPH::Vec3", align 16
  %42 = alloca %"class.JPH::Vec3", align 16
  %43 = alloca %"class.JPH::Vec3", align 16
  %44 = alloca %"class.JPH::Vec3", align 16
  %45 = alloca %"class.JPH::Quat", align 16
  %46 = alloca %"class.JPH::Vec3", align 16
  %47 = alloca %"class.JPH::Vec3", align 16
  %48 = alloca %"class.JPH::Vec3", align 16
  %49 = alloca %"class.JPH::Quat", align 16
  %50 = alloca %"class.JPH::Vec3", align 16
  %51 = alloca float, align 4
  %52 = alloca %"class.JPH::Vec3", align 16
  %53 = alloca %"class.JPH::Vec3", align 16
  %54 = alloca %"class.JPH::Vec3", align 16
  %55 = alloca %"class.JPH::Vec3", align 16
  %56 = alloca float, align 4
  %57 = alloca %"class.JPH::Vec3", align 16
  %58 = alloca float, align 4
  %59 = alloca %"class.JPH::Vec3", align 16
  %60 = alloca %"class.JPH::Vec3", align 16
  %61 = alloca float, align 4
  %62 = alloca float, align 4
  %63 = alloca float, align 4
  %64 = alloca ptr, align 8
  %65 = alloca ptr, align 8
  %66 = alloca ptr, align 8
  %67 = alloca ptr, align 8
  %68 = alloca ptr, align 8
  %69 = alloca ptr, align 8
  %70 = alloca float, align 4
  %71 = alloca %"class.JPH::Vec3", align 16
  %72 = alloca float, align 4
  %73 = alloca float, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store float %1, ptr %5, align 4, !tbaa !9
  store ptr %2, ptr %6, align 8, !tbaa !5
  %74 = load ptr, ptr %4, align 8
  %75 = load float, ptr %5, align 4, !tbaa !9
  %76 = load ptr, ptr %6, align 8, !tbaa !5
  call void @_ZN3JPH24WheeledVehicleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(256) %74, float noundef %75, ptr noundef nonnull align 16 dereferenceable(1172) %76)
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #12
  %77 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %78 = load ptr, ptr %77, align 8, !tbaa !11
  %79 = call noundef ptr @_ZNK3JPH17VehicleConstraint14GetVehicleBodyEv(ptr noundef nonnull align 16 dereferenceable(408) %78)
  store ptr %79, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %8) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %9) #12
  %80 = load ptr, ptr %7, align 8, !tbaa !5
  %81 = call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %80)
  %82 = getelementptr inbounds %"class.JPH::Quat", ptr %9, i32 0, i32 0
  %83 = getelementptr inbounds %"class.JPH::Vec4", ptr %82, i32 0, i32 0
  %84 = getelementptr inbounds %union.anon.40, ptr %83, i32 0, i32 0
  %85 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 0
  %86 = extractvalue { double, double } %81, 0
  store double %86, ptr %85, align 16
  %87 = getelementptr inbounds { double, double }, ptr %84, i32 0, i32 1
  %88 = extractvalue { double, double } %81, 1
  store double %88, ptr %87, align 8
  %89 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %90 = load ptr, ptr %89, align 8, !tbaa !11
  %91 = call { double, double } @_ZNK3JPH17VehicleConstraint15GetLocalForwardEv(ptr noundef nonnull align 16 dereferenceable(408) %90)
  %92 = getelementptr inbounds %"class.JPH::Vec3", ptr %10, i32 0, i32 0
  %93 = getelementptr inbounds %union.anon, ptr %92, i32 0, i32 0
  %94 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 0
  %95 = extractvalue { double, double } %91, 0
  store double %95, ptr %94, align 16
  %96 = getelementptr inbounds { double, double }, ptr %93, i32 0, i32 1
  %97 = extractvalue { double, double } %91, 1
  store double %97, ptr %96, align 8
  %98 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 0
  %99 = load double, ptr %98, align 16
  %100 = getelementptr inbounds { double, double }, ptr %10, i32 0, i32 1
  %101 = load double, ptr %100, align 8
  %102 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %9, double %99, double %101)
  %103 = getelementptr inbounds %"class.JPH::Vec3", ptr %8, i32 0, i32 0
  %104 = getelementptr inbounds %union.anon, ptr %103, i32 0, i32 0
  %105 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 0
  %106 = extractvalue { double, double } %102, 0
  store double %106, ptr %105, align 16
  %107 = getelementptr inbounds { double, double }, ptr %104, i32 0, i32 1
  %108 = extractvalue { double, double } %102, 1
  store double %108, ptr %107, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %9) #12
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #12
  %109 = call noundef float @_ZNK3JPH20MotorcycleController12GetWheelBaseEv(ptr noundef nonnull align 16 dereferenceable(312) %74)
  store float %109, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %12) #12
  %110 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %111 = load ptr, ptr %110, align 8, !tbaa !11
  %112 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetWorldUpEv(ptr noundef nonnull align 16 dereferenceable(408) %111)
  %113 = getelementptr inbounds %"class.JPH::Vec3", ptr %12, i32 0, i32 0
  %114 = getelementptr inbounds %union.anon, ptr %113, i32 0, i32 0
  %115 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 0
  %116 = extractvalue { double, double } %112, 0
  store double %116, ptr %115, align 16
  %117 = getelementptr inbounds { double, double }, ptr %114, i32 0, i32 1
  %118 = extractvalue { double, double } %112, 1
  store double %118, ptr %117, align 8
  %119 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 1
  %120 = load i8, ptr %119, align 16, !tbaa !13, !range !31, !noundef !32
  %121 = trunc i8 %120 to i1
  br i1 %121, label %122, label %444

122:                                              ; preds = %3
  call void @llvm.lifetime.start.p0(i64 16, ptr %13) #12
  %123 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %124 = getelementptr inbounds %"class.JPH::Vec3", ptr %13, i32 0, i32 0
  %125 = getelementptr inbounds %union.anon, ptr %124, i32 0, i32 0
  %126 = getelementptr inbounds { double, double }, ptr %125, i32 0, i32 0
  %127 = extractvalue { double, double } %123, 0
  store double %127, ptr %126, align 16
  %128 = getelementptr inbounds { double, double }, ptr %125, i32 0, i32 1
  %129 = extractvalue { double, double } %123, 1
  store double %129, ptr %128, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #12
  %130 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %131 = load ptr, ptr %130, align 8, !tbaa !11
  %132 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %131)
  store ptr %132, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #12
  %133 = load ptr, ptr %14, align 8, !tbaa !5
  %134 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %133)
  store ptr %134, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #12
  %135 = load ptr, ptr %14, align 8, !tbaa !5
  %136 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %135)
  store ptr %136, ptr %16, align 8, !tbaa !5
  br label %137

137:                                              ; preds = %199, %122
  %138 = load ptr, ptr %15, align 8, !tbaa !5
  %139 = load ptr, ptr %16, align 8, !tbaa !5
  %140 = icmp ne ptr %138, %139
  br i1 %140, label %142, label %141

141:                                              ; preds = %137
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #12
  br label %202

142:                                              ; preds = %137
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #12
  %143 = load ptr, ptr %15, align 8, !tbaa !5
  %144 = load ptr, ptr %143, align 8, !tbaa !5
  store ptr %144, ptr %17, align 8, !tbaa !5
  %145 = load ptr, ptr %17, align 8, !tbaa !5
  %146 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %145)
  br i1 %146, label %147, label %198

147:                                              ; preds = %142
  call void @llvm.lifetime.start.p0(i64 16, ptr %19) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %20) #12
  %148 = load ptr, ptr %17, align 8, !tbaa !5
  %149 = call { double, double } @_ZNK3JPH5Wheel16GetContactNormalEv(ptr noundef nonnull align 16 dereferenceable(404) %148)
  %150 = getelementptr inbounds %"class.JPH::Vec3", ptr %20, i32 0, i32 0
  %151 = getelementptr inbounds %union.anon, ptr %150, i32 0, i32 0
  %152 = getelementptr inbounds { double, double }, ptr %151, i32 0, i32 0
  %153 = extractvalue { double, double } %149, 0
  store double %153, ptr %152, align 16
  %154 = getelementptr inbounds { double, double }, ptr %151, i32 0, i32 1
  %155 = extractvalue { double, double } %149, 1
  store double %155, ptr %154, align 8
  %156 = load ptr, ptr %17, align 8, !tbaa !5
  %157 = call noundef float @_ZNK3JPH5Wheel19GetSuspensionLambdaEv(ptr noundef nonnull align 16 dereferenceable(404) %156)
  %158 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %20, float noundef %157)
  %159 = getelementptr inbounds %"class.JPH::Vec3", ptr %19, i32 0, i32 0
  %160 = getelementptr inbounds %union.anon, ptr %159, i32 0, i32 0
  %161 = getelementptr inbounds { double, double }, ptr %160, i32 0, i32 0
  %162 = extractvalue { double, double } %158, 0
  store double %162, ptr %161, align 16
  %163 = getelementptr inbounds { double, double }, ptr %160, i32 0, i32 1
  %164 = extractvalue { double, double } %158, 1
  store double %164, ptr %163, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %22) #12
  %165 = load ptr, ptr %17, align 8, !tbaa !5
  %166 = call { double, double } @_ZNK3JPH5Wheel17GetContactLateralEv(ptr noundef nonnull align 16 dereferenceable(404) %165)
  %167 = getelementptr inbounds %"class.JPH::Vec3", ptr %22, i32 0, i32 0
  %168 = getelementptr inbounds %union.anon, ptr %167, i32 0, i32 0
  %169 = getelementptr inbounds { double, double }, ptr %168, i32 0, i32 0
  %170 = extractvalue { double, double } %166, 0
  store double %170, ptr %169, align 16
  %171 = getelementptr inbounds { double, double }, ptr %168, i32 0, i32 1
  %172 = extractvalue { double, double } %166, 1
  store double %172, ptr %171, align 8
  %173 = load ptr, ptr %17, align 8, !tbaa !5
  %174 = call noundef float @_ZNK3JPH5Wheel16GetLateralLambdaEv(ptr noundef nonnull align 16 dereferenceable(404) %173)
  %175 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %22, float noundef %174)
  %176 = getelementptr inbounds %"class.JPH::Vec3", ptr %21, i32 0, i32 0
  %177 = getelementptr inbounds %union.anon, ptr %176, i32 0, i32 0
  %178 = getelementptr inbounds { double, double }, ptr %177, i32 0, i32 0
  %179 = extractvalue { double, double } %175, 0
  store double %179, ptr %178, align 16
  %180 = getelementptr inbounds { double, double }, ptr %177, i32 0, i32 1
  %181 = extractvalue { double, double } %175, 1
  store double %181, ptr %180, align 8
  %182 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 0
  %183 = load double, ptr %182, align 16
  %184 = getelementptr inbounds { double, double }, ptr %21, i32 0, i32 1
  %185 = load double, ptr %184, align 8
  %186 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %19, double %183, double %185)
  %187 = getelementptr inbounds %"class.JPH::Vec3", ptr %18, i32 0, i32 0
  %188 = getelementptr inbounds %union.anon, ptr %187, i32 0, i32 0
  %189 = getelementptr inbounds { double, double }, ptr %188, i32 0, i32 0
  %190 = extractvalue { double, double } %186, 0
  store double %190, ptr %189, align 16
  %191 = getelementptr inbounds { double, double }, ptr %188, i32 0, i32 1
  %192 = extractvalue { double, double } %186, 1
  store double %192, ptr %191, align 8
  %193 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 0
  %194 = load double, ptr %193, align 16
  %195 = getelementptr inbounds { double, double }, ptr %18, i32 0, i32 1
  %196 = load double, ptr %195, align 8
  %197 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %194, double %196)
  call void @llvm.lifetime.end.p0(i64 16, ptr %22) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %20) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %19) #12
  br label %198

198:                                              ; preds = %147, %142
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #12
  br label %199

199:                                              ; preds = %198
  %200 = load ptr, ptr %15, align 8, !tbaa !5
  %201 = getelementptr inbounds ptr, ptr %200, i32 1
  store ptr %201, ptr %15, align 8, !tbaa !5
  br label %137

202:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 16, ptr %23) #12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %24, ptr align 16 %12, i64 16, i1 false), !tbaa.struct !33
  %203 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 0
  %204 = load double, ptr %203, align 16
  %205 = getelementptr inbounds { double, double }, ptr %24, i32 0, i32 1
  %206 = load double, ptr %205, align 8
  %207 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %204, double %206)
  %208 = getelementptr inbounds %"class.JPH::Vec3", ptr %23, 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
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %13, ptr align 16 %23, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %23) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %25) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %26) #12
  %214 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 9
  %215 = load float, ptr %214, align 8, !tbaa !35
  %216 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %27, ptr align 16 %216, i64 16, i1 false), !tbaa.struct !33
  %217 = getelementptr inbounds { double, double }, ptr %27, i32 0, i32 0
  %218 = load double, ptr %217, align 16
  %219 = getelementptr inbounds { double, double }, ptr %27, i32 0, i32 1
  %220 = load double, ptr %219, align 8
  %221 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %215, double %218, double %220)
  %222 = getelementptr inbounds %"class.JPH::Vec3", ptr %26, i32 0, i32 0
  %223 = getelementptr inbounds %union.anon, ptr %222, i32 0, i32 0
  %224 = getelementptr inbounds { double, double }, ptr %223, i32 0, i32 0
  %225 = extractvalue { double, double } %221, 0
  store double %225, ptr %224, align 16
  %226 = getelementptr inbounds { double, double }, ptr %223, i32 0, i32 1
  %227 = extractvalue { double, double } %221, 1
  store double %227, ptr %226, align 8
  %228 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 9
  %229 = load float, ptr %228, align 8, !tbaa !35
  %230 = fsub float 1.000000e+00, %229
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %29, ptr align 16 %13, i64 16, i1 false), !tbaa.struct !33
  %231 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 0
  %232 = load double, ptr %231, align 16
  %233 = getelementptr inbounds { double, double }, ptr %29, i32 0, i32 1
  %234 = load double, ptr %233, align 8
  %235 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %230, double %232, double %234)
  %236 = getelementptr inbounds %"class.JPH::Vec3", ptr %28, i32 0, i32 0
  %237 = getelementptr inbounds %union.anon, ptr %236, i32 0, i32 0
  %238 = getelementptr inbounds { double, double }, ptr %237, i32 0, i32 0
  %239 = extractvalue { double, double } %235, 0
  store double %239, ptr %238, align 16
  %240 = getelementptr inbounds { double, double }, ptr %237, i32 0, i32 1
  %241 = extractvalue { double, double } %235, 1
  store double %241, ptr %240, align 8
  %242 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 0
  %243 = load double, ptr %242, align 16
  %244 = getelementptr inbounds { double, double }, ptr %28, i32 0, i32 1
  %245 = load double, ptr %244, align 8
  %246 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %26, double %243, double %245)
  %247 = getelementptr inbounds %"class.JPH::Vec3", ptr %25, i32 0, i32 0
  %248 = getelementptr inbounds %union.anon, ptr %247, i32 0, i32 0
  %249 = getelementptr inbounds { double, double }, ptr %248, i32 0, i32 0
  %250 = extractvalue { double, double } %246, 0
  store double %250, ptr %249, align 16
  %251 = getelementptr inbounds { double, double }, ptr %248, i32 0, i32 1
  %252 = extractvalue { double, double } %246, 1
  store double %252, ptr %251, align 8
  %253 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %253, ptr align 16 %25, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %26) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %25) #12
  %254 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %31, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %255 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 0
  %256 = load double, ptr %255, align 16
  %257 = getelementptr inbounds { double, double }, ptr %31, i32 0, i32 1
  %258 = load double, ptr %257, align 8
  %259 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %254, double %256, double %258)
  %260 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %8, float noundef %259)
  %261 = getelementptr inbounds %"class.JPH::Vec3", ptr %30, i32 0, i32 0
  %262 = getelementptr inbounds %union.anon, ptr %261, i32 0, i32 0
  %263 = getelementptr inbounds { double, double }, ptr %262, i32 0, i32 0
  %264 = extractvalue { double, double } %260, 0
  store double %264, ptr %263, align 16
  %265 = getelementptr inbounds { double, double }, ptr %262, i32 0, i32 1
  %266 = extractvalue { double, double } %260, 1
  store double %266, ptr %265, align 8
  %267 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  %268 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 0
  %269 = load double, ptr %268, align 16
  %270 = getelementptr inbounds { double, double }, ptr %30, i32 0, i32 1
  %271 = load double, ptr %270, align 8
  %272 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %267, double %269, double %271)
  call void @llvm.lifetime.start.p0(i64 16, ptr %32) #12
  %273 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %33, ptr align 16 %12, i64 16, i1 false), !tbaa.struct !33
  %274 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 0
  %275 = load double, ptr %274, align 16
  %276 = getelementptr inbounds { double, double }, ptr %33, i32 0, i32 1
  %277 = load double, ptr %276, align 8
  %278 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %273, double %275, double %277)
  %279 = getelementptr inbounds %"class.JPH::Vec3", ptr %32, i32 0, i32 0
  %280 = getelementptr inbounds %union.anon, ptr %279, i32 0, i32 0
  %281 = getelementptr inbounds { double, double }, ptr %280, i32 0, i32 0
  %282 = extractvalue { double, double } %278, 0
  store double %282, ptr %281, align 16
  %283 = getelementptr inbounds { double, double }, ptr %280, i32 0, i32 1
  %284 = extractvalue { double, double } %278, 1
  store double %284, ptr %283, align 8
  %285 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %285, ptr align 16 %32, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %32) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %34) #12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %36, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %286 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 0
  %287 = load double, ptr %286, align 16
  %288 = getelementptr inbounds { double, double }, ptr %36, i32 0, i32 1
  %289 = load double, ptr %288, align 8
  %290 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %287, double %289)
  %291 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %8, float noundef %290)
  %292 = getelementptr inbounds %"class.JPH::Vec3", ptr %35, i32 0, i32 0
  %293 = getelementptr inbounds %union.anon, ptr %292, i32 0, i32 0
  %294 = getelementptr inbounds { double, double }, ptr %293, i32 0, i32 0
  %295 = extractvalue { double, double } %291, 0
  store double %295, ptr %294, align 16
  %296 = getelementptr inbounds { double, double }, ptr %293, i32 0, i32 1
  %297 = extractvalue { double, double } %291, 1
  store double %297, ptr %296, align 8
  %298 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 0
  %299 = load double, ptr %298, align 16
  %300 = getelementptr inbounds { double, double }, ptr %35, i32 0, i32 1
  %301 = load double, ptr %300, align 8
  %302 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %299, double %301)
  %303 = getelementptr inbounds %"class.JPH::Vec3", ptr %34, i32 0, i32 0
  %304 = getelementptr inbounds %union.anon, ptr %303, i32 0, i32 0
  %305 = getelementptr inbounds { double, double }, ptr %304, i32 0, i32 0
  %306 = extractvalue { double, double } %302, 0
  store double %306, ptr %305, align 16
  %307 = getelementptr inbounds { double, double }, ptr %304, i32 0, i32 1
  %308 = extractvalue { double, double } %302, 1
  store double %308, ptr %307, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr %37) #12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %38, ptr align 16 %12, i64 16, i1 false), !tbaa.struct !33
  %309 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 0
  %310 = load double, ptr %309, align 16
  %311 = getelementptr inbounds { double, double }, ptr %38, i32 0, i32 1
  %312 = load double, ptr %311, align 8
  %313 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %34, double %310, double %312)
  %314 = getelementptr inbounds %"class.JPH::Vec3", ptr %37, i32 0, i32 0
  %315 = getelementptr inbounds %union.anon, ptr %314, i32 0, i32 0
  %316 = getelementptr inbounds { double, double }, ptr %315, i32 0, i32 0
  %317 = extractvalue { double, double } %313, 0
  store double %317, ptr %316, align 16
  %318 = getelementptr inbounds { double, double }, ptr %315, i32 0, i32 1
  %319 = extractvalue { double, double } %313, 1
  store double %319, ptr %318, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %34, ptr align 16 %37, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %37) #12
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #12
  %320 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %41, ptr align 16 %34, i64 16, i1 false), !tbaa.struct !33
  %321 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 0
  %322 = load double, ptr %321, align 16
  %323 = getelementptr inbounds { double, double }, ptr %41, i32 0, i32 1
  %324 = load double, ptr %323, align 8
  %325 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %320, double %322, double %324)
  %326 = getelementptr inbounds %"class.JPH::Vec3", ptr %40, i32 0, i32 0
  %327 = getelementptr inbounds %union.anon, ptr %326, i32 0, i32 0
  %328 = getelementptr inbounds { double, double }, ptr %327, i32 0, i32 0
  %329 = extractvalue { double, double } %325, 0
  store double %329, ptr %328, align 16
  %330 = getelementptr inbounds { double, double }, ptr %327, i32 0, i32 1
  %331 = extractvalue { double, double } %325, 1
  store double %331, ptr %330, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %42, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %332 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 0
  %333 = load double, ptr %332, align 16
  %334 = getelementptr inbounds { double, double }, ptr %42, i32 0, i32 1
  %335 = load double, ptr %334, align 8
  %336 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %40, double %333, double %335)
  %337 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %336)
  %338 = fneg float %337
  %339 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %43, ptr align 16 %34, i64 16, i1 false), !tbaa.struct !33
  %340 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 0
  %341 = load double, ptr %340, align 16
  %342 = getelementptr inbounds { double, double }, ptr %43, i32 0, i32 1
  %343 = load double, ptr %342, align 8
  %344 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %339, double %341, double %343)
  %345 = call noundef float @_ZN3JPH4ACosEf(float noundef %344)
  %346 = fmul float %338, %345
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #12
  store float %346, ptr %39, align 4, !tbaa !9
  %347 = load float, ptr %39, align 4, !tbaa !9
  %348 = call noundef float @_ZSt3absf(float noundef %347)
  %349 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 4
  %350 = load float, ptr %349, align 4, !tbaa !36
  %351 = fcmp ogt float %348, %350
  br i1 %351, label %352, label %382

352:                                              ; preds = %202
  call void @llvm.lifetime.start.p0(i64 16, ptr %44) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %45) #12
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %46, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %353 = load float, ptr %39, align 4, !tbaa !9
  %354 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %353)
  %355 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 4
  %356 = load float, ptr %355, align 4, !tbaa !36
  %357 = fmul float %354, %356
  %358 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 0
  %359 = load double, ptr %358, align 16
  %360 = getelementptr inbounds { double, double }, ptr %46, i32 0, i32 1
  %361 = load double, ptr %360, align 8
  %362 = call { double, double } @_ZN3JPH4Quat9sRotationENS_4Vec3Ef(double %359, double %361, float noundef %357)
  %363 = getelementptr inbounds %"class.JPH::Quat", ptr %45, i32 0, i32 0
  %364 = getelementptr inbounds %"class.JPH::Vec4", ptr %363, i32 0, i32 0
  %365 = getelementptr inbounds %union.anon.40, ptr %364, i32 0, i32 0
  %366 = getelementptr inbounds { double, double }, ptr %365, i32 0, i32 0
  %367 = extractvalue { double, double } %362, 0
  store double %367, ptr %366, align 16
  %368 = getelementptr inbounds { double, double }, ptr %365, i32 0, i32 1
  %369 = extractvalue { double, double } %362, 1
  store double %369, ptr %368, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %47, ptr align 16 %34, i64 16, i1 false), !tbaa.struct !33
  %370 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 0
  %371 = load double, ptr %370, align 16
  %372 = getelementptr inbounds { double, double }, ptr %47, i32 0, i32 1
  %373 = load double, ptr %372, align 8
  %374 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %45, double %371, double %373)
  %375 = getelementptr inbounds %"class.JPH::Vec3", ptr %44, i32 0, i32 0
  %376 = getelementptr inbounds %union.anon, ptr %375, i32 0, i32 0
  %377 = getelementptr inbounds { double, double }, ptr %376, i32 0, i32 0
  %378 = extractvalue { double, double } %374, 0
  store double %378, ptr %377, align 16
  %379 = getelementptr inbounds { double, double }, ptr %376, i32 0, i32 1
  %380 = extractvalue { double, double } %374, 1
  store double %380, ptr %379, align 8
  %381 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %381, ptr align 16 %44, i64 16, i1 false), !tbaa.struct !33
  call void @llvm.lifetime.end.p0(i64 16, ptr %45) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %44) #12
  br label %382

382:                                              ; preds = %352, %202
  call void @llvm.lifetime.start.p0(i64 16, ptr %48) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %49) #12
  %383 = load ptr, ptr %7, align 8, !tbaa !5
  %384 = call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %383)
  %385 = getelementptr inbounds %"class.JPH::Quat", ptr %49, i32 0, i32 0
  %386 = getelementptr inbounds %"class.JPH::Vec4", ptr %385, i32 0, i32 0
  %387 = getelementptr inbounds %union.anon.40, ptr %386, i32 0, i32 0
  %388 = getelementptr inbounds { double, double }, ptr %387, i32 0, i32 0
  %389 = extractvalue { double, double } %384, 0
  store double %389, ptr %388, align 16
  %390 = getelementptr inbounds { double, double }, ptr %387, i32 0, i32 1
  %391 = extractvalue { double, double } %384, 1
  store double %391, ptr %390, align 8
  %392 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %393 = load ptr, ptr %392, align 8, !tbaa !11
  %394 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetLocalUpEv(ptr noundef nonnull align 16 dereferenceable(408) %393)
  %395 = getelementptr inbounds %"class.JPH::Vec3", ptr %50, i32 0, i32 0
  %396 = getelementptr inbounds %union.anon, ptr %395, i32 0, i32 0
  %397 = getelementptr inbounds { double, double }, ptr %396, i32 0, i32 0
  %398 = extractvalue { double, double } %394, 0
  store double %398, ptr %397, align 16
  %399 = getelementptr inbounds { double, double }, ptr %396, i32 0, i32 1
  %400 = extractvalue { double, double } %394, 1
  store double %400, ptr %399, align 8
  %401 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 0
  %402 = load double, ptr %401, align 16
  %403 = getelementptr inbounds { double, double }, ptr %50, i32 0, i32 1
  %404 = load double, ptr %403, align 8
  %405 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %49, double %402, double %404)
  %406 = getelementptr inbounds %"class.JPH::Vec3", ptr %48, i32 0, i32 0
  %407 = getelementptr inbounds %union.anon, ptr %406, i32 0, i32 0
  %408 = getelementptr inbounds { double, double }, ptr %407, i32 0, i32 0
  %409 = extractvalue { double, double } %405, 0
  store double %409, ptr %408, align 16
  %410 = getelementptr inbounds { double, double }, ptr %407, i32 0, i32 1
  %411 = extractvalue { double, double } %405, 1
  store double %411, ptr %410, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr %49) #12
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %52) #12
  %412 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %53, ptr align 16 %48, i64 16, i1 false), !tbaa.struct !33
  %413 = getelementptr inbounds { double, double }, ptr %53, i32 0, i32 0
  %414 = load double, ptr %413, align 16
  %415 = getelementptr inbounds { double, double }, ptr %53, i32 0, i32 1
  %416 = load double, ptr %415, align 8
  %417 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %412, double %414, double %416)
  %418 = getelementptr inbounds %"class.JPH::Vec3", ptr %52, i32 0, i32 0
  %419 = getelementptr inbounds %union.anon, ptr %418, i32 0, i32 0
  %420 = getelementptr inbounds { double, double }, ptr %419, i32 0, i32 0
  %421 = extractvalue { double, double } %417, 0
  store double %421, ptr %420, align 16
  %422 = getelementptr inbounds { double, double }, ptr %419, i32 0, i32 1
  %423 = extractvalue { double, double } %417, 1
  store double %423, ptr %422, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %54, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %424 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 0
  %425 = load double, ptr %424, align 16
  %426 = getelementptr inbounds { double, double }, ptr %54, i32 0, i32 1
  %427 = load double, ptr %426, align 8
  %428 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %52, double %425, double %427)
  %429 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %428)
  %430 = fneg float %429
  %431 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %55, ptr align 16 %48, i64 16, i1 false), !tbaa.struct !33
  %432 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 0
  %433 = load double, ptr %432, align 16
  %434 = getelementptr inbounds { double, double }, ptr %55, i32 0, i32 1
  %435 = load double, ptr %434, align 8
  %436 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %431, double %433, double %435)
  %437 = call noundef float @_ZN3JPH4ACosEf(float noundef %436)
  %438 = fmul float %430, %437
  call void @llvm.lifetime.end.p0(i64 16, ptr %52) #12
  store float %438, ptr %51, align 4, !tbaa !9
  %439 = load float, ptr %51, align 4, !tbaa !9
  %440 = load float, ptr %5, align 4, !tbaa !9
  %441 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 12
  %442 = load float, ptr %441, align 16, !tbaa !37
  %443 = call float @llvm.fmuladd.f32(float %439, float %440, float %442)
  store float %443, ptr %441, align 16, !tbaa !37
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %48) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %34) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %13) #12
  br label %447

444:                                              ; preds = %3
  %445 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %445, ptr align 16 %12, i64 16, i1 false), !tbaa.struct !33
  %446 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 12
  store float 0.000000e+00, ptr %446, align 16, !tbaa !37
  br label %447

447:                                              ; preds = %444, %382
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #12
  %448 = load float, ptr %11, align 4, !tbaa !9
  %449 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 4
  %450 = load float, ptr %449, align 4, !tbaa !36
  %451 = call noundef float @_ZN3JPH3TanEf(float noundef %450)
  %452 = fmul float %448, %451
  call void @llvm.lifetime.start.p0(i64 16, ptr %57) #12
  %453 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %454 = load ptr, ptr %453, align 8, !tbaa !11
  %455 = call noundef zeroext i1 @_ZNK3JPH17VehicleConstraint19IsGravityOverriddenEv(ptr noundef nonnull align 16 dereferenceable(408) %454)
  br i1 %455, label %456, label %466

456:                                              ; preds = %447
  %457 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %458 = load ptr, ptr %457, align 8, !tbaa !11
  %459 = call { double, double } @_ZNK3JPH17VehicleConstraint18GetGravityOverrideEv(ptr noundef nonnull align 16 dereferenceable(408) %458)
  %460 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %461 = getelementptr inbounds %union.anon, ptr %460, i32 0, i32 0
  %462 = getelementptr inbounds { double, double }, ptr %461, i32 0, i32 0
  %463 = extractvalue { double, double } %459, 0
  store double %463, ptr %462, align 16
  %464 = getelementptr inbounds { double, double }, ptr %461, i32 0, i32 1
  %465 = extractvalue { double, double } %459, 1
  store double %465, ptr %464, align 8
  br label %475

466:                                              ; preds = %447
  %467 = load ptr, ptr %6, align 8, !tbaa !5
  %468 = call { double, double } @_ZNK3JPH13PhysicsSystem10GetGravityEv(ptr noundef nonnull align 16 dereferenceable(1172) %467)
  %469 = getelementptr inbounds %"class.JPH::Vec3", ptr %57, i32 0, i32 0
  %470 = getelementptr inbounds %union.anon, ptr %469, i32 0, i32 0
  %471 = getelementptr inbounds { double, double }, ptr %470, i32 0, i32 0
  %472 = extractvalue { double, double } %468, 0
  store double %472, ptr %471, align 16
  %473 = getelementptr inbounds { double, double }, ptr %470, i32 0, i32 1
  %474 = extractvalue { double, double } %468, 1
  store double %474, ptr %473, align 8
  br label %475

475:                                              ; preds = %466, %456
  %476 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %57)
  %477 = fmul float %452, %476
  call void @llvm.lifetime.end.p0(i64 16, ptr %57) #12
  store float %477, ptr %56, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #12
  %478 = load ptr, ptr %7, align 8, !tbaa !5
  %479 = call { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %478)
  %480 = getelementptr inbounds %"class.JPH::Vec3", ptr %59, i32 0, i32 0
  %481 = getelementptr inbounds %union.anon, ptr %480, i32 0, i32 0
  %482 = getelementptr inbounds { double, double }, ptr %481, i32 0, i32 0
  %483 = extractvalue { double, double } %479, 0
  store double %483, ptr %482, align 16
  %484 = getelementptr inbounds { double, double }, ptr %481, i32 0, i32 1
  %485 = extractvalue { double, double } %479, 1
  store double %485, ptr %484, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %60, ptr align 16 %8, i64 16, i1 false), !tbaa.struct !33
  %486 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 0
  %487 = load double, ptr %486, align 16
  %488 = getelementptr inbounds { double, double }, ptr %60, i32 0, i32 1
  %489 = load double, ptr %488, align 8
  %490 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %59, double %487, double %489)
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #12
  store float %490, ptr %58, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #12
  %491 = load float, ptr %58, align 4, !tbaa !9
  %492 = call noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %491)
  store float %492, ptr %61, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #12
  %493 = getelementptr inbounds %"class.JPH::WheeledVehicleController", ptr %74, i32 0, i32 2
  %494 = load float, ptr %493, align 4, !tbaa !38
  %495 = call noundef float @_ZSt3absf(float noundef %494)
  store float %495, ptr %62, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #12
  %496 = getelementptr inbounds %"class.JPH::WheeledVehicleController", ptr %74, i32 0, i32 2
  %497 = load float, ptr %496, align 4, !tbaa !38
  %498 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %497)
  %499 = fneg float %498
  store float %499, ptr %63, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #12
  %500 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %501 = load ptr, ptr %500, align 8, !tbaa !11
  %502 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %501)
  store ptr %502, ptr %64, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #12
  %503 = load ptr, ptr %64, align 8, !tbaa !5
  %504 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %503)
  store ptr %504, ptr %65, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #12
  %505 = load ptr, ptr %64, align 8, !tbaa !5
  %506 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %505)
  store ptr %506, ptr %66, align 8, !tbaa !5
  br label %507

507:                                              ; preds = %569, %475
  %508 = load ptr, ptr %65, align 8, !tbaa !5
  %509 = load ptr, ptr %66, align 8, !tbaa !5
  %510 = icmp ne ptr %508, %509
  br i1 %510, label %512, label %511

511:                                              ; preds = %507
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #12
  br label %572

512:                                              ; preds = %507
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #12
  %513 = load ptr, ptr %65, align 8, !tbaa !5
  %514 = load ptr, ptr %513, align 8, !tbaa !5
  store ptr %514, ptr %67, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #12
  %515 = load ptr, ptr %67, align 8, !tbaa !5
  store ptr %515, ptr %68, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #12
  %516 = load ptr, ptr %68, align 8, !tbaa !5
  %517 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %516)
  store ptr %517, ptr %69, align 8, !tbaa !5
  %518 = load ptr, ptr %69, align 8, !tbaa !5
  %519 = getelementptr inbounds %"class.JPH::WheelSettingsWV", ptr %518, i32 0, i32 3
  %520 = load float, ptr %519, align 4, !tbaa !39
  %521 = fcmp une float %520, 0.000000e+00
  br i1 %521, label %522, label %568

522:                                              ; preds = %512
  call void @llvm.lifetime.start.p0(i64 4, ptr %70) #12
  %523 = load ptr, ptr %69, align 8, !tbaa !5
  %524 = getelementptr inbounds %"class.JPH::WheelSettings", ptr %523, i32 0, i32 6
  %525 = getelementptr inbounds %"class.JPH::VehicleController", ptr %74, i32 0, i32 1
  %526 = load ptr, ptr %525, align 8, !tbaa !11
  %527 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetLocalUpEv(ptr noundef nonnull align 16 dereferenceable(408) %526)
  %528 = getelementptr inbounds %"class.JPH::Vec3", ptr %71, i32 0, i32 0
  %529 = getelementptr inbounds %union.anon, ptr %528, i32 0, i32 0
  %530 = getelementptr inbounds { double, double }, ptr %529, i32 0, i32 0
  %531 = extractvalue { double, double } %527, 0
  store double %531, ptr %530, align 16
  %532 = getelementptr inbounds { double, double }, ptr %529, i32 0, i32 1
  %533 = extractvalue { double, double } %527, 1
  store double %533, ptr %532, align 8
  %534 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 0
  %535 = load double, ptr %534, align 16
  %536 = getelementptr inbounds { double, double }, ptr %71, i32 0, i32 1
  %537 = load double, ptr %536, align 8
  %538 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %524, double %535, double %537)
  store float %538, ptr %70, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %72) #12
  %539 = load float, ptr %62, align 4, !tbaa !9
  %540 = load ptr, ptr %68, align 8, !tbaa !5
  %541 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %540)
  %542 = getelementptr inbounds %"class.JPH::WheelSettingsWV", ptr %541, i32 0, i32 3
  %543 = load float, ptr %542, align 4, !tbaa !39
  %544 = fmul float %539, %543
  store float %544, ptr %72, align 4, !tbaa !9
  %545 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 2
  %546 = load i8, ptr %545, align 1, !tbaa !48, !range !31, !noundef !32
  %547 = trunc i8 %546 to i1
  br i1 %547, label %548, label %563

548:                                              ; preds = %522
  %549 = load float, ptr %61, align 4, !tbaa !9
  %550 = fcmp ogt float %549, 0x3EB0C6F7A0000000
  br i1 %550, label %551, label %563

551:                                              ; preds = %548
  %552 = load float, ptr %70, align 4, !tbaa !9
  %553 = fcmp ogt float %552, 0x3EB0C6F7A0000000
  br i1 %553, label %554, label %563

554:                                              ; preds = %551
  call void @llvm.lifetime.start.p0(i64 4, ptr %73) #12
  %555 = load float, ptr %56, align 4, !tbaa !9
  %556 = load float, ptr %61, align 4, !tbaa !9
  %557 = load float, ptr %70, align 4, !tbaa !9
  %558 = fmul float %556, %557
  %559 = fdiv float %555, %558
  %560 = call noundef float @_ZN3JPH4ASinEf(float noundef %559)
  store float %560, ptr %73, align 4, !tbaa !9
  %561 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %72, ptr noundef nonnull align 4 dereferenceable(4) %73)
  %562 = load float, ptr %561, align 4, !tbaa !9
  store float %562, ptr %72, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %73) #12
  br label %563

563:                                              ; preds = %554, %551, %548, %522
  %564 = load ptr, ptr %68, align 8, !tbaa !5
  %565 = load float, ptr %63, align 4, !tbaa !9
  %566 = load float, ptr %72, align 4, !tbaa !9
  %567 = fmul float %565, %566
  call void @_ZN3JPH5Wheel13SetSteerAngleEf(ptr noundef nonnull align 16 dereferenceable(404) %564, float noundef %567)
  call void @llvm.lifetime.end.p0(i64 4, ptr %72) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %70) #12
  br label %568

568:                                              ; preds = %563, %512
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #12
  br label %569

569:                                              ; preds = %568
  %570 = load ptr, ptr %65, align 8, !tbaa !5
  %571 = getelementptr inbounds ptr, ptr %570, i32 1
  store ptr %571, ptr %65, align 8, !tbaa !5
  br label %507

572:                                              ; preds = %511
  %573 = getelementptr inbounds %"class.JPH::MotorcycleController", ptr %74, i32 0, i32 13
  store float 0.000000e+00, ptr %573, align 4, !tbaa !49
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %12) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr %8) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #12
  ret void
}

declare void @_ZN3JPH24WheeledVehicleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(256), float noundef, ptr noundef nonnull align 16 dereferenceable(1172)) unnamed_addr #7

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH17VehicleConstraint14GetVehicleBodyEv(ptr noundef nonnull align 16 dereferenceable(408)) #3 align 2

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

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404)) #8 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH5Wheel19GetSuspensionLambdaEv(ptr noundef nonnull align 16 dereferenceable(404)) #2 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH5Wheel16GetLateralLambdaEv(ptr noundef nonnull align 16 dereferenceable(404)) #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #10 align 2

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) #1 align 2

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

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH4ACosEf(float noundef) #9

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

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

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3TanEf(float noundef) #9

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH17VehicleConstraint19IsGravityOverriddenEv(ptr noundef nonnull align 16 dereferenceable(408)) #3 align 2

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

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

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

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

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424)) #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH4ASinEf(float noundef) #9

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5Wheel13SetSteerAngleEf(ptr noundef nonnull align 16 dereferenceable(404), float noundef) #3 align 2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { 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 #3 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { inlinehint 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 #9 = { 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 #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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !6, i64 8}
!12 = !{!"_ZTSN3JPH17VehicleControllerE", !6, i64 8}
!13 = !{!14, !29, i64 256}
!14 = !{!"_ZTSN3JPH20MotorcycleControllerE", !15, i64 0, !29, i64 256, !29, i64 257, !10, i64 260, !10, i64 264, !10, i64 268, !10, i64 272, !10, i64 276, !10, i64 280, !30, i64 288, !10, i64 304, !10, i64 308}
!15 = !{!"_ZTSN3JPH24WheeledVehicleControllerE", !12, i64 0, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !16, i64 32, !21, i64 88, !26, i64 192, !10, i64 216, !10, i64 220, !27, i64 224}
!16 = !{!"_ZTSN3JPH13VehicleEngineE", !17, i64 0, !10, i64 48}
!17 = !{!"_ZTSN3JPH21VehicleEngineSettingsE", !10, i64 0, !10, i64 4, !10, i64 8, !18, i64 16, !10, i64 40, !10, i64 44}
!18 = !{!"_ZTSN3JPH11LinearCurveE", !19, i64 0}
!19 = !{!"_ZTSN3JPH5ArrayINS_11LinearCurve5PointENS_12STLAllocatorIS2_EEEE", !20, i64 0, !20, i64 8, !6, i64 16}
!20 = !{!"long", !7, i64 0}
!21 = !{!"_ZTSN3JPH19VehicleTransmissionE", !22, i64 0, !25, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96}
!22 = !{!"_ZTSN3JPH27VehicleTransmissionSettingsE", !23, i64 0, !24, i64 8, !24, i64 32, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76}
!23 = !{!"_ZTSN3JPH17ETransmissionModeE", !7, i64 0}
!24 = !{!"_ZTSN3JPH5ArrayIfNS_12STLAllocatorIfEEEE", !20, i64 0, !20, i64 8, !6, i64 16}
!25 = !{!"int", !7, i64 0}
!26 = !{!"_ZTSN3JPH5ArrayINS_27VehicleDifferentialSettingsENS_12STLAllocatorIS1_EEEE", !20, i64 0, !20, i64 8, !6, i64 16}
!27 = !{!"_ZTSSt8functionIFvjRfS0_ffffffEE", !28, i64 0, !6, i64 24}
!28 = !{!"_ZTSSt14_Function_base", !7, i64 0, !6, i64 16}
!29 = !{!"bool", !7, i64 0}
!30 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!31 = !{i8 0, i8 2}
!32 = !{}
!33 = !{i64 0, i64 16, !34}
!34 = !{!7, !7, i64 0}
!35 = !{!14, !10, i64 280}
!36 = !{!14, !10, i64 260}
!37 = !{!14, !10, i64 304}
!38 = !{!15, !10, i64 20}
!39 = !{!40, !10, i64 156}
!40 = !{!"_ZTSN3JPH15WheelSettingsWVE", !41, i64 0, !10, i64 148, !10, i64 152, !10, i64 156, !18, i64 160, !18, i64 184, !10, i64 208, !10, i64 212}
!41 = !{!"_ZTSN3JPH13WheelSettingsE", !42, i64 0, !43, i64 8, !30, i64 16, !30, i64 32, !30, i64 48, !30, i64 64, !30, i64 80, !30, i64 96, !10, i64 112, !10, i64 116, !10, i64 120, !46, i64 124, !10, i64 136, !10, i64 140, !29, i64 144}
!42 = !{!"_ZTSN3JPH18SerializableObjectE"}
!43 = !{!"_ZTSN3JPH9RefTargetINS_13WheelSettingsEEE", !44, i64 0}
!44 = !{!"_ZTSSt6atomicIjE", !45, i64 0}
!45 = !{!"_ZTSSt13__atomic_baseIjE", !25, i64 0}
!46 = !{!"_ZTSN3JPH14SpringSettingsE", !47, i64 0, !7, i64 4, !10, i64 8}
!47 = !{!"_ZTSN3JPH11ESpringModeE", !7, i64 0}
!48 = !{!14, !29, i64 257}
!49 = !{!14, !10, i64 308}


; 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::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::Quat" = type { %"class.JPH::Vec4" }
%"class.JPH::Vec4" = type { %union.anon.40 }
%union.anon.40 = type { <4 x float> }

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local { double, double } @_ZN3JPH4Vec35sZeroEv() local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH20MotorcycleController12GetWheelBaseEv(ptr noundef nonnull align 16 dereferenceable(312)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408)) local_unnamed_addr #3 align 2

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

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

; Function Attrs: mustprogress 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) #5

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH20MotorcycleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 16 dereferenceable(312) %0, float noundef %1, ptr noundef nonnull align 16 dereferenceable(1172) %2) unnamed_addr #2 align 2 {
  %4 = alloca %"class.JPH::Vec3", align 16
  %5 = alloca %"class.JPH::Quat", align 16
  %6 = alloca %"class.JPH::Vec3", align 16
  %7 = alloca %"class.JPH::Vec3", align 16
  %8 = alloca %"class.JPH::Vec3", align 16
  %9 = alloca %"class.JPH::Vec3", align 16
  %10 = alloca %"class.JPH::Vec3", align 16
  %11 = alloca %"class.JPH::Vec3", align 16
  %12 = alloca %"class.JPH::Vec3", align 16
  %13 = alloca %"class.JPH::Vec3", align 16
  %14 = alloca %"class.JPH::Quat", align 16
  %15 = alloca %"class.JPH::Quat", align 16
  %16 = alloca %"class.JPH::Vec3", align 16
  %17 = alloca %"class.JPH::Vec3", align 16
  %18 = alloca %"class.JPH::Vec3", align 16
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  tail call void @_ZN3JPH24WheeledVehicleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(256) %0, float noundef %1, ptr noundef nonnull align 16 dereferenceable(1172) %2)
  %21 = getelementptr inbounds i8, ptr %0, i64 8
  %22 = load ptr, ptr %21, align 8, !tbaa !5
  %23 = tail call noundef ptr @_ZNK3JPH17VehicleConstraint14GetVehicleBodyEv(ptr noundef nonnull align 16 dereferenceable(408) %22)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %4) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %5) #12
  %24 = tail call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %23)
  %25 = extractvalue { double, double } %24, 0
  store double %25, ptr %5, align 16
  %26 = getelementptr inbounds i8, ptr %5, i64 8
  %27 = extractvalue { double, double } %24, 1
  store double %27, ptr %26, align 8
  %28 = load ptr, ptr %21, align 8, !tbaa !5
  %29 = tail call { double, double } @_ZNK3JPH17VehicleConstraint15GetLocalForwardEv(ptr noundef nonnull align 16 dereferenceable(408) %28)
  %30 = extractvalue { double, double } %29, 0
  %31 = extractvalue { double, double } %29, 1
  %32 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %5, double %30, double %31)
  %33 = extractvalue { double, double } %32, 0
  store double %33, ptr %4, align 16
  %34 = getelementptr inbounds i8, ptr %4, i64 8
  %35 = extractvalue { double, double } %32, 1
  store double %35, ptr %34, align 8
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %5) #12
  %36 = call noundef float @_ZNK3JPH20MotorcycleController12GetWheelBaseEv(ptr noundef nonnull align 16 dereferenceable(312) %0)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %6) #12
  %37 = load ptr, ptr %21, align 8, !tbaa !5
  %38 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetWorldUpEv(ptr noundef nonnull align 16 dereferenceable(408) %37)
  %39 = extractvalue { double, double } %38, 0
  store double %39, ptr %6, align 16
  %40 = getelementptr inbounds i8, ptr %6, i64 8
  %41 = extractvalue { double, double } %38, 1
  store double %41, ptr %40, align 8
  %42 = getelementptr inbounds i8, ptr %0, i64 256
  %43 = load i8, ptr %42, align 16, !tbaa !10, !range !29, !noundef !30
  %44 = trunc nuw i8 %43 to i1
  br i1 %44, label %45, label %168

45:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #12
  %46 = call { double, double } @_ZN3JPH4Vec35sZeroEv()
  %47 = extractvalue { double, double } %46, 0
  store double %47, ptr %7, align 16
  %48 = getelementptr inbounds i8, ptr %7, i64 8
  %49 = extractvalue { double, double } %46, 1
  store double %49, ptr %48, align 8
  %50 = load ptr, ptr %21, align 8, !tbaa !5
  %51 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %50)
  %52 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %51)
  %53 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %51)
  %.not106 = icmp eq ptr %52, %53
  br i1 %.not106, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %45
  %54 = getelementptr inbounds i8, ptr %9, i64 8
  %55 = getelementptr inbounds i8, ptr %8, i64 8
  %56 = getelementptr inbounds i8, ptr %10, i64 8
  br label %108

._crit_edge:                                      ; preds = %130, %45
  %57 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %7, double %39, double %41)
  %58 = extractvalue { double, double } %57, 0
  %59 = extractvalue { double, double } %57, 1
  store double %58, ptr %7, align 16
  store double %59, ptr %48, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %11) #12
  %60 = getelementptr inbounds i8, ptr %0, i64 280
  %61 = load float, ptr %60, align 8, !tbaa !32
  %62 = getelementptr inbounds i8, ptr %0, i64 288
  %.sroa.068.0.copyload = load double, ptr %62, align 16
  %.sroa.269.0..sroa_idx = getelementptr inbounds i8, ptr %0, i64 296
  %.sroa.269.0.copyload = load double, ptr %.sroa.269.0..sroa_idx, align 8, !tbaa !31
  %63 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %61, double %.sroa.068.0.copyload, double %.sroa.269.0.copyload)
  %64 = extractvalue { double, double } %63, 0
  store double %64, ptr %11, align 16
  %65 = getelementptr inbounds i8, ptr %11, i64 8
  %66 = extractvalue { double, double } %63, 1
  store double %66, ptr %65, align 8
  %67 = load float, ptr %60, align 8, !tbaa !32
  %68 = fsub float 1.000000e+00, %67
  %.sroa.064.0.copyload = load double, ptr %7, align 16
  %.sroa.265.0.copyload = load double, ptr %48, align 8, !tbaa !31
  %69 = call { double, double } @_ZN3JPHmlEfNS_4Vec3E(float noundef %68, double %.sroa.064.0.copyload, double %.sroa.265.0.copyload)
  %70 = extractvalue { double, double } %69, 0
  %71 = extractvalue { double, double } %69, 1
  %72 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %11, double %70, double %71)
  %73 = extractvalue { double, double } %72, 0
  %74 = extractvalue { double, double } %72, 1
  store double %73, ptr %62, align 16
  store double %74, ptr %.sroa.269.0..sroa_idx, align 8, !tbaa !31
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %11) #12
  %75 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %33, double %35)
  %76 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %4, float noundef %75)
  %77 = extractvalue { double, double } %76, 0
  %78 = extractvalue { double, double } %76, 1
  %79 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3mIES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %77, double %78)
  %80 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %39, double %41)
  %81 = extractvalue { double, double } %80, 0
  %82 = extractvalue { double, double } %80, 1
  store double %81, ptr %62, align 16
  store double %82, ptr %.sroa.269.0..sroa_idx, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %12) #12
  %.sroa.052.0.copyload = load double, ptr %4, align 16
  %.sroa.253.0.copyload = load double, ptr %34, align 8, !tbaa !31
  %83 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %.sroa.052.0.copyload, double %.sroa.253.0.copyload)
  %84 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %4, float noundef %83)
  %85 = extractvalue { double, double } %84, 0
  %86 = extractvalue { double, double } %84, 1
  %87 = call { double, double } @_ZNK3JPH4Vec3miES0_(ptr noundef nonnull align 16 dereferenceable(16) %6, double %85, double %86)
  %88 = extractvalue { double, double } %87, 0
  store double %88, ptr %12, align 16
  %89 = getelementptr inbounds i8, ptr %12, i64 8
  %90 = extractvalue { double, double } %87, 1
  store double %90, ptr %89, align 8
  %.sroa.048.0.copyload = load double, ptr %6, align 16
  %.sroa.249.0.copyload = load double, ptr %40, align 8, !tbaa !31
  %91 = call { double, double } @_ZNK3JPH4Vec312NormalizedOrES0_(ptr noundef nonnull align 16 dereferenceable(16) %12, double %.sroa.048.0.copyload, double %.sroa.249.0.copyload)
  %92 = extractvalue { double, double } %91, 0
  %93 = extractvalue { double, double } %91, 1
  store double %92, ptr %12, align 16
  store double %93, ptr %89, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #12
  %94 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %92, double %93)
  %95 = extractvalue { double, double } %94, 0
  store double %95, ptr %13, align 16
  %96 = getelementptr inbounds i8, ptr %13, i64 8
  %97 = extractvalue { double, double } %94, 1
  store double %97, ptr %96, align 8
  %.sroa.042.0.copyload = load double, ptr %4, align 16
  %.sroa.243.0.copyload = load double, ptr %34, align 8, !tbaa !31
  %98 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %13, double %.sroa.042.0.copyload, double %.sroa.243.0.copyload)
  %99 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %98)
  %100 = fneg float %99
  %.sroa.040.0.copyload = load double, ptr %12, align 16
  %.sroa.241.0.copyload = load double, ptr %89, align 8, !tbaa !31
  %101 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %.sroa.040.0.copyload, double %.sroa.241.0.copyload)
  %102 = call noundef float @_ZN3JPH4ACosEf(float noundef %101)
  %103 = fmul float %102, %100
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #12
  %104 = call noundef float @_ZSt3absf(float noundef %103)
  %105 = getelementptr inbounds i8, ptr %0, i64 260
  %106 = load float, ptr %105, align 4, !tbaa !33
  %107 = fcmp ogt float %104, %106
  br i1 %107, label %132, label %143

108:                                              ; preds = %.lr.ph, %130
  %.0107 = phi ptr [ %52, %.lr.ph ], [ %131, %130 ]
  %109 = load ptr, ptr %.0107, align 8, !tbaa !34
  %110 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %109)
  br i1 %110, label %111, label %130

111:                                              ; preds = %108
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %8) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %9) #12
  %112 = call { double, double } @_ZNK3JPH5Wheel16GetContactNormalEv(ptr noundef nonnull align 16 dereferenceable(404) %109)
  %113 = extractvalue { double, double } %112, 0
  store double %113, ptr %9, align 16
  %114 = extractvalue { double, double } %112, 1
  store double %114, ptr %54, align 8
  %115 = call noundef float @_ZNK3JPH5Wheel19GetSuspensionLambdaEv(ptr noundef nonnull align 16 dereferenceable(404) %109)
  %116 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %9, float noundef %115)
  %117 = extractvalue { double, double } %116, 0
  store double %117, ptr %8, align 16
  %118 = extractvalue { double, double } %116, 1
  store double %118, ptr %55, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %10) #12
  %119 = call { double, double } @_ZNK3JPH5Wheel17GetContactLateralEv(ptr noundef nonnull align 16 dereferenceable(404) %109)
  %120 = extractvalue { double, double } %119, 0
  store double %120, ptr %10, align 16
  %121 = extractvalue { double, double } %119, 1
  store double %121, ptr %56, align 8
  %122 = call noundef float @_ZNK3JPH5Wheel16GetLateralLambdaEv(ptr noundef nonnull align 16 dereferenceable(404) %109)
  %123 = call { double, double } @_ZNK3JPH4Vec3mlEf(ptr noundef nonnull align 16 dereferenceable(16) %10, float noundef %122)
  %124 = extractvalue { double, double } %123, 0
  %125 = extractvalue { double, double } %123, 1
  %126 = call { double, double } @_ZNK3JPH4Vec3plES0_(ptr noundef nonnull align 16 dereferenceable(16) %8, double %124, double %125)
  %127 = extractvalue { double, double } %126, 0
  %128 = extractvalue { double, double } %126, 1
  %129 = call noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16) %7, double %127, double %128)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %10) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %9) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %8) #12
  br label %130

130:                                              ; preds = %111, %108
  %131 = getelementptr inbounds i8, ptr %.0107, i64 8
  %.not = icmp eq ptr %131, %53
  br i1 %.not, label %._crit_edge, label %108

132:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #12
  %.sroa.037.0.copyload = load double, ptr %4, align 16
  %.sroa.238.0.copyload = load double, ptr %34, align 8, !tbaa !31
  %133 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %103)
  %134 = load float, ptr %105, align 4, !tbaa !33
  %135 = fmul float %133, %134
  %136 = call { double, double } @_ZN3JPH4Quat9sRotationENS_4Vec3Ef(double %.sroa.037.0.copyload, double %.sroa.238.0.copyload, float noundef %135)
  %137 = extractvalue { double, double } %136, 0
  store double %137, ptr %14, align 16
  %138 = getelementptr inbounds i8, ptr %14, i64 8
  %139 = extractvalue { double, double } %136, 1
  store double %139, ptr %138, align 8
  %.sroa.035.0.copyload = load double, ptr %12, align 16
  %.sroa.236.0.copyload = load double, ptr %89, align 8, !tbaa !31
  %140 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %14, double %.sroa.035.0.copyload, double %.sroa.236.0.copyload)
  %141 = extractvalue { double, double } %140, 0
  %142 = extractvalue { double, double } %140, 1
  store double %141, ptr %62, align 16
  store double %142, ptr %.sroa.269.0..sroa_idx, align 8, !tbaa !31
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #12
  br label %143

143:                                              ; preds = %132, %._crit_edge
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %15) #12
  %144 = call { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122) %23)
  %145 = extractvalue { double, double } %144, 0
  store double %145, ptr %15, align 16
  %146 = getelementptr inbounds i8, ptr %15, i64 8
  %147 = extractvalue { double, double } %144, 1
  store double %147, ptr %146, align 8
  %148 = load ptr, ptr %21, align 8, !tbaa !5
  %149 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetLocalUpEv(ptr noundef nonnull align 16 dereferenceable(408) %148)
  %150 = extractvalue { double, double } %149, 0
  %151 = extractvalue { double, double } %149, 1
  %152 = call { double, double } @_ZNK3JPH4QuatmlENS_4Vec3E(ptr noundef nonnull align 16 dereferenceable(16) %15, double %150, double %151)
  %153 = extractvalue { double, double } %152, 0
  %154 = extractvalue { double, double } %152, 1
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %15) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #12
  %155 = call { double, double } @_ZNK3JPH4Vec35CrossES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %153, double %154)
  %156 = extractvalue { double, double } %155, 0
  store double %156, ptr %16, align 16
  %157 = getelementptr inbounds i8, ptr %16, i64 8
  %158 = extractvalue { double, double } %155, 1
  store double %158, ptr %157, align 8
  %.sroa.027.0.copyload = load double, ptr %4, align 16
  %.sroa.228.0.copyload = load double, ptr %34, align 8, !tbaa !31
  %159 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %16, double %.sroa.027.0.copyload, double %.sroa.228.0.copyload)
  %160 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %159)
  %161 = fneg float %160
  %162 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %62, double %153, double %154)
  %163 = call noundef float @_ZN3JPH4ACosEf(float noundef %162)
  %164 = fmul float %163, %161
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #12
  %165 = getelementptr inbounds i8, ptr %0, i64 304
  %166 = load float, ptr %165, align 16, !tbaa !35
  %167 = call float @llvm.fmuladd.f32(float %164, float %1, float %166)
  store float %167, ptr %165, align 16, !tbaa !35
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %12) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #12
  br label %171

168:                                              ; preds = %3
  %169 = getelementptr inbounds i8, ptr %0, i64 288
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(16) %169, ptr noundef nonnull align 16 dereferenceable(16) %6, i64 16, i1 false), !tbaa.struct !36
  %170 = getelementptr inbounds i8, ptr %0, i64 304
  store float 0.000000e+00, ptr %170, align 16, !tbaa !35
  br label %171

171:                                              ; preds = %168, %143
  %172 = getelementptr inbounds i8, ptr %0, i64 260
  %173 = load float, ptr %172, align 4, !tbaa !33
  %174 = call noundef float @_ZN3JPH3TanEf(float noundef %173)
  %175 = fmul float %36, %174
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %17) #12
  %176 = load ptr, ptr %21, align 8, !tbaa !5
  %177 = call noundef zeroext i1 @_ZNK3JPH17VehicleConstraint19IsGravityOverriddenEv(ptr noundef nonnull align 16 dereferenceable(408) %176)
  br i1 %177, label %178, label %181

178:                                              ; preds = %171
  %179 = load ptr, ptr %21, align 8, !tbaa !5
  %180 = call { double, double } @_ZNK3JPH17VehicleConstraint18GetGravityOverrideEv(ptr noundef nonnull align 16 dereferenceable(408) %179)
  br label %183

181:                                              ; preds = %171
  %182 = call { double, double } @_ZNK3JPH13PhysicsSystem10GetGravityEv(ptr noundef nonnull align 16 dereferenceable(1172) %2)
  br label %183

183:                                              ; preds = %181, %178
  %.pn = phi { double, double } [ %180, %178 ], [ %182, %181 ]
  %.sink = extractvalue { double, double } %.pn, 1
  %.sink114 = extractvalue { double, double } %.pn, 0
  store double %.sink114, ptr %17, align 16
  %184 = getelementptr inbounds i8, ptr %17, i64 8
  store double %.sink, ptr %184, align 8
  %185 = call noundef float @_ZNK3JPH4Vec36LengthEv(ptr noundef nonnull align 16 dereferenceable(16) %17)
  %186 = fmul float %175, %185
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %17) #12
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %18) #12
  %187 = call { double, double } @_ZNK3JPH4Body17GetLinearVelocityEv(ptr noundef nonnull align 16 dereferenceable(122) %23)
  %188 = extractvalue { double, double } %187, 0
  store double %188, ptr %18, align 16
  %189 = getelementptr inbounds i8, ptr %18, i64 8
  %190 = extractvalue { double, double } %187, 1
  store double %190, ptr %189, align 8
  %.sroa.021.0.copyload = load double, ptr %4, align 16
  %.sroa.222.0.copyload = load double, ptr %34, align 8, !tbaa !31
  %191 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %18, double %.sroa.021.0.copyload, double %.sroa.222.0.copyload)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %18) #12
  %192 = call noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef %191)
  %193 = getelementptr inbounds i8, ptr %0, i64 20
  %194 = load float, ptr %193, align 4, !tbaa !37
  %195 = call noundef float @_ZSt3absf(float noundef %194)
  %196 = load float, ptr %193, align 4, !tbaa !37
  %197 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %196)
  %198 = fneg float %197
  %199 = load ptr, ptr %21, align 8, !tbaa !5
  %200 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %199)
  %201 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %200)
  %202 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %200)
  %.not105108 = icmp eq ptr %201, %202
  br i1 %.not105108, label %._crit_edge112, label %.lr.ph111

.lr.ph111:                                        ; preds = %183
  %203 = getelementptr inbounds i8, ptr %0, i64 257
  %204 = fcmp ogt float %192, 0x3EB0C6F7A0000000
  br i1 %204, label %.lr.ph111.split, label %.lr.ph111.split.us

.lr.ph111.split.us:                               ; preds = %.lr.ph111, %222
  %.0102109.us = phi ptr [ %223, %222 ], [ %201, %.lr.ph111 ]
  %205 = load ptr, ptr %.0102109.us, align 8, !tbaa !34
  %206 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %205)
  %207 = getelementptr inbounds i8, ptr %206, i64 156
  %208 = load float, ptr %207, align 4, !tbaa !38
  %209 = fcmp une float %208, 0.000000e+00
  br i1 %209, label %210, label %222

210:                                              ; preds = %.lr.ph111.split.us
  %211 = getelementptr inbounds i8, ptr %206, i64 64
  %212 = load ptr, ptr %21, align 8, !tbaa !5
  %213 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetLocalUpEv(ptr noundef nonnull align 16 dereferenceable(408) %212)
  %214 = extractvalue { double, double } %213, 0
  %215 = extractvalue { double, double } %213, 1
  %216 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %211, double %214, double %215)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %19) #12
  %217 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %205)
  %218 = getelementptr inbounds i8, ptr %217, i64 156
  %219 = load float, ptr %218, align 4, !tbaa !38
  %220 = fmul float %195, %219
  %221 = fmul float %220, %198
  call void @_ZN3JPH5Wheel13SetSteerAngleEf(ptr noundef nonnull align 16 dereferenceable(404) %205, float noundef %221)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %19) #12
  br label %222

222:                                              ; preds = %210, %.lr.ph111.split.us
  %223 = getelementptr inbounds i8, ptr %.0102109.us, i64 8
  %.not105.us = icmp eq ptr %223, %202
  br i1 %.not105.us, label %._crit_edge112, label %.lr.ph111.split.us

._crit_edge112:                                   ; preds = %222, %253, %183
  %224 = getelementptr inbounds i8, ptr %0, i64 308
  store float 0.000000e+00, ptr %224, align 4, !tbaa !47
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %6) #12
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %4) #12
  ret void

.lr.ph111.split:                                  ; preds = %.lr.ph111, %253
  %.0102109 = phi ptr [ %254, %253 ], [ %201, %.lr.ph111 ]
  %225 = load ptr, ptr %.0102109, align 8, !tbaa !34
  %226 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %225)
  %227 = getelementptr inbounds i8, ptr %226, i64 156
  %228 = load float, ptr %227, align 4, !tbaa !38
  %229 = fcmp une float %228, 0.000000e+00
  br i1 %229, label %230, label %253

230:                                              ; preds = %.lr.ph111.split
  %231 = getelementptr inbounds i8, ptr %226, i64 64
  %232 = load ptr, ptr %21, align 8, !tbaa !5
  %233 = call { double, double } @_ZNK3JPH17VehicleConstraint10GetLocalUpEv(ptr noundef nonnull align 16 dereferenceable(408) %232)
  %234 = extractvalue { double, double } %233, 0
  %235 = extractvalue { double, double } %233, 1
  %236 = call noundef float @_ZNK3JPH4Vec33DotES0_(ptr noundef nonnull align 16 dereferenceable(16) %231, double %234, double %235)
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %19) #12
  %237 = call noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424) %225)
  %238 = getelementptr inbounds i8, ptr %237, i64 156
  %239 = load float, ptr %238, align 4, !tbaa !38
  %240 = fmul float %195, %239
  store float %240, ptr %19, align 4, !tbaa !48
  %241 = load i8, ptr %203, align 1, !tbaa !49, !range !29, !noundef !30
  %242 = trunc nuw i8 %241 to i1
  %243 = fcmp ogt float %236, 0x3EB0C6F7A0000000
  %or.cond3 = and i1 %243, %242
  br i1 %or.cond3, label %244, label %250

244:                                              ; preds = %230
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %20) #12
  %245 = fmul float %192, %236
  %246 = fdiv float %186, %245
  %247 = call noundef float @_ZN3JPH4ASinEf(float noundef %246)
  store float %247, ptr %20, align 4, !tbaa !48
  %248 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %19, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %249 = load float, ptr %248, align 4, !tbaa !48
  store float %249, ptr %19, align 4, !tbaa !48
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %20) #12
  br label %250

250:                                              ; preds = %244, %230
  %251 = phi float [ %249, %244 ], [ %240, %230 ]
  %252 = fmul float %251, %198
  call void @_ZN3JPH5Wheel13SetSteerAngleEf(ptr noundef nonnull align 16 dereferenceable(404) %225, float noundef %252)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %19) #12
  br label %253

253:                                              ; preds = %250, %.lr.ph111.split
  %254 = getelementptr inbounds i8, ptr %.0102109, i64 8
  %.not105 = icmp eq ptr %254, %202
  br i1 %.not105, label %._crit_edge112, label %.lr.ph111.split
}

declare void @_ZN3JPH24WheeledVehicleController10PreCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(256), float noundef, ptr noundef nonnull align 16 dereferenceable(1172)) unnamed_addr #7

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH17VehicleConstraint14GetVehicleBodyEv(ptr noundef nonnull align 16 dereferenceable(408)) local_unnamed_addr #3 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { double, double } @_ZNK3JPH4Body11GetRotationEv(ptr noundef nonnull align 16 dereferenceable(122)) local_unnamed_addr #8 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 #9 align 2

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404)) local_unnamed_addr #8 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH5Wheel19GetSuspensionLambdaEv(ptr noundef nonnull align 16 dereferenceable(404)) local_unnamed_addr #2 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef float @_ZNK3JPH5Wheel16GetLateralLambdaEv(ptr noundef nonnull align 16 dereferenceable(404)) local_unnamed_addr #3 align 2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef nonnull align 16 dereferenceable(16) ptr @_ZN3JPH4Vec3pLES0_(ptr noundef nonnull align 16 dereferenceable(16), double, double) local_unnamed_addr #10 align 2

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

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

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

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZN3JPH4SignIfEET_S1_(float noundef) local_unnamed_addr #6

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH4ACosEf(float noundef) local_unnamed_addr #9

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

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

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

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

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH3TanEf(float noundef) local_unnamed_addr #9

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK3JPH17VehicleConstraint19IsGravityOverriddenEv(ptr noundef nonnull align 16 dereferenceable(408)) local_unnamed_addr #3 align 2

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

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

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

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

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local noundef float @_ZN3JPH6SquareIfEET_S1_(float noundef) local_unnamed_addr #6

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZNK3JPH7WheelWV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(424)) local_unnamed_addr #2 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef float @_ZN3JPH4ASinEf(float noundef) local_unnamed_addr #9

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN3JPH5Wheel13SetSteerAngleEf(ptr noundef nonnull align 16 dereferenceable(404), float noundef) local_unnamed_addr #3 align 2

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { 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 #3 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { inlinehint 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 #9 = { 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 #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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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, !7, i64 8}
!6 = !{!"_ZTSN3JPH17VehicleControllerE", !7, i64 8}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!11, !27, i64 256}
!11 = !{!"_ZTSN3JPH20MotorcycleControllerE", !12, i64 0, !27, i64 256, !27, i64 257, !13, i64 260, !13, i64 264, !13, i64 268, !13, i64 272, !13, i64 276, !13, i64 280, !28, i64 288, !13, i64 304, !13, i64 308}
!12 = !{!"_ZTSN3JPH24WheeledVehicleControllerE", !6, i64 0, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !14, i64 32, !19, i64 88, !24, i64 192, !13, i64 216, !13, i64 220, !25, i64 224}
!13 = !{!"float", !8, i64 0}
!14 = !{!"_ZTSN3JPH13VehicleEngineE", !15, i64 0, !13, i64 48}
!15 = !{!"_ZTSN3JPH21VehicleEngineSettingsE", !13, i64 0, !13, i64 4, !13, i64 8, !16, i64 16, !13, i64 40, !13, i64 44}
!16 = !{!"_ZTSN3JPH11LinearCurveE", !17, i64 0}
!17 = !{!"_ZTSN3JPH5ArrayINS_11LinearCurve5PointENS_12STLAllocatorIS2_EEEE", !18, i64 0, !18, i64 8, !7, i64 16}
!18 = !{!"long", !8, i64 0}
!19 = !{!"_ZTSN3JPH19VehicleTransmissionE", !20, i64 0, !23, i64 80, !13, i64 84, !13, i64 88, !13, i64 92, !13, i64 96}
!20 = !{!"_ZTSN3JPH27VehicleTransmissionSettingsE", !21, i64 0, !22, i64 8, !22, i64 32, !13, i64 56, !13, i64 60, !13, i64 64, !13, i64 68, !13, i64 72, !13, i64 76}
!21 = !{!"_ZTSN3JPH17ETransmissionModeE", !8, i64 0}
!22 = !{!"_ZTSN3JPH5ArrayIfNS_12STLAllocatorIfEEEE", !18, i64 0, !18, i64 8, !7, i64 16}
!23 = !{!"int", !8, i64 0}
!24 = !{!"_ZTSN3JPH5ArrayINS_27VehicleDifferentialSettingsENS_12STLAllocatorIS1_EEEE", !18, i64 0, !18, i64 8, !7, i64 16}
!25 = !{!"_ZTSSt8functionIFvjRfS0_ffffffEE", !26, i64 0, !7, i64 24}
!26 = !{!"_ZTSSt14_Function_base", !8, i64 0, !7, i64 16}
!27 = !{!"bool", !8, i64 0}
!28 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!29 = !{i8 0, i8 2}
!30 = !{}
!31 = !{!8, !8, i64 0}
!32 = !{!11, !13, i64 280}
!33 = !{!11, !13, i64 260}
!34 = !{!7, !7, i64 0}
!35 = !{!11, !13, i64 304}
!36 = !{i64 0, i64 16, !31}
!37 = !{!12, !13, i64 20}
!38 = !{!39, !13, i64 156}
!39 = !{!"_ZTSN3JPH15WheelSettingsWVE", !40, i64 0, !13, i64 148, !13, i64 152, !13, i64 156, !16, i64 160, !16, i64 184, !13, i64 208, !13, i64 212}
!40 = !{!"_ZTSN3JPH13WheelSettingsE", !41, i64 0, !42, i64 8, !28, i64 16, !28, i64 32, !28, i64 48, !28, i64 64, !28, i64 80, !28, i64 96, !13, i64 112, !13, i64 116, !13, i64 120, !45, i64 124, !13, i64 136, !13, i64 140, !27, i64 144}
!41 = !{!"_ZTSN3JPH18SerializableObjectE"}
!42 = !{!"_ZTSN3JPH9RefTargetINS_13WheelSettingsEEE", !43, i64 0}
!43 = !{!"_ZTSSt6atomicIjE", !44, i64 0}
!44 = !{!"_ZTSSt13__atomic_baseIjE", !23, i64 0}
!45 = !{!"_ZTSN3JPH14SpringSettingsE", !46, i64 0, !8, i64 4, !13, i64 8}
!46 = !{!"_ZTSN3JPH11ESpringModeE", !8, i64 0}
!47 = !{!11, !13, i64 308}
!48 = !{!13, !13, i64 0}
!49 = !{!11, !27, i64 257}


; Effective O3 passes: DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,MergedLoadStoreMotionPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass