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

; 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.int2 = type { i32, i32 }
%struct.float2 = type { float, float }
%struct.float4 = type { float, float, float, float }
%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 }
%struct.int3 = type { i32, i32, i32 }

@_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

; 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>, <2 x float> } @_Z11make_float46float3f(<2 x float>, float, float noundef) #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)) #3 align 2

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

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

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

; 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

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

116:                                              ; preds = %8
  %117 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 0
  %118 = load i32, ptr %117, align 8, !tbaa !35
  %119 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 1
  %120 = load i32, ptr %119, align 4, !tbaa !38
  %121 = add nsw i32 %118, %120
  %122 = mul nsw i32 2, %121
  store i32 %122, ptr %28, align 4, !tbaa !34
  br label %126

123:                                              ; preds = %8
  %124 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 1
  %125 = load i32, ptr %124, align 4, !tbaa !38
  store i32 %125, ptr %28, align 4, !tbaa !34
  br label %126

126:                                              ; preds = %123, %116
  %127 = load i32, ptr %28, align 4, !tbaa !34
  %128 = mul i32 %127, 3
  %129 = zext i32 %128 to i64
  %130 = alloca float, i64 %129, align 16
  store i64 %129, ptr %29, align 8
  %131 = load i32, ptr %28, align 4, !tbaa !34
  %132 = zext i32 %131 to i64
  %133 = alloca i32, i64 %132, align 16
  store i64 %132, ptr %30, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #12
  store i32 0, ptr %31, align 4, !tbaa !34
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #12
  store i32 0, ptr %32, align 4, !tbaa !34
  %134 = load i32, ptr %27, align 4, !tbaa !34
  %135 = mul i32 %134, 2
  %136 = zext i32 %135 to i64
  %137 = alloca i32, i64 %136, align 16
  store i64 %136, ptr %33, align 8
  %138 = load i32, ptr %27, align 4, !tbaa !34
  %139 = zext i32 %138 to i64
  %140 = alloca float, i64 %139, align 16
  store i64 %139, ptr %34, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #12
  store i32 0, ptr %35, align 4, !tbaa !34
  br label %141

141:                                              ; preds = %336, %126
  %142 = load i32, ptr %35, align 4, !tbaa !34
  %143 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 1
  %144 = load i32, ptr %143, align 4, !tbaa !38
  %145 = icmp slt i32 %142, %144
  br i1 %145, label %147, label %146

146:                                              ; preds = %141
  store i32 2, ptr %36, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #12
  br label %339

147:                                              ; preds = %141
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #12
  store i32 0, ptr %37, align 4, !tbaa !34
  br label %148

148:                                              ; preds = %332, %147
  %149 = load i32, ptr %37, align 4, !tbaa !34
  %150 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 0
  %151 = load i32, ptr %150, align 8, !tbaa !35
  %152 = icmp slt i32 %149, %151
  br i1 %152, label %154, label %153

153:                                              ; preds = %148
  store i32 5, ptr %36, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #12
  br label %335

154:                                              ; preds = %148
  %155 = getelementptr inbounds %struct.int2, ptr %9, i32 0, i32 0
  %156 = load i32, ptr %155, align 8, !tbaa !35
  %157 = sitofp i32 %156 to float
  %158 = load i32, ptr %37, align 4, !tbaa !34
  %159 = sitofp i32 %158 to float
  %160 = getelementptr inbounds %struct.float3, ptr %11, i32 0, i32 0
  %161 = load float, ptr %160, align 4, !tbaa !37
  %162 = call float @llvm.fmuladd.f32(float %159, float %161, float %157)
  %163 = load i32, ptr %26, align 4, !tbaa !34
  %164 = mul nsw i32 %163, 4
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds float, ptr %86, i64 %165
  store float %162, ptr %166, align 4, !tbaa !9
  %167 = getelementptr inbounds %struct.float3, ptr %11, i32 0, i32 1
  %168 = load float, ptr %167, align 4, !tbaa !42
  %169 = load i32, ptr %26, align 4, !tbaa !34
  %170 = mul nsw i32 %169, 4
  %171 = add nsw i32 %170, 1
  %172 = sext i32 %171 to i64
  %173 = getelementptr inbounds float, ptr %86, i64 %172
  store float %168, ptr %173, align 4, !tbaa !9
  %174 = getelementptr inbounds %struct.int2, ptr %9, i32 0, i32 1
  %175 = load i32, ptr %174, align 4, !tbaa !38
  %176 = sitofp i32 %175 to float
  %177 = load i32, ptr %35, align 4, !tbaa !34
  %178 = sitofp i32 %177 to float
  %179 = getelementptr inbounds %struct.float3, ptr %11, i32 0, i32 2
  %180 = load float, ptr %179, align 4, !tbaa !39
  %181 = call float @llvm.fmuladd.f32(float %178, float %180, float %176)
  %182 = load i32, ptr %26, align 4, !tbaa !34
  %183 = mul nsw i32 %182, 4
  %184 = add nsw i32 %183, 2
  %185 = sext i32 %184 to i64
  %186 = getelementptr inbounds float, ptr %86, i64 %185
  store float %181, ptr %186, align 4, !tbaa !9
  %187 = load i32, ptr %26, align 4, !tbaa !34
  %188 = mul nsw i32 %187, 4
  %189 = add nsw i32 %188, 3
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds float, ptr %86, i64 %190
  store float 1.000000e+00, ptr %191, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #12
  %192 = load i32, ptr %17, align 4, !tbaa !34
  %193 = load i32, ptr %35, align 4, !tbaa !34
  %194 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 0
  %195 = load i32, ptr %194, align 8, !tbaa !35
  %196 = mul nsw i32 %193, %195
  %197 = add nsw i32 %192, %196
  %198 = load i32, ptr %37, align 4, !tbaa !34
  %199 = add nsw i32 %197, %198
  store i32 %199, ptr %38, align 4, !tbaa !34
  %200 = load i32, ptr %37, align 4, !tbaa !34
  %201 = icmp sgt i32 %200, 0
  br i1 %201, label %202, label %222

202:                                              ; preds = %154
  %203 = load i32, ptr %38, align 4, !tbaa !34
  %204 = sub i32 %203, 1
  %205 = load i32, ptr %32, align 4, !tbaa !34
  %206 = mul nsw i32 %205, 2
  %207 = sext i32 %206 to i64
  %208 = getelementptr inbounds i32, ptr %137, i64 %207
  store i32 %204, ptr %208, align 4, !tbaa !34
  %209 = load i32, ptr %38, align 4, !tbaa !34
  %210 = load i32, ptr %32, align 4, !tbaa !34
  %211 = mul nsw i32 %210, 2
  %212 = add nsw i32 %211, 1
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds i32, ptr %137, i64 %213
  store i32 %209, ptr %214, align 4, !tbaa !34
  %215 = getelementptr inbounds %struct.float2, ptr %13, i32 0, i32 0
  %216 = load float, ptr %215, align 8, !tbaa !43
  %217 = load i32, ptr %32, align 4, !tbaa !34
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds float, ptr %140, i64 %218
  store float %216, ptr %219, align 4, !tbaa !9
  %220 = load i32, ptr %32, align 4, !tbaa !34
  %221 = add nsw i32 %220, 1
  store i32 %221, ptr %32, align 4, !tbaa !34
  br label %237

222:                                              ; preds = %154
  %223 = load i32, ptr %38, align 4, !tbaa !34
  %224 = load i32, ptr %31, align 4, !tbaa !34
  %225 = sext i32 %224 to i64
  %226 = getelementptr inbounds i32, ptr %133, i64 %225
  store i32 %223, ptr %226, align 4, !tbaa !34
  %227 = load i32, ptr %31, align 4, !tbaa !34
  %228 = mul nsw i32 %227, 3
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds float, ptr %130, i64 %229
  %231 = load i32, ptr %26, align 4, !tbaa !34
  %232 = mul nsw i32 %231, 4
  %233 = sext i32 %232 to i64
  %234 = getelementptr inbounds float, ptr %86, i64 %233
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %230, ptr align 4 %234, i64 12, i1 false)
  %235 = load i32, ptr %31, align 4, !tbaa !34
  %236 = add nsw i32 %235, 1
  store i32 %236, ptr %31, align 4, !tbaa !34
  br label %237

237:                                              ; preds = %222, %202
  %238 = load i32, ptr %35, align 4, !tbaa !34
  %239 = icmp sgt i32 %238, 0
  br i1 %239, label %240, label %262

240:                                              ; preds = %237
  %241 = load i32, ptr %38, align 4, !tbaa !34
  %242 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 0
  %243 = load i32, ptr %242, align 8, !tbaa !35
  %244 = sub i32 %241, %243
  %245 = load i32, ptr %32, align 4, !tbaa !34
  %246 = mul nsw i32 %245, 2
  %247 = sext i32 %246 to i64
  %248 = getelementptr inbounds i32, ptr %137, i64 %247
  store i32 %244, ptr %248, align 4, !tbaa !34
  %249 = load i32, ptr %38, align 4, !tbaa !34
  %250 = load i32, ptr %32, align 4, !tbaa !34
  %251 = mul nsw i32 %250, 2
  %252 = add nsw i32 %251, 1
  %253 = sext i32 %252 to i64
  %254 = getelementptr inbounds i32, ptr %137, i64 %253
  store i32 %249, ptr %254, align 4, !tbaa !34
  %255 = getelementptr inbounds %struct.float2, ptr %13, i32 0, i32 1
  %256 = load float, ptr %255, align 4, !tbaa !45
  %257 = load i32, ptr %32, align 4, !tbaa !34
  %258 = sext i32 %257 to i64
  %259 = getelementptr inbounds float, ptr %140, i64 %258
  store float %256, ptr %259, align 4, !tbaa !9
  %260 = load i32, ptr %32, align 4, !tbaa !34
  %261 = add nsw i32 %260, 1
  store i32 %261, ptr %32, align 4, !tbaa !34
  br label %281

262:                                              ; preds = %237
  %263 = load i8, ptr %16, align 1, !tbaa !11, !range !40, !noundef !41
  %264 = trunc i8 %263 to i1
  br i1 %264, label %265, label %280

265:                                              ; preds = %262
  %266 = load i32, ptr %38, align 4, !tbaa !34
  %267 = load i32, ptr %31, align 4, !tbaa !34
  %268 = sext i32 %267 to i64
  %269 = getelementptr inbounds i32, ptr %133, i64 %268
  store i32 %266, ptr %269, align 4, !tbaa !34
  %270 = load i32, ptr %31, align 4, !tbaa !34
  %271 = mul nsw i32 %270, 3
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds float, ptr %130, i64 %272
  %274 = load i32, ptr %26, align 4, !tbaa !34
  %275 = mul nsw i32 %274, 4
  %276 = sext i32 %275 to i64
  %277 = getelementptr inbounds float, ptr %86, i64 %276
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %273, ptr align 4 %277, i64 12, i1 false)
  %278 = load i32, ptr %31, align 4, !tbaa !34
  %279 = add nsw i32 %278, 1
  store i32 %279, ptr %31, align 4, !tbaa !34
  br label %280

280:                                              ; preds = %265, %262
  br label %281

281:                                              ; preds = %280, %240
  %282 = load i32, ptr %37, align 4, !tbaa !34
  %283 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 0
  %284 = load i32, ptr %283, align 8, !tbaa !35
  %285 = sub nsw i32 %284, 1
  %286 = icmp eq i32 %282, %285
  br i1 %286, label %287, label %305

287:                                              ; preds = %281
  %288 = load i8, ptr %16, align 1, !tbaa !11, !range !40, !noundef !41
  %289 = trunc i8 %288 to i1
  br i1 %289, label %290, label %305

290:                                              ; preds = %287
  %291 = load i32, ptr %38, align 4, !tbaa !34
  %292 = load i32, ptr %31, align 4, !tbaa !34
  %293 = sext i32 %292 to i64
  %294 = getelementptr inbounds i32, ptr %133, i64 %293
  store i32 %291, ptr %294, align 4, !tbaa !34
  %295 = load i32, ptr %31, align 4, !tbaa !34
  %296 = mul nsw i32 %295, 3
  %297 = sext i32 %296 to i64
  %298 = getelementptr inbounds float, ptr %130, i64 %297
  %299 = load i32, ptr %26, align 4, !tbaa !34
  %300 = mul nsw i32 %299, 4
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds float, ptr %86, i64 %301
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %298, ptr align 4 %302, i64 12, i1 false)
  %303 = load i32, ptr %31, align 4, !tbaa !34
  %304 = add nsw i32 %303, 1
  store i32 %304, ptr %31, align 4, !tbaa !34
  br label %305

305:                                              ; preds = %290, %287, %281
  %306 = load i32, ptr %35, align 4, !tbaa !34
  %307 = getelementptr inbounds %struct.int2, ptr %18, i32 0, i32 1
  %308 = load i32, ptr %307, align 4, !tbaa !38
  %309 = sub nsw i32 %308, 1
  %310 = icmp eq i32 %306, %309
  br i1 %310, label %311, label %329

311:                                              ; preds = %305
  %312 = load i8, ptr %16, align 1, !tbaa !11, !range !40, !noundef !41
  %313 = trunc i8 %312 to i1
  br i1 %313, label %314, label %329

314:                                              ; preds = %311
  %315 = load i32, ptr %38, align 4, !tbaa !34
  %316 = load i32, ptr %31, align 4, !tbaa !34
  %317 = sext i32 %316 to i64
  %318 = getelementptr inbounds i32, ptr %133, i64 %317
  store i32 %315, ptr %318, align 4, !tbaa !34
  %319 = load i32, ptr %31, align 4, !tbaa !34
  %320 = mul nsw i32 %319, 3
  %321 = sext i32 %320 to i64
  %322 = getelementptr inbounds float, ptr %130, i64 %321
  %323 = load i32, ptr %26, align 4, !tbaa !34
  %324 = mul nsw i32 %323, 4
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds float, ptr %86, i64 %325
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %322, ptr align 4 %326, i64 12, i1 false)
  %327 = load i32, ptr %31, align 4, !tbaa !34
  %328 = add nsw i32 %327, 1
  store i32 %328, ptr %31, align 4, !tbaa !34
  br label %329

329:                                              ; preds = %314, %311, %305
  %330 = load i32, ptr %26, align 4, !tbaa !34
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %26, align 4, !tbaa !34
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #12
  br label %332

332:                                              ; preds = %329
  %333 = load i32, ptr %37, align 4, !tbaa !34
  %334 = add nsw i32 %333, 1
  store i32 %334, ptr %37, align 4, !tbaa !34
  br label %148, !llvm.loop !46

335:                                              ; preds = %153
  br label %336

336:                                              ; preds = %335
  %337 = load i32, ptr %35, align 4, !tbaa !34
  %338 = add nsw i32 %337, 1
  store i32 %338, ptr %35, align 4, !tbaa !34
  br label %141, !llvm.loop !48

339:                                              ; preds = %146
  %340 = load i32, ptr %19, align 4, !tbaa !34
  %341 = mul nsw i32 %340, 4
  %342 = sext i32 %341 to i64
  %343 = mul i64 %342, 4
  call void @llvm.memset.p0.i64(ptr align 1 %90, i8 0, i64 %343, i1 false)
  %344 = load i32, ptr %19, align 4, !tbaa !34
  %345 = sext i32 %344 to i64
  %346 = getelementptr inbounds float, ptr %93, i64 %345
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #12
  %347 = load float, ptr %15, align 4, !tbaa !9
  %348 = fdiv float 1.000000e+00, %347
  store float %348, ptr %39, align 4, !tbaa !9
  call void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef %93, ptr noundef %346, ptr noundef nonnull align 4 dereferenceable(4) %39)
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #12
  %349 = load i32, ptr %19, align 4, !tbaa !34
  %350 = sext i32 %349 to i64
  %351 = getelementptr inbounds float, ptr %96, i64 %350
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #12
  store float 1.000000e+00, ptr %40, align 4, !tbaa !9
  call void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef %96, ptr noundef %351, ptr noundef nonnull align 4 dereferenceable(4) %40)
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #12
  %352 = load i32, ptr %19, align 4, !tbaa !34
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds i32, ptr %99, i64 %353
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #12
  %355 = getelementptr inbounds %class.ParticleSystem, ptr %49, i32 0, i32 18
  %356 = load i32, ptr %355, align 4, !tbaa !49
  %357 = add nsw i32 4, %356
  store i32 %357, ptr %41, align 4, !tbaa !34
  call void @_ZSt4fillIPiiEvT_S1_RKT0_(ptr noundef %99, ptr noundef %354, ptr noundef nonnull align 4 dereferenceable(4) %41)
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #12
  %358 = load i32, ptr %19, align 4, !tbaa !34
  call void @_ZN14ParticleSystem19addParticleMultipleEPfS0_S0_S0_Pii(ptr noundef nonnull align 8 dereferenceable(412) %49, ptr noundef %86, ptr noundef %90, ptr noundef %93, ptr noundef %96, ptr noundef %99, i32 noundef %358)
  %359 = load i32, ptr %28, align 4, !tbaa !34
  call void @addPointConstraint(ptr noundef %133, ptr noundef %130, i32 noundef %359)
  %360 = load i32, ptr %27, align 4, !tbaa !34
  call void @addDistanceConstraint(ptr noundef %137, ptr noundef %140, i32 noundef %360)
  %361 = getelementptr inbounds %class.ParticleSystem, ptr %49, i32 0, i32 21
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #12
  %362 = load i32, ptr %17, align 4, !tbaa !34
  %363 = getelementptr inbounds %class.ParticleSystem, ptr %49, i32 0, i32 4
  %364 = load i32, ptr %363, align 4, !tbaa !13
  %365 = call i64 @_ZL9make_int2ii(i32 noundef %362, i32 noundef %364)
  store i64 %365, ptr %42, align 8
  call void @_ZNSt6vectorI4int2SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %361, ptr noundef nonnull align 8 dereferenceable(8) %42)
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #12
  %366 = getelementptr inbounds %class.ParticleSystem, ptr %49, i32 0, i32 22
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #12
  %367 = call i32 @rand() #12
  %368 = srem i32 %367, 8
  %369 = sext i32 %368 to i64
  %370 = getelementptr inbounds [8 x %struct.float3], ptr @_ZL6colors, i64 0, i64 %369
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %44, ptr align 4 %370, i64 12, i1 false), !tbaa.struct !50
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %45, ptr align 4 %44, i64 12, i1 false)
  %371 = getelementptr inbounds { <2 x float>, float }, ptr %45, i32 0, i32 0
  %372 = load <2 x float>, ptr %371, align 4
  %373 = getelementptr inbounds { <2 x float>, float }, ptr %45, i32 0, i32 1
  %374 = load float, ptr %373, align 4
  %375 = call { <2 x float>, <2 x float> } @_Z11make_float46float3f(<2 x float> %372, float %374, float noundef 1.000000e+00)
  %376 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %43, i32 0, i32 0
  %377 = extractvalue { <2 x float>, <2 x float> } %375, 0
  store <2 x float> %377, ptr %376, align 16
  %378 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %43, i32 0, i32 1
  %379 = extractvalue { <2 x float>, <2 x float> } %375, 1
  store <2 x float> %379, ptr %378, align 8
  call void @_ZNSt6vectorI6float4SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %366, ptr noundef nonnull align 16 dereferenceable(16) %43)
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #12
  %380 = getelementptr inbounds %class.ParticleSystem, ptr %49, i32 0, i32 18
  %381 = load i32, ptr %380, align 4, !tbaa !49
  %382 = add nsw i32 %381, 1
  store i32 %382, ptr %380, align 4, !tbaa !49
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #12
  %383 = load ptr, ptr %20, align 8
  call void @llvm.stackrestore.p0(ptr %383)
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #12
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #12
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #12
  ret void
}

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

declare void @addDistanceConstraint(ptr noundef, ptr noundef, i32 noundef) #11

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 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nocallback nofree 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 = { 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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #12 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"float", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"bool", !7, i64 0}
!13 = !{!14, !15, i64 12}
!14 = !{!"_ZTS14ParticleSystem", !12, i64 0, !10, i64 4, !15, i64 8, !15, i64 12, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !15, i64 72, !15, i64 76, !6, i64 80, !16, i64 88, !18, i64 156, !15, i64 168, !15, i64 172, !19, i64 176, !19, i64 256, !25, i64 336, !29, i64 360, !33, i64 384, !33, i64 396, !15, i64 408}
!15 = !{!"int", !7, i64 0}
!16 = !{!"_ZTS9SimParams", !17, i64 0, !10, i64 12, !10, i64 16, !18, i64 20, !15, i64 32, !17, i64 36, !17, i64 48, !15, i64 60, !15, i64 64}
!17 = !{!"_ZTS6float3", !10, i64 0, !10, i64 4, !10, i64 8}
!18 = !{!"_ZTS5uint3", !15, i64 0, !15, i64 4, !15, i64 8}
!19 = !{!"_ZTSSt5dequeI6float4SaIS0_EE", !20, i64 0}
!20 = !{!"_ZTSSt11_Deque_baseI6float4SaIS0_EE", !21, i64 0}
!21 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE11_Deque_implE", !22, i64 0}
!22 = !{!"_ZTSNSt11_Deque_baseI6float4SaIS0_EE16_Deque_impl_dataE", !6, i64 0, !23, i64 8, !24, i64 16, !24, i64 48}
!23 = !{!"long", !7, i64 0}
!24 = !{!"_ZTSSt15_Deque_iteratorI6float4RS0_PS0_E", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!25 = !{!"_ZTSSt6vectorI4int2SaIS0_EE", !26, i64 0}
!26 = !{!"_ZTSSt12_Vector_baseI4int2SaIS0_EE", !27, i64 0}
!27 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE12_Vector_implE", !28, i64 0}
!28 = !{!"_ZTSNSt12_Vector_baseI4int2SaIS0_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!29 = !{!"_ZTSSt6vectorI6float4SaIS0_EE", !30, i64 0}
!30 = !{!"_ZTSSt12_Vector_baseI6float4SaIS0_EE", !31, i64 0}
!31 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE12_Vector_implE", !32, i64 0}
!32 = !{!"_ZTSNSt12_Vector_baseI6float4SaIS0_EE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!33 = !{!"_ZTS4int3", !15, i64 0, !15, i64 4, !15, i64 8}
!34 = !{!15, !15, i64 0}
!35 = !{!36, !15, i64 0}
!36 = !{!"_ZTS4int2", !15, i64 0, !15, i64 4}
!37 = !{!17, !10, i64 0}
!38 = !{!36, !15, i64 4}
!39 = !{!17, !10, i64 8}
!40 = !{i8 0, i8 2}
!41 = !{}
!42 = !{!17, !10, i64 4}
!43 = !{!44, !10, i64 0}
!44 = !{!"_ZTS6float2", !10, i64 0, !10, i64 4}
!45 = !{!44, !10, i64 4}
!46 = distinct !{!46, !47}
!47 = !{!"llvm.loop.mustprogress"}
!48 = distinct !{!48, !47}
!49 = !{!14, !15, i64 172}
!50 = !{i64 0, i64 4, !9, i64 4, i64 4, !9, i64 8, i64 4, !9}


; 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.int2 = type { i32, i32 }
%struct.float4 = type { float, float, float, float }

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

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

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

; Function Attrs: mustprogress 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>, <2 x float> } @_Z11make_float46float3f(<2 x float>, float, float noundef) local_unnamed_addr #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)) local_unnamed_addr #3 align 2

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

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

; Function Attrs: nounwind
declare i32 @rand() local_unnamed_addr #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) local_unnamed_addr #3 align 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 #4

; 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 uwtable
define dso_local void @_ZN14ParticleSystem13addHorizClothE4int2S0_6float36float2fb(ptr noundef nonnull align 8 dereferenceable(412) %0, i64 %1, i64 %2, <2 x float> %3, float %4, <2 x float> %5, float noundef %6, i1 noundef zeroext %7) local_unnamed_addr #9 align 2 {
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca i32, align 4
  %12 = alloca %struct.int2, align 8
  %13 = alloca %struct.float4, align 16
  %.sroa.098.0.extract.trunc = trunc i64 %1 to i32
  %.sroa.3.0.extract.shift = lshr i64 %1, 32
  %.sroa.3.0.extract.trunc = trunc nuw i64 %.sroa.3.0.extract.shift to i32
  %.sroa.096.0.extract.trunc = trunc i64 %2 to i32
  %.sroa.297.0.extract.shift = lshr i64 %2, 32
  %.sroa.297.0.extract.trunc = trunc nuw i64 %.sroa.297.0.extract.shift to i32
  %14 = getelementptr inbounds i8, ptr %0, i64 12
  %15 = load i32, ptr %14, align 4, !tbaa !5
  %16 = sub nsw i32 %.sroa.096.0.extract.trunc, %.sroa.098.0.extract.trunc
  %17 = tail call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %16)
  %18 = fptosi double %17 to i32
  %19 = sitofp i32 %18 to float
  %.sroa.092.0.vec.extract = extractelement <2 x float> %3, i64 0
  %20 = fdiv float %19, %.sroa.092.0.vec.extract
  %21 = fptosi float %20 to i32
  %22 = sub nsw i32 %.sroa.297.0.extract.trunc, %.sroa.3.0.extract.trunc
  %23 = tail call noundef double @_ZSt4ceilIiEN9__gnu_cxx11__enable_ifIXsr12__is_integerIT_EE7__valueEdE6__typeES2_(i32 noundef %22)
  %24 = fptosi double %23 to i32
  %25 = sitofp i32 %24 to float
  %26 = fdiv float %25, %4
  %27 = fptosi float %26 to i32
  %28 = tail call i64 @_ZL9make_int2ii(i32 noundef %21, i32 noundef %27)
  %.sroa.067.0.extract.trunc = trunc i64 %28 to i32
  %.sroa.11.0.extract.shift = lshr i64 %28, 32
  %.sroa.11.0.extract.trunc = trunc nuw i64 %.sroa.11.0.extract.shift to i32
  %29 = mul nsw i32 %.sroa.11.0.extract.trunc, %.sroa.067.0.extract.trunc
  %30 = shl nsw i32 %29, 2
  %31 = zext i32 %30 to i64
  %32 = alloca float, i64 %31, align 16
  %33 = alloca float, i64 %31, align 16
  %34 = zext i32 %29 to i64
  %35 = alloca float, i64 %34, align 16
  %36 = alloca float, i64 %34, align 16
  %37 = alloca i32, i64 %34, align 16
  %38 = add nsw i32 %.sroa.067.0.extract.trunc, -1
  %39 = add nsw i32 %.sroa.11.0.extract.trunc, -1
  %40 = mul nsw i32 %39, %38
  %41 = add i32 %29, -1
  %42 = add i32 %41, %40
  %43 = add nsw i32 %.sroa.11.0.extract.trunc, %.sroa.067.0.extract.trunc
  %44 = shl nsw i32 %43, 1
  %.0101 = select i1 %7, i32 %44, i32 %.sroa.11.0.extract.trunc
  %45 = mul i32 %.0101, 3
  %46 = zext i32 %45 to i64
  %47 = alloca float, i64 %46, align 16
  %48 = zext i32 %.0101 to i64
  %49 = alloca i32, i64 %48, align 16
  %50 = shl i32 %42, 1
  %51 = zext i32 %50 to i64
  %52 = alloca i32, i64 %51, align 16
  %53 = zext i32 %42 to i64
  %54 = alloca float, i64 %53, align 16
  %55 = icmp sgt i32 %.sroa.11.0.extract.trunc, 0
  br i1 %55, label %.preheader.lr.ph, label %._crit_edge142

.preheader.lr.ph:                                 ; preds = %8
  %56 = icmp sgt i32 %.sroa.067.0.extract.trunc, 0
  %57 = sitofp i32 %.sroa.098.0.extract.trunc to float
  %.sroa.092.4.vec.extract = extractelement <2 x float> %3, i64 1
  %58 = sitofp i32 %.sroa.3.0.extract.trunc to float
  %.sroa.089.0.vec.extract = extractelement <2 x float> %5, i64 0
  %.sroa.089.4.vec.extract = extractelement <2 x float> %5, i64 1
  br i1 %56, label %.preheader.us.preheader, label %._crit_edge142

.preheader.us.preheader:                          ; preds = %.preheader.lr.ph
  %59 = tail call float @llvm.fmuladd.f32(float %.sroa.092.0.vec.extract, float 0.000000e+00, float %57)
  %60 = icmp eq i32 %38, 0
  %brmerge.not.us.peel = and i1 %60, %7
  %exitcond.peel.not = icmp eq i32 %.sroa.067.0.extract.trunc, 1
  br label %61

61:                                               ; preds = %.preheader.us.preheader, %._crit_edge.us
  %.0141.us = phi i64 [ %.lcssa.wide, %._crit_edge.us ], [ 0, %.preheader.us.preheader ]
  %.0102140.us = phi i32 [ %.5.us.lcssa, %._crit_edge.us ], [ 0, %.preheader.us.preheader ]
  %.0104139.us = phi i32 [ %.3107121129.us.lcssa, %._crit_edge.us ], [ 0, %.preheader.us.preheader ]
  %.0108138.us = phi i32 [ %175, %._crit_edge.us ], [ 0, %.preheader.us.preheader ]
  %62 = uitofp nneg i32 %.0108138.us to float
  %63 = tail call float @llvm.fmuladd.f32(float %62, float %4, float %58)
  %64 = mul nuw nsw i32 %.0108138.us, %.sroa.067.0.extract.trunc
  %65 = add nsw i32 %64, %15
  %.not110.us = icmp eq i32 %.0108138.us, 0
  %66 = icmp eq i32 %.0108138.us, %39
  %brmerge115.not.us = and i1 %66, %7
  %sext = shl i64 %.0141.us, 32
  %67 = ashr exact i64 %sext, 32
  %68 = ashr exact i64 %sext, 30
  %69 = getelementptr inbounds float, ptr %32, i64 %68
  store float %59, ptr %69, align 16, !tbaa !31
  %70 = or disjoint i64 %68, 1
  %71 = getelementptr inbounds float, ptr %32, i64 %70
  store float %.sroa.092.4.vec.extract, ptr %71, align 4, !tbaa !31
  %72 = or disjoint i64 %68, 2
  %73 = getelementptr inbounds float, ptr %32, i64 %72
  store float %63, ptr %73, align 8, !tbaa !31
  %74 = or disjoint i64 %68, 3
  %75 = getelementptr inbounds float, ptr %32, i64 %74
  store float 1.000000e+00, ptr %75, align 4, !tbaa !31
  %76 = sext i32 %.0102140.us to i64
  %77 = getelementptr inbounds i32, ptr %49, i64 %76
  store i32 %65, ptr %77, align 4, !tbaa !32
  %78 = mul nsw i32 %.0102140.us, 3
  %79 = sext i32 %78 to i64
  %80 = getelementptr inbounds float, ptr %47, i64 %79
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %80, ptr noundef nonnull align 16 dereferenceable(12) %69, i64 12, i1 false)
  %81 = add nsw i32 %.0102140.us, 1
  br i1 %.not110.us, label %93, label %82

82:                                               ; preds = %61
  %83 = sub i32 %65, %.sroa.067.0.extract.trunc
  %84 = shl nsw i32 %.0104139.us, 1
  %85 = sext i32 %84 to i64
  %86 = getelementptr inbounds i32, ptr %52, i64 %85
  store i32 %83, ptr %86, align 8, !tbaa !32
  %87 = or disjoint i32 %84, 1
  %88 = sext i32 %87 to i64
  %89 = getelementptr inbounds i32, ptr %52, i64 %88
  store i32 %65, ptr %89, align 4, !tbaa !32
  %90 = sext i32 %.0104139.us to i64
  %91 = getelementptr inbounds float, ptr %54, i64 %90
  store float %.sroa.089.4.vec.extract, ptr %91, align 4, !tbaa !31
  %92 = add nsw i32 %.0104139.us, 1
  br label %101

93:                                               ; preds = %61
  br i1 %7, label %94, label %.thread123.us.peel

94:                                               ; preds = %93
  %95 = sext i32 %81 to i64
  %96 = getelementptr inbounds i32, ptr %49, i64 %95
  store i32 %65, ptr %96, align 4, !tbaa !32
  %97 = mul nsw i32 %81, 3
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds float, ptr %47, i64 %98
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %99, ptr noundef nonnull align 16 dereferenceable(12) %69, i64 12, i1 false)
  %100 = add nsw i32 %.0102140.us, 2
  br label %101

101:                                              ; preds = %94, %82
  %.3107.us.peel = phi i32 [ %92, %82 ], [ %.0104139.us, %94 ]
  %.3.us.peel = phi i32 [ %81, %82 ], [ %100, %94 ]
  br i1 %brmerge.not.us.peel, label %102, label %109

102:                                              ; preds = %101
  %103 = sext i32 %.3.us.peel to i64
  %104 = getelementptr inbounds i32, ptr %49, i64 %103
  store i32 %65, ptr %104, align 4, !tbaa !32
  %105 = mul nsw i32 %.3.us.peel, 3
  %106 = sext i32 %105 to i64
  %107 = getelementptr inbounds float, ptr %47, i64 %106
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %107, ptr noundef nonnull align 16 dereferenceable(12) %69, i64 12, i1 false)
  %108 = add nsw i32 %.3.us.peel, 1
  br label %109

109:                                              ; preds = %102, %101
  %.4.us.peel = phi i32 [ %108, %102 ], [ %.3.us.peel, %101 ]
  br i1 %brmerge115.not.us, label %110, label %.thread123.us.peel

110:                                              ; preds = %109
  %111 = sext i32 %.4.us.peel to i64
  %112 = getelementptr inbounds i32, ptr %49, i64 %111
  store i32 %65, ptr %112, align 4, !tbaa !32
  %113 = mul nsw i32 %.4.us.peel, 3
  %114 = sext i32 %113 to i64
  %115 = getelementptr inbounds float, ptr %47, i64 %114
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %115, ptr noundef nonnull align 16 dereferenceable(12) %69, i64 12, i1 false)
  %116 = add nsw i32 %.4.us.peel, 1
  br label %.thread123.us.peel

.thread123.us.peel:                               ; preds = %110, %109, %93
  %.3107121129.us.peel = phi i32 [ %.3107.us.peel, %110 ], [ %.3107.us.peel, %109 ], [ %.0104139.us, %93 ]
  %.5.us.peel = phi i32 [ %116, %110 ], [ %.4.us.peel, %109 ], [ %81, %93 ]
  %indvars.iv.next.peel = add nsw i64 %67, 1
  br i1 %exitcond.peel.not, label %._crit_edge.us, label %.peel.next

.peel.next:                                       ; preds = %.thread123.us.peel, %.thread123.us
  %indvars.iv = phi i64 [ %indvars.iv.next, %.thread123.us ], [ %indvars.iv.next.peel, %.thread123.us.peel ]
  %.1103134.us = phi i32 [ %.5.us, %.thread123.us ], [ %.5.us.peel, %.thread123.us.peel ]
  %.1105133.us = phi i32 [ %.3107121129.us, %.thread123.us ], [ %.3107121129.us.peel, %.thread123.us.peel ]
  %.0109132.us = phi i32 [ %174, %.thread123.us ], [ 1, %.thread123.us.peel ]
  %117 = uitofp nneg i32 %.0109132.us to float
  %118 = tail call float @llvm.fmuladd.f32(float %117, float %.sroa.092.0.vec.extract, float %57)
  %119 = shl nsw i64 %indvars.iv, 2
  %120 = getelementptr inbounds float, ptr %32, i64 %119
  store float %118, ptr %120, align 16, !tbaa !31
  %121 = or disjoint i64 %119, 1
  %122 = getelementptr inbounds float, ptr %32, i64 %121
  store float %.sroa.092.4.vec.extract, ptr %122, align 4, !tbaa !31
  %123 = or disjoint i64 %119, 2
  %124 = getelementptr inbounds float, ptr %32, i64 %123
  store float %63, ptr %124, align 8, !tbaa !31
  %125 = or disjoint i64 %119, 3
  %126 = getelementptr inbounds float, ptr %32, i64 %125
  store float 1.000000e+00, ptr %126, align 4, !tbaa !31
  %127 = add nsw i32 %65, %.0109132.us
  %128 = add i32 %127, -1
  %129 = shl nsw i32 %.1105133.us, 1
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds i32, ptr %52, i64 %130
  store i32 %128, ptr %131, align 8, !tbaa !32
  %132 = or disjoint i32 %129, 1
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds i32, ptr %52, i64 %133
  store i32 %127, ptr %134, align 4, !tbaa !32
  %135 = sext i32 %.1105133.us to i64
  %136 = getelementptr inbounds float, ptr %54, i64 %135
  store float %.sroa.089.0.vec.extract, ptr %136, align 4, !tbaa !31
  %137 = add nsw i32 %.1105133.us, 1
  br i1 %.not110.us, label %149, label %138

138:                                              ; preds = %.peel.next
  %139 = sub i32 %127, %.sroa.067.0.extract.trunc
  %140 = shl nsw i32 %137, 1
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds i32, ptr %52, i64 %141
  store i32 %139, ptr %142, align 8, !tbaa !32
  %143 = or disjoint i32 %140, 1
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds i32, ptr %52, i64 %144
  store i32 %127, ptr %145, align 4, !tbaa !32
  %146 = sext i32 %137 to i64
  %147 = getelementptr inbounds float, ptr %54, i64 %146
  store float %.sroa.089.4.vec.extract, ptr %147, align 4, !tbaa !31
  %148 = add nsw i32 %.1105133.us, 2
  br label %157

149:                                              ; preds = %.peel.next
  br i1 %7, label %150, label %.thread123.us

150:                                              ; preds = %149
  %151 = sext i32 %.1103134.us to i64
  %152 = getelementptr inbounds i32, ptr %49, i64 %151
  store i32 %127, ptr %152, align 4, !tbaa !32
  %153 = mul nsw i32 %.1103134.us, 3
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds float, ptr %47, i64 %154
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %155, ptr noundef nonnull align 16 dereferenceable(12) %120, i64 12, i1 false)
  %156 = add nsw i32 %.1103134.us, 1
  br label %157

157:                                              ; preds = %150, %138
  %.3107.us = phi i32 [ %148, %138 ], [ %137, %150 ]
  %.3.us = phi i32 [ %.1103134.us, %138 ], [ %156, %150 ]
  %158 = icmp eq i32 %.0109132.us, %38
  %brmerge.not.us = and i1 %158, %7
  br i1 %brmerge.not.us, label %159, label %166

159:                                              ; preds = %157
  %160 = sext i32 %.3.us to i64
  %161 = getelementptr inbounds i32, ptr %49, i64 %160
  store i32 %127, ptr %161, align 4, !tbaa !32
  %162 = mul nsw i32 %.3.us, 3
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds float, ptr %47, i64 %163
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %164, ptr noundef nonnull align 16 dereferenceable(12) %120, i64 12, i1 false)
  %165 = add nsw i32 %.3.us, 1
  br label %166

166:                                              ; preds = %159, %157
  %.4.us = phi i32 [ %165, %159 ], [ %.3.us, %157 ]
  br i1 %brmerge115.not.us, label %167, label %.thread123.us

167:                                              ; preds = %166
  %168 = sext i32 %.4.us to i64
  %169 = getelementptr inbounds i32, ptr %49, i64 %168
  store i32 %127, ptr %169, align 4, !tbaa !32
  %170 = mul nsw i32 %.4.us, 3
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds float, ptr %47, i64 %171
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(12) %172, ptr noundef nonnull align 16 dereferenceable(12) %120, i64 12, i1 false)
  %173 = add nsw i32 %.4.us, 1
  br label %.thread123.us

.thread123.us:                                    ; preds = %167, %166, %149
  %.3107121129.us = phi i32 [ %.3107.us, %167 ], [ %.3107.us, %166 ], [ %137, %149 ]
  %.5.us = phi i32 [ %173, %167 ], [ %.4.us, %166 ], [ %.1103134.us, %149 ]
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %174 = add nuw nsw i32 %.0109132.us, 1
  %exitcond.not = icmp eq i32 %174, %.sroa.067.0.extract.trunc
  br i1 %exitcond.not, label %._crit_edge.us, label %.peel.next, !llvm.loop !33

._crit_edge.us:                                   ; preds = %.thread123.us, %.thread123.us.peel
  %.3107121129.us.lcssa = phi i32 [ %.3107121129.us.peel, %.thread123.us.peel ], [ %.3107121129.us, %.thread123.us ]
  %.5.us.lcssa = phi i32 [ %.5.us.peel, %.thread123.us.peel ], [ %.5.us, %.thread123.us ]
  %.lcssa.wide = phi i64 [ %indvars.iv.next.peel, %.thread123.us.peel ], [ %indvars.iv.next, %.thread123.us ]
  %175 = add nuw nsw i32 %.0108138.us, 1
  %exitcond146.not = icmp eq i32 %175, %.sroa.11.0.extract.trunc
  br i1 %exitcond146.not, label %._crit_edge142, label %61, !llvm.loop !36

._crit_edge142:                                   ; preds = %._crit_edge.us, %.preheader.lr.ph, %8
  %176 = sext i32 %30 to i64
  %177 = shl nsw i64 %176, 2
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %33, i8 0, i64 %177, i1 false)
  %178 = sext i32 %29 to i64
  %179 = getelementptr inbounds float, ptr %35, i64 %178
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %9) #11
  %180 = fdiv float 1.000000e+00, %6
  store float %180, ptr %9, align 4, !tbaa !31
  call void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef nonnull %35, ptr noundef nonnull %179, ptr noundef nonnull align 4 dereferenceable(4) %9)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %9) #11
  %181 = getelementptr inbounds float, ptr %36, i64 %178
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #11
  store float 1.000000e+00, ptr %10, align 4, !tbaa !31
  call void @_ZSt4fillIPffEvT_S1_RKT0_(ptr noundef nonnull %36, ptr noundef nonnull %181, ptr noundef nonnull align 4 dereferenceable(4) %10)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #11
  %182 = getelementptr inbounds i32, ptr %37, i64 %178
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %11) #11
  %183 = getelementptr inbounds i8, ptr %0, i64 172
  %184 = load i32, ptr %183, align 4, !tbaa !37
  %185 = add nsw i32 %184, 4
  store i32 %185, ptr %11, align 4, !tbaa !32
  call void @_ZSt4fillIPiiEvT_S1_RKT0_(ptr noundef nonnull %37, ptr noundef nonnull %182, ptr noundef nonnull align 4 dereferenceable(4) %11)
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %11) #11
  call void @_ZN14ParticleSystem19addParticleMultipleEPfS0_S0_S0_Pii(ptr noundef nonnull align 8 dereferenceable(412) %0, ptr noundef nonnull %32, ptr noundef nonnull %33, ptr noundef nonnull %35, ptr noundef nonnull %36, ptr noundef nonnull %37, i32 noundef %29)
  call void @addPointConstraint(ptr noundef nonnull %49, ptr noundef nonnull %47, i32 noundef %.0101)
  call void @addDistanceConstraint(ptr noundef nonnull %52, ptr noundef nonnull %54, i32 noundef %42)
  %186 = getelementptr inbounds i8, ptr %0, i64 336
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #11
  %187 = load i32, ptr %14, align 4, !tbaa !5
  %188 = call i64 @_ZL9make_int2ii(i32 noundef %15, i32 noundef %187)
  store i64 %188, ptr %12, align 8
  call void @_ZNSt6vectorI4int2SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %186, ptr noundef nonnull align 8 dereferenceable(8) %12)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #11
  %189 = getelementptr inbounds i8, ptr %0, i64 360
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %13) #11
  %190 = call i32 @rand() #11
  %191 = srem i32 %190, 8
  %192 = sext i32 %191 to i64
  %193 = getelementptr inbounds [8 x %struct.float3], ptr @_ZL6colors, i64 0, i64 %192
  %.sroa.01.0.copyload = load <2 x float>, ptr %193, align 4
  %.sroa.22.0..sroa_idx = getelementptr inbounds i8, ptr %193, i64 8
  %.sroa.22.0.copyload = load float, ptr %.sroa.22.0..sroa_idx, align 4, !tbaa !31
  %194 = 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)
  %195 = extractvalue { <2 x float>, <2 x float> } %194, 0
  store <2 x float> %195, ptr %13, align 16
  %196 = getelementptr inbounds i8, ptr %13, i64 8
  %197 = extractvalue { <2 x float>, <2 x float> } %194, 1
  store <2 x float> %197, ptr %196, align 8
  call void @_ZNSt6vectorI6float4SaIS0_EE9push_backEOS0_(ptr noundef nonnull align 8 dereferenceable(24) %189, ptr noundef nonnull align 16 dereferenceable(16) %13)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %13) #11
  %198 = load i32, ptr %183, align 4, !tbaa !37
  %199 = add nsw i32 %198, 1
  store i32 %199, ptr %183, align 4, !tbaa !37
  ret void
}

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

declare void @addDistanceConstraint(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #10

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { mustprogress nocallback nofree 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 = { 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 = { 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 #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 = { 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 = !{!10, !10, i64 0}
!32 = !{!11, !11, i64 0}
!33 = distinct !{!33, !34, !35}
!34 = !{!"llvm.loop.mustprogress"}
!35 = !{!"llvm.loop.peeled.count", i32 1}
!36 = distinct !{!36, !34}
!37 = !{!6, !11, i64 172}


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