; LLVM IR from ebirenbaum/ParticleSolver :: gpu/src/particlesystem.ll (ZN14ParticleSystem15addStaticSphereE4int3S0_f)

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

%struct.float3 = type { float, float, float }
%struct.int3 = type { i32, i32, i32 }
%struct.float4 = type { float, float, float, float }
%"class.std::vector.5" = type { %"struct.std::_Vector_base.6" }
%"struct.std::_Vector_base.6" = type { %"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl" }
%"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl" = type { %"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl_data" }
%"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.std::vector.10" = type { %"struct.std::_Vector_base.11" }
%"struct.std::_Vector_base.11" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%struct.int2 = type { i32, i32 }
%class.ParticleSystem = type <{ i8, [3 x i8], float, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, ptr, %struct.SimParams, %struct.uint3, i32, i32, %"class.std::deque", %"class.std::deque", %"class.std::vector", %"class.std::vector.3", %struct.int3, %struct.int3, i32, [4 x i8] }>
%struct.SimParams = type { %struct.float3, float, float, %struct.uint3, i32, %struct.float3, %struct.float3, i32, i32 }
%struct.uint3 = type { i32, i32, i32 }
%"class.std::deque" = type { %"class.std::_Deque_base" }
%"class.std::_Deque_base" = type { %"struct.std::_Deque_base<float4, std::allocator<float4>>::_Deque_impl" }
%"struct.std::_Deque_base<float4, std::allocator<float4>>::_Deque_impl" = type { %"struct.std::_Deque_base<float4, std::allocator<float4>>::_Deque_impl_data" }
%"struct.std::_Deque_base<float4, std::allocator<float4>>::_Deque_impl_data" = type { ptr, i64, %"struct.std::_Deque_iterator", %"struct.std::_Deque_iterator" }
%"struct.std::_Deque_iterator" = type { ptr, ptr, ptr, ptr }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<int2, std::allocator<int2>>::_Vector_impl" }
%"struct.std::_Vector_base<int2, std::allocator<int2>>::_Vector_impl" = type { %"struct.std::_Vector_base<int2, std::allocator<int2>>::_Vector_impl_data" }
%"struct.std::_Vector_base<int2, std::allocator<int2>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.std::vector.3" = type { %"struct.std::_Vector_base.4" }
%"struct.std::_Vector_base.4" = type { %"struct.std::_Vector_base<float4, std::allocator<float4>>::_Vector_impl" }
%"struct.std::_Vector_base<float4, std::allocator<float4>>::_Vector_impl" = type { %"struct.std::_Vector_base<float4, std::allocator<float4>>::_Vector_impl_data" }
%"struct.std::_Vector_base<float4, std::allocator<float4>>::_Vector_impl_data" = type { ptr, ptr, ptr }

@_ZL6colors = external hidden global [8 x %struct.float3], align 16

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

declare i32 @__gxx_personality_v0(...)

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float3f(float noundef) #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden { <2 x float>, <2 x float> } @_ZL11make_float4ffff(float noundef, float noundef, float noundef, float noundef) #3

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, <2 x float> } @_Z11make_float46float3f(<2 x float>, float, float noundef) #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float36float4(<2 x float>, <2 x float>) #2

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden i64 @_ZL9make_int2ii(i32 noundef, i32 noundef) #3

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

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

; Function Attrs: nounwind
declare i32 @rand() #6

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden { i64, i32 } @_ZL9make_int3iii(i32 noundef, i32 noundef, i32 noundef) #3

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef) #3

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #7

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

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

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

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #7

declare void @addPointConstraint(ptr noundef, ptr noundef, i32 noundef) #10

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Zpl6float3S_(<2 x float>, float, <2 x float>, float) #2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14ParticleSystem15addStaticSphereE4int3S0_f(ptr noundef nonnull align 8 dereferenceable(412) %0, i64 %1, i32 %2, i64 %3, i32 %4, float noundef %5) #11 align 2 personality ptr @__gxx_personality_v0 {
  %7 = alloca %struct.int3, align 4
  %8 = alloca { i64, i32 }, align 4
  %9 = alloca %struct.int3, align 4
  %10 = alloca { i64, i32 }, align 4
  %11 = alloca ptr, align 8
  %12 = alloca float, align 4
  %13 = alloca i32, align 4
  %14 = alloca %struct.int3, align 4
  %15 = alloca { i64, i32 }, align 8
  %16 = alloca %struct.float4, align 16
  %17 = alloca float, align 4
  %18 = alloca %struct.float3, align 4
  %19 = alloca %struct.float3, align 4
  %20 = alloca %struct.int3, align 4
  %21 = alloca { i64, i32 }, align 4
  %22 = alloca { <2 x float>, float }, align 8
  %23 = alloca %struct.float3, align 4
  %24 = alloca { <2 x float>, float }, align 8
  %25 = alloca { <2 x float>, float }, align 4
  %26 = alloca { <2 x float>, float }, align 4
  %27 = alloca { <2 x float>, float }, align 8
  %28 = alloca %"class.std::vector.5", align 8
  %29 = alloca %"class.std::vector.10", align 8
  %30 = alloca %"class.std::vector.5", align 8
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca %struct.float4, align 16
  %37 = alloca ptr, align 8
  %38 = alloca i32, align 4
  %39 = alloca %struct.float3, align 4
  %40 = alloca %struct.float3, align 4
  %41 = alloca %struct.float4, align 16
  %42 = alloca { <2 x float>, float }, align 8
  %43 = alloca %struct.float3, align 4
  %44 = alloca { <2 x float>, float }, align 4
  %45 = alloca { <2 x float>, float }, align 4
  %46 = alloca { <2 x float>, float }, align 8
  %47 = alloca { <2 x float>, float }, align 4
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca ptr, align 8
  %51 = alloca i64, align 8
  %52 = alloca i64, align 8
  %53 = alloca i64, align 8
  %54 = alloca i64, align 8
  %55 = alloca float, align 4
  %56 = alloca float, align 4
  %57 = alloca i32, align 4
  %58 = alloca %struct.int2, align 8
  %59 = alloca %struct.float4, align 16
  %60 = alloca %struct.float3, align 4
  %61 = alloca { <2 x float>, float }, align 4
  %62 = getelementptr inbounds { i64, i32 }, ptr %8, i32 0, i32 0
  store i64 %1, ptr %62, align 4
  %63 = getelementptr inbounds { i64, i32 }, ptr %8, i32 0, i32 1
  store i32 %2, ptr %63, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %7, ptr align 4 %8, i64 12, i1 false)
  %64 = getelementptr inbounds { i64, i32 }, ptr %10, i32 0, i32 0
  store i64 %3, ptr %64, align 4
  %65 = getelementptr inbounds { i64, i32 }, ptr %10, i32 0, i32 1
  store i32 %4, ptr %65, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %9, ptr align 4 %10, i64 12, i1 false)
  store ptr %0, ptr %11, align 8, !tbaa !5
  store float %5, ptr %12, align 4, !tbaa !9
  %66 = load ptr, ptr %11, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #14
  %67 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 4
  %68 = load i32, ptr %67, align 4, !tbaa !11
  store i32 %68, ptr %13, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 12, ptr %14) #14
  %69 = getelementptr inbounds %struct.int3, ptr %9, i32 0, i32 0
  %70 = load i32, ptr %69, align 4, !tbaa !34
  %71 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 0
  %72 = load i32, ptr %71, align 4, !tbaa !34
  %73 = sub nsw i32 %70, %72
  %74 = call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %73)
  %75 = fptosi double %74 to i32
  %76 = sitofp i32 %75 to float
  %77 = load float, ptr %12, align 4, !tbaa !9
  %78 = fdiv float %76, %77
  %79 = fptosi float %78 to i32
  %80 = getelementptr inbounds %struct.int3, ptr %9, i32 0, i32 1
  %81 = load i32, ptr %80, align 4, !tbaa !35
  %82 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 1
  %83 = load i32, ptr %82, align 4, !tbaa !35
  %84 = sub nsw i32 %81, %83
  %85 = call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %84)
  %86 = fptosi double %85 to i32
  %87 = sitofp i32 %86 to float
  %88 = load float, ptr %12, align 4, !tbaa !9
  %89 = fdiv float %87, %88
  %90 = fptosi float %89 to i32
  %91 = getelementptr inbounds %struct.int3, ptr %9, i32 0, i32 2
  %92 = load i32, ptr %91, align 4, !tbaa !36
  %93 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 2
  %94 = load i32, ptr %93, align 4, !tbaa !36
  %95 = sub nsw i32 %92, %94
  %96 = call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %95)
  %97 = fptosi double %96 to i32
  %98 = sitofp i32 %97 to float
  %99 = load float, ptr %12, align 4, !tbaa !9
  %100 = fdiv float %98, %99
  %101 = fptosi float %100 to i32
  %102 = call { i64, i32 } @_ZL9make_int3iii(i32 noundef %79, i32 noundef %90, i32 noundef %101)
  store { i64, i32 } %102, ptr %15, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %14, ptr align 8 %15, i64 12, i1 false)
  call void @llvm.lifetime.start.p0(i64 16, ptr %16) #14
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #14
  %103 = getelementptr inbounds %struct.int3, ptr %9, i32 0, i32 0
  %104 = load i32, ptr %103, align 4, !tbaa !34
  %105 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 0
  %106 = load i32, ptr %105, align 4, !tbaa !34
  %107 = sub nsw i32 %104, %106
  %108 = sitofp i32 %107 to float
  %109 = fmul float %108, 5.000000e-01
  store float %109, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 12, ptr %18) #14
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %20, ptr align 4 %7, i64 12, i1 false), !tbaa.struct !37
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %21, ptr align 4 %20, i64 12, i1 false)
  %110 = getelementptr inbounds { i64, i32 }, ptr %21, i32 0, i32 0
  %111 = load i64, ptr %110, align 4
  %112 = getelementptr inbounds { i64, i32 }, ptr %21, i32 0, i32 1
  %113 = load i32, ptr %112, align 4
  %114 = call { <2 x float>, float } @_Z11make_float34int3(i64 %111, i32 %113)
  store { <2 x float>, float } %114, ptr %22, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %19, ptr align 8 %22, i64 12, i1 false)
  %115 = load float, ptr %17, align 4, !tbaa !9
  %116 = call { <2 x float>, float } @_Z11make_float3f(float noundef %115)
  store { <2 x float>, float } %116, ptr %24, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %23, ptr align 8 %24, i64 12, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %25, ptr align 4 %19, i64 12, i1 false)
  %117 = getelementptr inbounds { <2 x float>, float }, ptr %25, i32 0, i32 0
  %118 = load <2 x float>, ptr %117, align 4
  %119 = getelementptr inbounds { <2 x float>, float }, ptr %25, i32 0, i32 1
  %120 = load float, ptr %119, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %26, ptr align 4 %23, i64 12, i1 false)
  %121 = getelementptr inbounds { <2 x float>, float }, ptr %26, i32 0, i32 0
  %122 = load <2 x float>, ptr %121, align 4
  %123 = getelementptr inbounds { <2 x float>, float }, ptr %26, i32 0, i32 1
  %124 = load float, ptr %123, align 4
  %125 = call { <2 x float>, float } @_Zpl6float3S_(<2 x float> %118, float %120, <2 x float> %122, float %124)
  store { <2 x float>, float } %125, ptr %27, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %18, ptr align 8 %27, i64 12, i1 false)
  call void @llvm.lifetime.start.p0(i64 24, ptr %28) #14
  call void @_ZNSt6vectorIfSaIfEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %28) #14
  call void @llvm.lifetime.start.p0(i64 24, ptr %29) #14
  call void @_ZNSt6vectorIjSaIjEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  call void @llvm.lifetime.start.p0(i64 24, ptr %30) #14
  call void @_ZNSt6vectorIfSaIfEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %30) #14
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #14
  store i32 0, ptr %31, align 4, !tbaa !33
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #14
  store i32 0, ptr %32, align 4, !tbaa !33
  br label %126

126:                                              ; preds = %240, %6
  %127 = load i32, ptr %32, align 4, !tbaa !33
  %128 = getelementptr inbounds %struct.int3, ptr %14, i32 0, i32 2
  %129 = load i32, ptr %128, align 4, !tbaa !36
  %130 = icmp slt i32 %127, %129
  br i1 %130, label %132, label %131

131:                                              ; preds = %126
  store i32 2, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #14
  br label %243

132:                                              ; preds = %126
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #14
  store i32 0, ptr %34, align 4, !tbaa !33
  br label %133

133:                                              ; preds = %236, %132
  %134 = load i32, ptr %34, align 4, !tbaa !33
  %135 = getelementptr inbounds %struct.int3, ptr %14, i32 0, i32 1
  %136 = load i32, ptr %135, align 4, !tbaa !35
  %137 = icmp slt i32 %134, %136
  br i1 %137, label %139, label %138

138:                                              ; preds = %133
  store i32 5, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #14
  br label %239

139:                                              ; preds = %133
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #14
  store i32 0, ptr %35, align 4, !tbaa !33
  br label %140

140:                                              ; preds = %231, %139
  %141 = load i32, ptr %35, align 4, !tbaa !33
  %142 = getelementptr inbounds %struct.int3, ptr %14, i32 0, i32 0
  %143 = load i32, ptr %142, align 4, !tbaa !34
  %144 = icmp slt i32 %141, %143
  br i1 %144, label %146, label %145

145:                                              ; preds = %140
  store i32 8, ptr %33, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #14
  br label %235

146:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 16, ptr %36) #14
  %147 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 0
  %148 = load i32, ptr %147, align 4, !tbaa !34
  %149 = sitofp i32 %148 to float
  %150 = load i32, ptr %35, align 4, !tbaa !33
  %151 = sitofp i32 %150 to float
  %152 = load float, ptr %12, align 4, !tbaa !9
  %153 = call float @llvm.fmuladd.f32(float %151, float %152, float %149)
  %154 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 1
  %155 = load i32, ptr %154, align 4, !tbaa !35
  %156 = sitofp i32 %155 to float
  %157 = load i32, ptr %34, align 4, !tbaa !33
  %158 = sitofp i32 %157 to float
  %159 = load float, ptr %12, align 4, !tbaa !9
  %160 = call float @llvm.fmuladd.f32(float %158, float %159, float %156)
  %161 = getelementptr inbounds %struct.int3, ptr %7, i32 0, i32 2
  %162 = load i32, ptr %161, align 4, !tbaa !36
  %163 = sitofp i32 %162 to float
  %164 = load i32, ptr %32, align 4, !tbaa !33
  %165 = sitofp i32 %164 to float
  %166 = load float, ptr %12, align 4, !tbaa !9
  %167 = call float @llvm.fmuladd.f32(float %165, float %166, float %163)
  %168 = invoke { <2 x float>, <2 x float> } @_ZL11make_float4ffff(float noundef %153, float noundef %160, float noundef %167, float noundef 1.000000e+00)
          to label %169 unwind label %218

169:                                              ; preds = %146
  %170 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %36, i32 0, i32 0
  %171 = extractvalue { <2 x float>, <2 x float> } %168, 0
  store <2 x float> %171, ptr %170, align 16
  %172 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %36, i32 0, i32 1
  %173 = extractvalue { <2 x float>, <2 x float> } %168, 1
  store <2 x float> %173, ptr %172, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %16, ptr align 16 %36, i64 16, i1 false), !tbaa.struct !38
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #14
  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %41, ptr align 16 %16, i64 16, i1 false), !tbaa.struct !38
  %174 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %41, i32 0, i32 0
  %175 = load <2 x float>, ptr %174, align 16
  %176 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %41, i32 0, i32 1
  %177 = load <2 x float>, ptr %176, align 8
  %178 = invoke { <2 x float>, float } @_Z11make_float36float4(<2 x float> %175, <2 x float> %177)
          to label %179 unwind label %222

179:                                              ; preds = %169
  store { <2 x float>, float } %178, ptr %42, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %40, ptr align 8 %42, i64 12, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %43, ptr align 4 %18, i64 12, i1 false), !tbaa.struct !39
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %44, ptr align 4 %40, i64 12, i1 false)
  %180 = getelementptr inbounds { <2 x float>, float }, ptr %44, i32 0, i32 0
  %181 = load <2 x float>, ptr %180, align 4
  %182 = getelementptr inbounds { <2 x float>, float }, ptr %44, i32 0, i32 1
  %183 = load float, ptr %182, align 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %45, ptr align 4 %43, i64 12, i1 false)
  %184 = getelementptr inbounds { <2 x float>, float }, ptr %45, i32 0, i32 0
  %185 = load <2 x float>, ptr %184, align 4
  %186 = getelementptr inbounds { <2 x float>, float }, ptr %45, i32 0, i32 1
  %187 = load float, ptr %186, align 4
  %188 = invoke { <2 x float>, float } @_Zmi6float3S_(<2 x float> %181, float %183, <2 x float> %185, float %187)
          to label %189 unwind label %222

189:                                              ; preds = %179
  store { <2 x float>, float } %188, ptr %46, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %39, ptr align 8 %46, i64 12, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %47, ptr align 4 %39, i64 12, i1 false)
  %190 = getelementptr inbounds { <2 x float>, float }, ptr %47, i32 0, i32 0
  %191 = load <2 x float>, ptr %190, align 4
  %192 = getelementptr inbounds { <2 x float>, float }, ptr %47, i32 0, i32 1
  %193 = load float, ptr %192, align 4
  %194 = invoke noundef float @_Z6length6float3(<2 x float> %191, float %193)
          to label %195 unwind label %222

195:                                              ; preds = %189
  %196 = load float, ptr %17, align 4, !tbaa !9
  %197 = fcmp olt float %194, %196
  br i1 %197, label %198, label %230

198:                                              ; preds = %195
  %199 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 0
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %28, ptr noundef nonnull align 4 dereferenceable(4) %199)
          to label %200 unwind label %222

200:                                              ; preds = %198
  %201 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 1
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %28, ptr noundef nonnull align 4 dereferenceable(4) %201)
          to label %202 unwind label %222

202:                                              ; preds = %200
  %203 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 2
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %28, ptr noundef nonnull align 4 dereferenceable(4) %203)
          to label %204 unwind label %222

204:                                              ; preds = %202
  %205 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 3
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %28, ptr noundef nonnull align 4 dereferenceable(4) %205)
          to label %206 unwind label %222

206:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #14
  %207 = load i32, ptr %13, align 4, !tbaa !33
  %208 = load i32, ptr %31, align 4, !tbaa !33
  %209 = add i32 %208, 1
  store i32 %209, ptr %31, align 4, !tbaa !33
  %210 = add i32 %207, %208
  store i32 %210, ptr %48, align 4, !tbaa !33
  invoke void @_ZNSt6vectorIjSaIjEE9push_backEOj(ptr noundef nonnull align 8 dereferenceable(24) %29, ptr noundef nonnull align 4 dereferenceable(4) %48)
          to label %211 unwind label %226

211:                                              ; preds = %206
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #14
  %212 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 0
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 4 dereferenceable(4) %212)
          to label %213 unwind label %222

213:                                              ; preds = %211
  %214 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 1
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 4 dereferenceable(4) %214)
          to label %215 unwind label %222

215:                                              ; preds = %213
  %216 = getelementptr inbounds %struct.float4, ptr %16, i32 0, i32 2
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 4 dereferenceable(4) %216)
          to label %217 unwind label %222

217:                                              ; preds = %215
  br label %230

218:                                              ; preds = %146
  %219 = landingpad { ptr, i32 }
          cleanup
  %220 = extractvalue { ptr, i32 } %219, 0
  store ptr %220, ptr %37, align 8
  %221 = extractvalue { ptr, i32 } %219, 1
  store i32 %221, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %36) #14
  br label %234

222:                                              ; preds = %215, %213, %211, %204, %202, %200, %198, %189, %179, %169
  %223 = landingpad { ptr, i32 }
          cleanup
  %224 = extractvalue { ptr, i32 } %223, 0
  store ptr %224, ptr %37, align 8
  %225 = extractvalue { ptr, i32 } %223, 1
  store i32 %225, ptr %38, align 4
  br label %234

226:                                              ; preds = %206
  %227 = landingpad { ptr, i32 }
          cleanup
  %228 = extractvalue { ptr, i32 } %227, 0
  store ptr %228, ptr %37, align 8
  %229 = extractvalue { ptr, i32 } %227, 1
  store i32 %229, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #14
  br label %234

230:                                              ; preds = %217, %195
  br label %231

231:                                              ; preds = %230
  %232 = load i32, ptr %35, align 4, !tbaa !33
  %233 = add nsw i32 %232, 1
  store i32 %233, ptr %35, align 4, !tbaa !33
  br label %140, !llvm.loop !40

234:                                              ; preds = %226, %222, %218
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #14
  br label %339

235:                                              ; preds = %145
  br label %236

236:                                              ; preds = %235
  %237 = load i32, ptr %34, align 4, !tbaa !33
  %238 = add nsw i32 %237, 1
  store i32 %238, ptr %34, align 4, !tbaa !33
  br label %133, !llvm.loop !42

239:                                              ; preds = %138
  br label %240

240:                                              ; preds = %239
  %241 = load i32, ptr %32, align 4, !tbaa !33
  %242 = add nsw i32 %241, 1
  store i32 %242, ptr %32, align 4, !tbaa !33
  br label %126, !llvm.loop !43

243:                                              ; preds = %131
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #14
  %244 = call noundef i64 @_ZNKSt6vectorIjSaIjEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  %245 = trunc i64 %244 to i32
  store i32 %245, ptr %49, align 4, !tbaa !33
  %246 = load i32, ptr %49, align 4, !tbaa !33
  %247 = mul nsw i32 %246, 4
  %248 = zext i32 %247 to i64
  %249 = call ptr @llvm.stacksave.p0()
  store ptr %249, ptr %50, align 8
  %250 = alloca float, i64 %248, align 16
  store i64 %248, ptr %51, align 8
  %251 = load i32, ptr %49, align 4, !tbaa !33
  %252 = zext i32 %251 to i64
  %253 = alloca float, i64 %252, align 16
  store i64 %252, ptr %52, align 8
  %254 = load i32, ptr %49, align 4, !tbaa !33
  %255 = zext i32 %254 to i64
  %256 = alloca float, i64 %255, align 16
  store i64 %255, ptr %53, align 8
  %257 = load i32, ptr %49, align 4, !tbaa !33
  %258 = zext i32 %257 to i64
  %259 = alloca i32, i64 %258, align 16
  store i64 %258, ptr %54, align 8
  %260 = load i32, ptr %49, align 4, !tbaa !33
  %261 = mul nsw i32 %260, 4
  %262 = sext i32 %261 to i64
  %263 = mul i64 %262, 4
  call void @llvm.memset.p0.i64(ptr align 1 %250, i8 0, i64 %263, i1 false)
  %264 = load i32, ptr %49, align 4, !tbaa !33
  %265 = sext i32 %264 to i64
  %266 = getelementptr inbounds float, ptr %253, i64 %265
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #14
  store float 0x3F847AE140000000, ptr %55, align 4, !tbaa !9
  invoke void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef %253, ptr noundef %266, ptr noundef nonnull align 4 dereferenceable(4) %55)
          to label %267 unwind label %314

267:                                              ; preds = %243
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #14
  %268 = load i32, ptr %49, align 4, !tbaa !33
  %269 = sext i32 %268 to i64
  %270 = getelementptr inbounds float, ptr %256, i64 %269
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #14
  store float 1.000000e+00, ptr %56, align 4, !tbaa !9
  invoke void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef %256, ptr noundef %270, ptr noundef nonnull align 4 dereferenceable(4) %56)
          to label %271 unwind label %318

271:                                              ; preds = %267
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #14
  %272 = load i32, ptr %49, align 4, !tbaa !33
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds i32, ptr %259, i64 %273
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #14
  %275 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 18
  %276 = load i32, ptr %275, align 4, !tbaa !44
  %277 = add nsw i32 4, %276
  store i32 %277, ptr %57, align 4, !tbaa !33
  invoke void @_ZSt4fillIPiiEvT_S1_RKT0_(ptr noundef %259, ptr noundef %274, ptr noundef nonnull align 4 dereferenceable(4) %57)
          to label %278 unwind label %322

278:                                              ; preds = %271
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #14
  %279 = call noundef ptr @_ZNSt6vectorIfSaIfEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %28) #14
  %280 = load i32, ptr %49, align 4, !tbaa !33
  invoke void @_ZN14ParticleSystem19addParticleMultipleEPfS0_S0_S0_Pii(ptr noundef nonnull align 8 dereferenceable(412) %66, ptr noundef %279, ptr noundef %250, ptr noundef %253, ptr noundef %256, ptr noundef %259, i32 noundef %280)
          to label %281 unwind label %326

281:                                              ; preds = %278
  %282 = call noundef ptr @_ZNSt6vectorIjSaIjEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  %283 = call noundef ptr @_ZNSt6vectorIfSaIfEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %30) #14
  %284 = call noundef i64 @_ZNKSt6vectorIjSaIjEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  %285 = trunc i64 %284 to i32
  invoke void @addPointConstraint(ptr noundef %282, ptr noundef %283, i32 noundef %285)
          to label %286 unwind label %326

286:                                              ; preds = %281
  %287 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 21
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #14
  %288 = load i32, ptr %13, align 4, !tbaa !33
  %289 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 4
  %290 = load i32, ptr %289, align 4, !tbaa !11
  %291 = invoke i64 @_ZL9make_int2ii(i32 noundef %288, i32 noundef %290)
          to label %292 unwind label %330

292:                                              ; preds = %286
  store i64 %291, ptr %58, align 8
  invoke void @_ZNSt6vectorI4int2SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %287, ptr noundef nonnull align 8 dereferenceable(8) %58)
          to label %293 unwind label %330

293:                                              ; preds = %292
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #14
  %294 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 22
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #14
  %295 = call i32 @rand() #14
  %296 = srem i32 %295, 8
  %297 = sext i32 %296 to i64
  %298 = getelementptr inbounds [8 x %struct.float3], ptr @_ZL6colors, i64 0, i64 %297
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %60, ptr align 4 %298, i64 12, i1 false), !tbaa.struct !39
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %61, ptr align 4 %60, i64 12, i1 false)
  %299 = getelementptr inbounds { <2 x float>, float }, ptr %61, i32 0, i32 0
  %300 = load <2 x float>, ptr %299, align 4
  %301 = getelementptr inbounds { <2 x float>, float }, ptr %61, i32 0, i32 1
  %302 = load float, ptr %301, align 4
  %303 = invoke { <2 x float>, <2 x float> } @_Z11make_float46float3f(<2 x float> %300, float %302, float noundef 1.000000e+00)
          to label %304 unwind label %334

304:                                              ; preds = %293
  %305 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %59, i32 0, i32 0
  %306 = extractvalue { <2 x float>, <2 x float> } %303, 0
  store <2 x float> %306, ptr %305, align 16
  %307 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %59, i32 0, i32 1
  %308 = extractvalue { <2 x float>, <2 x float> } %303, 1
  store <2 x float> %308, ptr %307, align 8
  invoke void @_ZNSt6vectorI6float4SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %294, ptr noundef nonnull align 16 dereferenceable(16) %59)
          to label %309 unwind label %334

309:                                              ; preds = %304
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #14
  %310 = getelementptr inbounds %class.ParticleSystem, ptr %66, i32 0, i32 18
  %311 = load i32, ptr %310, align 4, !tbaa !44
  %312 = add nsw i32 %311, 1
  store i32 %312, ptr %310, align 4, !tbaa !44
  %313 = load ptr, ptr %50, align 8
  call void @llvm.stackrestore.p0(ptr %313)
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #14
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %30) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #14
  call void @_ZNSt6vectorIjSaIjEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %29) #14
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %28) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %28) #14
  call void @llvm.lifetime.end.p0(i64 12, ptr %18) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #14
  call void @llvm.lifetime.end.p0(i64 16, ptr %16) #14
  call void @llvm.lifetime.end.p0(i64 12, ptr %14) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #14
  ret void

314:                                              ; preds = %243
  %315 = landingpad { ptr, i32 }
          cleanup
  %316 = extractvalue { ptr, i32 } %315, 0
  store ptr %316, ptr %37, align 8
  %317 = extractvalue { ptr, i32 } %315, 1
  store i32 %317, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #14
  br label %338

318:                                              ; preds = %267
  %319 = landingpad { ptr, i32 }
          cleanup
  %320 = extractvalue { ptr, i32 } %319, 0
  store ptr %320, ptr %37, align 8
  %321 = extractvalue { ptr, i32 } %319, 1
  store i32 %321, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #14
  br label %338

322:                                              ; preds = %271
  %323 = landingpad { ptr, i32 }
          cleanup
  %324 = extractvalue { ptr, i32 } %323, 0
  store ptr %324, ptr %37, align 8
  %325 = extractvalue { ptr, i32 } %323, 1
  store i32 %325, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #14
  br label %338

326:                                              ; preds = %281, %278
  %327 = landingpad { ptr, i32 }
          cleanup
  %328 = extractvalue { ptr, i32 } %327, 0
  store ptr %328, ptr %37, align 8
  %329 = extractvalue { ptr, i32 } %327, 1
  store i32 %329, ptr %38, align 4
  br label %338

330:                                              ; preds = %292, %286
  %331 = landingpad { ptr, i32 }
          cleanup
  %332 = extractvalue { ptr, i32 } %331, 0
  store ptr %332, ptr %37, align 8
  %333 = extractvalue { ptr, i32 } %331, 1
  store i32 %333, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #14
  br label %338

334:                                              ; preds = %304, %293
  %335 = landingpad { ptr, i32 }
          cleanup
  %336 = extractvalue { ptr, i32 } %335, 0
  store ptr %336, ptr %37, align 8
  %337 = extractvalue { ptr, i32 } %335, 1
  store i32 %337, ptr %38, align 4
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #14
  br label %338

338:                                              ; preds = %334, %330, %326, %322, %318, %314
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #14
  br label %339

339:                                              ; preds = %338, %234
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #14
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %30) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #14
  call void @_ZNSt6vectorIjSaIjEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %29) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %29) #14
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %28) #14
  call void @llvm.lifetime.end.p0(i64 24, ptr %28) #14
  call void @llvm.lifetime.end.p0(i64 12, ptr %18) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #14
  call void @llvm.lifetime.end.p0(i64 16, ptr %16) #14
  call void @llvm.lifetime.end.p0(i64 12, ptr %14) #14
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #14
  br label %340

340:                                              ; preds = %339
  %341 = load ptr, ptr %37, align 8
  %342 = load i32, ptr %38, align 4
  %343 = insertvalue { ptr, i32 } poison, ptr %341, 0
  %344 = insertvalue { ptr, i32 } %343, i32 %342, 1
  resume { ptr, i32 } %344
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float34int3(i64, i32) #2

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef float @_Z6length6float3(<2 x float>, float) #13

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Zmi6float3S_(<2 x float>, float, <2 x float>, float) #2

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

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

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

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

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

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

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

attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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 = { 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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { nounwind "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 willreturn }
attributes #8 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #9 = { 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 #10 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #11 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #12 = { 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 #13 = { inlinehint mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #14 = { 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, !14, i64 12}
!12 = !{!"_ZTS14ParticleSystem", !13, i64 0, !10, i64 4, !14, i64 8, !14, i64 12, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !14, i64 72, !14, i64 76, !6, i64 80, !15, i64 88, !17, i64 156, !14, i64 168, !14, i64 172, !18, i64 176, !18, i64 256, !24, i64 336, !28, i64 360, !32, i64 384, !32, i64 396, !14, i64 408}
!13 = !{!"bool", !7, i64 0}
!14 = !{!"int", !7, i64 0}
!15 = !{!"_ZTS9SimParams", !16, i64 0, !10, i64 12, !10, i64 16, !17, i64 20, !14, i64 32, !16, i64 36, !16, i64 48, !14, i64 60, !14, i64 64}
!16 = !{!"_ZTS6float3", !10, i64 0, !10, i64 4, !10, i64 8}
!17 = !{!"_ZTS5uint3", !14, i64 0, !14, i64 4, !14, i64 8}
!18 = !{!"_ZTSSt5dequeI6float4SaIS0_EE", !19, i64 0}
!19 = !{!"_ZTSSt11_Deque_baseI6float4SaIS0_EE", !20, i64 0}
!20 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE11_Deque_implE", !21, i64 0}
!21 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE16_Deque_impl_dataE", !6, i64 0, !22, i64 8, !23, i64 16, !23, i64 48}
!22 = !{!"long", !7, i64 0}
!23 = !{!"_ZTSSt15_Deque_iteratorI6float4RS0_PS0_E", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!24 = !{!"_ZTSSt6vectorI4int2SaIS0_EE", !25, i64 0}
!25 = !{!"_ZTSSt12_Vector_baseI4int2SaIS0_EE", !26, i64 0}
!26 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE12_Vector_implE", !27, i64 0}
!27 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!28 = !{!"_ZTSSt6vectorI6float4SaIS0_EE", !29, i64 0}
!29 = !{!"_ZTSSt12_Vector_baseI6float4SaIS0_EE", !30, i64 0}
!30 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE12_Vector_implE", !31, i64 0}
!31 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!32 = !{!"_ZTS4int3", !14, i64 0, !14, i64 4, !14, i64 8}
!33 = !{!14, !14, i64 0}
!34 = !{!32, !14, i64 0}
!35 = !{!32, !14, i64 4}
!36 = !{!32, !14, i64 8}
!37 = !{i64 0, i64 4, !33, i64 4, i64 4, !33, i64 8, i64 4, !33}
!38 = !{i64 0, i64 4, !9, i64 4, i64 4, !9, i64 8, i64 4, !9, i64 12, i64 4, !9}
!39 = !{i64 0, i64 4, !9, i64 4, i64 4, !9, i64 8, i64 4, !9}
!40 = distinct !{!40, !41}
!41 = !{!"llvm.loop.mustprogress"}
!42 = distinct !{!42, !41}
!43 = distinct !{!43, !41}
!44 = !{!12, !14, i64 172}


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

%struct.float3 = type { float, float, float }
%struct.float4 = type { float, float, float, float }
%"class.std::vector.5" = type { %"struct.std::_Vector_base.6" }
%"struct.std::_Vector_base.6" = type { %"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl" }
%"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl" = type { %"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl_data" }
%"struct.std::_Vector_base<float, std::allocator<float>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.std::vector.10" = type { %"struct.std::_Vector_base.11" }
%"struct.std::_Vector_base.11" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl" = type { %"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<unsigned int, std::allocator<unsigned int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%struct.int2 = type { i32, i32 }

@_ZL6colors = external hidden local_unnamed_addr global [8 x %struct.float3], align 16

declare i32 @__gxx_personality_v0(...)

; 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: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float3f(float noundef) local_unnamed_addr #1

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden { <2 x float>, <2 x float> } @_ZL11make_float4ffff(float noundef, float noundef, float noundef, float noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, <2 x float> } @_Z11make_float46float3f(<2 x float>, float, float noundef) local_unnamed_addr #1

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float36float4(<2 x float>, <2 x float>) local_unnamed_addr #1

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden i64 @_ZL9make_int2ii(i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZNSt6vectorI6float4SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 16 dereferenceable(16)) local_unnamed_addr #3 align 2

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

; Function Attrs: nounwind
declare i32 @rand() local_unnamed_addr #5

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden { i64, i32 } @_ZL9make_int3iii(i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #6

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

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #6

declare void @addPointConstraint(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #9

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Zpl6float3S_(<2 x float>, float, <2 x float>, float) local_unnamed_addr #1

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14ParticleSystem15addStaticSphereE4int3S0_f(ptr noundef nonnull align 8 dereferenceable(412) %0, i64 %1, i32 %2, i64 %3, i32 %4, float noundef %5) local_unnamed_addr #10 align 2 personality ptr @__gxx_personality_v0 {
  %7 = alloca %struct.float4, align 16
  %8 = alloca %"class.std::vector.5", align 8
  %9 = alloca %"class.std::vector.10", align 8
  %10 = alloca %"class.std::vector.5", align 8
  %11 = alloca i32, align 4
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca i32, align 4
  %15 = alloca %struct.int2, align 8
  %16 = alloca %struct.float4, align 16
  %.sroa.092.0.extract.trunc = trunc i64 %1 to i32
  %.sroa.595.0.extract.shift = lshr i64 %1, 32
  %.sroa.595.0.extract.trunc = trunc nuw i64 %.sroa.595.0.extract.shift to i32
  %.sroa.087.0.extract.trunc = trunc i64 %3 to i32
  %.sroa.3.0.extract.shift = lshr i64 %3, 32
  %.sroa.3.0.extract.trunc = trunc nuw i64 %.sroa.3.0.extract.shift to i32
  %17 = getelementptr inbounds i8, ptr %0, i64 12
  %18 = load i32, ptr %17, align 4, !tbaa !5
  %19 = sub nsw i32 %.sroa.087.0.extract.trunc, %.sroa.092.0.extract.trunc
  %20 = tail call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %19)
  %21 = fptosi double %20 to i32
  %22 = sitofp i32 %21 to float
  %23 = fdiv float %22, %5
  %24 = fptosi float %23 to i32
  %25 = sub nsw i32 %.sroa.3.0.extract.trunc, %.sroa.595.0.extract.trunc
  %26 = tail call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %25)
  %27 = fptosi double %26 to i32
  %28 = sitofp i32 %27 to float
  %29 = fdiv float %28, %5
  %30 = fptosi float %29 to i32
  %31 = sub nsw i32 %4, %2
  %32 = tail call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %31)
  %33 = fptosi double %32 to i32
  %34 = sitofp i32 %33 to float
  %35 = fdiv float %34, %5
  %36 = fptosi float %35 to i32
  %37 = tail call { i64, i32 } @_ZL9make_int3iii(i32 noundef %24, i32 noundef %30, i32 noundef %36)
  %.fca.1.extract72 = extractvalue { i64, i32 } %37, 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %7) #13
  %38 = sitofp i32 %19 to float
  %39 = fmul float %38, 5.000000e-01
  %40 = tail call { <2 x float>, float } @_Z11make_float34int3(i64 %1, i32 %2)
  %.fca.0.extract58 = extractvalue { <2 x float>, float } %40, 0
  %.fca.1.extract59 = extractvalue { <2 x float>, float } %40, 1
  %41 = tail call { <2 x float>, float } @_Z11make_float3f(float noundef %39)
  %.fca.0.extract52 = extractvalue { <2 x float>, float } %41, 0
  %.fca.1.extract53 = extractvalue { <2 x float>, float } %41, 1
  %42 = tail call { <2 x float>, float } @_Zpl6float3S_(<2 x float> %.fca.0.extract58, float %.fca.1.extract59, <2 x float> %.fca.0.extract52, float %.fca.1.extract53)
  %.fca.0.extract44 = extractvalue { <2 x float>, float } %42, 0
  %.fca.1.extract45 = extractvalue { <2 x float>, float } %42, 1
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %8) #13
  call void @_ZNSt6vectorIfSaIfEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %8) #13
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %9) #13
  call void @_ZNSt6vectorIjSaIjEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %10) #13
  call void @_ZNSt6vectorIfSaIfEEC2Ev(ptr noundef nonnull align 8 dereferenceable(24) %10) #13
  %43 = icmp sgt i32 %.fca.1.extract72, 0
  br i1 %43, label %.preheader112.lr.ph, label %._crit_edge

.preheader112.lr.ph:                              ; preds = %6
  %.fca.0.extract71 = extractvalue { i64, i32 } %37, 0
  %.sroa.075.4.extract.shift = lshr i64 %.fca.0.extract71, 32
  %.sroa.075.4.extract.trunc = trunc nuw i64 %.sroa.075.4.extract.shift to i32
  %44 = icmp sgt i32 %.sroa.075.4.extract.trunc, 0
  %.sroa.075.0.extract.trunc = trunc i64 %.fca.0.extract71 to i32
  %45 = sitofp i32 %.sroa.092.0.extract.trunc to float
  %46 = sitofp i32 %.sroa.595.0.extract.trunc to float
  %47 = sitofp i32 %2 to float
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %7, i64 8
  %48 = getelementptr inbounds i8, ptr %7, i64 4
  %49 = getelementptr inbounds i8, ptr %7, i64 12
  %50 = icmp sgt i32 %.sroa.075.0.extract.trunc, 0
  %or.cond = and i1 %44, %50
  br i1 %or.cond, label %.preheader112.us.us, label %._crit_edge

.preheader112.us.us:                              ; preds = %.preheader112.lr.ph, %._crit_edge121.split.us.us.us
  %.0128.us.us = phi i32 [ %.3.us.us.us, %._crit_edge121.split.us.us.us ], [ 0, %.preheader112.lr.ph ]
  %.099127.us.us = phi i32 [ %79, %._crit_edge121.split.us.us.us ], [ 0, %.preheader112.lr.ph ]
  %51 = uitofp nneg i32 %.099127.us.us to float
  %52 = call float @llvm.fmuladd.f32(float %51, float %5, float %47)
  br label %.preheader.us.us.us

.preheader.us.us.us:                              ; preds = %._crit_edge.us.us.us, %.preheader112.us.us
  %.1120.us.us.us = phi i32 [ %.0128.us.us, %.preheader112.us.us ], [ %.3.us.us.us, %._crit_edge.us.us.us ]
  %.0100119.us.us.us = phi i32 [ 0, %.preheader112.us.us ], [ %78, %._crit_edge.us.us.us ]
  %53 = uitofp nneg i32 %.0100119.us.us.us to float
  %54 = call float @llvm.fmuladd.f32(float %53, float %5, float %46)
  br label %55

55:                                               ; preds = %76, %.preheader.us.us.us
  %.2118.us.us.us = phi i32 [ %.1120.us.us.us, %.preheader.us.us.us ], [ %.3.us.us.us, %76 ]
  %.0101117.us.us.us = phi i32 [ 0, %.preheader.us.us.us ], [ %77, %76 ]
  %56 = uitofp nneg i32 %.0101117.us.us.us to float
  %57 = call float @llvm.fmuladd.f32(float %56, float %5, float %45)
  %58 = call { <2 x float>, <2 x float> } @_ZL11make_float4ffff(float noundef %57, float noundef %54, float noundef %52, float noundef 1.000000e+00)
  %59 = extractvalue { <2 x float>, <2 x float> } %58, 0
  %60 = extractvalue { <2 x float>, <2 x float> } %58, 1
  store <2 x float> %59, ptr %7, align 16
  store <2 x float> %60, ptr %.sroa.4.0..sroa_idx, align 8
  %61 = call { <2 x float>, float } @_Z11make_float36float4(<2 x float> %59, <2 x float> %60)
  %.fca.0.extract21.us.us.us = extractvalue { <2 x float>, float } %61, 0
  %.fca.1.extract22.us.us.us = extractvalue { <2 x float>, float } %61, 1
  %62 = call { <2 x float>, float } @_Zmi6float3S_(<2 x float> %.fca.0.extract21.us.us.us, float %.fca.1.extract22.us.us.us, <2 x float> %.fca.0.extract44, float %.fca.1.extract45)
  %.fca.0.extract.us.us.us = extractvalue { <2 x float>, float } %62, 0
  %.fca.1.extract.us.us.us = extractvalue { <2 x float>, float } %62, 1
  %63 = invoke noundef float @_Z6length6float3(<2 x float> %.fca.0.extract.us.us.us, float %.fca.1.extract.us.us.us)
          to label %64 unwind label %.split.us.split.us.split.us

64:                                               ; preds = %55
  %65 = fcmp olt float %63, %39
  br i1 %65, label %66, label %76

66:                                               ; preds = %64
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(4) %7)
          to label %67 unwind label %.split.us.split.us.split.us

67:                                               ; preds = %66
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(4) %48)
          to label %68 unwind label %.split.us.split.us.split.us

68:                                               ; preds = %67
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(4) %.sroa.4.0..sroa_idx)
          to label %69 unwind label %.split.us.split.us.split.us

69:                                               ; preds = %68
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %8, ptr noundef nonnull align 4 dereferenceable(4) %49)
          to label %70 unwind label %.split.us.split.us.split.us

70:                                               ; preds = %69
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #13
  %71 = add i32 %.2118.us.us.us, 1
  %72 = add i32 %.2118.us.us.us, %18
  store i32 %72, ptr %11, align 4, !tbaa !31
  invoke void @_ZNSt6vectorIjSaIjEE9push_backEOj(ptr noundef nonnull align 8 dereferenceable(24) %9, ptr noundef nonnull align 4 dereferenceable(4) %11)
          to label %73 unwind label %.split125.us.split.us.split.us

73:                                               ; preds = %70
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #13
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %10, ptr noundef nonnull align 4 dereferenceable(4) %7)
          to label %74 unwind label %.split.us.split.us.split.us

74:                                               ; preds = %73
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %10, ptr noundef nonnull align 4 dereferenceable(4) %48)
          to label %75 unwind label %.split.us.split.us.split.us

75:                                               ; preds = %74
  invoke void @_ZNSt6vectorIfSaIfEE9push_backERKf(ptr noundef nonnull align 8 dereferenceable(24) %10, ptr noundef nonnull align 4 dereferenceable(4) %.sroa.4.0..sroa_idx)
          to label %76 unwind label %.split.us.split.us.split.us

76:                                               ; preds = %75, %64
  %.3.us.us.us = phi i32 [ %71, %75 ], [ %.2118.us.us.us, %64 ]
  %77 = add nuw nsw i32 %.0101117.us.us.us, 1
  %exitcond.not = icmp eq i32 %77, %.sroa.075.0.extract.trunc
  br i1 %exitcond.not, label %._crit_edge.us.us.us, label %55, !llvm.loop !32

._crit_edge.us.us.us:                             ; preds = %76
  %78 = add nuw nsw i32 %.0100119.us.us.us, 1
  %exitcond138.not = icmp eq i32 %78, %.sroa.075.4.extract.trunc
  br i1 %exitcond138.not, label %._crit_edge121.split.us.us.us, label %.preheader.us.us.us, !llvm.loop !34

._crit_edge121.split.us.us.us:                    ; preds = %._crit_edge.us.us.us
  %79 = add nuw nsw i32 %.099127.us.us, 1
  %exitcond139.not = icmp eq i32 %79, %.fca.1.extract72
  br i1 %exitcond139.not, label %._crit_edge, label %.preheader112.us.us, !llvm.loop !35

.split.us.split.us.split.us:                      ; preds = %75, %74, %73, %69, %68, %67, %66, %55
  %80 = landingpad { ptr, i32 }
          cleanup
  br label %139

.split125.us.split.us.split.us:                   ; preds = %70
  %81 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #13
  br label %139

._crit_edge:                                      ; preds = %._crit_edge121.split.us.us.us, %.preheader112.lr.ph, %6
  %82 = call noundef i64 @_ZNKSt6vectorIjSaIjEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  %83 = trunc i64 %82 to i32
  %84 = shl nsw i32 %83, 2
  %85 = zext i32 %84 to i64
  %86 = call ptr @llvm.stacksave.p0()
  %87 = alloca float, i64 %85, align 16
  %88 = and i64 %82, 4294967295
  %89 = alloca float, i64 %88, align 16
  %90 = alloca float, i64 %88, align 16
  %91 = alloca i32, i64 %88, align 16
  %92 = sext i32 %84 to i64
  %93 = shl nsw i64 %92, 2
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %87, i8 0, i64 %93, i1 false)
  %sext = shl i64 %82, 32
  %94 = ashr exact i64 %sext, 32
  %95 = getelementptr inbounds float, ptr %89, i64 %94
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #13
  store float 0x3F847AE140000000, ptr %12, align 4, !tbaa !36
  invoke void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef nonnull %89, ptr noundef nonnull %95, ptr noundef nonnull align 4 dereferenceable(4) %12)
          to label %96 unwind label %127

96:                                               ; preds = %._crit_edge
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #13
  %97 = getelementptr inbounds float, ptr %90, i64 %94
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #13
  store float 1.000000e+00, ptr %13, align 4, !tbaa !36
  invoke void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef nonnull %90, ptr noundef nonnull %97, ptr noundef nonnull align 4 dereferenceable(4) %13)
          to label %98 unwind label %129

98:                                               ; preds = %96
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #13
  %99 = getelementptr inbounds i32, ptr %91, i64 %94
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %14) #13
  %100 = getelementptr inbounds i8, ptr %0, i64 172
  %101 = load i32, ptr %100, align 4, !tbaa !37
  %102 = add nsw i32 %101, 4
  store i32 %102, ptr %14, align 4, !tbaa !31
  invoke void @_ZSt4fillIPiiEvT_S1_RKT0_(ptr noundef nonnull %91, ptr noundef nonnull %99, ptr noundef nonnull align 4 dereferenceable(4) %14)
          to label %103 unwind label %131

103:                                              ; preds = %98
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #13
  %104 = call noundef ptr @_ZNSt6vectorIfSaIfEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %8) #13
  invoke void @_ZN14ParticleSystem19addParticleMultipleEPfS0_S0_S0_Pii(ptr noundef nonnull align 8 dereferenceable(412) %0, ptr noundef %104, ptr noundef nonnull %87, ptr noundef nonnull %89, ptr noundef nonnull %90, ptr noundef nonnull %91, i32 noundef %83)
          to label %105 unwind label %133

105:                                              ; preds = %103
  %106 = call noundef ptr @_ZNSt6vectorIjSaIjEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  %107 = call noundef ptr @_ZNSt6vectorIfSaIfEE4dataEv(ptr noundef nonnull align 8 dereferenceable(24) %10) #13
  %108 = call noundef i64 @_ZNKSt6vectorIjSaIjEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  %109 = trunc i64 %108 to i32
  invoke void @addPointConstraint(ptr noundef %106, ptr noundef %107, i32 noundef %109)
          to label %110 unwind label %133

110:                                              ; preds = %105
  %111 = getelementptr inbounds i8, ptr %0, i64 336
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #13
  %112 = load i32, ptr %17, align 4, !tbaa !5
  %113 = call i64 @_ZL9make_int2ii(i32 noundef %18, i32 noundef %112)
  store i64 %113, ptr %15, align 8
  invoke void @_ZNSt6vectorI4int2SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %111, ptr noundef nonnull align 8 dereferenceable(8) %15)
          to label %114 unwind label %135

114:                                              ; preds = %110
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #13
  %115 = getelementptr inbounds i8, ptr %0, i64 360
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %16) #13
  %116 = call i32 @rand() #13
  %117 = srem i32 %116, 8
  %118 = sext i32 %117 to i64
  %119 = getelementptr inbounds [8 x %struct.float3], ptr @_ZL6colors, i64 0, i64 %118
  %.sroa.01.0.copyload = load <2 x float>, ptr %119, align 4
  %.sroa.22.0..sroa_idx = getelementptr inbounds i8, ptr %119, i64 8
  %.sroa.22.0.copyload = load float, ptr %.sroa.22.0..sroa_idx, align 4, !tbaa !36
  %120 = call { <2 x float>, <2 x float> } @_Z11make_float46float3f(<2 x float> %.sroa.01.0.copyload, float %.sroa.22.0.copyload, float noundef 1.000000e+00)
  %121 = extractvalue { <2 x float>, <2 x float> } %120, 0
  store <2 x float> %121, ptr %16, align 16
  %122 = getelementptr inbounds i8, ptr %16, i64 8
  %123 = extractvalue { <2 x float>, <2 x float> } %120, 1
  store <2 x float> %123, ptr %122, align 8
  invoke void @_ZNSt6vectorI6float4SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %115, ptr noundef nonnull align 16 dereferenceable(16) %16)
          to label %124 unwind label %137

124:                                              ; preds = %114
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #13
  %125 = load i32, ptr %100, align 4, !tbaa !37
  %126 = add nsw i32 %125, 1
  store i32 %126, ptr %100, align 4, !tbaa !37
  call void @llvm.stackrestore.p0(ptr %86)
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %10) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %10) #13
  call void @_ZNSt6vectorIjSaIjEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %9) #13
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %8) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #13
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #13
  ret void

127:                                              ; preds = %._crit_edge
  %128 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #13
  br label %139

129:                                              ; preds = %96
  %130 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #13
  br label %139

131:                                              ; preds = %98
  %132 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %14) #13
  br label %139

133:                                              ; preds = %105, %103
  %134 = landingpad { ptr, i32 }
          cleanup
  br label %139

135:                                              ; preds = %110
  %136 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #13
  br label %139

137:                                              ; preds = %114
  %138 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %16) #13
  br label %139

139:                                              ; preds = %127, %129, %131, %133, %135, %137, %.split.us.split.us.split.us, %.split125.us.split.us.split.us
  %.pn109.pn = phi { ptr, i32 } [ %80, %.split.us.split.us.split.us ], [ %81, %.split125.us.split.us.split.us ], [ %138, %137 ], [ %136, %135 ], [ %134, %133 ], [ %132, %131 ], [ %130, %129 ], [ %128, %127 ]
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %10) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %10) #13
  call void @_ZNSt6vectorIjSaIjEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %9) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %9) #13
  call void @_ZNSt6vectorIfSaIfEED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %8) #13
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %8) #13
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %7) #13
  resume { ptr, i32 } %.pn109.pn
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Z11make_float34int3(i64, i32) local_unnamed_addr #1

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

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

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef float @_Z6length6float3(<2 x float>, float) local_unnamed_addr #12

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local { <2 x float>, float } @_Zmi6float3S_(<2 x float>, float, <2 x float>, float) local_unnamed_addr #1

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

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

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

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

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

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

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { mustprogress nocallback nofree nosync nounwind willreturn }
attributes #7 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #8 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #9 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #10 = { mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #11 = { 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 #12 = { inlinehint mustprogress uwtable "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #13 = { 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, !11, i64 12}
!6 = !{!"_ZTS14ParticleSystem", !7, i64 0, !10, i64 4, !11, i64 8, !11, i64 12, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !11, i64 72, !11, i64 76, !12, i64 80, !13, i64 88, !15, i64 156, !11, i64 168, !11, i64 172, !16, i64 176, !16, i64 256, !22, i64 336, !26, i64 360, !30, i64 384, !30, i64 396, !11, i64 408}
!7 = !{!"bool", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!"_ZTS9SimParams", !14, i64 0, !10, i64 12, !10, i64 16, !15, i64 20, !11, i64 32, !14, i64 36, !14, i64 48, !11, i64 60, !11, i64 64}
!14 = !{!"_ZTS6float3", !10, i64 0, !10, i64 4, !10, i64 8}
!15 = !{!"_ZTS5uint3", !11, i64 0, !11, i64 4, !11, i64 8}
!16 = !{!"_ZTSSt5dequeI6float4SaIS0_EE", !17, i64 0}
!17 = !{!"_ZTSSt11_Deque_baseI6float4SaIS0_EE", !18, i64 0}
!18 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE11_Deque_implE", !19, i64 0}
!19 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE16_Deque_impl_dataE", !12, i64 0, !20, i64 8, !21, i64 16, !21, i64 48}
!20 = !{!"long", !8, i64 0}
!21 = !{!"_ZTSSt15_Deque_iteratorI6float4RS0_PS0_E", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24}
!22 = !{!"_ZTSSt6vectorI4int2SaIS0_EE", !23, i64 0}
!23 = !{!"_ZTSSt12_Vector_baseI4int2SaIS0_EE", !24, i64 0}
!24 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE12_Vector_implE", !25, i64 0}
!25 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE17_Vector_impl_dataE", !12, i64 0, !12, i64 8, !12, i64 16}
!26 = !{!"_ZTSSt6vectorI6float4SaIS0_EE", !27, i64 0}
!27 = !{!"_ZTSSt12_Vector_baseI6float4SaIS0_EE", !28, i64 0}
!28 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE12_Vector_implE", !29, i64 0}
!29 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE17_Vector_impl_dataE", !12, i64 0, !12, i64 8, !12, i64 16}
!30 = !{!"_ZTS4int3", !11, i64 0, !11, i64 4, !11, i64 8}
!31 = !{!11, !11, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = distinct !{!35, !33}
!36 = !{!10, !10, i64 0}
!37 = !{!6, !11, i64 172}


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