; LLVM IR from introlab/odas :: src/system (particle2particle)

; 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.particle2particle_obj = type { i32, float, [3 x float], [3 x float], [3 x float], [3 x float], [3 x float], float, float, float, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, ptr, ptr, ptr, float }
%struct.pots_obj = type { i32, ptr }
%struct.postprobs_obj = type { i32, i32, ptr, ptr, ptr }
%struct.particles_obj = type { i32, ptr, ptr }

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

; Function Attrs: nounwind
declare float @expf(float noundef) #1

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

declare void @random_pdf(ptr noundef, ptr noundef) #3

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

declare void @random_generate(ptr noundef, i32 noundef, ptr noundef) #3

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

; Function Attrs: nounwind uwtable
define dso_local void @particle2particle_update(ptr noundef %0, ptr noundef %1, i32 noundef %2, ptr noundef %3, ptr noundef %4) #5 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca float, align 4
  %16 = alloca float, align 4
  %17 = alloca float, align 4
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  %21 = alloca float, align 4
  %22 = alloca float, align 4
  %23 = alloca float, align 4
  %24 = alloca float, align 4
  %25 = alloca float, align 4
  %26 = alloca float, align 4
  %27 = alloca float, align 4
  %28 = alloca float, align 4
  %29 = alloca float, align 4
  %30 = alloca float, align 4
  %31 = alloca float, align 4
  %32 = alloca float, align 4
  %33 = alloca float, align 4
  %34 = alloca float, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store i32 %2, ptr %8, align 4, !tbaa !9
  store ptr %3, ptr %9, align 8, !tbaa !5
  store ptr %4, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #7
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = getelementptr inbounds %struct.particle2particle_obj, ptr %35, i32 0, i32 19
  %37 = load ptr, ptr %36, align 8, !tbaa !11
  %38 = load ptr, ptr %6, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.particle2particle_obj, ptr %38, i32 0, i32 0
  %40 = load i32, ptr %39, align 8, !tbaa !15
  %41 = zext i32 %40 to i64
  %42 = mul i64 4, %41
  call void @llvm.memset.p0.i64(ptr align 4 %37, i8 0, i64 %42, i1 false)
  %43 = load ptr, ptr %6, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.particle2particle_obj, ptr %43, i32 0, i32 17
  %45 = load double, ptr %44, align 8, !tbaa !16
  %46 = fptrunc double %45 to float
  store float %46, ptr %32, align 4, !tbaa !17
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = getelementptr inbounds %struct.particle2particle_obj, ptr %47, i32 0, i32 8
  %49 = load float, ptr %48, align 8, !tbaa !18
  store float %49, ptr %22, align 4, !tbaa !17
  %50 = load ptr, ptr %6, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.particle2particle_obj, ptr %50, i32 0, i32 9
  %52 = load float, ptr %51, align 4, !tbaa !19
  store float %52, ptr %23, align 4, !tbaa !17
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %53

53:                                               ; preds = %174, %5
  %54 = load i32, ptr %12, align 4, !tbaa !9
  %55 = load ptr, ptr %9, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.pots_obj, ptr %55, i32 0, i32 0
  %57 = load i32, ptr %56, align 8, !tbaa !20
  %58 = icmp ult i32 %54, %57
  br i1 %58, label %59, label %177

59:                                               ; preds = %53
  %60 = load ptr, ptr %9, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.pots_obj, ptr %60, i32 0, i32 1
  %62 = load ptr, ptr %61, align 8, !tbaa !22
  %63 = load i32, ptr %12, align 4, !tbaa !9
  %64 = mul i32 %63, 4
  %65 = add i32 %64, 0
  %66 = zext i32 %65 to i64
  %67 = getelementptr inbounds float, ptr %62, i64 %66
  %68 = load float, ptr %67, align 4, !tbaa !17
  store float %68, ptr %13, align 4, !tbaa !17
  %69 = load ptr, ptr %9, align 8, !tbaa !5
  %70 = getelementptr inbounds %struct.pots_obj, ptr %69, i32 0, i32 1
  %71 = load ptr, ptr %70, align 8, !tbaa !22
  %72 = load i32, ptr %12, align 4, !tbaa !9
  %73 = mul i32 %72, 4
  %74 = add i32 %73, 1
  %75 = zext i32 %74 to i64
  %76 = getelementptr inbounds float, ptr %71, i64 %75
  %77 = load float, ptr %76, align 4, !tbaa !17
  store float %77, ptr %14, align 4, !tbaa !17
  %78 = load ptr, ptr %9, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.pots_obj, ptr %78, i32 0, i32 1
  %80 = load ptr, ptr %79, align 8, !tbaa !22
  %81 = load i32, ptr %12, align 4, !tbaa !9
  %82 = mul i32 %81, 4
  %83 = add i32 %82, 2
  %84 = zext i32 %83 to i64
  %85 = getelementptr inbounds float, ptr %80, i64 %84
  %86 = load float, ptr %85, align 4, !tbaa !17
  store float %86, ptr %15, align 4, !tbaa !17
  %87 = load ptr, ptr %7, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.postprobs_obj, ptr %87, i32 0, i32 3
  %89 = load ptr, ptr %88, align 8, !tbaa !23
  %90 = load i32, ptr %8, align 4, !tbaa !9
  %91 = load ptr, ptr %9, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.pots_obj, ptr %91, i32 0, i32 0
  %93 = load i32, ptr %92, align 8, !tbaa !20
  %94 = mul i32 %90, %93
  %95 = load i32, ptr %12, align 4, !tbaa !9
  %96 = add i32 %94, %95
  %97 = zext i32 %96 to i64
  %98 = getelementptr inbounds float, ptr %89, i64 %97
  %99 = load float, ptr %98, align 4, !tbaa !17
  store float %99, ptr %24, align 4, !tbaa !17
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %100

100:                                              ; preds = %170, %59
  %101 = load i32, ptr %11, align 4, !tbaa !9
  %102 = load ptr, ptr %10, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.particles_obj, ptr %102, i32 0, i32 0
  %104 = load i32, ptr %103, align 8, !tbaa !25
  %105 = icmp ult i32 %101, %104
  br i1 %105, label %106, label %173

106:                                              ; preds = %100
  %107 = load ptr, ptr %10, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.particles_obj, ptr %107, i32 0, i32 1
  %109 = load ptr, ptr %108, align 8, !tbaa !27
  %110 = load i32, ptr %11, align 4, !tbaa !9
  %111 = mul i32 %110, 7
  %112 = add i32 %111, 0
  %113 = zext i32 %112 to i64
  %114 = getelementptr inbounds float, ptr %109, i64 %113
  %115 = load float, ptr %114, align 4, !tbaa !17
  store float %115, ptr %16, align 4, !tbaa !17
  %116 = load ptr, ptr %10, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.particles_obj, ptr %116, i32 0, i32 1
  %118 = load ptr, ptr %117, align 8, !tbaa !27
  %119 = load i32, ptr %11, align 4, !tbaa !9
  %120 = mul i32 %119, 7
  %121 = add i32 %120, 1
  %122 = zext i32 %121 to i64
  %123 = getelementptr inbounds float, ptr %118, i64 %122
  %124 = load float, ptr %123, align 4, !tbaa !17
  store float %124, ptr %17, align 4, !tbaa !17
  %125 = load ptr, ptr %10, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.particles_obj, ptr %125, i32 0, i32 1
  %127 = load ptr, ptr %126, align 8, !tbaa !27
  %128 = load i32, ptr %11, align 4, !tbaa !9
  %129 = mul i32 %128, 7
  %130 = add i32 %129, 2
  %131 = zext i32 %130 to i64
  %132 = getelementptr inbounds float, ptr %127, i64 %131
  %133 = load float, ptr %132, align 4, !tbaa !17
  store float %133, ptr %18, align 4, !tbaa !17
  %134 = load float, ptr %13, align 4, !tbaa !17
  %135 = load float, ptr %16, align 4, !tbaa !17
  %136 = fsub float %134, %135
  store float %136, ptr %19, align 4, !tbaa !17
  %137 = load float, ptr %14, align 4, !tbaa !17
  %138 = load float, ptr %17, align 4, !tbaa !17
  %139 = fsub float %137, %138
  store float %139, ptr %20, align 4, !tbaa !17
  %140 = load float, ptr %15, align 4, !tbaa !17
  %141 = load float, ptr %18, align 4, !tbaa !17
  %142 = fsub float %140, %141
  store float %142, ptr %21, align 4, !tbaa !17
  %143 = load float, ptr %23, align 4, !tbaa !17
  %144 = load float, ptr %19, align 4, !tbaa !17
  %145 = load float, ptr %19, align 4, !tbaa !17
  %146 = load float, ptr %20, align 4, !tbaa !17
  %147 = load float, ptr %20, align 4, !tbaa !17
  %148 = fmul float %146, %147
  %149 = call float @llvm.fmuladd.f32(float %144, float %145, float %148)
  %150 = load float, ptr %21, align 4, !tbaa !17
  %151 = load float, ptr %21, align 4, !tbaa !17
  %152 = call float @llvm.fmuladd.f32(float %150, float %151, float %149)
  %153 = fmul float %143, %152
  %154 = call float @expf(float noundef %153) #7, !tbaa !9
  store float %154, ptr %25, align 4, !tbaa !17
  %155 = load float, ptr %24, align 4, !tbaa !17
  %156 = load float, ptr %25, align 4, !tbaa !17
  %157 = fmul float %155, %156
  store float %157, ptr %26, align 4, !tbaa !17
  %158 = load float, ptr %26, align 4, !tbaa !17
  %159 = load ptr, ptr %6, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.particle2particle_obj, ptr %159, i32 0, i32 19
  %161 = load ptr, ptr %160, align 8, !tbaa !11
  %162 = load i32, ptr %11, align 4, !tbaa !9
  %163 = zext i32 %162 to i64
  %164 = getelementptr inbounds float, ptr %161, i64 %163
  %165 = load float, ptr %164, align 4, !tbaa !17
  %166 = fadd float %165, %158
  store float %166, ptr %164, align 4, !tbaa !17
  %167 = load float, ptr %26, align 4, !tbaa !17
  %168 = load float, ptr %32, align 4, !tbaa !17
  %169 = fadd float %168, %167
  store float %169, ptr %32, align 4, !tbaa !17
  br label %170

170:                                              ; preds = %106
  %171 = load i32, ptr %11, align 4, !tbaa !9
  %172 = add i32 %171, 1
  store i32 %172, ptr %11, align 4, !tbaa !9
  br label %100, !llvm.loop !28

173:                                              ; preds = %100
  br label %174

174:                                              ; preds = %173
  %175 = load i32, ptr %12, align 4, !tbaa !9
  %176 = add i32 %175, 1
  store i32 %176, ptr %12, align 4, !tbaa !9
  br label %53, !llvm.loop !30

177:                                              ; preds = %53
  %178 = load ptr, ptr %6, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.particle2particle_obj, ptr %178, i32 0, i32 0
  %180 = load i32, ptr %179, align 8, !tbaa !15
  %181 = uitofp i32 %180 to float
  %182 = fdiv float 1.000000e+00, %181
  store float %182, ptr %27, align 4, !tbaa !17
  %183 = load ptr, ptr %7, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.postprobs_obj, ptr %183, i32 0, i32 4
  %185 = load ptr, ptr %184, align 8, !tbaa !31
  %186 = load i32, ptr %8, align 4, !tbaa !9
  %187 = zext i32 %186 to i64
  %188 = getelementptr inbounds float, ptr %185, i64 %187
  %189 = load float, ptr %188, align 4, !tbaa !17
  store float %189, ptr %28, align 4, !tbaa !17
  %190 = load float, ptr %28, align 4, !tbaa !17
  %191 = fsub float 1.000000e+00, %190
  store float %191, ptr %29, align 4, !tbaa !17
  %192 = load float, ptr %28, align 4, !tbaa !17
  %193 = load float, ptr %32, align 4, !tbaa !17
  %194 = fdiv float %192, %193
  store float %194, ptr %30, align 4, !tbaa !17
  %195 = load ptr, ptr %6, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.particle2particle_obj, ptr %195, i32 0, i32 17
  %197 = load double, ptr %196, align 8, !tbaa !16
  %198 = fptrunc double %197 to float
  store float %198, ptr %33, align 4, !tbaa !17
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %199

199:                                              ; preds = %240, %177
  %200 = load i32, ptr %11, align 4, !tbaa !9
  %201 = load ptr, ptr %6, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.particle2particle_obj, ptr %201, i32 0, i32 0
  %203 = load i32, ptr %202, align 8, !tbaa !15
  %204 = icmp ult i32 %200, %203
  br i1 %204, label %205, label %243

205:                                              ; preds = %199
  %206 = load float, ptr %29, align 4, !tbaa !17
  %207 = load float, ptr %27, align 4, !tbaa !17
  %208 = load float, ptr %30, align 4, !tbaa !17
  %209 = load ptr, ptr %6, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.particle2particle_obj, ptr %209, i32 0, i32 19
  %211 = load ptr, ptr %210, align 8, !tbaa !11
  %212 = load i32, ptr %11, align 4, !tbaa !9
  %213 = zext i32 %212 to i64
  %214 = getelementptr inbounds float, ptr %211, i64 %213
  %215 = load float, ptr %214, align 4, !tbaa !17
  %216 = fmul float %208, %215
  %217 = call float @llvm.fmuladd.f32(float %206, float %207, float %216)
  store float %217, ptr %31, align 4, !tbaa !17
  %218 = load float, ptr %31, align 4, !tbaa !17
  %219 = load ptr, ptr %10, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.particles_obj, ptr %219, i32 0, i32 1
  %221 = load ptr, ptr %220, align 8, !tbaa !27
  %222 = load i32, ptr %11, align 4, !tbaa !9
  %223 = mul i32 %222, 7
  %224 = add i32 %223, 6
  %225 = zext i32 %224 to i64
  %226 = getelementptr inbounds float, ptr %221, i64 %225
  %227 = load float, ptr %226, align 4, !tbaa !17
  %228 = fmul float %227, %218
  store float %228, ptr %226, align 4, !tbaa !17
  %229 = load ptr, ptr %10, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.particles_obj, ptr %229, i32 0, i32 1
  %231 = load ptr, ptr %230, align 8, !tbaa !27
  %232 = load i32, ptr %11, align 4, !tbaa !9
  %233 = mul i32 %232, 7
  %234 = add i32 %233, 6
  %235 = zext i32 %234 to i64
  %236 = getelementptr inbounds float, ptr %231, i64 %235
  %237 = load float, ptr %236, align 4, !tbaa !17
  %238 = load float, ptr %33, align 4, !tbaa !17
  %239 = fadd float %238, %237
  store float %239, ptr %33, align 4, !tbaa !17
  br label %240

240:                                              ; preds = %205
  %241 = load i32, ptr %11, align 4, !tbaa !9
  %242 = add i32 %241, 1
  store i32 %242, ptr %11, align 4, !tbaa !9
  br label %199, !llvm.loop !32

243:                                              ; preds = %199
  %244 = load ptr, ptr %6, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.particle2particle_obj, ptr %244, i32 0, i32 17
  %246 = load double, ptr %245, align 8, !tbaa !16
  %247 = fptrunc double %246 to float
  store float %247, ptr %34, align 4, !tbaa !17
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %248

248:                                              ; preds = %286, %243
  %249 = load i32, ptr %11, align 4, !tbaa !9
  %250 = load ptr, ptr %6, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.particle2particle_obj, ptr %250, i32 0, i32 0
  %252 = load i32, ptr %251, align 8, !tbaa !15
  %253 = icmp ult i32 %249, %252
  br i1 %253, label %254, label %289

254:                                              ; preds = %248
  %255 = load float, ptr %33, align 4, !tbaa !17
  %256 = load ptr, ptr %10, align 8, !tbaa !5
  %257 = getelementptr inbounds %struct.particles_obj, ptr %256, i32 0, i32 1
  %258 = load ptr, ptr %257, align 8, !tbaa !27
  %259 = load i32, ptr %11, align 4, !tbaa !9
  %260 = mul i32 %259, 7
  %261 = add i32 %260, 6
  %262 = zext i32 %261 to i64
  %263 = getelementptr inbounds float, ptr %258, i64 %262
  %264 = load float, ptr %263, align 4, !tbaa !17
  %265 = fdiv float %264, %255
  store float %265, ptr %263, align 4, !tbaa !17
  %266 = load ptr, ptr %10, align 8, !tbaa !5
  %267 = getelementptr inbounds %struct.particles_obj, ptr %266, i32 0, i32 1
  %268 = load ptr, ptr %267, align 8, !tbaa !27
  %269 = load i32, ptr %11, align 4, !tbaa !9
  %270 = mul i32 %269, 7
  %271 = add i32 %270, 6
  %272 = zext i32 %271 to i64
  %273 = getelementptr inbounds float, ptr %268, i64 %272
  %274 = load float, ptr %273, align 4, !tbaa !17
  %275 = load ptr, ptr %10, align 8, !tbaa !5
  %276 = getelementptr inbounds %struct.particles_obj, ptr %275, i32 0, i32 1
  %277 = load ptr, ptr %276, align 8, !tbaa !27
  %278 = load i32, ptr %11, align 4, !tbaa !9
  %279 = mul i32 %278, 7
  %280 = add i32 %279, 6
  %281 = zext i32 %280 to i64
  %282 = getelementptr inbounds float, ptr %277, i64 %281
  %283 = load float, ptr %282, align 4, !tbaa !17
  %284 = load float, ptr %34, align 4, !tbaa !17
  %285 = call float @llvm.fmuladd.f32(float %274, float %283, float %284)
  store float %285, ptr %34, align 4, !tbaa !17
  br label %286

286:                                              ; preds = %254
  %287 = load i32, ptr %11, align 4, !tbaa !9
  %288 = add i32 %287, 1
  store i32 %288, ptr %11, align 4, !tbaa !9
  br label %248, !llvm.loop !33

289:                                              ; preds = %248
  %290 = load float, ptr %34, align 4, !tbaa !17
  %291 = fdiv float 1.000000e+00, %290
  store float %291, ptr %34, align 4, !tbaa !17
  %292 = load float, ptr %34, align 4, !tbaa !17
  %293 = load ptr, ptr %6, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.particle2particle_obj, ptr %293, i32 0, i32 21
  %295 = load float, ptr %294, align 8, !tbaa !34
  %296 = load ptr, ptr %6, align 8, !tbaa !5
  %297 = getelementptr inbounds %struct.particle2particle_obj, ptr %296, i32 0, i32 0
  %298 = load i32, ptr %297, align 8, !tbaa !15
  %299 = uitofp i32 %298 to float
  %300 = fmul float %295, %299
  %301 = fcmp olt float %292, %300
  br i1 %301, label %302, label %557

302:                                              ; preds = %289
  %303 = load ptr, ptr %6, align 8, !tbaa !5
  %304 = getelementptr inbounds %struct.particle2particle_obj, ptr %303, i32 0, i32 20
  %305 = load ptr, ptr %304, align 8, !tbaa !35
  %306 = getelementptr inbounds %struct.particles_obj, ptr %305, i32 0, i32 1
  %307 = load ptr, ptr %306, align 8, !tbaa !27
  %308 = load ptr, ptr %10, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.particles_obj, ptr %308, i32 0, i32 1
  %310 = load ptr, ptr %309, align 8, !tbaa !27
  %311 = load ptr, ptr %6, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.particle2particle_obj, ptr %311, i32 0, i32 0
  %313 = load i32, ptr %312, align 8, !tbaa !15
  %314 = zext i32 %313 to i64
  %315 = mul i64 28, %314
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %307, ptr align 4 %310, i64 %315, i1 false)
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %316

316:                                              ; preds = %340, %302
  %317 = load i32, ptr %11, align 4, !tbaa !9
  %318 = load ptr, ptr %6, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.particle2particle_obj, ptr %318, i32 0, i32 0
  %320 = load i32, ptr %319, align 8, !tbaa !15
  %321 = icmp ult i32 %317, %320
  br i1 %321, label %322, label %343

322:                                              ; preds = %316
  %323 = load ptr, ptr %6, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.particle2particle_obj, ptr %323, i32 0, i32 20
  %325 = load ptr, ptr %324, align 8, !tbaa !35
  %326 = getelementptr inbounds %struct.particles_obj, ptr %325, i32 0, i32 1
  %327 = load ptr, ptr %326, align 8, !tbaa !27
  %328 = load i32, ptr %11, align 4, !tbaa !9
  %329 = mul i32 %328, 7
  %330 = add i32 %329, 6
  %331 = zext i32 %330 to i64
  %332 = getelementptr inbounds float, ptr %327, i64 %331
  %333 = load float, ptr %332, align 4, !tbaa !17
  %334 = load ptr, ptr %6, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct.particle2particle_obj, ptr %334, i32 0, i32 13
  %336 = load ptr, ptr %335, align 8, !tbaa !36
  %337 = load i32, ptr %11, align 4, !tbaa !9
  %338 = zext i32 %337 to i64
  %339 = getelementptr inbounds float, ptr %336, i64 %338
  store float %333, ptr %339, align 4, !tbaa !17
  br label %340

340:                                              ; preds = %322
  %341 = load i32, ptr %11, align 4, !tbaa !9
  %342 = add i32 %341, 1
  store i32 %342, ptr %11, align 4, !tbaa !9
  br label %316, !llvm.loop !37

343:                                              ; preds = %316
  %344 = load ptr, ptr %6, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.particle2particle_obj, ptr %344, i32 0, i32 15
  %346 = load ptr, ptr %345, align 8, !tbaa !38
  %347 = load ptr, ptr %6, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.particle2particle_obj, ptr %347, i32 0, i32 13
  %349 = load ptr, ptr %348, align 8, !tbaa !36
  call void @random_pdf(ptr noundef %346, ptr noundef %349)
  %350 = load ptr, ptr %6, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.particle2particle_obj, ptr %350, i32 0, i32 15
  %352 = load ptr, ptr %351, align 8, !tbaa !38
  %353 = load ptr, ptr %6, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.particle2particle_obj, ptr %353, i32 0, i32 0
  %355 = load i32, ptr %354, align 8, !tbaa !15
  %356 = load ptr, ptr %6, align 8, !tbaa !5
  %357 = getelementptr inbounds %struct.particle2particle_obj, ptr %356, i32 0, i32 14
  %358 = load ptr, ptr %357, align 8, !tbaa !39
  call void @random_generate(ptr noundef %352, i32 noundef %355, ptr noundef %358)
  %359 = load ptr, ptr %6, align 8, !tbaa !5
  %360 = getelementptr inbounds %struct.particle2particle_obj, ptr %359, i32 0, i32 12
  %361 = load ptr, ptr %360, align 8, !tbaa !40
  %362 = load ptr, ptr %6, align 8, !tbaa !5
  %363 = getelementptr inbounds %struct.particle2particle_obj, ptr %362, i32 0, i32 0
  %364 = load i32, ptr %363, align 8, !tbaa !15
  %365 = load ptr, ptr %6, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.particle2particle_obj, ptr %365, i32 0, i32 11
  %367 = load ptr, ptr %366, align 8, !tbaa !41
  call void @random_generate(ptr noundef %361, i32 noundef %364, ptr noundef %367)
  %368 = load ptr, ptr %6, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.particle2particle_obj, ptr %368, i32 0, i32 0
  %370 = load i32, ptr %369, align 8, !tbaa !15
  %371 = uitofp i32 %370 to float
  %372 = fdiv float 1.000000e+00, %371
  store float %372, ptr %27, align 4, !tbaa !17
  store i32 0, ptr %11, align 4, !tbaa !9
  br label %373

373:                                              ; preds = %553, %343
  %374 = load i32, ptr %11, align 4, !tbaa !9
  %375 = load ptr, ptr %6, align 8, !tbaa !5
  %376 = getelementptr inbounds %struct.particle2particle_obj, ptr %375, i32 0, i32 0
  %377 = load i32, ptr %376, align 8, !tbaa !15
  %378 = icmp ult i32 %374, %377
  br i1 %378, label %379, label %556

379:                                              ; preds = %373
  %380 = load ptr, ptr %6, align 8, !tbaa !5
  %381 = getelementptr inbounds %struct.particle2particle_obj, ptr %380, i32 0, i32 20
  %382 = load ptr, ptr %381, align 8, !tbaa !35
  %383 = getelementptr inbounds %struct.particles_obj, ptr %382, i32 0, i32 1
  %384 = load ptr, ptr %383, align 8, !tbaa !27
  %385 = load ptr, ptr %6, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.particle2particle_obj, ptr %385, i32 0, i32 14
  %387 = load ptr, ptr %386, align 8, !tbaa !39
  %388 = load i32, ptr %11, align 4, !tbaa !9
  %389 = zext i32 %388 to i64
  %390 = getelementptr inbounds i32, ptr %387, i64 %389
  %391 = load i32, ptr %390, align 4, !tbaa !9
  %392 = mul i32 %391, 7
  %393 = add i32 %392, 0
  %394 = zext i32 %393 to i64
  %395 = getelementptr inbounds float, ptr %384, i64 %394
  %396 = load float, ptr %395, align 4, !tbaa !17
  %397 = load ptr, ptr %10, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.particles_obj, ptr %397, i32 0, i32 1
  %399 = load ptr, ptr %398, align 8, !tbaa !27
  %400 = load i32, ptr %11, align 4, !tbaa !9
  %401 = mul i32 %400, 7
  %402 = add i32 %401, 0
  %403 = zext i32 %402 to i64
  %404 = getelementptr inbounds float, ptr %399, i64 %403
  store float %396, ptr %404, align 4, !tbaa !17
  %405 = load ptr, ptr %6, align 8, !tbaa !5
  %406 = getelementptr inbounds %struct.particle2particle_obj, ptr %405, i32 0, i32 20
  %407 = load ptr, ptr %406, align 8, !tbaa !35
  %408 = getelementptr inbounds %struct.particles_obj, ptr %407, i32 0, i32 1
  %409 = load ptr, ptr %408, align 8, !tbaa !27
  %410 = load ptr, ptr %6, align 8, !tbaa !5
  %411 = getelementptr inbounds %struct.particle2particle_obj, ptr %410, i32 0, i32 14
  %412 = load ptr, ptr %411, align 8, !tbaa !39
  %413 = load i32, ptr %11, align 4, !tbaa !9
  %414 = zext i32 %413 to i64
  %415 = getelementptr inbounds i32, ptr %412, i64 %414
  %416 = load i32, ptr %415, align 4, !tbaa !9
  %417 = mul i32 %416, 7
  %418 = add i32 %417, 1
  %419 = zext i32 %418 to i64
  %420 = getelementptr inbounds float, ptr %409, i64 %419
  %421 = load float, ptr %420, align 4, !tbaa !17
  %422 = load ptr, ptr %10, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.particles_obj, ptr %422, i32 0, i32 1
  %424 = load ptr, ptr %423, align 8, !tbaa !27
  %425 = load i32, ptr %11, align 4, !tbaa !9
  %426 = mul i32 %425, 7
  %427 = add i32 %426, 1
  %428 = zext i32 %427 to i64
  %429 = getelementptr inbounds float, ptr %424, i64 %428
  store float %421, ptr %429, align 4, !tbaa !17
  %430 = load ptr, ptr %6, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.particle2particle_obj, ptr %430, i32 0, i32 20
  %432 = load ptr, ptr %431, align 8, !tbaa !35
  %433 = getelementptr inbounds %struct.particles_obj, ptr %432, i32 0, i32 1
  %434 = load ptr, ptr %433, align 8, !tbaa !27
  %435 = load ptr, ptr %6, align 8, !tbaa !5
  %436 = getelementptr inbounds %struct.particle2particle_obj, ptr %435, i32 0, i32 14
  %437 = load ptr, ptr %436, align 8, !tbaa !39
  %438 = load i32, ptr %11, align 4, !tbaa !9
  %439 = zext i32 %438 to i64
  %440 = getelementptr inbounds i32, ptr %437, i64 %439
  %441 = load i32, ptr %440, align 4, !tbaa !9
  %442 = mul i32 %441, 7
  %443 = add i32 %442, 2
  %444 = zext i32 %443 to i64
  %445 = getelementptr inbounds float, ptr %434, i64 %444
  %446 = load float, ptr %445, align 4, !tbaa !17
  %447 = load ptr, ptr %10, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.particles_obj, ptr %447, i32 0, i32 1
  %449 = load ptr, ptr %448, align 8, !tbaa !27
  %450 = load i32, ptr %11, align 4, !tbaa !9
  %451 = mul i32 %450, 7
  %452 = add i32 %451, 2
  %453 = zext i32 %452 to i64
  %454 = getelementptr inbounds float, ptr %449, i64 %453
  store float %446, ptr %454, align 4, !tbaa !17
  %455 = load ptr, ptr %6, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.particle2particle_obj, ptr %455, i32 0, i32 20
  %457 = load ptr, ptr %456, align 8, !tbaa !35
  %458 = getelementptr inbounds %struct.particles_obj, ptr %457, i32 0, i32 1
  %459 = load ptr, ptr %458, align 8, !tbaa !27
  %460 = load ptr, ptr %6, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.particle2particle_obj, ptr %460, i32 0, i32 14
  %462 = load ptr, ptr %461, align 8, !tbaa !39
  %463 = load i32, ptr %11, align 4, !tbaa !9
  %464 = zext i32 %463 to i64
  %465 = getelementptr inbounds i32, ptr %462, i64 %464
  %466 = load i32, ptr %465, align 4, !tbaa !9
  %467 = mul i32 %466, 7
  %468 = add i32 %467, 3
  %469 = zext i32 %468 to i64
  %470 = getelementptr inbounds float, ptr %459, i64 %469
  %471 = load float, ptr %470, align 4, !tbaa !17
  %472 = load ptr, ptr %10, align 8, !tbaa !5
  %473 = getelementptr inbounds %struct.particles_obj, ptr %472, i32 0, i32 1
  %474 = load ptr, ptr %473, align 8, !tbaa !27
  %475 = load i32, ptr %11, align 4, !tbaa !9
  %476 = mul i32 %475, 7
  %477 = add i32 %476, 3
  %478 = zext i32 %477 to i64
  %479 = getelementptr inbounds float, ptr %474, i64 %478
  store float %471, ptr %479, align 4, !tbaa !17
  %480 = load ptr, ptr %6, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.particle2particle_obj, ptr %480, i32 0, i32 20
  %482 = load ptr, ptr %481, align 8, !tbaa !35
  %483 = getelementptr inbounds %struct.particles_obj, ptr %482, i32 0, i32 1
  %484 = load ptr, ptr %483, align 8, !tbaa !27
  %485 = load ptr, ptr %6, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct.particle2particle_obj, ptr %485, i32 0, i32 14
  %487 = load ptr, ptr %486, align 8, !tbaa !39
  %488 = load i32, ptr %11, align 4, !tbaa !9
  %489 = zext i32 %488 to i64
  %490 = getelementptr inbounds i32, ptr %487, i64 %489
  %491 = load i32, ptr %490, align 4, !tbaa !9
  %492 = mul i32 %491, 7
  %493 = add i32 %492, 4
  %494 = zext i32 %493 to i64
  %495 = getelementptr inbounds float, ptr %484, i64 %494
  %496 = load float, ptr %495, align 4, !tbaa !17
  %497 = load ptr, ptr %10, align 8, !tbaa !5
  %498 = getelementptr inbounds %struct.particles_obj, ptr %497, i32 0, i32 1
  %499 = load ptr, ptr %498, align 8, !tbaa !27
  %500 = load i32, ptr %11, align 4, !tbaa !9
  %501 = mul i32 %500, 7
  %502 = add i32 %501, 4
  %503 = zext i32 %502 to i64
  %504 = getelementptr inbounds float, ptr %499, i64 %503
  store float %496, ptr %504, align 4, !tbaa !17
  %505 = load ptr, ptr %6, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.particle2particle_obj, ptr %505, i32 0, i32 20
  %507 = load ptr, ptr %506, align 8, !tbaa !35
  %508 = getelementptr inbounds %struct.particles_obj, ptr %507, i32 0, i32 1
  %509 = load ptr, ptr %508, align 8, !tbaa !27
  %510 = load ptr, ptr %6, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.particle2particle_obj, ptr %510, i32 0, i32 14
  %512 = load ptr, ptr %511, align 8, !tbaa !39
  %513 = load i32, ptr %11, align 4, !tbaa !9
  %514 = zext i32 %513 to i64
  %515 = getelementptr inbounds i32, ptr %512, i64 %514
  %516 = load i32, ptr %515, align 4, !tbaa !9
  %517 = mul i32 %516, 7
  %518 = add i32 %517, 5
  %519 = zext i32 %518 to i64
  %520 = getelementptr inbounds float, ptr %509, i64 %519
  %521 = load float, ptr %520, align 4, !tbaa !17
  %522 = load ptr, ptr %10, align 8, !tbaa !5
  %523 = getelementptr inbounds %struct.particles_obj, ptr %522, i32 0, i32 1
  %524 = load ptr, ptr %523, align 8, !tbaa !27
  %525 = load i32, ptr %11, align 4, !tbaa !9
  %526 = mul i32 %525, 7
  %527 = add i32 %526, 5
  %528 = zext i32 %527 to i64
  %529 = getelementptr inbounds float, ptr %524, i64 %528
  store float %521, ptr %529, align 4, !tbaa !17
  %530 = load ptr, ptr %6, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.particle2particle_obj, ptr %530, i32 0, i32 11
  %532 = load ptr, ptr %531, align 8, !tbaa !41
  %533 = load i32, ptr %11, align 4, !tbaa !9
  %534 = zext i32 %533 to i64
  %535 = getelementptr inbounds i32, ptr %532, i64 %534
  %536 = load i32, ptr %535, align 4, !tbaa !9
  %537 = trunc i32 %536 to i8
  %538 = load ptr, ptr %10, align 8, !tbaa !5
  %539 = getelementptr inbounds %struct.particles_obj, ptr %538, i32 0, i32 2
  %540 = load ptr, ptr %539, align 8, !tbaa !42
  %541 = load i32, ptr %11, align 4, !tbaa !9
  %542 = zext i32 %541 to i64
  %543 = getelementptr inbounds i8, ptr %540, i64 %542
  store i8 %537, ptr %543, align 1, !tbaa !43
  %544 = load float, ptr %27, align 4, !tbaa !17
  %545 = load ptr, ptr %10, align 8, !tbaa !5
  %546 = getelementptr inbounds %struct.particles_obj, ptr %545, i32 0, i32 1
  %547 = load ptr, ptr %546, align 8, !tbaa !27
  %548 = load i32, ptr %11, align 4, !tbaa !9
  %549 = mul i32 %548, 7
  %550 = add i32 %549, 6
  %551 = zext i32 %550 to i64
  %552 = getelementptr inbounds float, ptr %547, i64 %551
  store float %544, ptr %552, align 4, !tbaa !17
  br label %553

553:                                              ; preds = %379
  %554 = load i32, ptr %11, align 4, !tbaa !9
  %555 = add i32 %554, 1
  store i32 %555, ptr %11, align 4, !tbaa !9
  br label %373, !llvm.loop !44

556:                                              ; preds = %373
  br label %557

557:                                              ; preds = %556, %289
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  ret void
}

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { "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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { 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 #6 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !6, i64 152}
!12 = !{!"particle2particle_obj", !10, i64 0, !13, i64 4, !7, i64 8, !7, i64 20, !7, i64 32, !7, i64 44, !7, i64 56, !13, i64 68, !13, i64 72, !13, i64 76, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !14, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !13, i64 168}
!13 = !{!"float", !7, i64 0}
!14 = !{!"double", !7, i64 0}
!15 = !{!12, !10, i64 0}
!16 = !{!12, !14, i64 136}
!17 = !{!13, !13, i64 0}
!18 = !{!12, !13, i64 72}
!19 = !{!12, !13, i64 76}
!20 = !{!21, !10, i64 0}
!21 = !{!"pots_obj", !10, i64 0, !6, i64 8}
!22 = !{!21, !6, i64 8}
!23 = !{!24, !6, i64 16}
!24 = !{!"postprobs_obj", !10, i64 0, !10, i64 4, !6, i64 8, !6, i64 16, !6, i64 24}
!25 = !{!26, !10, i64 0}
!26 = !{!"particles_obj", !10, i64 0, !6, i64 8, !6, i64 16}
!27 = !{!26, !6, i64 8}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = distinct !{!30, !29}
!31 = !{!24, !6, i64 24}
!32 = distinct !{!32, !29}
!33 = distinct !{!33, !29}
!34 = !{!12, !13, i64 168}
!35 = !{!12, !6, i64 160}
!36 = !{!12, !6, i64 104}
!37 = distinct !{!37, !29}
!38 = !{!12, !6, i64 120}
!39 = !{!12, !6, i64 112}
!40 = !{!12, !6, i64 96}
!41 = !{!12, !6, i64 88}
!42 = !{!26, !6, i64 16}
!43 = !{!7, !7, i64 0}
!44 = distinct !{!44, !29}


; 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"

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare float @expf(float noundef) local_unnamed_addr #0

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

declare void @random_pdf(ptr noundef, ptr noundef) local_unnamed_addr #2

declare void @random_generate(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
define dso_local void @particle2particle_update(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1, i32 noundef %2, ptr nocapture noundef readonly %3, ptr nocapture noundef readonly %4) local_unnamed_addr #4 {
  %6 = getelementptr inbounds i8, ptr %0, i64 152
  %7 = load ptr, ptr %6, align 8, !tbaa !5
  %8 = load i32, ptr %0, align 8, !tbaa !13
  %9 = zext i32 %8 to i64
  %10 = shl nuw nsw i64 %9, 2
  tail call void @llvm.memset.p0.i64(ptr align 4 %7, i8 0, i64 %10, i1 false)
  %11 = getelementptr inbounds i8, ptr %0, i64 136
  %12 = load double, ptr %11, align 8, !tbaa !14
  %13 = fptrunc double %12 to float
  %14 = getelementptr inbounds i8, ptr %0, i64 76
  %15 = load float, ptr %14, align 4, !tbaa !15
  %16 = load i32, ptr %3, align 8, !tbaa !16
  %.not = icmp eq i32 %16, 0
  br i1 %.not, label %._crit_edge155, label %.lr.ph154

.lr.ph154:                                        ; preds = %5
  %17 = getelementptr inbounds i8, ptr %3, i64 8
  %18 = load ptr, ptr %17, align 8, !tbaa !18
  %19 = getelementptr inbounds i8, ptr %1, i64 16
  %20 = load ptr, ptr %19, align 8, !tbaa !19
  %21 = getelementptr inbounds i8, ptr %4, i64 8
  %22 = load i32, ptr %4, align 8, !tbaa !21
  %.not174 = icmp eq i32 %22, 0
  br i1 %.not174, label %._crit_edge155, label %.lr.ph154.split

.lr.ph154.split:                                  ; preds = %.lr.ph154, %._crit_edge
  %23 = phi i32 [ %75, %._crit_edge ], [ %16, %.lr.ph154 ]
  %24 = phi i32 [ %76, %._crit_edge ], [ 1, %.lr.ph154 ]
  %indvars.iv184 = phi i64 [ %indvars.iv.next185, %._crit_edge ], [ 0, %.lr.ph154 ]
  %.0143152 = phi float [ %.1.lcssa, %._crit_edge ], [ %13, %.lr.ph154 ]
  %25 = trunc nuw i64 %indvars.iv184 to i32
  %26 = shl i32 %25, 2
  %27 = zext i32 %26 to i64
  %28 = getelementptr inbounds float, ptr %18, i64 %27
  %29 = load float, ptr %28, align 4, !tbaa !23
  %30 = or disjoint i32 %26, 1
  %31 = zext i32 %30 to i64
  %32 = getelementptr inbounds float, ptr %18, i64 %31
  %33 = load float, ptr %32, align 4, !tbaa !23
  %34 = or disjoint i32 %26, 2
  %35 = zext i32 %34 to i64
  %36 = getelementptr inbounds float, ptr %18, i64 %35
  %37 = load float, ptr %36, align 4, !tbaa !23
  %38 = mul i32 %23, %2
  %39 = add i32 %38, %25
  %40 = zext i32 %39 to i64
  %41 = getelementptr inbounds float, ptr %20, i64 %40
  %42 = load float, ptr %41, align 4, !tbaa !23
  %.not175 = icmp eq i32 %24, 0
  br i1 %.not175, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph154.split
  %43 = load ptr, ptr %21, align 8, !tbaa !24
  %44 = load ptr, ptr %6, align 8, !tbaa !5
  br label %45

45:                                               ; preds = %.lr.ph, %45
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %45 ]
  %.1150 = phi float [ %.0143152, %.lr.ph ], [ %71, %45 ]
  %46 = trunc nuw i64 %indvars.iv to i32
  %47 = mul i32 %46, 7
  %48 = zext i32 %47 to i64
  %49 = getelementptr inbounds float, ptr %43, i64 %48
  %50 = load float, ptr %49, align 4, !tbaa !23
  %51 = add i32 %47, 1
  %52 = zext i32 %51 to i64
  %53 = getelementptr inbounds float, ptr %43, i64 %52
  %54 = load float, ptr %53, align 4, !tbaa !23
  %55 = add i32 %47, 2
  %56 = zext i32 %55 to i64
  %57 = getelementptr inbounds float, ptr %43, i64 %56
  %58 = load float, ptr %57, align 4, !tbaa !23
  %59 = fsub float %29, %50
  %60 = fsub float %33, %54
  %61 = fsub float %37, %58
  %62 = fmul float %60, %60
  %63 = tail call float @llvm.fmuladd.f32(float %59, float %59, float %62)
  %64 = tail call float @llvm.fmuladd.f32(float %61, float %61, float %63)
  %65 = fmul float %15, %64
  %66 = tail call float @expf(float noundef %65) #7, !tbaa !25
  %67 = fmul float %42, %66
  %68 = getelementptr inbounds float, ptr %44, i64 %indvars.iv
  %69 = load float, ptr %68, align 4, !tbaa !23
  %70 = fadd float %67, %69
  store float %70, ptr %68, align 4, !tbaa !23
  %71 = fadd float %.1150, %67
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %72 = load i32, ptr %4, align 8, !tbaa !21
  %73 = zext i32 %72 to i64
  %74 = icmp ult i64 %indvars.iv.next, %73
  br i1 %74, label %45, label %._crit_edge.loopexit, !llvm.loop !26

._crit_edge.loopexit:                             ; preds = %45
  %.pre = load i32, ptr %3, align 8, !tbaa !16
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %.lr.ph154.split
  %75 = phi i32 [ %23, %.lr.ph154.split ], [ %.pre, %._crit_edge.loopexit ]
  %76 = phi i32 [ 0, %.lr.ph154.split ], [ %72, %._crit_edge.loopexit ]
  %.1.lcssa = phi float [ %.0143152, %.lr.ph154.split ], [ %71, %._crit_edge.loopexit ]
  %indvars.iv.next185 = add nuw nsw i64 %indvars.iv184, 1
  %77 = zext i32 %75 to i64
  %78 = icmp ult i64 %indvars.iv.next185, %77
  br i1 %78, label %.lr.ph154.split, label %._crit_edge155, !llvm.loop !28

._crit_edge155:                                   ; preds = %._crit_edge, %.lr.ph154, %5
  %.0143.lcssa = phi float [ %13, %5 ], [ %13, %.lr.ph154 ], [ %.1.lcssa, %._crit_edge ]
  %79 = load i32, ptr %0, align 8, !tbaa !13
  %80 = uitofp i32 %79 to float
  %81 = fdiv float 1.000000e+00, %80
  %82 = getelementptr inbounds i8, ptr %1, i64 24
  %83 = load ptr, ptr %82, align 8, !tbaa !30
  %84 = zext i32 %2 to i64
  %85 = getelementptr inbounds float, ptr %83, i64 %84
  %86 = load float, ptr %85, align 4, !tbaa !23
  %87 = fsub float 1.000000e+00, %86
  %88 = fdiv float %86, %.0143.lcssa
  %.not176 = icmp eq i32 %79, 0
  br i1 %.not176, label %._crit_edge165, label %.lr.ph160

.lr.ph160:                                        ; preds = %._crit_edge155
  %89 = load ptr, ptr %6, align 8, !tbaa !5
  %90 = getelementptr inbounds i8, ptr %4, i64 8
  %91 = load ptr, ptr %90, align 8, !tbaa !24
  %wide.trip.count = zext i32 %79 to i64
  %92 = add nsw i64 %wide.trip.count, -1
  %xtraiter = and i64 %wide.trip.count, 1
  %93 = icmp eq i64 %92, 0
  br i1 %93, label %.preheader.unr-lcssa, label %.lr.ph160.new

.lr.ph160.new:                                    ; preds = %.lr.ph160
  %unroll_iter = and i64 %wide.trip.count, 4294967294
  br label %108

.preheader.unr-lcssa:                             ; preds = %108, %.lr.ph160
  %.lcssa216.ph = phi float [ poison, %.lr.ph160 ], [ %130, %108 ]
  %indvars.iv187.unr = phi i64 [ 0, %.lr.ph160 ], [ %indvars.iv.next188.1, %108 ]
  %.0142158.unr = phi float [ %13, %.lr.ph160 ], [ %130, %108 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader, label %.preheader.epilog-lcssa

.preheader.epilog-lcssa:                          ; preds = %.preheader.unr-lcssa
  %94 = getelementptr inbounds float, ptr %89, i64 %indvars.iv187.unr
  %95 = load float, ptr %94, align 4, !tbaa !23
  %96 = fmul float %88, %95
  %97 = tail call float @llvm.fmuladd.f32(float %87, float %81, float %96)
  %98 = mul i64 %indvars.iv187.unr, 7
  %99 = add i64 %98, 6
  %100 = and i64 %99, 4294967295
  %101 = getelementptr inbounds float, ptr %91, i64 %100
  %102 = load float, ptr %101, align 4, !tbaa !23
  %103 = fmul float %102, %97
  store float %103, ptr %101, align 4, !tbaa !23
  %104 = fadd float %.0142158.unr, %103
  br label %.preheader

.preheader:                                       ; preds = %.preheader.unr-lcssa, %.preheader.epilog-lcssa
  %.lcssa216 = phi float [ %.lcssa216.ph, %.preheader.unr-lcssa ], [ %104, %.preheader.epilog-lcssa ]
  br i1 %.not176, label %._crit_edge165, label %.lr.ph164

.lr.ph164:                                        ; preds = %.preheader
  %105 = getelementptr inbounds i8, ptr %4, i64 8
  %106 = load ptr, ptr %105, align 8, !tbaa !24
  %xtraiter221 = and i64 %wide.trip.count, 1
  %107 = icmp eq i64 %92, 0
  br i1 %107, label %._crit_edge165.loopexit.unr-lcssa, label %.lr.ph164.new

.lr.ph164.new:                                    ; preds = %.lr.ph164
  %unroll_iter224 = and i64 %wide.trip.count, 4294967294
  br label %131

108:                                              ; preds = %108, %.lr.ph160.new
  %indvars.iv187 = phi i64 [ 0, %.lr.ph160.new ], [ %indvars.iv.next188.1, %108 ]
  %.0142158 = phi float [ %13, %.lr.ph160.new ], [ %130, %108 ]
  %niter = phi i64 [ 0, %.lr.ph160.new ], [ %niter.next.1, %108 ]
  %109 = getelementptr inbounds float, ptr %89, i64 %indvars.iv187
  %110 = load float, ptr %109, align 4, !tbaa !23
  %111 = fmul float %88, %110
  %112 = tail call float @llvm.fmuladd.f32(float %87, float %81, float %111)
  %113 = mul i64 %indvars.iv187, 7
  %114 = add i64 %113, 6
  %115 = and i64 %114, 4294967294
  %116 = getelementptr inbounds float, ptr %91, i64 %115
  %117 = load float, ptr %116, align 4, !tbaa !23
  %118 = fmul float %117, %112
  store float %118, ptr %116, align 4, !tbaa !23
  %119 = fadd float %.0142158, %118
  %indvars.iv.next188 = or disjoint i64 %indvars.iv187, 1
  %120 = getelementptr inbounds float, ptr %89, i64 %indvars.iv.next188
  %121 = load float, ptr %120, align 4, !tbaa !23
  %122 = fmul float %88, %121
  %123 = tail call float @llvm.fmuladd.f32(float %87, float %81, float %122)
  %124 = mul i64 %indvars.iv.next188, 7
  %125 = add i64 %124, 6
  %126 = and i64 %125, 4294967295
  %127 = getelementptr inbounds float, ptr %91, i64 %126
  %128 = load float, ptr %127, align 4, !tbaa !23
  %129 = fmul float %128, %123
  store float %129, ptr %127, align 4, !tbaa !23
  %130 = fadd float %119, %129
  %indvars.iv.next188.1 = add nuw nsw i64 %indvars.iv187, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.preheader.unr-lcssa, label %108, !llvm.loop !31

131:                                              ; preds = %131, %.lr.ph164.new
  %indvars.iv190 = phi i64 [ 0, %.lr.ph164.new ], [ %indvars.iv.next191.1, %131 ]
  %.0163 = phi float [ %13, %.lr.ph164.new ], [ %145, %131 ]
  %niter225 = phi i64 [ 0, %.lr.ph164.new ], [ %niter225.next.1, %131 ]
  %132 = mul i64 %indvars.iv190, 7
  %133 = add i64 %132, 6
  %134 = and i64 %133, 4294967294
  %135 = getelementptr inbounds float, ptr %106, i64 %134
  %136 = load float, ptr %135, align 4, !tbaa !23
  %137 = fdiv float %136, %.lcssa216
  store float %137, ptr %135, align 4, !tbaa !23
  %138 = tail call float @llvm.fmuladd.f32(float %137, float %137, float %.0163)
  %139 = mul i64 %indvars.iv190, 7
  %140 = add i64 %139, 13
  %141 = and i64 %140, 4294967295
  %142 = getelementptr inbounds float, ptr %106, i64 %141
  %143 = load float, ptr %142, align 4, !tbaa !23
  %144 = fdiv float %143, %.lcssa216
  store float %144, ptr %142, align 4, !tbaa !23
  %145 = tail call float @llvm.fmuladd.f32(float %144, float %144, float %138)
  %indvars.iv.next191.1 = add nuw nsw i64 %indvars.iv190, 2
  %niter225.next.1 = add i64 %niter225, 2
  %niter225.ncmp.1 = icmp eq i64 %niter225.next.1, %unroll_iter224
  br i1 %niter225.ncmp.1, label %._crit_edge165.loopexit.unr-lcssa.loopexit, label %131, !llvm.loop !32

._crit_edge165.loopexit.unr-lcssa.loopexit:       ; preds = %131
  %146 = mul i64 %indvars.iv.next191.1, 7
  %147 = add i64 %146, 6
  %148 = and i64 %147, 4294967294
  br label %._crit_edge165.loopexit.unr-lcssa

._crit_edge165.loopexit.unr-lcssa:                ; preds = %._crit_edge165.loopexit.unr-lcssa.loopexit, %.lr.ph164
  %.lcssa.ph = phi float [ poison, %.lr.ph164 ], [ %145, %._crit_edge165.loopexit.unr-lcssa.loopexit ]
  %indvars.iv190.unr = phi i64 [ 6, %.lr.ph164 ], [ %148, %._crit_edge165.loopexit.unr-lcssa.loopexit ]
  %.0163.unr = phi float [ %13, %.lr.ph164 ], [ %145, %._crit_edge165.loopexit.unr-lcssa.loopexit ]
  %lcmp.mod222.not = icmp eq i64 %xtraiter221, 0
  br i1 %lcmp.mod222.not, label %._crit_edge165, label %._crit_edge165.loopexit.epilog-lcssa

._crit_edge165.loopexit.epilog-lcssa:             ; preds = %._crit_edge165.loopexit.unr-lcssa
  %149 = getelementptr inbounds float, ptr %106, i64 %indvars.iv190.unr
  %150 = load float, ptr %149, align 4, !tbaa !23
  %151 = fdiv float %150, %.lcssa216
  store float %151, ptr %149, align 4, !tbaa !23
  %152 = tail call float @llvm.fmuladd.f32(float %151, float %151, float %.0163.unr)
  br label %._crit_edge165

._crit_edge165:                                   ; preds = %._crit_edge165.loopexit.epilog-lcssa, %._crit_edge165.loopexit.unr-lcssa, %._crit_edge155, %.preheader
  %.0.lcssa = phi float [ %13, %.preheader ], [ %13, %._crit_edge155 ], [ %.lcssa.ph, %._crit_edge165.loopexit.unr-lcssa ], [ %152, %._crit_edge165.loopexit.epilog-lcssa ]
  %153 = fdiv float 1.000000e+00, %.0.lcssa
  %154 = getelementptr inbounds i8, ptr %0, i64 168
  %155 = load float, ptr %154, align 8, !tbaa !33
  %156 = fmul float %155, %80
  %157 = fcmp olt float %153, %156
  br i1 %157, label %158, label %.loopexit

158:                                              ; preds = %._crit_edge165
  %159 = getelementptr inbounds i8, ptr %0, i64 160
  %160 = load ptr, ptr %159, align 8, !tbaa !34
  %161 = getelementptr inbounds i8, ptr %160, i64 8
  %162 = load ptr, ptr %161, align 8, !tbaa !24
  %163 = getelementptr inbounds i8, ptr %4, i64 8
  %164 = load ptr, ptr %163, align 8, !tbaa !24
  %165 = zext i32 %79 to i64
  %166 = mul nuw nsw i64 %165, 28
  tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 %162, ptr align 4 %164, i64 %166, i1 false)
  %167 = load i32, ptr %0, align 8, !tbaa !13
  %.not178 = icmp eq i32 %167, 0
  br i1 %.not178, label %.._crit_edge170_crit_edge, label %.lr.ph169

.._crit_edge170_crit_edge:                        ; preds = %158
  %.phi.trans.insert = getelementptr inbounds i8, ptr %0, i64 104
  %.pre203 = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !35
  br label %._crit_edge170

.lr.ph169:                                        ; preds = %158
  %168 = load ptr, ptr %159, align 8, !tbaa !34
  %169 = getelementptr inbounds i8, ptr %168, i64 8
  %170 = load ptr, ptr %169, align 8, !tbaa !24
  %171 = getelementptr inbounds i8, ptr %0, i64 104
  %172 = load ptr, ptr %171, align 8, !tbaa !35
  %wide.trip.count198 = zext i32 %167 to i64
  %min.iters.check = icmp ult i32 %167, 21
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %.lr.ph169
  %173 = add nsw i64 %wide.trip.count198, -1
  %174 = trunc i64 %173 to i32
  %mul = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %174, i32 7)
  %mul.result = extractvalue { i32, i1 } %mul, 0
  %mul.overflow = extractvalue { i32, i1 } %mul, 1
  %175 = icmp ugt i32 %mul.result, -7
  %176 = or i1 %175, %mul.overflow
  %177 = icmp ugt i64 %173, 4294967295
  %178 = or i1 %176, %177
  br i1 %178, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %vector.scevcheck
  %179 = shl nuw nsw i64 %wide.trip.count198, 2
  %scevgep = getelementptr i8, ptr %172, i64 %179
  %scevgep212 = getelementptr i8, ptr %170, i64 24
  %180 = mul nuw nsw i64 %wide.trip.count198, 28
  %scevgep213 = getelementptr i8, ptr %170, i64 %180
  %bound0 = icmp ult ptr %172, %scevgep213
  %bound1 = icmp ult ptr %scevgep212, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.mod.vf = and i64 %wide.trip.count198, 7
  %181 = icmp eq i64 %n.mod.vf, 0
  %182 = select i1 %181, i64 8, i64 %n.mod.vf
  %n.vec = sub nsw i64 %wide.trip.count198, %182
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %183 = mul i64 %index, 7
  %184 = mul i64 %index, 7
  %185 = add i64 %184, 34
  %186 = and i64 %183, 4294967288
  %187 = or disjoint i64 %186, 6
  %188 = and i64 %185, 4294967290
  %189 = getelementptr inbounds float, ptr %170, i64 %187
  %190 = getelementptr inbounds float, ptr %170, i64 %188
  %wide.vec = load <28 x float>, ptr %189, align 4, !tbaa !23
  %wide.vec214 = load <28 x float>, ptr %190, align 4, !tbaa !23
  %strided.vec = shufflevector <28 x float> %wide.vec, <28 x float> poison, <4 x i32> <i32 0, i32 7, i32 14, i32 21>
  %strided.vec215 = shufflevector <28 x float> %wide.vec214, <28 x float> poison, <4 x i32> <i32 0, i32 7, i32 14, i32 21>
  %191 = getelementptr inbounds float, ptr %172, i64 %index
  %192 = getelementptr inbounds i8, ptr %191, i64 16
  store <4 x float> %strided.vec, ptr %191, align 4, !tbaa !23, !alias.scope !36, !noalias !39
  store <4 x float> %strided.vec215, ptr %192, align 4, !tbaa !23, !alias.scope !36, !noalias !39
  %index.next = add nuw i64 %index, 8
  %193 = icmp eq i64 %index.next, %n.vec
  br i1 %193, label %scalar.ph.preheader, label %vector.body, !llvm.loop !41

scalar.ph.preheader:                              ; preds = %vector.body, %vector.memcheck, %vector.scevcheck, %.lr.ph169
  %indvars.iv195.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %vector.scevcheck ], [ 0, %.lr.ph169 ], [ %n.vec, %vector.body ]
  %194 = sub nsw i64 %wide.trip.count198, %indvars.iv195.ph
  %xtraiter226 = and i64 %194, 1
  %lcmp.mod227.not = icmp eq i64 %xtraiter226, 0
  br i1 %lcmp.mod227.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %195 = mul nsw i64 %indvars.iv195.ph, 7
  %196 = add nsw i64 %195, 6
  %197 = and i64 %196, 4294967295
  %198 = getelementptr inbounds float, ptr %170, i64 %197
  %199 = load float, ptr %198, align 4, !tbaa !23
  %200 = getelementptr inbounds float, ptr %172, i64 %indvars.iv195.ph
  store float %199, ptr %200, align 4, !tbaa !23
  %indvars.iv.next196.prol = add nuw nsw i64 %indvars.iv195.ph, 1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv195.unr = phi i64 [ %indvars.iv195.ph, %scalar.ph.preheader ], [ %indvars.iv.next196.prol, %scalar.ph.prol ]
  %201 = add nsw i64 %wide.trip.count198, -1
  %202 = icmp eq i64 %indvars.iv195.ph, %201
  br i1 %202, label %._crit_edge170, label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv195 = phi i64 [ %indvars.iv.next196.1, %scalar.ph ], [ %indvars.iv195.unr, %scalar.ph.prol.loopexit ]
  %203 = mul i64 %indvars.iv195, 7
  %204 = add i64 %203, 6
  %205 = and i64 %204, 4294967295
  %206 = getelementptr inbounds float, ptr %170, i64 %205
  %207 = load float, ptr %206, align 4, !tbaa !23
  %208 = getelementptr inbounds float, ptr %172, i64 %indvars.iv195
  store float %207, ptr %208, align 4, !tbaa !23
  %indvars.iv.next196 = add nuw nsw i64 %indvars.iv195, 1
  %209 = mul i64 %indvars.iv.next196, 7
  %210 = add i64 %209, 6
  %211 = and i64 %210, 4294967295
  %212 = getelementptr inbounds float, ptr %170, i64 %211
  %213 = load float, ptr %212, align 4, !tbaa !23
  %214 = getelementptr inbounds float, ptr %172, i64 %indvars.iv.next196
  store float %213, ptr %214, align 4, !tbaa !23
  %indvars.iv.next196.1 = add nuw nsw i64 %indvars.iv195, 2
  %exitcond199.not.1 = icmp eq i64 %indvars.iv.next196.1, %wide.trip.count198
  br i1 %exitcond199.not.1, label %._crit_edge170, label %scalar.ph, !llvm.loop !44

._crit_edge170:                                   ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %.._crit_edge170_crit_edge
  %215 = phi ptr [ %.pre203, %.._crit_edge170_crit_edge ], [ %172, %scalar.ph ], [ %172, %scalar.ph.prol.loopexit ]
  %216 = getelementptr inbounds i8, ptr %0, i64 120
  %217 = load ptr, ptr %216, align 8, !tbaa !45
  tail call void @random_pdf(ptr noundef %217, ptr noundef %215) #7
  %218 = load ptr, ptr %216, align 8, !tbaa !45
  %219 = load i32, ptr %0, align 8, !tbaa !13
  %220 = getelementptr inbounds i8, ptr %0, i64 112
  %221 = load ptr, ptr %220, align 8, !tbaa !46
  tail call void @random_generate(ptr noundef %218, i32 noundef %219, ptr noundef %221) #7
  %222 = getelementptr inbounds i8, ptr %0, i64 96
  %223 = load ptr, ptr %222, align 8, !tbaa !47
  %224 = load i32, ptr %0, align 8, !tbaa !13
  %225 = getelementptr inbounds i8, ptr %0, i64 88
  %226 = load ptr, ptr %225, align 8, !tbaa !48
  tail call void @random_generate(ptr noundef %223, i32 noundef %224, ptr noundef %226) #7
  %227 = load i32, ptr %0, align 8, !tbaa !13
  %228 = uitofp i32 %227 to float
  %229 = fdiv float 1.000000e+00, %228
  %.not179 = icmp eq i32 %227, 0
  br i1 %.not179, label %.loopexit, label %.lr.ph173

.lr.ph173:                                        ; preds = %._crit_edge170
  %230 = getelementptr inbounds i8, ptr %4, i64 16
  %.pre204 = load ptr, ptr %163, align 8, !tbaa !24
  br label %231

231:                                              ; preds = %.lr.ph173, %231
  %232 = phi ptr [ %.pre204, %.lr.ph173 ], [ %288, %231 ]
  %indvars.iv200 = phi i64 [ 0, %.lr.ph173 ], [ %indvars.iv.next201, %231 ]
  %233 = load ptr, ptr %159, align 8, !tbaa !34
  %234 = getelementptr inbounds i8, ptr %233, i64 8
  %235 = load ptr, ptr %234, align 8, !tbaa !24
  %236 = load ptr, ptr %220, align 8, !tbaa !46
  %237 = getelementptr inbounds i32, ptr %236, i64 %indvars.iv200
  %238 = load i32, ptr %237, align 4, !tbaa !25
  %239 = mul i32 %238, 7
  %240 = zext i32 %239 to i64
  %241 = getelementptr inbounds float, ptr %235, i64 %240
  %242 = load float, ptr %241, align 4, !tbaa !23
  %243 = trunc nuw i64 %indvars.iv200 to i32
  %244 = mul i32 %243, 7
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds float, ptr %232, i64 %245
  store float %242, ptr %246, align 4, !tbaa !23
  %247 = add i32 %239, 1
  %248 = zext i32 %247 to i64
  %249 = getelementptr inbounds float, ptr %235, i64 %248
  %250 = load float, ptr %249, align 4, !tbaa !23
  %251 = add i32 %244, 1
  %252 = zext i32 %251 to i64
  %253 = getelementptr inbounds float, ptr %232, i64 %252
  store float %250, ptr %253, align 4, !tbaa !23
  %254 = add i32 %239, 2
  %255 = zext i32 %254 to i64
  %256 = getelementptr inbounds float, ptr %235, i64 %255
  %257 = load float, ptr %256, align 4, !tbaa !23
  %258 = add i32 %244, 2
  %259 = zext i32 %258 to i64
  %260 = getelementptr inbounds float, ptr %232, i64 %259
  store float %257, ptr %260, align 4, !tbaa !23
  %261 = add i32 %239, 3
  %262 = zext i32 %261 to i64
  %263 = getelementptr inbounds float, ptr %235, i64 %262
  %264 = load float, ptr %263, align 4, !tbaa !23
  %265 = add i32 %244, 3
  %266 = zext i32 %265 to i64
  %267 = getelementptr inbounds float, ptr %232, i64 %266
  store float %264, ptr %267, align 4, !tbaa !23
  %268 = add i32 %239, 4
  %269 = zext i32 %268 to i64
  %270 = getelementptr inbounds float, ptr %235, i64 %269
  %271 = load float, ptr %270, align 4, !tbaa !23
  %272 = add i32 %244, 4
  %273 = zext i32 %272 to i64
  %274 = getelementptr inbounds float, ptr %232, i64 %273
  store float %271, ptr %274, align 4, !tbaa !23
  %275 = add i32 %239, 5
  %276 = zext i32 %275 to i64
  %277 = getelementptr inbounds float, ptr %235, i64 %276
  %278 = load float, ptr %277, align 4, !tbaa !23
  %279 = add i32 %244, 5
  %280 = zext i32 %279 to i64
  %281 = getelementptr inbounds float, ptr %232, i64 %280
  store float %278, ptr %281, align 4, !tbaa !23
  %282 = load ptr, ptr %225, align 8, !tbaa !48
  %283 = getelementptr inbounds i32, ptr %282, i64 %indvars.iv200
  %284 = load i32, ptr %283, align 4, !tbaa !25
  %285 = trunc i32 %284 to i8
  %286 = load ptr, ptr %230, align 8, !tbaa !49
  %287 = getelementptr inbounds i8, ptr %286, i64 %indvars.iv200
  store i8 %285, ptr %287, align 1, !tbaa !50
  %288 = load ptr, ptr %163, align 8, !tbaa !24
  %289 = add i32 %244, 6
  %290 = zext i32 %289 to i64
  %291 = getelementptr inbounds float, ptr %288, i64 %290
  store float %229, ptr %291, align 4, !tbaa !23
  %indvars.iv.next201 = add nuw nsw i64 %indvars.iv200, 1
  %292 = load i32, ptr %0, align 8, !tbaa !13
  %293 = zext i32 %292 to i64
  %294 = icmp ult i64 %indvars.iv.next201, %293
  br i1 %294, label %231, label %.loopexit, !llvm.loop !51

.loopexit:                                        ; preds = %231, %._crit_edge170, %._crit_edge165
  ret void
}

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i32, i1 } @llvm.umul.with.overflow.i32(i32, i32) #6

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !11, i64 152}
!6 = !{!"particle2particle_obj", !7, i64 0, !10, i64 4, !8, i64 8, !8, i64 20, !8, i64 32, !8, i64 44, !8, i64 56, !10, i64 68, !10, i64 72, !10, i64 76, !11, i64 80, !11, i64 88, !11, i64 96, !11, i64 104, !11, i64 112, !11, i64 120, !11, i64 128, !12, i64 136, !11, i64 144, !11, i64 152, !11, i64 160, !10, i64 168}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"double", !8, i64 0}
!13 = !{!6, !7, i64 0}
!14 = !{!6, !12, i64 136}
!15 = !{!6, !10, i64 76}
!16 = !{!17, !7, i64 0}
!17 = !{!"pots_obj", !7, i64 0, !11, i64 8}
!18 = !{!17, !11, i64 8}
!19 = !{!20, !11, i64 16}
!20 = !{!"postprobs_obj", !7, i64 0, !7, i64 4, !11, i64 8, !11, i64 16, !11, i64 24}
!21 = !{!22, !7, i64 0}
!22 = !{!"particles_obj", !7, i64 0, !11, i64 8, !11, i64 16}
!23 = !{!10, !10, i64 0}
!24 = !{!22, !11, i64 8}
!25 = !{!7, !7, i64 0}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = distinct !{!28, !27, !29}
!29 = !{!"llvm.loop.unswitch.partial.disable"}
!30 = !{!20, !11, i64 24}
!31 = distinct !{!31, !27}
!32 = distinct !{!32, !27}
!33 = !{!6, !10, i64 168}
!34 = !{!6, !11, i64 160}
!35 = !{!6, !11, i64 104}
!36 = !{!37}
!37 = distinct !{!37, !38}
!38 = distinct !{!38, !"LVerDomain"}
!39 = !{!40}
!40 = distinct !{!40, !38}
!41 = distinct !{!41, !27, !42, !43}
!42 = !{!"llvm.loop.isvectorized", i32 1}
!43 = !{!"llvm.loop.unroll.runtime.disable"}
!44 = distinct !{!44, !27, !42}
!45 = !{!6, !11, i64 120}
!46 = !{!6, !11, i64 112}
!47 = !{!6, !11, i64 96}
!48 = !{!6, !11, i64 88}
!49 = !{!22, !11, i64 16}
!50 = !{!8, !8, i64 0}
!51 = distinct !{!51, !27}


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