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

; 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::VehicleController" = type { ptr, ptr }
%"class.JPH::TrackedVehicleController" = type { %"class.JPH::VehicleController", float, float, float, float, %"class.JPH::VehicleEngine", %"class.JPH::VehicleTransmission", [2 x %"class.JPH::VehicleTrack"] }
%"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::VehicleTrack" = type <{ %"class.JPH::VehicleTrackSettings", float, [4 x i8] }>
%"class.JPH::VehicleTrackSettings" = type { i32, %"class.JPH::Array.5", float, float, float, float }
%"class.JPH::Array.5" = type { i64, i64, ptr }
%"class.JPH::WheelSettings" = type <{ %"class.JPH::SerializableObject", %"class.JPH::RefTarget.12", [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] }>
%"class.JPH::SerializableObject" = type { ptr }
%"class.JPH::RefTarget.12" = type { %"struct.std::atomic" }
%"struct.std::atomic" = type { %"struct.std::__atomic_base" }
%"struct.std::__atomic_base" = type { i32 }
%"class.JPH::Vec3" = type { %union.anon }
%union.anon = type { <4 x float> }
%"class.JPH::SpringSettings" = type { i8, %union.anon.13, float }
%union.anon.13 = type { float }
%"class.JPH::WheelTV" = type { %"class.JPH::Wheel.base", i32, float, float, float, [12 x i8] }
%"class.JPH::Wheel.base" = type <{ ptr, %"class.JPH::RefConst", %"class.JPH::BodyID", %"class.JPH::SubShapeID", ptr, float, [12 x i8], %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", %"class.JPH::Vec3", float, float, float, float, float, %"class.JPH::AxisConstraintPart", %"class.JPH::AxisConstraintPart", %"class.JPH::AxisConstraintPart", %"class.JPH::AxisConstraintPart" }>
%"class.JPH::RefConst" = type { ptr }
%"class.JPH::BodyID" = type { i32 }
%"class.JPH::SubShapeID" = type { i32 }
%"class.JPH::AxisConstraintPart" = type { %"class.JPH::Float3", %"class.JPH::Float3", %"class.JPH::Float3", %"class.JPH::Float3", float, %"class.JPH::SpringPart", float }
%"class.JPH::Float3" = type { float, float, float }
%"class.JPH::SpringPart" = type { float, float }

; 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: mustprogress uwtable
declare dso_local void @_ZN3JPH7WheelTV24CalculateAngularVelocityERKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420), ptr noundef nonnull align 16 dereferenceable(408)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZNK3JPH7WheelTV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(420)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH7WheelTV6UpdateEjfRKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420), i32 noundef, float noundef, ptr noundef nonnull align 16 dereferenceable(408)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH13VehicleEngine13SetCurrentRPMEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) #1 align 2

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

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

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24TrackedVehicleController11PostCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(304) %0, float noundef %1, ptr noundef nonnull align 16 dereferenceable(1172) %2) unnamed_addr #1 align 2 {
  %4 = alloca ptr, align 8
  %5 = alloca float, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i8, align 1
  %12 = alloca float, align 4
  %13 = alloca i8, align 1
  %14 = alloca float, align 4
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca float, align 4
  %21 = alloca float, align 4
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca i32, align 4
  %26 = alloca float, align 4
  %27 = alloca float, align 4
  %28 = alloca float, align 4
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca float, align 4
  %34 = alloca ptr, align 8
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca ptr, align 8
  %38 = alloca float, align 4
  %39 = alloca float, align 4
  %40 = alloca float, align 4
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca ptr, align 8
  %44 = alloca i32, align 4
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca ptr, align 8
  %48 = alloca ptr, align 8
  %49 = alloca i32, align 4
  %50 = alloca ptr, align 8
  %51 = alloca ptr, align 8
  %52 = alloca ptr, align 8
  %53 = alloca ptr, align 8
  %54 = alloca ptr, align 8
  %55 = alloca ptr, align 8
  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
  %56 = load ptr, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  %57 = getelementptr inbounds %"class.JPH::VehicleController", ptr %56, i32 0, i32 1
  %58 = load ptr, ptr %57, align 8, !tbaa !11
  %59 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %58)
  store ptr %59, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #7
  store i32 0, ptr %8, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  %60 = load ptr, ptr %7, align 8, !tbaa !5
  %61 = call noundef i64 @_ZNK3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %60)
  %62 = trunc i64 %61 to i32
  store i32 %62, ptr %9, align 4, !tbaa !13
  br label %63

63:                                               ; preds = %79, %3
  %64 = load i32, ptr %8, align 4, !tbaa !13
  %65 = load i32, ptr %9, align 4, !tbaa !13
  %66 = icmp ult i32 %64, %65
  br i1 %66, label %68, label %67

67:                                               ; preds = %63
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #7
  br label %82

68:                                               ; preds = %63
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #7
  %69 = load ptr, ptr %7, align 8, !tbaa !5
  %70 = load i32, ptr %8, align 4, !tbaa !13
  %71 = zext i32 %70 to i64
  %72 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %69, i64 noundef %71)
  %73 = load ptr, ptr %72, align 8, !tbaa !5
  store ptr %73, ptr %10, align 8, !tbaa !5
  %74 = load ptr, ptr %10, align 8, !tbaa !5
  %75 = load i32, ptr %8, align 4, !tbaa !13
  %76 = load float, ptr %5, align 4, !tbaa !9
  %77 = getelementptr inbounds %"class.JPH::VehicleController", ptr %56, i32 0, i32 1
  %78 = load ptr, ptr %77, align 8, !tbaa !11
  call void @_ZN3JPH7WheelTV6UpdateEjfRKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420) %74, i32 noundef %75, float noundef %76, ptr noundef nonnull align 16 dereferenceable(408) %78)
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #7
  br label %79

79:                                               ; preds = %68
  %80 = load i32, ptr %8, align 4, !tbaa !13
  %81 = add i32 %80, 1
  store i32 %81, ptr %8, align 4, !tbaa !13
  br label %63, !llvm.loop !15

82:                                               ; preds = %67
  call void @llvm.lifetime.start.p0(i64 1, ptr %11) #7
  store i8 0, ptr %11, align 1, !tbaa !17
  %83 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %84 = call noundef i32 @_ZNK3JPH19VehicleTransmission14GetCurrentGearEv(ptr noundef nonnull align 8 dereferenceable(100) %83)
  %85 = icmp ne i32 %84, 0
  br i1 %85, label %86, label %183

86:                                               ; preds = %82
  %87 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %88 = call noundef float @_ZNK3JPH19VehicleTransmission17GetClutchFrictionEv(ptr noundef nonnull align 8 dereferenceable(100) %87)
  %89 = fcmp ogt float %88, 0x3F50624DE0000000
  br i1 %89, label %90, label %183

90:                                               ; preds = %86
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #7
  %91 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %92 = call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %91)
  store float %92, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %13) #7
  %93 = load float, ptr %12, align 4, !tbaa !9
  %94 = fcmp oge float %93, 0.000000e+00
  %95 = zext i1 %94 to i8
  store i8 %95, ptr %13, align 1, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %96 = load i8, ptr %13, align 1, !tbaa !17, !range !19, !noundef !20
  %97 = trunc i8 %96 to i1
  %98 = zext i1 %97 to i64
  %99 = select i1 %97, float 0xC7EFFFFFE0000000, float 0x47EFFFFFE0000000
  store float %99, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  %100 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 7
  store ptr %100, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  %101 = load ptr, ptr %15, align 8, !tbaa !5
  %102 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %101, i64 0, i64 0
  store ptr %102, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  %103 = load ptr, ptr %15, align 8, !tbaa !5
  %104 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %103, i64 0, i64 0
  %105 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %104, i64 2
  store ptr %105, ptr %17, align 8, !tbaa !5
  br label %106

106:                                              ; preds = %166, %90
  %107 = load ptr, ptr %16, align 8, !tbaa !5
  %108 = load ptr, ptr %17, align 8, !tbaa !5
  %109 = icmp ne ptr %107, %108
  br i1 %109, label %111, label %110

110:                                              ; preds = %106
  store i32 5, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  br label %169

111:                                              ; preds = %106
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  %112 = load ptr, ptr %16, align 8, !tbaa !5
  store ptr %112, ptr %19, align 8, !tbaa !5
  %113 = load i8, ptr %13, align 1, !tbaa !17, !range !19, !noundef !20
  %114 = trunc i8 %113 to i1
  br i1 %114, label %115, label %125

115:                                              ; preds = %111
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  %116 = load ptr, ptr %19, align 8, !tbaa !5
  %117 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %116, i32 0, i32 1
  %118 = load float, ptr %117, align 8, !tbaa !21
  %119 = load ptr, ptr %19, align 8, !tbaa !5
  %120 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %119, i32 0, i32 5
  %121 = load float, ptr %120, align 4, !tbaa !26
  %122 = fmul float %118, %121
  store float %122, ptr %20, align 4, !tbaa !9
  %123 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %14, ptr noundef nonnull align 4 dereferenceable(4) %20)
  %124 = load float, ptr %123, align 4, !tbaa !9
  store float %124, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  br label %135

125:                                              ; preds = %111
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  %126 = load ptr, ptr %19, align 8, !tbaa !5
  %127 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %126, i32 0, i32 1
  %128 = load float, ptr %127, align 8, !tbaa !21
  %129 = load ptr, ptr %19, align 8, !tbaa !5
  %130 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %129, i32 0, i32 5
  %131 = load float, ptr %130, align 4, !tbaa !26
  %132 = fmul float %128, %131
  store float %132, ptr %21, align 4, !tbaa !9
  %133 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %14, ptr noundef nonnull align 4 dereferenceable(4) %21)
  %134 = load float, ptr %133, align 4, !tbaa !9
  store float %134, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  br label %135

135:                                              ; preds = %125, %115
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %136 = load ptr, ptr %19, align 8, !tbaa !5
  %137 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %136, i32 0, i32 1
  store ptr %137, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #7
  %138 = load ptr, ptr %22, align 8, !tbaa !5
  %139 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %138)
  store ptr %139, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  %140 = load ptr, ptr %22, align 8, !tbaa !5
  %141 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %140)
  store ptr %141, ptr %24, align 8, !tbaa !5
  br label %142

142:                                              ; preds = %161, %135
  %143 = load ptr, ptr %23, align 8, !tbaa !5
  %144 = load ptr, ptr %24, align 8, !tbaa !5
  %145 = icmp ne ptr %143, %144
  br i1 %145, label %147, label %146

146:                                              ; preds = %142
  store i32 7, ptr %18, align 4
  br label %164

147:                                              ; preds = %142
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  %148 = load ptr, ptr %23, align 8, !tbaa !5
  %149 = load i32, ptr %148, align 4, !tbaa !13
  store i32 %149, ptr %25, align 4, !tbaa !13
  %150 = load ptr, ptr %7, align 8, !tbaa !5
  %151 = load i32, ptr %25, align 4, !tbaa !13
  %152 = zext i32 %151 to i64
  %153 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %150, i64 noundef %152)
  %154 = load ptr, ptr %153, align 8, !tbaa !5
  %155 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %154)
  br i1 %155, label %156, label %157

156:                                              ; preds = %147
  store i8 1, ptr %11, align 1, !tbaa !17
  store i32 7, ptr %18, align 4
  br label %158

157:                                              ; preds = %147
  store i32 0, ptr %18, align 4
  br label %158

158:                                              ; preds = %157, %156
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  %159 = load i32, ptr %18, align 4
  switch i32 %159, label %164 [
    i32 0, label %160
  ]

160:                                              ; preds = %158
  br label %161

161:                                              ; preds = %160
  %162 = load ptr, ptr %23, align 8, !tbaa !5
  %163 = getelementptr inbounds i32, ptr %162, i32 1
  store ptr %163, ptr %23, align 8, !tbaa !5
  br label %142

164:                                              ; preds = %158, %146
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %165

165:                                              ; preds = %164
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  br label %166

166:                                              ; preds = %165
  %167 = load ptr, ptr %16, align 8, !tbaa !5
  %168 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %167, i32 1
  store ptr %168, ptr %16, align 8, !tbaa !5
  br label %106

169:                                              ; preds = %110
  %170 = load float, ptr %14, align 4, !tbaa !9
  %171 = fcmp ogt float %170, 0xC7EFFFFFE0000000
  br i1 %171, label %172, label %182

172:                                              ; preds = %169
  %173 = load float, ptr %14, align 4, !tbaa !9
  %174 = fcmp olt float %173, 0x47EFFFFFE0000000
  br i1 %174, label %175, label %182

175:                                              ; preds = %172
  %176 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %177 = load float, ptr %14, align 4, !tbaa !9
  %178 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %179 = call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %178)
  %180 = fmul float %177, %179
  %181 = fmul float %180, 0x4023193D60000000
  call void @_ZN3JPH13VehicleEngine13SetCurrentRPMEf(ptr noundef nonnull align 8 dereferenceable(52) %176, float noundef %181)
  br label %182

182:                                              ; preds = %175, %172, %169
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #7
  br label %202

183:                                              ; preds = %86, %82
  %184 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %185 = load float, ptr %5, align 4, !tbaa !9
  call void @_ZN3JPH13VehicleEngine12ApplyDampingEf(ptr noundef nonnull align 8 dereferenceable(52) %184, float noundef %185)
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  %186 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %187 = getelementptr inbounds %"class.JPH::VehicleTransmissionSettings", ptr %186, i32 0, i32 0
  %188 = load i8, ptr %187, align 8, !tbaa !27
  %189 = icmp eq i8 %188, 1
  br i1 %189, label %190, label %194

190:                                              ; preds = %183
  %191 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 1
  %192 = load float, ptr %191, align 8, !tbaa !31
  %193 = call noundef float @_ZSt3absf(float noundef %192)
  br label %195

194:                                              ; preds = %183
  br label %195

195:                                              ; preds = %194, %190
  %196 = phi float [ %193, %190 ], [ 0.000000e+00, %194 ]
  store float %196, ptr %26, align 4, !tbaa !9
  %197 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %198 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %199 = load float, ptr %26, align 4, !tbaa !9
  %200 = call noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52) %198, float noundef %199)
  %201 = load float, ptr %5, align 4, !tbaa !9
  call void @_ZN3JPH13VehicleEngine11ApplyTorqueEff(ptr noundef nonnull align 8 dereferenceable(52) %197, float noundef %200, float noundef %201)
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  br label %202

202:                                              ; preds = %195, %182
  %203 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %204 = load float, ptr %5, align 4, !tbaa !9
  %205 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %206 = call noundef float @_ZNK3JPH13VehicleEngine13GetCurrentRPMEv(ptr noundef nonnull align 8 dereferenceable(52) %205)
  %207 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 1
  %208 = load float, ptr %207, align 8, !tbaa !31
  %209 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 2
  %210 = load float, ptr %209, align 4, !tbaa !38
  %211 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 3
  %212 = load float, ptr %211, align 8, !tbaa !39
  %213 = fmul float %210, %212
  %214 = fcmp ogt float %213, 0.000000e+00
  br i1 %214, label %215, label %218

215:                                              ; preds = %202
  %216 = load i8, ptr %11, align 1, !tbaa !17, !range !19, !noundef !20
  %217 = trunc i8 %216 to i1
  br label %218

218:                                              ; preds = %215, %202
  %219 = phi i1 [ false, %202 ], [ %217, %215 ]
  call void @_ZN3JPH19VehicleTransmission6UpdateEfffb(ptr noundef nonnull align 8 dereferenceable(100) %203, float noundef %204, float noundef %206, float noundef %208, i1 noundef zeroext %219)
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %220 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %221 = call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %220)
  store float %221, ptr %27, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  %222 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 6
  %223 = call noundef float @_ZNK3JPH19VehicleTransmission17GetClutchFrictionEv(ptr noundef nonnull align 8 dereferenceable(100) %222)
  %224 = load float, ptr %27, align 4, !tbaa !9
  %225 = fmul float %223, %224
  %226 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %227 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 1
  %228 = load float, ptr %227, align 8, !tbaa !31
  %229 = call noundef float @_ZSt3absf(float noundef %228)
  %230 = call noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52) %226, float noundef %229)
  %231 = fmul float %225, %230
  store float %231, ptr %28, align 4, !tbaa !9
  %232 = load float, ptr %28, align 4, !tbaa !9
  %233 = fcmp une float %232, 0.000000e+00
  br i1 %233, label %234, label %307

234:                                              ; preds = %218
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  store i32 0, ptr %29, align 4, !tbaa !13
  br label %235

235:                                              ; preds = %303, %234
  %236 = load i32, ptr %29, align 4, !tbaa !13
  %237 = zext i32 %236 to i64
  %238 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 7
  %239 = call noundef i64 @_ZSt4sizeIN3JPH12VehicleTrackELm2EEmRAT0__KT_(ptr noundef nonnull align 8 dereferenceable(112) %238) #7
  %240 = icmp ult i64 %237, %239
  br i1 %240, label %242, label %241

241:                                              ; preds = %235
  store i32 9, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  br label %306

242:                                              ; preds = %235
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #7
  %243 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 7
  %244 = load i32, ptr %29, align 4, !tbaa !13
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %243, i64 0, i64 %245
  store ptr %246, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  %247 = load i32, ptr %29, align 4, !tbaa !13
  %248 = icmp eq i32 %247, 0
  br i1 %248, label %249, label %252

249:                                              ; preds = %242
  %250 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 2
  %251 = load float, ptr %250, align 4, !tbaa !38
  br label %255

252:                                              ; preds = %242
  %253 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 3
  %254 = load float, ptr %253, align 8, !tbaa !39
  br label %255

255:                                              ; preds = %252, %249
  %256 = phi float [ %251, %249 ], [ %254, %252 ]
  store float %256, ptr %31, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #7
  %257 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 5
  %258 = call noundef float @_ZNK3JPH13VehicleEngine13GetCurrentRPMEv(ptr noundef nonnull align 8 dereferenceable(52) %257)
  %259 = load float, ptr %27, align 4, !tbaa !9
  %260 = load ptr, ptr %30, align 8, !tbaa !5
  %261 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %260, i32 0, i32 5
  %262 = load float, ptr %261, align 4, !tbaa !26
  %263 = fmul float %259, %262
  %264 = load float, ptr %31, align 4, !tbaa !9
  %265 = fmul float %263, %264
  %266 = fmul float %265, 0x4023193D60000000
  %267 = fdiv float %258, %266
  %268 = fmul float %267, 0x3FF00418A0000000
  store float %268, ptr %32, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  %269 = load ptr, ptr %30, align 8, !tbaa !5
  %270 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %269, i32 0, i32 5
  %271 = load float, ptr %270, align 4, !tbaa !26
  %272 = load float, ptr %31, align 4, !tbaa !9
  %273 = fmul float %271, %272
  %274 = load float, ptr %28, align 4, !tbaa !9
  %275 = fmul float %273, %274
  store float %275, ptr %33, align 4, !tbaa !9
  %276 = load ptr, ptr %30, align 8, !tbaa !5
  %277 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %276, i32 0, i32 1
  %278 = load float, ptr %277, align 8, !tbaa !21
  %279 = load float, ptr %32, align 4, !tbaa !9
  %280 = fmul float %278, %279
  %281 = fcmp olt float %280, 0.000000e+00
  br i1 %281, label %290, label %282

282:                                              ; preds = %255
  %283 = load ptr, ptr %30, align 8, !tbaa !5
  %284 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %283, i32 0, i32 1
  %285 = load float, ptr %284, align 8, !tbaa !21
  %286 = call noundef float @_ZSt3absf(float noundef %285)
  %287 = load float, ptr %32, align 4, !tbaa !9
  %288 = call noundef float @_ZSt3absf(float noundef %287)
  %289 = fcmp olt float %286, %288
  br i1 %289, label %290, label %302

290:                                              ; preds = %282, %255
  %291 = load float, ptr %33, align 4, !tbaa !9
  %292 = load float, ptr %5, align 4, !tbaa !9
  %293 = fmul float %291, %292
  %294 = load ptr, ptr %30, align 8, !tbaa !5
  %295 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %294, i32 0, i32 2
  %296 = load float, ptr %295, align 8, !tbaa !40
  %297 = fdiv float %293, %296
  %298 = load ptr, ptr %30, align 8, !tbaa !5
  %299 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %298, i32 0, i32 1
  %300 = load float, ptr %299, align 8, !tbaa !21
  %301 = fadd float %300, %297
  store float %301, ptr %299, align 8, !tbaa !21
  br label %302

302:                                              ; preds = %290, %282
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #7
  br label %303

303:                                              ; preds = %302
  %304 = load i32, ptr %29, align 4, !tbaa !13
  %305 = add i32 %304, 1
  store i32 %305, ptr %29, align 4, !tbaa !13
  br label %235, !llvm.loop !41

306:                                              ; preds = %241
  br label %307

307:                                              ; preds = %306, %218
  call void @_ZN3JPH24TrackedVehicleController19SyncLeftRightTracksEv(ptr noundef nonnull align 8 dereferenceable(304) %56)
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  %308 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 7
  store ptr %308, ptr %34, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #7
  %309 = load ptr, ptr %34, align 8, !tbaa !5
  %310 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %309, i64 0, i64 0
  store ptr %310, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #7
  %311 = load ptr, ptr %34, align 8, !tbaa !5
  %312 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %311, i64 0, i64 0
  %313 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %312, i64 2
  store ptr %313, ptr %36, align 8, !tbaa !5
  br label %314

314:                                              ; preds = %444, %307
  %315 = load ptr, ptr %35, align 8, !tbaa !5
  %316 = load ptr, ptr %36, align 8, !tbaa !5
  %317 = icmp ne ptr %315, %316
  br i1 %317, label %319, label %318

318:                                              ; preds = %314
  store i32 12, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  br label %447

319:                                              ; preds = %314
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #7
  %320 = load ptr, ptr %35, align 8, !tbaa !5
  store ptr %320, ptr %37, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #7
  %321 = getelementptr inbounds %"class.JPH::TrackedVehicleController", ptr %56, i32 0, i32 4
  %322 = load float, ptr %321, align 4, !tbaa !42
  %323 = load ptr, ptr %37, align 8, !tbaa !5
  %324 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %323, i32 0, i32 4
  %325 = load float, ptr %324, align 8, !tbaa !43
  %326 = fmul float %322, %325
  store float %326, ptr %38, align 4, !tbaa !9
  %327 = load float, ptr %38, align 4, !tbaa !9
  %328 = fcmp ogt float %327, 0.000000e+00
  br i1 %328, label %329, label %367

329:                                              ; preds = %319
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #7
  %330 = load ptr, ptr %37, align 8, !tbaa !5
  %331 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %330, i32 0, i32 1
  %332 = load float, ptr %331, align 8, !tbaa !21
  %333 = call noundef float @_ZSt3absf(float noundef %332)
  %334 = load ptr, ptr %37, align 8, !tbaa !5
  %335 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %334, i32 0, i32 2
  %336 = load float, ptr %335, align 8, !tbaa !40
  %337 = fmul float %333, %336
  %338 = load float, ptr %5, align 4, !tbaa !9
  %339 = fdiv float %337, %338
  store float %339, ptr %39, align 4, !tbaa !9
  %340 = load float, ptr %38, align 4, !tbaa !9
  %341 = load float, ptr %39, align 4, !tbaa !9
  %342 = fcmp ogt float %340, %341
  br i1 %342, label %343, label %349

343:                                              ; preds = %329
  %344 = load ptr, ptr %37, align 8, !tbaa !5
  %345 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %344, i32 0, i32 1
  store float 0.000000e+00, ptr %345, align 8, !tbaa !21
  %346 = load float, ptr %39, align 4, !tbaa !9
  %347 = load float, ptr %38, align 4, !tbaa !9
  %348 = fsub float %347, %346
  store float %348, ptr %38, align 4, !tbaa !9
  br label %366

349:                                              ; preds = %329
  %350 = load ptr, ptr %37, align 8, !tbaa !5
  %351 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %350, i32 0, i32 1
  %352 = load float, ptr %351, align 8, !tbaa !21
  %353 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %352)
  %354 = load float, ptr %38, align 4, !tbaa !9
  %355 = fmul float %353, %354
  %356 = load float, ptr %5, align 4, !tbaa !9
  %357 = fmul float %355, %356
  %358 = load ptr, ptr %37, align 8, !tbaa !5
  %359 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %358, i32 0, i32 2
  %360 = load float, ptr %359, align 8, !tbaa !40
  %361 = fdiv float %357, %360
  %362 = load ptr, ptr %37, align 8, !tbaa !5
  %363 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %362, i32 0, i32 1
  %364 = load float, ptr %363, align 8, !tbaa !21
  %365 = fsub float %364, %361
  store float %365, ptr %363, align 8, !tbaa !21
  br label %366

366:                                              ; preds = %349, %343
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #7
  br label %367

367:                                              ; preds = %366, %319
  %368 = load float, ptr %38, align 4, !tbaa !9
  %369 = fcmp ogt float %368, 0.000000e+00
  br i1 %369, label %370, label %443

370:                                              ; preds = %367
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #7
  store float 0.000000e+00, ptr %40, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #7
  %371 = load ptr, ptr %37, align 8, !tbaa !5
  %372 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %371, i32 0, i32 1
  store ptr %372, ptr %41, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #7
  %373 = load ptr, ptr %41, align 8, !tbaa !5
  %374 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %373)
  store ptr %374, ptr %42, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #7
  %375 = load ptr, ptr %41, align 8, !tbaa !5
  %376 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %375)
  store ptr %376, ptr %43, align 8, !tbaa !5
  br label %377

377:                                              ; preds = %400, %370
  %378 = load ptr, ptr %42, align 8, !tbaa !5
  %379 = load ptr, ptr %43, align 8, !tbaa !5
  %380 = icmp ne ptr %378, %379
  br i1 %380, label %382, label %381

381:                                              ; preds = %377
  store i32 14, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #7
  br label %403

382:                                              ; preds = %377
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #7
  %383 = load ptr, ptr %42, align 8, !tbaa !5
  %384 = load i32, ptr %383, align 4, !tbaa !13
  store i32 %384, ptr %44, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #7
  %385 = load ptr, ptr %7, align 8, !tbaa !5
  %386 = load i32, ptr %44, align 4, !tbaa !13
  %387 = zext i32 %386 to i64
  %388 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %385, i64 noundef %387)
  %389 = load ptr, ptr %388, align 8, !tbaa !5
  store ptr %389, ptr %45, align 8, !tbaa !5
  %390 = load ptr, ptr %45, align 8, !tbaa !5
  %391 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %390)
  br i1 %391, label %392, label %399

392:                                              ; preds = %382
  %393 = load ptr, ptr %45, align 8, !tbaa !5
  %394 = call noundef ptr @_ZNK3JPH7WheelTV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(420) %393)
  %395 = getelementptr inbounds %"class.JPH::WheelSettings", ptr %394, i32 0, i32 13
  %396 = load float, ptr %395, align 8, !tbaa !44
  %397 = load float, ptr %40, align 4, !tbaa !9
  %398 = fadd float %397, %396
  store float %398, ptr %40, align 4, !tbaa !9
  br label %399

399:                                              ; preds = %392, %382
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #7
  br label %400

400:                                              ; preds = %399
  %401 = load ptr, ptr %42, align 8, !tbaa !5
  %402 = getelementptr inbounds i32, ptr %401, i32 1
  store ptr %402, ptr %42, align 8, !tbaa !5
  br label %377

403:                                              ; preds = %381
  %404 = load float, ptr %40, align 4, !tbaa !9
  %405 = fcmp ogt float %404, 0.000000e+00
  br i1 %405, label %406, label %442

406:                                              ; preds = %403
  %407 = load float, ptr %40, align 4, !tbaa !9
  %408 = load float, ptr %38, align 4, !tbaa !9
  %409 = fdiv float %408, %407
  store float %409, ptr %38, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #7
  %410 = load ptr, ptr %37, align 8, !tbaa !5
  %411 = getelementptr inbounds %"class.JPH::VehicleTrackSettings", ptr %410, i32 0, i32 1
  store ptr %411, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #7
  %412 = load ptr, ptr %46, align 8, !tbaa !5
  %413 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %412)
  store ptr %413, ptr %47, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #7
  %414 = load ptr, ptr %46, align 8, !tbaa !5
  %415 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %414)
  store ptr %415, ptr %48, align 8, !tbaa !5
  br label %416

416:                                              ; preds = %438, %406
  %417 = load ptr, ptr %47, align 8, !tbaa !5
  %418 = load ptr, ptr %48, align 8, !tbaa !5
  %419 = icmp ne ptr %417, %418
  br i1 %419, label %421, label %420

420:                                              ; preds = %416
  store i32 16, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #7
  br label %441

421:                                              ; preds = %416
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #7
  %422 = load ptr, ptr %47, align 8, !tbaa !5
  %423 = load i32, ptr %422, align 4, !tbaa !13
  store i32 %423, ptr %49, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #7
  %424 = load ptr, ptr %7, align 8, !tbaa !5
  %425 = load i32, ptr %49, align 4, !tbaa !13
  %426 = zext i32 %425 to i64
  %427 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %424, i64 noundef %426)
  %428 = load ptr, ptr %427, align 8, !tbaa !5
  store ptr %428, ptr %50, align 8, !tbaa !5
  %429 = load ptr, ptr %50, align 8, !tbaa !5
  %430 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %429)
  br i1 %430, label %431, label %437

431:                                              ; preds = %421
  %432 = load float, ptr %38, align 4, !tbaa !9
  %433 = load float, ptr %5, align 4, !tbaa !9
  %434 = fmul float %432, %433
  %435 = load ptr, ptr %50, align 8, !tbaa !5
  %436 = getelementptr inbounds %"class.JPH::WheelTV", ptr %435, i32 0, i32 4
  store float %434, ptr %436, align 16, !tbaa !53
  br label %437

437:                                              ; preds = %431, %421
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #7
  br label %438

438:                                              ; preds = %437
  %439 = load ptr, ptr %47, align 8, !tbaa !5
  %440 = getelementptr inbounds i32, ptr %439, i32 1
  store ptr %440, ptr %47, align 8, !tbaa !5
  br label %416

441:                                              ; preds = %420
  br label %442

442:                                              ; preds = %441, %403
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  br label %443

443:                                              ; preds = %442, %367
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #7
  br label %444

444:                                              ; preds = %443
  %445 = load ptr, ptr %35, align 8, !tbaa !5
  %446 = getelementptr inbounds %"class.JPH::VehicleTrack", ptr %445, i32 1
  store ptr %446, ptr %35, align 8, !tbaa !5
  br label %314

447:                                              ; preds = %318
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #7
  %448 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %448, ptr %51, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #7
  %449 = load ptr, ptr %51, align 8, !tbaa !5
  %450 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %449)
  store ptr %450, ptr %52, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #7
  %451 = load ptr, ptr %51, align 8, !tbaa !5
  %452 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %451)
  store ptr %452, ptr %53, align 8, !tbaa !5
  br label %453

453:                                              ; preds = %465, %447
  %454 = load ptr, ptr %52, align 8, !tbaa !5
  %455 = load ptr, ptr %53, align 8, !tbaa !5
  %456 = icmp ne ptr %454, %455
  br i1 %456, label %458, label %457

457:                                              ; preds = %453
  store i32 18, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #7
  br label %468

458:                                              ; preds = %453
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #7
  %459 = load ptr, ptr %52, align 8, !tbaa !5
  %460 = load ptr, ptr %459, align 8, !tbaa !5
  store ptr %460, ptr %54, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #7
  %461 = load ptr, ptr %54, align 8, !tbaa !5
  store ptr %461, ptr %55, align 8, !tbaa !5
  %462 = load ptr, ptr %55, align 8, !tbaa !5
  %463 = getelementptr inbounds %"class.JPH::VehicleController", ptr %56, i32 0, i32 1
  %464 = load ptr, ptr %463, align 8, !tbaa !11
  call void @_ZN3JPH7WheelTV24CalculateAngularVelocityERKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420) %462, ptr noundef nonnull align 16 dereferenceable(408) %464)
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #7
  br label %465

465:                                              ; preds = %458
  %466 = load ptr, ptr %52, align 8, !tbaa !5
  %467 = getelementptr inbounds ptr, ptr %466, i32 1
  store ptr %467, ptr %52, align 8, !tbaa !5
  br label %453

468:                                              ; preds = %457
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 1, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  ret void
}

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

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

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

declare noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100)) #5

; 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)) #3

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

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

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

declare void @_ZN3JPH13VehicleEngine12ApplyDampingEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) #5

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

declare void @_ZN3JPH13VehicleEngine11ApplyTorqueEff(ptr noundef nonnull align 8 dereferenceable(52), float noundef, float noundef) #5

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) #1 align 2

declare void @_ZN3JPH19VehicleTransmission6UpdateEfffb(ptr noundef nonnull align 8 dereferenceable(100), float noundef, float noundef, float noundef, i1 noundef zeroext) #5

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

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

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

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress uwtable "min-legal-vector-width"="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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { 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, !14, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = !{!18, !18, i64 0}
!18 = !{!"bool", !7, i64 0}
!19 = !{i8 0, i8 2}
!20 = !{}
!21 = !{!22, !10, i64 48}
!22 = !{!"_ZTSN3JPH12VehicleTrackE", !23, i64 0, !10, i64 48}
!23 = !{!"_ZTSN3JPH20VehicleTrackSettingsE", !14, i64 0, !24, i64 8, !10, i64 32, !10, i64 36, !10, i64 40, !10, i64 44}
!24 = !{!"_ZTSN3JPH5ArrayIjNS_12STLAllocatorIjEEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!25 = !{!"long", !7, i64 0}
!26 = !{!23, !10, i64 44}
!27 = !{!28, !29, i64 0}
!28 = !{!"_ZTSN3JPH27VehicleTransmissionSettingsE", !29, i64 0, !30, i64 8, !30, i64 32, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76}
!29 = !{!"_ZTSN3JPH17ETransmissionModeE", !7, i64 0}
!30 = !{!"_ZTSN3JPH5ArrayIfNS_12STLAllocatorIfEEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!31 = !{!32, !10, i64 16}
!32 = !{!"_ZTSN3JPH24TrackedVehicleControllerE", !12, i64 0, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !33, i64 32, !37, i64 88, !7, i64 192}
!33 = !{!"_ZTSN3JPH13VehicleEngineE", !34, i64 0, !10, i64 48}
!34 = !{!"_ZTSN3JPH21VehicleEngineSettingsE", !10, i64 0, !10, i64 4, !10, i64 8, !35, i64 16, !10, i64 40, !10, i64 44}
!35 = !{!"_ZTSN3JPH11LinearCurveE", !36, i64 0}
!36 = !{!"_ZTSN3JPH5ArrayINS_11LinearCurve5PointENS_12STLAllocatorIS2_EEEE", !25, i64 0, !25, i64 8, !6, i64 16}
!37 = !{!"_ZTSN3JPH19VehicleTransmissionE", !28, i64 0, !14, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96}
!38 = !{!32, !10, i64 20}
!39 = !{!32, !10, i64 24}
!40 = !{!23, !10, i64 32}
!41 = distinct !{!41, !16}
!42 = !{!32, !10, i64 28}
!43 = !{!23, !10, i64 40}
!44 = !{!45, !10, i64 136}
!45 = !{!"_ZTSN3JPH13WheelSettingsE", !46, i64 0, !47, i64 8, !50, i64 16, !50, i64 32, !50, i64 48, !50, i64 64, !50, i64 80, !50, i64 96, !10, i64 112, !10, i64 116, !10, i64 120, !51, i64 124, !10, i64 136, !10, i64 140, !18, i64 144}
!46 = !{!"_ZTSN3JPH18SerializableObjectE"}
!47 = !{!"_ZTSN3JPH9RefTargetINS_13WheelSettingsEEE", !48, i64 0}
!48 = !{!"_ZTSSt6atomicIjE", !49, i64 0}
!49 = !{!"_ZTSSt13__atomic_baseIjE", !14, i64 0}
!50 = !{!"_ZTSN3JPH4Vec3E", !7, i64 0}
!51 = !{!"_ZTSN3JPH14SpringSettingsE", !52, i64 0, !7, i64 4, !10, i64 8}
!52 = !{!"_ZTSN3JPH11ESpringModeE", !7, i64 0}
!53 = !{!54, !10, i64 416}
!54 = !{!"_ZTSN3JPH7WheelTVE", !55, i64 0, !14, i64 404, !10, i64 408, !10, i64 412, !10, i64 416}
!55 = !{!"_ZTSN3JPH5WheelE", !56, i64 8, !57, i64 16, !58, i64 20, !6, i64 24, !10, i64 32, !50, i64 48, !50, i64 64, !50, i64 80, !50, i64 96, !50, i64 112, !10, i64 128, !10, i64 132, !10, i64 136, !10, i64 140, !10, i64 144, !59, i64 148, !59, i64 212, !59, i64 276, !59, i64 340}
!56 = !{!"_ZTSN3JPH8RefConstINS_13WheelSettingsEEE", !6, i64 0}
!57 = !{!"_ZTSN3JPH6BodyIDE", !14, i64 0}
!58 = !{!"_ZTSN3JPH10SubShapeIDE", !14, i64 0}
!59 = !{!"_ZTSN3JPH18AxisConstraintPartE", !60, i64 0, !60, i64 12, !60, i64 24, !60, i64 36, !10, i64 48, !61, i64 52, !10, i64 60}
!60 = !{!"_ZTSN3JPH6Float3E", !10, i64 0, !10, i64 4, !10, i64 8}
!61 = !{!"_ZTSN3JPH10SpringPartE", !10, i64 0, !10, i64 4}


; 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::VehicleTrack" = type <{ %"class.JPH::VehicleTrackSettings", float, [4 x i8] }>
%"class.JPH::VehicleTrackSettings" = type { i32, %"class.JPH::Array.5", float, float, float, float }
%"class.JPH::Array.5" = type { i64, i64, ptr }

; 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: mustprogress uwtable
declare dso_local void @_ZN3JPH7WheelTV24CalculateAngularVelocityERKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420), ptr noundef nonnull align 16 dereferenceable(408)) local_unnamed_addr #1 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH7WheelTV6UpdateEjfRKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420), i32 noundef, float noundef, ptr noundef nonnull align 16 dereferenceable(408)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3JPH13VehicleEngine13SetCurrentRPMEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZSt4sizeIN3JPH12VehicleTrackELm2EEmRAT0__KT_(ptr noundef nonnull align 8 dereferenceable(112)) local_unnamed_addr #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 #2 align 2

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

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

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

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

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

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN3JPH24TrackedVehicleController11PostCollideEfRNS_13PhysicsSystemE(ptr noundef nonnull align 8 dereferenceable(304) %0, float noundef %1, ptr nocapture noundef nonnull readnone align 16 dereferenceable(1172) %2) unnamed_addr #1 align 2 {
  %4 = alloca float, align 4
  %5 = alloca float, align 4
  %6 = alloca float, align 4
  %7 = getelementptr inbounds i8, ptr %0, i64 8
  %8 = load ptr, ptr %7, align 8, !tbaa !5
  %9 = tail call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3JPH17VehicleConstraint9GetWheelsEv(ptr noundef nonnull align 16 dereferenceable(408) %8)
  %10 = tail call noundef i64 @_ZNK3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %9)
  %11 = and i64 %10, 4294967295
  %.not180 = icmp eq i64 %11, 0
  br i1 %.not180, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %3
  %wide.trip.count = and i64 %10, 4294967295
  br label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %3
  %12 = getelementptr inbounds i8, ptr %0, i64 88
  %13 = tail call noundef i32 @_ZNK3JPH19VehicleTransmission14GetCurrentGearEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %.not = icmp eq i32 %13, 0
  br i1 %.not, label %96, label %18

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %14 = tail call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %indvars.iv)
  %15 = load ptr, ptr %14, align 8, !tbaa !10
  %16 = load ptr, ptr %7, align 8, !tbaa !5
  %17 = trunc nuw i64 %indvars.iv to i32
  tail call void @_ZN3JPH7WheelTV6UpdateEjfRKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420) %15, i32 noundef %17, float noundef %1, ptr noundef nonnull align 16 dereferenceable(408) %16)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !11

18:                                               ; preds = %._crit_edge
  %19 = tail call noundef float @_ZNK3JPH19VehicleTransmission17GetClutchFrictionEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %20 = fcmp ogt float %19, 0x3F50624DE0000000
  br i1 %20, label %21, label %96

21:                                               ; preds = %18
  %22 = tail call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %23 = fcmp oge float %22, 0.000000e+00
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #8
  %24 = select i1 %23, float 0xC7EFFFFFE0000000, float 0x47EFFFFFE0000000
  store float %24, ptr %4, align 4, !tbaa !13
  %25 = getelementptr inbounds i8, ptr %0, i64 240
  %26 = getelementptr inbounds i8, ptr %0, i64 236
  %27 = getelementptr inbounds i8, ptr %0, i64 200
  br i1 %23, label %.split.us.preheader, label %.split.preheader

.split.preheader:                                 ; preds = %21
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #8
  %28 = load float, ptr %25, align 8, !tbaa !15
  %29 = load float, ptr %26, align 4, !tbaa !21
  %30 = fmul float %28, %29
  store float %30, ptr %6, align 4, !tbaa !13
  %31 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 4 dereferenceable(4) %6)
  %32 = load float, ptr %31, align 4, !tbaa !13
  store float %32, ptr %4, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #8
  %33 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %27)
  %34 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %27)
  %.not143147 = icmp eq ptr %33, %34
  br i1 %.not143147, label %._crit_edge151, label %.lr.ph150

.split.us.preheader:                              ; preds = %21
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  %35 = load float, ptr %25, align 8, !tbaa !15
  %36 = load float, ptr %26, align 4, !tbaa !21
  %37 = fmul float %35, %36
  store float %37, ptr %5, align 4, !tbaa !13
  %38 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 4 dereferenceable(4) %5)
  %39 = load float, ptr %38, align 4, !tbaa !13
  store float %39, ptr %4, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  %40 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %27)
  %41 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %27)
  %.not143147.us = icmp eq ptr %40, %41
  br i1 %.not143147.us, label %._crit_edge151.us, label %.lr.ph150.us

.lr.ph150.us:                                     ; preds = %.split.us.preheader, %.lr.ph150.us
  %.0121148.us = phi ptr [ %47, %.lr.ph150.us ], [ %40, %.split.us.preheader ]
  %42 = load i32, ptr %.0121148.us, align 4, !tbaa !22
  %43 = zext i32 %42 to i64
  %44 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %43)
  %45 = load ptr, ptr %44, align 8, !tbaa !10
  %46 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %45)
  %47 = getelementptr inbounds i8, ptr %.0121148.us, i64 4
  %.not143.us = icmp eq ptr %47, %41
  %or.cond191 = select i1 %46, i1 true, i1 %.not143.us
  br i1 %or.cond191, label %._crit_edge151.us, label %.lr.ph150.us

._crit_edge151.us:                                ; preds = %.lr.ph150.us, %.split.us.preheader
  %.3.us = phi i1 [ false, %.split.us.preheader ], [ %46, %.lr.ph150.us ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %5) #8
  %48 = getelementptr inbounds i8, ptr %0, i64 296
  %49 = load float, ptr %48, align 8, !tbaa !15
  %50 = getelementptr inbounds i8, ptr %0, i64 292
  %51 = load float, ptr %50, align 4, !tbaa !21
  %52 = fmul float %49, %51
  store float %52, ptr %5, align 4, !tbaa !13
  %53 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3maxIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 4 dereferenceable(4) %5)
  %54 = load float, ptr %53, align 4, !tbaa !13
  store float %54, ptr %4, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %5) #8
  %55 = getelementptr inbounds i8, ptr %0, i64 256
  %56 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %55)
  %57 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %55)
  %.not143147.us.1 = icmp eq ptr %56, %57
  br i1 %.not143147.us.1, label %.split159.us, label %.lr.ph150.us.1

.lr.ph150.us.1:                                   ; preds = %._crit_edge151.us, %63
  %.0121148.us.1 = phi ptr [ %64, %63 ], [ %56, %._crit_edge151.us ]
  %58 = load i32, ptr %.0121148.us.1, align 4, !tbaa !22
  %59 = zext i32 %58 to i64
  %60 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %59)
  %61 = load ptr, ptr %60, align 8, !tbaa !10
  %62 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %61)
  br i1 %62, label %.split159.us, label %63

63:                                               ; preds = %.lr.ph150.us.1
  %64 = getelementptr inbounds i8, ptr %.0121148.us.1, i64 4
  %.not143.us.1 = icmp eq ptr %64, %57
  br i1 %.not143.us.1, label %.split159.us, label %.lr.ph150.us.1

.split159.us:                                     ; preds = %88, %.lr.ph150.1, %63, %.lr.ph150.us.1, %._crit_edge151, %._crit_edge151.us
  %.us-phi = phi i1 [ %.3.us, %._crit_edge151.us ], [ %.3, %._crit_edge151 ], [ %.3.us, %63 ], [ true, %.lr.ph150.us.1 ], [ %.3, %88 ], [ true, %.lr.ph150.1 ]
  %65 = load float, ptr %4, align 4
  %66 = call float @llvm.fabs.f32(float %65)
  %or.cond = fcmp olt float %66, 0x47EFFFFFE0000000
  br i1 %or.cond, label %90, label %95

.lr.ph150:                                        ; preds = %.split.preheader, %.lr.ph150
  %.0121148 = phi ptr [ %72, %.lr.ph150 ], [ %33, %.split.preheader ]
  %67 = load i32, ptr %.0121148, align 4, !tbaa !22
  %68 = zext i32 %67 to i64
  %69 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %68)
  %70 = load ptr, ptr %69, align 8, !tbaa !10
  %71 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %70)
  %72 = getelementptr inbounds i8, ptr %.0121148, i64 4
  %.not143 = icmp eq ptr %72, %34
  %or.cond192 = select i1 %71, i1 true, i1 %.not143
  br i1 %or.cond192, label %._crit_edge151, label %.lr.ph150

._crit_edge151:                                   ; preds = %.lr.ph150, %.split.preheader
  %.3 = phi i1 [ false, %.split.preheader ], [ %71, %.lr.ph150 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #8
  %73 = getelementptr inbounds i8, ptr %0, i64 296
  %74 = load float, ptr %73, align 8, !tbaa !15
  %75 = getelementptr inbounds i8, ptr %0, i64 292
  %76 = load float, ptr %75, align 4, !tbaa !21
  %77 = fmul float %74, %76
  store float %77, ptr %6, align 4, !tbaa !13
  %78 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZSt3minIfERKT_S2_S2_(ptr noundef nonnull align 4 dereferenceable(4) %4, ptr noundef nonnull align 4 dereferenceable(4) %6)
  %79 = load float, ptr %78, align 4, !tbaa !13
  store float %79, ptr %4, align 4, !tbaa !13
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #8
  %80 = getelementptr inbounds i8, ptr %0, i64 256
  %81 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %80)
  %82 = call noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %80)
  %.not143147.1 = icmp eq ptr %81, %82
  br i1 %.not143147.1, label %.split159.us, label %.lr.ph150.1

.lr.ph150.1:                                      ; preds = %._crit_edge151, %88
  %.0121148.1 = phi ptr [ %89, %88 ], [ %81, %._crit_edge151 ]
  %83 = load i32, ptr %.0121148.1, align 4, !tbaa !22
  %84 = zext i32 %83 to i64
  %85 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %84)
  %86 = load ptr, ptr %85, align 8, !tbaa !10
  %87 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %86)
  br i1 %87, label %.split159.us, label %88

88:                                               ; preds = %.lr.ph150.1
  %89 = getelementptr inbounds i8, ptr %.0121148.1, i64 4
  %.not143.1 = icmp eq ptr %89, %82
  br i1 %.not143.1, label %.split159.us, label %.lr.ph150.1

90:                                               ; preds = %.split159.us
  %91 = getelementptr inbounds i8, ptr %0, i64 32
  %92 = call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %93 = fmul float %65, %92
  %94 = fmul float %93, 0x4023193D60000000
  call void @_ZN3JPH13VehicleEngine13SetCurrentRPMEf(ptr noundef nonnull align 8 dereferenceable(52) %91, float noundef %94)
  br label %95

95:                                               ; preds = %90, %.split159.us
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #8
  br label %107

96:                                               ; preds = %18, %._crit_edge
  %97 = getelementptr inbounds i8, ptr %0, i64 32
  tail call void @_ZN3JPH13VehicleEngine12ApplyDampingEf(ptr noundef nonnull align 8 dereferenceable(52) %97, float noundef %1)
  %98 = load i8, ptr %12, align 8, !tbaa !23
  %99 = icmp eq i8 %98, 1
  br i1 %99, label %100, label %104

100:                                              ; preds = %96
  %101 = getelementptr inbounds i8, ptr %0, i64 16
  %102 = load float, ptr %101, align 8, !tbaa !27
  %103 = tail call noundef float @_ZSt3absf(float noundef %102)
  br label %104

104:                                              ; preds = %96, %100
  %105 = phi float [ %103, %100 ], [ 0.000000e+00, %96 ]
  %106 = tail call noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52) %97, float noundef %105)
  tail call void @_ZN3JPH13VehicleEngine11ApplyTorqueEff(ptr noundef nonnull align 8 dereferenceable(52) %97, float noundef %106, float noundef %1)
  br label %107

107:                                              ; preds = %104, %95
  %.4 = phi i1 [ %.us-phi, %95 ], [ false, %104 ]
  %108 = getelementptr inbounds i8, ptr %0, i64 32
  %109 = call noundef float @_ZNK3JPH13VehicleEngine13GetCurrentRPMEv(ptr noundef nonnull align 8 dereferenceable(52) %108)
  %110 = getelementptr inbounds i8, ptr %0, i64 16
  %111 = load float, ptr %110, align 8, !tbaa !27
  %112 = getelementptr inbounds i8, ptr %0, i64 20
  %113 = load float, ptr %112, align 4, !tbaa !34
  %114 = getelementptr inbounds i8, ptr %0, i64 24
  %115 = load float, ptr %114, align 8, !tbaa !35
  %116 = fmul float %113, %115
  %117 = fcmp ogt float %116, 0.000000e+00
  %118 = and i1 %117, %.4
  call void @_ZN3JPH19VehicleTransmission6UpdateEfffb(ptr noundef nonnull align 8 dereferenceable(100) %12, float noundef %1, float noundef %109, float noundef %111, i1 noundef zeroext %118)
  %119 = call noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %120 = call noundef float @_ZNK3JPH19VehicleTransmission17GetClutchFrictionEv(ptr noundef nonnull align 8 dereferenceable(100) %12)
  %121 = fmul float %119, %120
  %122 = load float, ptr %110, align 8, !tbaa !27
  %123 = call noundef float @_ZSt3absf(float noundef %122)
  %124 = call noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52) %108, float noundef %123)
  %125 = fmul float %121, %124
  %126 = fcmp une float %125, 0.000000e+00
  br i1 %126, label %.preheader, label %.loopexit145

.preheader:                                       ; preds = %107
  %127 = getelementptr inbounds i8, ptr %0, i64 192
  %128 = call noundef i64 @_ZSt4sizeIN3JPH12VehicleTrackELm2EEmRAT0__KT_(ptr noundef nonnull align 8 dereferenceable(112) %127) #8
  %.not181 = icmp eq i64 %128, 0
  br i1 %.not181, label %.loopexit145, label %.lr.ph161

.lr.ph161:                                        ; preds = %.preheader, %158
  %129 = phi i64 [ %160, %158 ], [ 0, %.preheader ]
  %.0122160 = phi i32 [ %159, %158 ], [ 0, %.preheader ]
  %130 = getelementptr inbounds [2 x %"class.JPH::VehicleTrack"], ptr %127, i64 0, i64 %129
  %131 = icmp eq i32 %.0122160, 0
  %.val = load float, ptr %112, align 4
  %.val144 = load float, ptr %114, align 8
  %132 = select i1 %131, float %.val, float %.val144
  %133 = call noundef float @_ZNK3JPH13VehicleEngine13GetCurrentRPMEv(ptr noundef nonnull align 8 dereferenceable(52) %108)
  %134 = getelementptr inbounds i8, ptr %130, i64 44
  %135 = load float, ptr %134, align 4, !tbaa !21
  %136 = fmul float %119, %135
  %137 = fmul float %132, %136
  %138 = fmul float %137, 0x4023193D60000000
  %139 = fdiv float %133, %138
  %140 = fmul float %139, 0x3FF00418A0000000
  %141 = fmul float %132, %135
  %142 = fmul float %125, %141
  %143 = getelementptr inbounds i8, ptr %130, i64 48
  %144 = load float, ptr %143, align 8, !tbaa !15
  %145 = fmul float %144, %140
  %146 = fcmp olt float %145, 0.000000e+00
  br i1 %146, label %151, label %147

147:                                              ; preds = %.lr.ph161
  %148 = call noundef float @_ZSt3absf(float noundef %144)
  %149 = call noundef float @_ZSt3absf(float noundef %140)
  %150 = fcmp olt float %148, %149
  br i1 %150, label %._crit_edge184, label %158

._crit_edge184:                                   ; preds = %147
  %.pre = load float, ptr %143, align 8, !tbaa !15
  br label %151

151:                                              ; preds = %._crit_edge184, %.lr.ph161
  %152 = phi float [ %.pre, %._crit_edge184 ], [ %144, %.lr.ph161 ]
  %153 = fmul float %142, %1
  %154 = getelementptr inbounds i8, ptr %130, i64 32
  %155 = load float, ptr %154, align 8, !tbaa !36
  %156 = fdiv float %153, %155
  %157 = fadd float %152, %156
  store float %157, ptr %143, align 8, !tbaa !15
  br label %158

158:                                              ; preds = %151, %147
  %159 = add i32 %.0122160, 1
  %160 = zext i32 %159 to i64
  %161 = call noundef i64 @_ZSt4sizeIN3JPH12VehicleTrackELm2EEmRAT0__KT_(ptr noundef nonnull align 8 dereferenceable(112) %127) #8
  %162 = icmp ugt i64 %161, %160
  br i1 %162, label %.lr.ph161, label %.loopexit145, !llvm.loop !37

.loopexit145:                                     ; preds = %158, %.preheader, %107
  call void @_ZN3JPH24TrackedVehicleController19SyncLeftRightTracksEv(ptr noundef nonnull align 8 dereferenceable(304) %0)
  %163 = getelementptr inbounds i8, ptr %0, i64 28
  %164 = load float, ptr %163, align 4, !tbaa !38
  %165 = getelementptr inbounds i8, ptr %0, i64 232
  %166 = load float, ptr %165, align 8, !tbaa !39
  %167 = fmul float %164, %166
  %168 = fcmp ogt float %167, 0.000000e+00
  br i1 %168, label %169, label %189

169:                                              ; preds = %.loopexit145
  %170 = getelementptr inbounds i8, ptr %0, i64 240
  %171 = load float, ptr %170, align 8, !tbaa !15
  %172 = call noundef float @_ZSt3absf(float noundef %171)
  %173 = getelementptr inbounds i8, ptr %0, i64 224
  %174 = load float, ptr %173, align 8, !tbaa !36
  %175 = fmul float %172, %174
  %176 = fdiv float %175, %1
  %177 = fcmp ogt float %167, %176
  br i1 %177, label %178, label %180

178:                                              ; preds = %169
  store float 0.000000e+00, ptr %170, align 8, !tbaa !15
  %179 = fsub float %167, %176
  br label %189

180:                                              ; preds = %169
  %181 = load float, ptr %170, align 8, !tbaa !15
  %182 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %181)
  %183 = fmul float %167, %182
  %184 = fmul float %183, %1
  %185 = load float, ptr %173, align 8, !tbaa !36
  %186 = fdiv float %184, %185
  %187 = load float, ptr %170, align 8, !tbaa !15
  %188 = fsub float %187, %186
  store float %188, ptr %170, align 8, !tbaa !15
  br label %189

189:                                              ; preds = %178, %180, %.loopexit145
  %.1126 = phi float [ %167, %.loopexit145 ], [ %179, %178 ], [ %167, %180 ]
  %190 = fcmp ogt float %.1126, 0.000000e+00
  br i1 %190, label %191, label %.loopexit

191:                                              ; preds = %189
  %192 = getelementptr inbounds i8, ptr %0, i64 200
  %193 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %192)
  %194 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %192)
  %.not141162 = icmp eq ptr %193, %194
  br i1 %.not141162, label %.loopexit, label %.lr.ph166

._crit_edge167:                                   ; preds = %206
  %195 = fcmp ogt float %.1128, 0.000000e+00
  br i1 %195, label %208, label %.loopexit

.lr.ph166:                                        ; preds = %191, %206
  %.0127164 = phi float [ %.1128, %206 ], [ 0.000000e+00, %191 ]
  %.0129163 = phi ptr [ %207, %206 ], [ %193, %191 ]
  %196 = load i32, ptr %.0129163, align 4, !tbaa !22
  %197 = zext i32 %196 to i64
  %198 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %197)
  %199 = load ptr, ptr %198, align 8, !tbaa !10
  %200 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %199)
  br i1 %200, label %201, label %206

201:                                              ; preds = %.lr.ph166
  %202 = call noundef ptr @_ZNK3JPH7WheelTV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(420) %199)
  %203 = getelementptr inbounds i8, ptr %202, i64 136
  %204 = load float, ptr %203, align 8, !tbaa !40
  %205 = fadd float %.0127164, %204
  br label %206

206:                                              ; preds = %201, %.lr.ph166
  %.1128 = phi float [ %205, %201 ], [ %.0127164, %.lr.ph166 ]
  %207 = getelementptr inbounds i8, ptr %.0129163, i64 4
  %.not141 = icmp eq ptr %207, %194
  br i1 %.not141, label %._crit_edge167, label %.lr.ph166

208:                                              ; preds = %._crit_edge167
  %209 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %192)
  %210 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %192)
  %.not142168 = icmp eq ptr %209, %210
  br i1 %.not142168, label %.loopexit, label %.lr.ph171

.lr.ph171:                                        ; preds = %208
  %211 = fdiv float %.1126, %.1128
  %212 = fmul float %211, %1
  br label %213

213:                                              ; preds = %.lr.ph171, %221
  %.0124169 = phi ptr [ %209, %.lr.ph171 ], [ %222, %221 ]
  %214 = load i32, ptr %.0124169, align 4, !tbaa !22
  %215 = zext i32 %214 to i64
  %216 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %215)
  %217 = load ptr, ptr %216, align 8, !tbaa !10
  %218 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %217)
  br i1 %218, label %219, label %221

219:                                              ; preds = %213
  %220 = getelementptr inbounds i8, ptr %217, i64 416
  store float %212, ptr %220, align 16, !tbaa !50
  br label %221

221:                                              ; preds = %219, %213
  %222 = getelementptr inbounds i8, ptr %.0124169, i64 4
  %.not142 = icmp eq ptr %222, %210
  br i1 %.not142, label %.loopexit, label %213

.loopexit:                                        ; preds = %221, %191, %208, %._crit_edge167, %189
  %223 = load float, ptr %163, align 4, !tbaa !38
  %224 = getelementptr inbounds i8, ptr %0, i64 288
  %225 = load float, ptr %224, align 8, !tbaa !39
  %226 = fmul float %223, %225
  %227 = fcmp ogt float %226, 0.000000e+00
  br i1 %227, label %228, label %248

228:                                              ; preds = %.loopexit
  %229 = getelementptr inbounds i8, ptr %0, i64 296
  %230 = load float, ptr %229, align 8, !tbaa !15
  %231 = call noundef float @_ZSt3absf(float noundef %230)
  %232 = getelementptr inbounds i8, ptr %0, i64 280
  %233 = load float, ptr %232, align 8, !tbaa !36
  %234 = fmul float %231, %233
  %235 = fdiv float %234, %1
  %236 = fcmp ogt float %226, %235
  br i1 %236, label %246, label %237

237:                                              ; preds = %228
  %238 = load float, ptr %229, align 8, !tbaa !15
  %239 = call noundef float @_ZN3JPH4SignIfEET_S1_(float noundef %238)
  %240 = fmul float %226, %239
  %241 = fmul float %240, %1
  %242 = load float, ptr %232, align 8, !tbaa !36
  %243 = fdiv float %241, %242
  %244 = load float, ptr %229, align 8, !tbaa !15
  %245 = fsub float %244, %243
  store float %245, ptr %229, align 8, !tbaa !15
  br label %248

246:                                              ; preds = %228
  store float 0.000000e+00, ptr %229, align 8, !tbaa !15
  %247 = fsub float %226, %235
  br label %248

248:                                              ; preds = %246, %237, %.loopexit
  %.1126.1 = phi float [ %226, %.loopexit ], [ %247, %246 ], [ %226, %237 ]
  %249 = fcmp ogt float %.1126.1, 0.000000e+00
  br i1 %249, label %250, label %.loopexit.1

250:                                              ; preds = %248
  %251 = getelementptr inbounds i8, ptr %0, i64 256
  %252 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %251)
  %253 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %251)
  %.not141162.1 = icmp eq ptr %252, %253
  br i1 %.not141162.1, label %.loopexit.1, label %.lr.ph166.1

.lr.ph166.1:                                      ; preds = %250, %264
  %.0127164.1 = phi float [ %.1128.1, %264 ], [ 0.000000e+00, %250 ]
  %.0129163.1 = phi ptr [ %265, %264 ], [ %252, %250 ]
  %254 = load i32, ptr %.0129163.1, align 4, !tbaa !22
  %255 = zext i32 %254 to i64
  %256 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %255)
  %257 = load ptr, ptr %256, align 8, !tbaa !10
  %258 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %257)
  br i1 %258, label %259, label %264

259:                                              ; preds = %.lr.ph166.1
  %260 = call noundef ptr @_ZNK3JPH7WheelTV11GetSettingsEv(ptr noundef nonnull align 16 dereferenceable(420) %257)
  %261 = getelementptr inbounds i8, ptr %260, i64 136
  %262 = load float, ptr %261, align 8, !tbaa !40
  %263 = fadd float %.0127164.1, %262
  br label %264

264:                                              ; preds = %259, %.lr.ph166.1
  %.1128.1 = phi float [ %263, %259 ], [ %.0127164.1, %.lr.ph166.1 ]
  %265 = getelementptr inbounds i8, ptr %.0129163.1, i64 4
  %.not141.1 = icmp eq ptr %265, %253
  br i1 %.not141.1, label %._crit_edge167.1, label %.lr.ph166.1

._crit_edge167.1:                                 ; preds = %264
  %266 = fcmp ogt float %.1128.1, 0.000000e+00
  br i1 %266, label %267, label %.loopexit.1

267:                                              ; preds = %._crit_edge167.1
  %268 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %251)
  %269 = call noundef ptr @_ZN3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %251)
  %.not142168.1 = icmp eq ptr %268, %269
  br i1 %.not142168.1, label %.loopexit.1, label %.lr.ph171.1

.lr.ph171.1:                                      ; preds = %267
  %270 = fdiv float %.1126.1, %.1128.1
  %271 = fmul float %270, %1
  br label %272

272:                                              ; preds = %280, %.lr.ph171.1
  %.0124169.1 = phi ptr [ %268, %.lr.ph171.1 ], [ %281, %280 ]
  %273 = load i32, ptr %.0124169.1, align 4, !tbaa !22
  %274 = zext i32 %273 to i64
  %275 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %9, i64 noundef %274)
  %276 = load ptr, ptr %275, align 8, !tbaa !10
  %277 = call noundef zeroext i1 @_ZNK3JPH5Wheel10HasContactEv(ptr noundef nonnull align 16 dereferenceable(404) %276)
  br i1 %277, label %278, label %280

278:                                              ; preds = %272
  %279 = getelementptr inbounds i8, ptr %276, i64 416
  store float %271, ptr %279, align 16, !tbaa !50
  br label %280

280:                                              ; preds = %278, %272
  %281 = getelementptr inbounds i8, ptr %.0124169.1, i64 4
  %.not142.1 = icmp eq ptr %281, %269
  br i1 %.not142.1, label %.loopexit.1, label %272

.loopexit.1:                                      ; preds = %280, %250, %267, %._crit_edge167.1, %248
  %282 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE5beginEv(ptr noundef nonnull align 8 dereferenceable(24) %9)
  %283 = call noundef ptr @_ZN3JPH5ArrayIPNS_5WheelENS_12STLAllocatorIS2_EEE3endEv(ptr noundef nonnull align 8 dereferenceable(24) %9)
  %.not140175 = icmp eq ptr %282, %283
  br i1 %.not140175, label %._crit_edge179, label %.lr.ph178

._crit_edge179:                                   ; preds = %.lr.ph178, %.loopexit.1
  ret void

.lr.ph178:                                        ; preds = %.loopexit.1, %.lr.ph178
  %.0119176 = phi ptr [ %286, %.lr.ph178 ], [ %282, %.loopexit.1 ]
  %284 = load ptr, ptr %.0119176, align 8, !tbaa !10
  %285 = load ptr, ptr %7, align 8, !tbaa !5
  call void @_ZN3JPH7WheelTV24CalculateAngularVelocityERKNS_17VehicleConstraintE(ptr noundef nonnull align 16 dereferenceable(420) %284, ptr noundef nonnull align 16 dereferenceable(408) %285)
  %286 = getelementptr inbounds i8, ptr %.0119176, i64 8
  %.not140 = icmp eq ptr %286, %283
  br i1 %.not140, label %._crit_edge179, label %.lr.ph178
}

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZNK3JPH19VehicleTransmission14GetCurrentGearEv(ptr noundef nonnull align 8 dereferenceable(100)) local_unnamed_addr #2 align 2

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

declare noundef float @_ZNK3JPH19VehicleTransmission15GetCurrentRatioEv(ptr noundef nonnull align 8 dereferenceable(100)) local_unnamed_addr #5

; 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 #3

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZNK3JPH5ArrayIjNS_12STLAllocatorIjEEE3endEv(ptr noundef nonnull align 8 dereferenceable(24)) 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 #4 align 2

declare void @_ZN3JPH13VehicleEngine12ApplyDampingEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) local_unnamed_addr #5

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

declare void @_ZN3JPH13VehicleEngine11ApplyTorqueEff(ptr noundef nonnull align 8 dereferenceable(52), float noundef, float noundef) local_unnamed_addr #5

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZNK3JPH13VehicleEngine9GetTorqueEf(ptr noundef nonnull align 8 dereferenceable(52), float noundef) local_unnamed_addr #1 align 2

declare void @_ZN3JPH19VehicleTransmission6UpdateEfffb(ptr noundef nonnull align 8 dereferenceable(100), float noundef, float noundef, float noundef, i1 noundef zeroext) local_unnamed_addr #5

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

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

; 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 #3 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 #3 align 2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !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 = !{!7, !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = !{!14, !14, i64 0}
!14 = !{!"float", !8, i64 0}
!15 = !{!16, !14, i64 48}
!16 = !{!"_ZTSN3JPH12VehicleTrackE", !17, i64 0, !14, i64 48}
!17 = !{!"_ZTSN3JPH20VehicleTrackSettingsE", !18, i64 0, !19, i64 8, !14, i64 32, !14, i64 36, !14, i64 40, !14, i64 44}
!18 = !{!"int", !8, i64 0}
!19 = !{!"_ZTSN3JPH5ArrayIjNS_12STLAllocatorIjEEEE", !20, i64 0, !20, i64 8, !7, i64 16}
!20 = !{!"long", !8, i64 0}
!21 = !{!17, !14, i64 44}
!22 = !{!18, !18, i64 0}
!23 = !{!24, !25, i64 0}
!24 = !{!"_ZTSN3JPH27VehicleTransmissionSettingsE", !25, i64 0, !26, i64 8, !26, i64 32, !14, i64 56, !14, i64 60, !14, i64 64, !14, i64 68, !14, i64 72, !14, i64 76}
!25 = !{!"_ZTSN3JPH17ETransmissionModeE", !8, i64 0}
!26 = !{!"_ZTSN3JPH5ArrayIfNS_12STLAllocatorIfEEEE", !20, i64 0, !20, i64 8, !7, i64 16}
!27 = !{!28, !14, i64 16}
!28 = !{!"_ZTSN3JPH24TrackedVehicleControllerE", !6, i64 0, !14, i64 16, !14, i64 20, !14, i64 24, !14, i64 28, !29, i64 32, !33, i64 88, !8, i64 192}
!29 = !{!"_ZTSN3JPH13VehicleEngineE", !30, i64 0, !14, i64 48}
!30 = !{!"_ZTSN3JPH21VehicleEngineSettingsE", !14, i64 0, !14, i64 4, !14, i64 8, !31, i64 16, !14, i64 40, !14, i64 44}
!31 = !{!"_ZTSN3JPH11LinearCurveE", !32, i64 0}
!32 = !{!"_ZTSN3JPH5ArrayINS_11LinearCurve5PointENS_12STLAllocatorIS2_EEEE", !20, i64 0, !20, i64 8, !7, i64 16}
!33 = !{!"_ZTSN3JPH19VehicleTransmissionE", !24, i64 0, !18, i64 80, !14, i64 84, !14, i64 88, !14, i64 92, !14, i64 96}
!34 = !{!28, !14, i64 20}
!35 = !{!28, !14, i64 24}
!36 = !{!17, !14, i64 32}
!37 = distinct !{!37, !12}
!38 = !{!28, !14, i64 28}
!39 = !{!17, !14, i64 40}
!40 = !{!41, !14, i64 136}
!41 = !{!"_ZTSN3JPH13WheelSettingsE", !42, i64 0, !43, i64 8, !46, i64 16, !46, i64 32, !46, i64 48, !46, i64 64, !46, i64 80, !46, i64 96, !14, i64 112, !14, i64 116, !14, i64 120, !47, i64 124, !14, i64 136, !14, i64 140, !49, i64 144}
!42 = !{!"_ZTSN3JPH18SerializableObjectE"}
!43 = !{!"_ZTSN3JPH9RefTargetINS_13WheelSettingsEEE", !44, i64 0}
!44 = !{!"_ZTSSt6atomicIjE", !45, i64 0}
!45 = !{!"_ZTSSt13__atomic_baseIjE", !18, i64 0}
!46 = !{!"_ZTSN3JPH4Vec3E", !8, i64 0}
!47 = !{!"_ZTSN3JPH14SpringSettingsE", !48, i64 0, !8, i64 4, !14, i64 8}
!48 = !{!"_ZTSN3JPH11ESpringModeE", !8, i64 0}
!49 = !{!"bool", !8, i64 0}
!50 = !{!51, !14, i64 416}
!51 = !{!"_ZTSN3JPH7WheelTVE", !52, i64 0, !18, i64 404, !14, i64 408, !14, i64 412, !14, i64 416}
!52 = !{!"_ZTSN3JPH5WheelE", !53, i64 8, !54, i64 16, !55, i64 20, !7, i64 24, !14, i64 32, !46, i64 48, !46, i64 64, !46, i64 80, !46, i64 96, !46, i64 112, !14, i64 128, !14, i64 132, !14, i64 136, !14, i64 140, !14, i64 144, !56, i64 148, !56, i64 212, !56, i64 276, !56, i64 340}
!53 = !{!"_ZTSN3JPH8RefConstINS_13WheelSettingsEEE", !7, i64 0}
!54 = !{!"_ZTSN3JPH6BodyIDE", !18, i64 0}
!55 = !{!"_ZTSN3JPH10SubShapeIDE", !18, i64 0}
!56 = !{!"_ZTSN3JPH18AxisConstraintPartE", !57, i64 0, !57, i64 12, !57, i64 24, !57, i64 36, !14, i64 48, !58, i64 52, !14, i64 60}
!57 = !{!"_ZTSN3JPH6Float3E", !14, i64 0, !14, i64 4, !14, i64 8}
!58 = !{!"_ZTSN3JPH10SpringPartE", !14, i64 0, !14, i64 4}


; Effective O3 passes: AggressiveInstCombinePass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass