; LLVM IR from chrr/libECP :: src (type2)

; 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.doubleArray = type { ptr, ptr }
%struct.ScreenedGrid = type { i32, i32, i32 }
%struct._Type2 = type { i32, ptr, ptr, i32, i32, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, ptr, ptr, i32, ptr, ptr, i32, ptr, ptr, ptr, i32, i32, i32, i32, ptr, i32, ptr, double, double, double, i32 }
%struct.GCIntegrationTable = type { i32, i32, ptr, ptr, double, double, i32, i32 }

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

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

; Function Attrs: nounwind
declare void @free(ptr noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local { i64, i32 } @basisSetScreening(ptr noundef, double noundef, double noundef) #2

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

declare { ptr, ptr } @doubleArray_new(i64 noundef, ...) #4

; Function Attrs: nounwind allocsize(0,1)
declare noalias ptr @calloc(i64 noundef, i64 noundef) #5

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcF_FM06(ptr noundef %0, ptr noundef %1, ptr noundef %2) #2 {
  %4 = alloca %struct.doubleArray, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca double, align 8
  %13 = alloca double, align 8
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca %struct.ScreenedGrid, align 4
  %37 = alloca { i64, i32 }, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  %38 = load ptr, ptr %5, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct._Type2, ptr %38, i32 0, i32 4
  %40 = load i32, ptr %39, align 4, !tbaa !9
  store i32 %40, ptr %11, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.start.p0(i64 8, 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 8, ptr %18) #7
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct._Type2, ptr %41, i32 0, i32 0
  %43 = load i32, ptr %42, align 8, !tbaa !14
  %44 = load i32, ptr %11, align 4, !tbaa !13
  %45 = mul nsw i32 %43, %44
  %46 = sext i32 %45 to i64
  %47 = call noalias ptr @calloc(i64 noundef %46, i64 noundef 4) #8
  store ptr %47, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct._Type2, ptr %48, i32 0, i32 10
  %50 = load i32, ptr %49, align 8, !tbaa !15
  %51 = sub nsw i32 %50, 1
  store i32 %51, ptr %20, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  %52 = load ptr, ptr %5, align 8, !tbaa !5
  %53 = getelementptr inbounds %struct._Type2, ptr %52, i32 0, i32 14
  %54 = load i32, ptr %53, align 8, !tbaa !16
  %55 = add nsw i32 1, %54
  store i32 %55, ptr %21, align 4, !tbaa !13
  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 8, ptr %24) #7
  %56 = load ptr, ptr %5, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct._Type2, ptr %56, i32 0, i32 28
  %58 = load ptr, ptr %57, align 8, !tbaa !17
  store ptr %58, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %59 = load ptr, ptr %5, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct._Type2, ptr %59, i32 0, i32 3
  %61 = load i32, ptr %60, align 8, !tbaa !18
  %62 = sext i32 %61 to i64
  %63 = call noalias ptr @calloc(i64 noundef %62, i64 noundef 12) #8
  %64 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %63, ptr %64, align 8, !tbaa !5
  store ptr %63, ptr %25, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  %65 = load ptr, ptr %5, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct._Type2, ptr %65, i32 0, i32 0
  %67 = load i32, ptr %66, align 8, !tbaa !14
  %68 = sext i32 %67 to i64
  %69 = call noalias ptr @calloc(i64 noundef %68, i64 noundef 4) #8
  store ptr %69, ptr %26, align 8, !tbaa !5
  %70 = load i32, ptr %21, align 4, !tbaa !13
  %71 = load ptr, ptr %5, align 8, !tbaa !5
  %72 = getelementptr inbounds %struct._Type2, ptr %71, i32 0, i32 3
  %73 = load i32, ptr %72, align 8, !tbaa !18
  %74 = load ptr, ptr %5, align 8, !tbaa !5
  %75 = getelementptr inbounds %struct._Type2, ptr %74, i32 0, i32 12
  %76 = load i32, ptr %75, align 8, !tbaa !19
  %77 = add nsw i32 %76, 1
  %78 = load ptr, ptr %5, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct._Type2, ptr %78, i32 0, i32 28
  %80 = load ptr, ptr %79, align 8, !tbaa !17
  %81 = getelementptr inbounds %struct.GCIntegrationTable, ptr %80, i32 0, i32 1
  %82 = load i32, ptr %81, align 4, !tbaa !20
  %83 = call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 4, i32 noundef %70, i32 noundef %73, i32 noundef %77, i32 noundef %82)
  %84 = getelementptr inbounds { ptr, ptr }, ptr %4, i32 0, i32 0
  %85 = extractvalue { ptr, ptr } %83, 0
  store ptr %85, ptr %84, align 8
  %86 = getelementptr inbounds { ptr, ptr }, ptr %4, i32 0, i32 1
  %87 = extractvalue { ptr, ptr } %83, 1
  store ptr %87, ptr %86, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %88 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %89 = load ptr, ptr %88, align 8, !tbaa !22
  %90 = getelementptr inbounds i64, ptr %89, i64 4
  %91 = load i64, ptr %90, align 8, !tbaa !24
  %92 = trunc i64 %91 to i32
  store i32 %92, ptr %27, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  %93 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !22
  %95 = getelementptr inbounds i64, ptr %94, i64 3
  %96 = load i64, ptr %95, align 8, !tbaa !24
  %97 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %98 = load ptr, ptr %97, align 8, !tbaa !22
  %99 = getelementptr inbounds i64, ptr %98, i64 4
  %100 = load i64, ptr %99, align 8, !tbaa !24
  %101 = mul i64 %96, %100
  %102 = trunc i64 %101 to i32
  store i32 %102, ptr %28, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  %103 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %104 = load ptr, ptr %103, align 8, !tbaa !22
  %105 = getelementptr inbounds i64, ptr %104, i64 2
  %106 = load i64, ptr %105, align 8, !tbaa !24
  %107 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %108 = load ptr, ptr %107, align 8, !tbaa !22
  %109 = getelementptr inbounds i64, ptr %108, i64 3
  %110 = load i64, ptr %109, align 8, !tbaa !24
  %111 = mul i64 %106, %110
  %112 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 0
  %113 = load ptr, ptr %112, align 8, !tbaa !22
  %114 = getelementptr inbounds i64, ptr %113, i64 4
  %115 = load i64, ptr %114, align 8, !tbaa !24
  %116 = mul i64 %111, %115
  %117 = trunc i64 %116 to i32
  store i32 %117, ptr %29, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #7
  %118 = getelementptr inbounds %struct.doubleArray, ptr %4, i32 0, i32 1
  %119 = load ptr, ptr %118, align 8, !tbaa !26
  store ptr %119, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #7
  %120 = load ptr, ptr %5, align 8, !tbaa !5
  %121 = getelementptr inbounds %struct._Type2, ptr %120, i32 0, i32 1
  %122 = load ptr, ptr %121, align 8, !tbaa !27
  store ptr %122, ptr %31, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  %123 = load ptr, ptr %5, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct._Type2, ptr %123, i32 0, i32 28
  %125 = load ptr, ptr %124, align 8, !tbaa !17
  %126 = getelementptr inbounds %struct.GCIntegrationTable, ptr %125, i32 0, i32 2
  %127 = load ptr, ptr %126, align 8, !tbaa !28
  store ptr %127, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #7
  %128 = load ptr, ptr %5, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct._Type2, ptr %128, i32 0, i32 12
  %130 = load i32, ptr %129, align 8, !tbaa !19
  %131 = add nsw i32 %130, 1
  %132 = sext i32 %131 to i64
  %133 = call noalias ptr @calloc(i64 noundef %132, i64 noundef 8) #8
  store ptr %133, ptr %33, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #7
  store i32 0, ptr %35, align 4, !tbaa !13
  store i32 0, ptr %34, align 4, !tbaa !13
  store i32 0, ptr %8, align 4, !tbaa !13
  br label %134

134:                                              ; preds = %238, %3
  %135 = load i32, ptr %8, align 4, !tbaa !13
  %136 = load ptr, ptr %5, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct._Type2, ptr %136, i32 0, i32 0
  %138 = load i32, ptr %137, align 8, !tbaa !14
  %139 = icmp slt i32 %135, %138
  br i1 %139, label %140, label %241

140:                                              ; preds = %134
  %141 = load ptr, ptr %6, align 8, !tbaa !5
  %142 = load ptr, ptr %31, align 8, !tbaa !5
  %143 = load i32, ptr %8, align 4, !tbaa !13
  %144 = mul nsw i32 %143, 3
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds double, ptr %142, i64 %145
  %147 = call double @distance(ptr noundef %141, ptr noundef %146)
  store double %147, ptr %12, align 8, !tbaa !29
  %148 = load ptr, ptr %26, align 8, !tbaa !5
  %149 = load i32, ptr %8, align 4, !tbaa !13
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds i32, ptr %148, i64 %150
  store i32 1, ptr %151, align 4, !tbaa !13
  store i32 0, ptr %16, align 4, !tbaa !13
  br label %152

152:                                              ; preds = %234, %140
  %153 = load i32, ptr %16, align 4, !tbaa !13
  %154 = load ptr, ptr %5, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct._Type2, ptr %154, i32 0, i32 2
  %156 = load ptr, ptr %155, align 8, !tbaa !30
  %157 = load i32, ptr %8, align 4, !tbaa !13
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds i32, ptr %156, i64 %158
  %160 = load i32, ptr %159, align 4, !tbaa !13
  %161 = icmp slt i32 %153, %160
  br i1 %161, label %162, label %237

162:                                              ; preds = %152
  %163 = load ptr, ptr %5, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct._Type2, ptr %163, i32 0, i32 6
  %165 = load ptr, ptr %164, align 8, !tbaa !31
  %166 = load i32, ptr %35, align 4, !tbaa !13
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds i32, ptr %165, i64 %167
  %169 = load i32, ptr %168, align 4, !tbaa !13
  %170 = load ptr, ptr %5, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct._Type2, ptr %170, i32 0, i32 5
  %172 = load ptr, ptr %171, align 8, !tbaa !32
  %173 = load i32, ptr %35, align 4, !tbaa !13
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds i32, ptr %172, i64 %174
  %176 = load i32, ptr %175, align 4, !tbaa !13
  %177 = load ptr, ptr %5, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct._Type2, ptr %177, i32 0, i32 7
  %179 = load ptr, ptr %178, align 8, !tbaa !33
  %180 = load i32, ptr %34, align 4, !tbaa !13
  %181 = sext i32 %180 to i64
  %182 = getelementptr inbounds double, ptr %179, i64 %181
  %183 = load ptr, ptr %5, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct._Type2, ptr %183, i32 0, i32 8
  %185 = load ptr, ptr %184, align 8, !tbaa !34
  %186 = load i32, ptr %34, align 4, !tbaa !13
  %187 = sext i32 %186 to i64
  %188 = getelementptr inbounds double, ptr %185, i64 %187
  %189 = load ptr, ptr %5, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct._Type2, ptr %189, i32 0, i32 32
  %191 = load double, ptr %190, align 8, !tbaa !35
  %192 = call double @shellRadius(i32 noundef %169, i32 noundef %176, ptr noundef %182, ptr noundef %188, double noundef %191)
  store double %192, ptr %15, align 8, !tbaa !29
  %193 = load ptr, ptr %25, align 8, !tbaa !5
  %194 = load i32, ptr %35, align 4, !tbaa !13
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds %struct.ScreenedGrid, ptr %193, i64 %195
  call void @llvm.lifetime.start.p0(i64 12, ptr %36) #7
  %197 = load ptr, ptr %24, align 8, !tbaa !5
  %198 = load double, ptr %15, align 8, !tbaa !29
  %199 = load double, ptr %12, align 8, !tbaa !29
  %200 = call { i64, i32 } @basisSetScreening(ptr noundef %197, double noundef %198, double noundef %199)
  store { i64, i32 } %200, ptr %37, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %36, ptr align 8 %37, i64 12, i1 false)
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %196, ptr align 4 %36, i64 12, i1 false), !tbaa.struct !36
  call void @llvm.lifetime.end.p0(i64 12, ptr %36) #7
  %201 = load ptr, ptr %25, align 8, !tbaa !5
  %202 = load i32, ptr %35, align 4, !tbaa !13
  %203 = sext i32 %202 to i64
  %204 = getelementptr inbounds %struct.ScreenedGrid, ptr %201, i64 %203
  %205 = getelementptr inbounds %struct.ScreenedGrid, ptr %204, i32 0, i32 2
  %206 = load i32, ptr %205, align 4, !tbaa !37
  %207 = icmp eq i32 0, %206
  br i1 %207, label %208, label %213

208:                                              ; preds = %162
  %209 = load ptr, ptr %26, align 8, !tbaa !5
  %210 = load i32, ptr %8, align 4, !tbaa !13
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds i32, ptr %209, i64 %211
  store i32 0, ptr %212, align 4, !tbaa !13
  br label %213

213:                                              ; preds = %208, %162
  %214 = load i32, ptr %34, align 4, !tbaa !13
  %215 = load ptr, ptr %18, align 8, !tbaa !5
  %216 = load i32, ptr %8, align 4, !tbaa !13
  %217 = load i32, ptr %11, align 4, !tbaa !13
  %218 = mul nsw i32 %216, %217
  %219 = load i32, ptr %16, align 4, !tbaa !13
  %220 = add nsw i32 %218, %219
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds i32, ptr %215, i64 %221
  store i32 %214, ptr %222, align 4, !tbaa !13
  %223 = load ptr, ptr %5, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct._Type2, ptr %223, i32 0, i32 6
  %225 = load ptr, ptr %224, align 8, !tbaa !31
  %226 = load i32, ptr %35, align 4, !tbaa !13
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds i32, ptr %225, i64 %227
  %229 = load i32, ptr %228, align 4, !tbaa !13
  %230 = load i32, ptr %34, align 4, !tbaa !13
  %231 = add nsw i32 %230, %229
  store i32 %231, ptr %34, align 4, !tbaa !13
  %232 = load i32, ptr %35, align 4, !tbaa !13
  %233 = add nsw i32 %232, 1
  store i32 %233, ptr %35, align 4, !tbaa !13
  br label %234

234:                                              ; preds = %213
  %235 = load i32, ptr %16, align 4, !tbaa !13
  %236 = add nsw i32 %235, 1
  store i32 %236, ptr %16, align 4, !tbaa !13
  br label %152, !llvm.loop !39

237:                                              ; preds = %152
  br label %238

238:                                              ; preds = %237
  %239 = load i32, ptr %8, align 4, !tbaa !13
  %240 = add nsw i32 %239, 1
  store i32 %240, ptr %8, align 4, !tbaa !13
  br label %134, !llvm.loop !41

241:                                              ; preds = %134
  store i32 0, ptr %22, align 4, !tbaa !13
  br label %242

242:                                              ; preds = %456, %241
  %243 = load i32, ptr %22, align 4, !tbaa !13
  %244 = load i32, ptr %21, align 4, !tbaa !13
  %245 = icmp slt i32 %243, %244
  br i1 %245, label %246, label %459

246:                                              ; preds = %242
  %247 = load i32, ptr %22, align 4, !tbaa !13
  store i32 %247, ptr %23, align 4, !tbaa !13
  store i32 -1, ptr %35, align 4, !tbaa !13
  store i32 0, ptr %8, align 4, !tbaa !13
  br label %248

248:                                              ; preds = %452, %246
  %249 = load i32, ptr %8, align 4, !tbaa !13
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct._Type2, ptr %250, i32 0, i32 0
  %252 = load i32, ptr %251, align 8, !tbaa !14
  %253 = icmp slt i32 %249, %252
  br i1 %253, label %254, label %455

254:                                              ; preds = %248
  %255 = load ptr, ptr %26, align 8, !tbaa !5
  %256 = load i32, ptr %8, align 4, !tbaa !13
  %257 = sext i32 %256 to i64
  %258 = getelementptr inbounds i32, ptr %255, i64 %257
  %259 = load i32, ptr %258, align 4, !tbaa !13
  %260 = icmp eq i32 1, %259
  br i1 %260, label %261, label %271

261:                                              ; preds = %254
  %262 = load ptr, ptr %5, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct._Type2, ptr %262, i32 0, i32 2
  %264 = load ptr, ptr %263, align 8, !tbaa !30
  %265 = load i32, ptr %8, align 4, !tbaa !13
  %266 = sext i32 %265 to i64
  %267 = getelementptr inbounds i32, ptr %264, i64 %266
  %268 = load i32, ptr %267, align 4, !tbaa !13
  %269 = load i32, ptr %35, align 4, !tbaa !13
  %270 = add nsw i32 %269, %268
  store i32 %270, ptr %35, align 4, !tbaa !13
  br label %452

271:                                              ; preds = %254
  %272 = load ptr, ptr %6, align 8, !tbaa !5
  %273 = load ptr, ptr %31, align 8, !tbaa !5
  %274 = load i32, ptr %8, align 4, !tbaa !13
  %275 = mul nsw i32 %274, 3
  %276 = sext i32 %275 to i64
  %277 = getelementptr inbounds double, ptr %273, i64 %276
  %278 = call double @distance(ptr noundef %272, ptr noundef %277)
  store double %278, ptr %12, align 8, !tbaa !29
  store i32 0, ptr %16, align 4, !tbaa !13
  br label %279

279:                                              ; preds = %448, %271
  %280 = load i32, ptr %16, align 4, !tbaa !13
  %281 = load ptr, ptr %5, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct._Type2, ptr %281, i32 0, i32 2
  %283 = load ptr, ptr %282, align 8, !tbaa !30
  %284 = load i32, ptr %8, align 4, !tbaa !13
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i32, ptr %283, i64 %285
  %287 = load i32, ptr %286, align 4, !tbaa !13
  %288 = icmp slt i32 %280, %287
  br i1 %288, label %289, label %451

289:                                              ; preds = %279
  %290 = load i32, ptr %35, align 4, !tbaa !13
  %291 = add nsw i32 %290, 1
  store i32 %291, ptr %35, align 4, !tbaa !13
  %292 = load ptr, ptr %25, align 8, !tbaa !5
  %293 = load i32, ptr %35, align 4, !tbaa !13
  %294 = sext i32 %293 to i64
  %295 = getelementptr inbounds %struct.ScreenedGrid, ptr %292, i64 %294
  %296 = getelementptr inbounds %struct.ScreenedGrid, ptr %295, i32 0, i32 2
  %297 = load i32, ptr %296, align 4, !tbaa !37
  %298 = icmp eq i32 1, %297
  br i1 %298, label %299, label %300

299:                                              ; preds = %289
  br label %448

300:                                              ; preds = %289
  %301 = load i32, ptr %20, align 4, !tbaa !13
  %302 = load ptr, ptr %5, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct._Type2, ptr %302, i32 0, i32 5
  %304 = load ptr, ptr %303, align 8, !tbaa !32
  %305 = load i32, ptr %35, align 4, !tbaa !13
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds i32, ptr %304, i64 %306
  %308 = load i32, ptr %307, align 4, !tbaa !13
  %309 = add nsw i32 %301, %308
  %310 = load i32, ptr %23, align 4, !tbaa !13
  %311 = add nsw i32 %309, %310
  store i32 %311, ptr %19, align 4, !tbaa !13
  store i32 0, ptr %17, align 4, !tbaa !13
  br label %312

312:                                              ; preds = %444, %300
  %313 = load i32, ptr %17, align 4, !tbaa !13
  %314 = load ptr, ptr %5, align 8, !tbaa !5
  %315 = getelementptr inbounds %struct._Type2, ptr %314, i32 0, i32 6
  %316 = load ptr, ptr %315, align 8, !tbaa !31
  %317 = load i32, ptr %35, align 4, !tbaa !13
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds i32, ptr %316, i64 %318
  %320 = load i32, ptr %319, align 4, !tbaa !13
  %321 = icmp slt i32 %313, %320
  br i1 %321, label %322, label %447

322:                                              ; preds = %312
  %323 = load ptr, ptr %18, align 8, !tbaa !5
  %324 = load i32, ptr %8, align 4, !tbaa !13
  %325 = load i32, ptr %11, align 4, !tbaa !13
  %326 = mul nsw i32 %324, %325
  %327 = load i32, ptr %16, align 4, !tbaa !13
  %328 = add nsw i32 %326, %327
  %329 = sext i32 %328 to i64
  %330 = getelementptr inbounds i32, ptr %323, i64 %329
  %331 = load i32, ptr %330, align 4, !tbaa !13
  %332 = load i32, ptr %17, align 4, !tbaa !13
  %333 = add nsw i32 %331, %332
  store i32 %333, ptr %34, align 4, !tbaa !13
  %334 = load ptr, ptr %5, align 8, !tbaa !5
  %335 = getelementptr inbounds %struct._Type2, ptr %334, i32 0, i32 8
  %336 = load ptr, ptr %335, align 8, !tbaa !34
  %337 = load i32, ptr %34, align 4, !tbaa !13
  %338 = sext i32 %337 to i64
  %339 = getelementptr inbounds double, ptr %336, i64 %338
  %340 = load double, ptr %339, align 8, !tbaa !29
  store double %340, ptr %13, align 8, !tbaa !29
  %341 = load ptr, ptr %5, align 8, !tbaa !5
  %342 = getelementptr inbounds %struct._Type2, ptr %341, i32 0, i32 7
  %343 = load ptr, ptr %342, align 8, !tbaa !33
  %344 = load i32, ptr %34, align 4, !tbaa !13
  %345 = sext i32 %344 to i64
  %346 = getelementptr inbounds double, ptr %343, i64 %345
  %347 = load double, ptr %346, align 8, !tbaa !29
  store double %347, ptr %14, align 8, !tbaa !29
  store i32 0, ptr %10, align 4, !tbaa !13
  br label %348

348:                                              ; preds = %356, %322
  %349 = load i32, ptr %10, align 4, !tbaa !13
  %350 = load i32, ptr %23, align 4, !tbaa !13
  %351 = icmp slt i32 %349, %350
  br i1 %351, label %352, label %359

352:                                              ; preds = %348
  %353 = load double, ptr %13, align 8, !tbaa !29
  %354 = load double, ptr %14, align 8, !tbaa !29
  %355 = fmul double %354, %353
  store double %355, ptr %14, align 8, !tbaa !29
  br label %356

356:                                              ; preds = %352
  %357 = load i32, ptr %10, align 4, !tbaa !13
  %358 = add nsw i32 %357, 1
  store i32 %358, ptr %10, align 4, !tbaa !13
  br label %348, !llvm.loop !42

359:                                              ; preds = %348
  %360 = load ptr, ptr %25, align 8, !tbaa !5
  %361 = load i32, ptr %35, align 4, !tbaa !13
  %362 = sext i32 %361 to i64
  %363 = getelementptr inbounds %struct.ScreenedGrid, ptr %360, i64 %362
  %364 = getelementptr inbounds %struct.ScreenedGrid, ptr %363, i32 0, i32 0
  %365 = load i32, ptr %364, align 4, !tbaa !43
  store i32 %365, ptr %10, align 4, !tbaa !13
  br label %366

366:                                              ; preds = %440, %359
  %367 = load i32, ptr %10, align 4, !tbaa !13
  %368 = load ptr, ptr %25, align 8, !tbaa !5
  %369 = load i32, ptr %35, align 4, !tbaa !13
  %370 = sext i32 %369 to i64
  %371 = getelementptr inbounds %struct.ScreenedGrid, ptr %368, i64 %370
  %372 = getelementptr inbounds %struct.ScreenedGrid, ptr %371, i32 0, i32 1
  %373 = load i32, ptr %372, align 4, !tbaa !44
  %374 = icmp slt i32 %367, %373
  br i1 %374, label %375, label %443

375:                                              ; preds = %366
  %376 = load ptr, ptr %5, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct._Type2, ptr %376, i32 0, i32 23
  %378 = load ptr, ptr %377, align 8, !tbaa !45
  %379 = load i32, ptr %19, align 4, !tbaa !13
  %380 = load double, ptr %13, align 8, !tbaa !29
  %381 = fmul double 2.000000e+00, %380
  %382 = load double, ptr %12, align 8, !tbaa !29
  %383 = fmul double %381, %382
  %384 = load ptr, ptr %32, align 8, !tbaa !5
  %385 = load i32, ptr %10, align 4, !tbaa !13
  %386 = sext i32 %385 to i64
  %387 = getelementptr inbounds double, ptr %384, i64 %386
  %388 = load double, ptr %387, align 8, !tbaa !29
  %389 = fmul double %383, %388
  %390 = load ptr, ptr %33, align 8, !tbaa !5
  call void @weightedBesselFunction(ptr noundef %378, i32 noundef 1, i32 noundef %379, double noundef %389, ptr noundef %390)
  %391 = load double, ptr %12, align 8, !tbaa !29
  %392 = load ptr, ptr %32, align 8, !tbaa !5
  %393 = load i32, ptr %10, align 4, !tbaa !13
  %394 = sext i32 %393 to i64
  %395 = getelementptr inbounds double, ptr %392, i64 %394
  %396 = load double, ptr %395, align 8, !tbaa !29
  %397 = fsub double %391, %396
  store double %397, ptr %15, align 8, !tbaa !29
  %398 = load double, ptr %13, align 8, !tbaa !29
  %399 = fneg double %398
  %400 = load double, ptr %15, align 8, !tbaa !29
  %401 = fmul double %399, %400
  %402 = load double, ptr %15, align 8, !tbaa !29
  %403 = fmul double %401, %402
  %404 = call double @exp(double noundef %403) #7
  store double %404, ptr %15, align 8, !tbaa !29
  store i32 0, ptr %9, align 4, !tbaa !13
  br label %405

405:                                              ; preds = %436, %375
  %406 = load i32, ptr %9, align 4, !tbaa !13
  %407 = load i32, ptr %19, align 4, !tbaa !13
  %408 = icmp sle i32 %406, %407
  br i1 %408, label %409, label %439

409:                                              ; preds = %405
  %410 = load double, ptr %14, align 8, !tbaa !29
  %411 = load ptr, ptr %33, align 8, !tbaa !5
  %412 = load i32, ptr %9, align 4, !tbaa !13
  %413 = sext i32 %412 to i64
  %414 = getelementptr inbounds double, ptr %411, i64 %413
  %415 = load double, ptr %414, align 8, !tbaa !29
  %416 = fmul double %410, %415
  %417 = load double, ptr %15, align 8, !tbaa !29
  %418 = load ptr, ptr %30, align 8, !tbaa !5
  %419 = load i32, ptr %22, align 4, !tbaa !13
  %420 = load i32, ptr %29, align 4, !tbaa !13
  %421 = mul nsw i32 %419, %420
  %422 = load i32, ptr %35, align 4, !tbaa !13
  %423 = load i32, ptr %28, align 4, !tbaa !13
  %424 = mul nsw i32 %422, %423
  %425 = add nsw i32 %421, %424
  %426 = load i32, ptr %9, align 4, !tbaa !13
  %427 = load i32, ptr %27, align 4, !tbaa !13
  %428 = mul nsw i32 %426, %427
  %429 = add nsw i32 %425, %428
  %430 = load i32, ptr %10, align 4, !tbaa !13
  %431 = add nsw i32 %429, %430
  %432 = sext i32 %431 to i64
  %433 = getelementptr inbounds double, ptr %418, i64 %432
  %434 = load double, ptr %433, align 8, !tbaa !29
  %435 = call double @llvm.fmuladd.f64(double %416, double %417, double %434)
  store double %435, ptr %433, align 8, !tbaa !29
  br label %436

436:                                              ; preds = %409
  %437 = load i32, ptr %9, align 4, !tbaa !13
  %438 = add nsw i32 %437, 1
  store i32 %438, ptr %9, align 4, !tbaa !13
  br label %405, !llvm.loop !46

439:                                              ; preds = %405
  br label %440

440:                                              ; preds = %439
  %441 = load i32, ptr %10, align 4, !tbaa !13
  %442 = add nsw i32 %441, 1
  store i32 %442, ptr %10, align 4, !tbaa !13
  br label %366, !llvm.loop !47

443:                                              ; preds = %366
  br label %444

444:                                              ; preds = %443
  %445 = load i32, ptr %17, align 4, !tbaa !13
  %446 = add nsw i32 %445, 1
  store i32 %446, ptr %17, align 4, !tbaa !13
  br label %312, !llvm.loop !48

447:                                              ; preds = %312
  br label %448

448:                                              ; preds = %447, %299
  %449 = load i32, ptr %16, align 4, !tbaa !13
  %450 = add nsw i32 %449, 1
  store i32 %450, ptr %16, align 4, !tbaa !13
  br label %279, !llvm.loop !49

451:                                              ; preds = %279
  br label %452

452:                                              ; preds = %451, %261
  %453 = load i32, ptr %8, align 4, !tbaa !13
  %454 = add nsw i32 %453, 1
  store i32 %454, ptr %8, align 4, !tbaa !13
  br label %248, !llvm.loop !50

455:                                              ; preds = %248
  br label %456

456:                                              ; preds = %455
  %457 = load i32, ptr %22, align 4, !tbaa !13
  %458 = add nsw i32 %457, 1
  store i32 %458, ptr %22, align 4, !tbaa !13
  br label %242, !llvm.loop !51

459:                                              ; preds = %242
  %460 = load ptr, ptr %26, align 8, !tbaa !5
  call void @free(ptr noundef %460) #7
  %461 = load ptr, ptr %18, align 8, !tbaa !5
  call void @free(ptr noundef %461) #7
  %462 = load ptr, ptr %33, align 8, !tbaa !5
  call void @free(ptr noundef %462) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 8, 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 8, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 8, 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 8, 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 8, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #7
  %463 = load { ptr, ptr }, ptr %4, align 8
  ret { ptr, ptr } %463
}

declare double @distance(ptr noundef, ptr noundef) #4

declare double @shellRadius(i32 noundef, i32 noundef, ptr noundef, ptr noundef, double noundef) #4

declare void @weightedBesselFunction(ptr noundef, i32 noundef, i32 noundef, double noundef, ptr noundef) #4

; Function Attrs: nounwind
declare double @exp(double noundef) #1

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { "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 = { nounwind allocsize(0,1) "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 nosync nounwind speculatable willreturn memory(none) }
attributes #7 = { nounwind }
attributes #8 = { nounwind allocsize(0,1) }

!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, !11, i64 28}
!10 = !{!"_Type2", !11, i64 0, !6, i64 8, !6, i64 16, !11, i64 24, !11, i64 28, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !11, i64 88, !6, i64 96, !6, i64 104, !11, i64 112, !6, i64 120, !6, i64 128, !11, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !11, i64 168, !11, i64 172, !11, i64 176, !11, i64 180, !6, i64 184, !11, i64 192, !6, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !11, i64 232}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !11, i64 0}
!15 = !{!10, !11, i64 72}
!16 = !{!10, !11, i64 88}
!17 = !{!10, !6, i64 184}
!18 = !{!10, !11, i64 24}
!19 = !{!10, !11, i64 80}
!20 = !{!21, !11, i64 4}
!21 = !{!"", !11, i64 0, !11, i64 4, !6, i64 8, !6, i64 16, !12, i64 24, !12, i64 32, !11, i64 40, !11, i64 44}
!22 = !{!23, !6, i64 0}
!23 = !{!"", !6, i64 0, !6, i64 8}
!24 = !{!25, !25, i64 0}
!25 = !{!"long", !7, i64 0}
!26 = !{!23, !6, i64 8}
!27 = !{!10, !6, i64 8}
!28 = !{!21, !6, i64 8}
!29 = !{!12, !12, i64 0}
!30 = !{!10, !6, i64 16}
!31 = !{!10, !6, i64 40}
!32 = !{!10, !6, i64 32}
!33 = !{!10, !6, i64 48}
!34 = !{!10, !6, i64 56}
!35 = !{!10, !12, i64 216}
!36 = !{i64 0, i64 4, !13, i64 4, i64 4, !13, i64 8, i64 4, !13}
!37 = !{!38, !11, i64 8}
!38 = !{!"", !11, i64 0, !11, i64 4, !11, i64 8}
!39 = distinct !{!39, !40}
!40 = !{!"llvm.loop.mustprogress"}
!41 = distinct !{!41, !40}
!42 = distinct !{!42, !40}
!43 = !{!38, !11, i64 0}
!44 = !{!38, !11, i64 4}
!45 = !{!10, !6, i64 160}
!46 = distinct !{!46, !40}
!47 = distinct !{!47, !40}
!48 = distinct !{!48, !40}
!49 = distinct !{!49, !40}
!50 = distinct !{!50, !40}
!51 = distinct !{!51, !40}


; 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.ScreenedGrid = type { i32, i32, i32 }

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare dso_local { i64, i32 } @basisSetScreening(ptr noundef, double noundef, double noundef) local_unnamed_addr #1

declare { ptr, ptr } @doubleArray_new(i64 noundef, ...) local_unnamed_addr #2

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @calloc(i64 noundef, i64 noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcF_FM06(ptr nocapture noundef readonly %0, ptr noundef %1, ptr nocapture noundef writeonly %2) local_unnamed_addr #1 {
  %4 = getelementptr inbounds i8, ptr %0, i64 28
  %5 = load i32, ptr %4, align 4, !tbaa !5
  %6 = load i32, ptr %0, align 8, !tbaa !12
  %7 = mul nsw i32 %6, %5
  %8 = sext i32 %7 to i64
  %9 = tail call noalias ptr @calloc(i64 noundef %8, i64 noundef 4) #6
  %10 = getelementptr inbounds i8, ptr %0, i64 72
  %11 = load i32, ptr %10, align 8, !tbaa !13
  %12 = add nsw i32 %11, -1
  %13 = getelementptr inbounds i8, ptr %0, i64 88
  %14 = load i32, ptr %13, align 8, !tbaa !14
  %15 = add i32 %14, 1
  %16 = getelementptr inbounds i8, ptr %0, i64 184
  %17 = load ptr, ptr %16, align 8, !tbaa !15
  %18 = getelementptr inbounds i8, ptr %0, i64 24
  %19 = load i32, ptr %18, align 8, !tbaa !16
  %20 = sext i32 %19 to i64
  %21 = tail call noalias ptr @calloc(i64 noundef %20, i64 noundef 12) #6
  store ptr %21, ptr %2, align 8, !tbaa !17
  %22 = sext i32 %6 to i64
  %23 = tail call noalias ptr @calloc(i64 noundef %22, i64 noundef 4) #6
  %24 = getelementptr inbounds i8, ptr %0, i64 80
  %25 = load i32, ptr %24, align 8, !tbaa !18
  %26 = add nsw i32 %25, 1
  %27 = load ptr, ptr %16, align 8, !tbaa !15
  %28 = getelementptr inbounds i8, ptr %27, i64 4
  %29 = load i32, ptr %28, align 4, !tbaa !19
  %30 = tail call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 4, i32 noundef %15, i32 noundef %19, i32 noundef %26, i32 noundef %29) #7
  %31 = extractvalue { ptr, ptr } %30, 0
  %32 = extractvalue { ptr, ptr } %30, 1
  %33 = getelementptr inbounds i8, ptr %31, i64 32
  %34 = load i64, ptr %33, align 8, !tbaa !21
  %35 = getelementptr inbounds i8, ptr %31, i64 24
  %36 = load i64, ptr %35, align 8, !tbaa !21
  %37 = mul i64 %36, %34
  %38 = getelementptr inbounds i8, ptr %31, i64 16
  %39 = load i64, ptr %38, align 8, !tbaa !21
  %40 = mul i64 %37, %39
  %41 = getelementptr inbounds i8, ptr %0, i64 8
  %42 = load ptr, ptr %41, align 8, !tbaa !23
  %43 = load ptr, ptr %16, align 8, !tbaa !15
  %44 = getelementptr inbounds i8, ptr %43, i64 8
  %45 = load ptr, ptr %44, align 8, !tbaa !24
  %46 = load i32, ptr %24, align 8, !tbaa !18
  %47 = add nsw i32 %46, 1
  %48 = sext i32 %47 to i64
  %49 = tail call noalias ptr @calloc(i64 noundef %48, i64 noundef 8) #6
  %50 = load i32, ptr %0, align 8, !tbaa !12
  %51 = icmp sgt i32 %50, 0
  br i1 %51, label %.lr.ph165, label %.preheader156

.lr.ph165:                                        ; preds = %3
  %52 = getelementptr inbounds i8, ptr %0, i64 16
  %53 = getelementptr inbounds i8, ptr %0, i64 40
  %54 = getelementptr inbounds i8, ptr %0, i64 32
  %55 = getelementptr inbounds i8, ptr %0, i64 48
  %56 = getelementptr inbounds i8, ptr %0, i64 56
  %57 = getelementptr inbounds i8, ptr %0, i64 216
  %58 = sext i32 %5 to i64
  br label %68

.preheader156:                                    ; preds = %._crit_edge, %3
  %59 = phi i32 [ %50, %3 ], [ %107, %._crit_edge ]
  %.not193 = icmp slt i32 %14, 0
  br i1 %.not193, label %._crit_edge195, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %.preheader156
  %60 = getelementptr inbounds i8, ptr %0, i64 16
  %61 = getelementptr inbounds i8, ptr %0, i64 32
  %62 = getelementptr inbounds i8, ptr %0, i64 40
  %63 = getelementptr inbounds i8, ptr %0, i64 56
  %64 = getelementptr inbounds i8, ptr %0, i64 48
  %65 = getelementptr inbounds i8, ptr %0, i64 160
  %66 = icmp sgt i32 %59, 0
  br i1 %66, label %.preheader.preheader, label %._crit_edge195

.preheader.preheader:                             ; preds = %.preheader.lr.ph
  %67 = sext i32 %5 to i64
  %wide.trip.count239 = zext i32 %15 to i64
  br label %.preheader

68:                                               ; preds = %.lr.ph165, %._crit_edge
  %indvars.iv207 = phi i64 [ 0, %.lr.ph165 ], [ %indvars.iv.next208, %._crit_edge ]
  %.0145162 = phi i32 [ 0, %.lr.ph165 ], [ %.1146.lcssa, %._crit_edge ]
  %.0147161 = phi i32 [ 0, %.lr.ph165 ], [ %.1148.lcssa, %._crit_edge ]
  %.idx = mul i64 %indvars.iv207, 24
  %69 = getelementptr inbounds i8, ptr %42, i64 %.idx
  %70 = tail call double @distance(ptr noundef %1, ptr noundef %69) #7
  %71 = getelementptr inbounds i32, ptr %23, i64 %indvars.iv207
  store i32 1, ptr %71, align 4, !tbaa !25
  %72 = load ptr, ptr %52, align 8, !tbaa !26
  %73 = getelementptr inbounds i32, ptr %72, i64 %indvars.iv207
  %74 = load i32, ptr %73, align 4, !tbaa !25
  %75 = icmp sgt i32 %74, 0
  br i1 %75, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %68
  %76 = mul nsw i64 %indvars.iv207, %58
  %77 = sext i32 %.0145162 to i64
  %.pre = load ptr, ptr %53, align 8, !tbaa !27
  %invariant.gep = getelementptr i32, ptr %9, i64 %76
  br label %78

78:                                               ; preds = %.lr.ph, %96
  %79 = phi ptr [ %.pre, %.lr.ph ], [ %97, %96 ]
  %indvars.iv202 = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next203, %96 ]
  %indvars.iv = phi i64 [ %77, %.lr.ph ], [ %indvars.iv.next, %96 ]
  %.1148158 = phi i32 [ %.0147161, %.lr.ph ], [ %100, %96 ]
  %80 = getelementptr inbounds i32, ptr %79, i64 %indvars.iv
  %81 = load i32, ptr %80, align 4, !tbaa !25
  %82 = load ptr, ptr %54, align 8, !tbaa !28
  %83 = getelementptr inbounds i32, ptr %82, i64 %indvars.iv
  %84 = load i32, ptr %83, align 4, !tbaa !25
  %85 = load ptr, ptr %55, align 8, !tbaa !29
  %86 = sext i32 %.1148158 to i64
  %87 = getelementptr inbounds double, ptr %85, i64 %86
  %88 = load ptr, ptr %56, align 8, !tbaa !30
  %89 = getelementptr inbounds double, ptr %88, i64 %86
  %90 = load double, ptr %57, align 8, !tbaa !31
  %91 = tail call double @shellRadius(i32 noundef %81, i32 noundef %84, ptr noundef %87, ptr noundef %89, double noundef %90) #7
  %92 = getelementptr inbounds %struct.ScreenedGrid, ptr %21, i64 %indvars.iv
  %93 = tail call { i64, i32 } @basisSetScreening(ptr noundef %17, double noundef %91, double noundef %70)
  %.fca.0.extract = extractvalue { i64, i32 } %93, 0
  %.fca.1.extract = extractvalue { i64, i32 } %93, 1
  store i64 %.fca.0.extract, ptr %92, align 4
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %92, i64 8
  store i32 %.fca.1.extract, ptr %.sroa.4.0..sroa_idx, align 4, !tbaa !25
  %94 = icmp eq i32 %.fca.1.extract, 0
  br i1 %94, label %95, label %96

95:                                               ; preds = %78
  store i32 0, ptr %71, align 4, !tbaa !25
  br label %96

96:                                               ; preds = %95, %78
  %gep = getelementptr i32, ptr %invariant.gep, i64 %indvars.iv202
  store i32 %.1148158, ptr %gep, align 4, !tbaa !25
  %97 = load ptr, ptr %53, align 8, !tbaa !27
  %98 = getelementptr inbounds i32, ptr %97, i64 %indvars.iv
  %99 = load i32, ptr %98, align 4, !tbaa !25
  %100 = add nsw i32 %99, %.1148158
  %indvars.iv.next = add nsw i64 %indvars.iv, 1
  %indvars.iv.next203 = add nuw nsw i64 %indvars.iv202, 1
  %101 = load ptr, ptr %52, align 8, !tbaa !26
  %102 = getelementptr inbounds i32, ptr %101, i64 %indvars.iv207
  %103 = load i32, ptr %102, align 4, !tbaa !25
  %104 = sext i32 %103 to i64
  %105 = icmp slt i64 %indvars.iv.next203, %104
  br i1 %105, label %78, label %._crit_edge.loopexit, !llvm.loop !32

._crit_edge.loopexit:                             ; preds = %96
  %106 = trunc nsw i64 %indvars.iv.next to i32
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %68
  %.1148.lcssa = phi i32 [ %.0147161, %68 ], [ %100, %._crit_edge.loopexit ]
  %.1146.lcssa = phi i32 [ %.0145162, %68 ], [ %106, %._crit_edge.loopexit ]
  %indvars.iv.next208 = add nuw nsw i64 %indvars.iv207, 1
  %107 = load i32, ptr %0, align 8, !tbaa !12
  %108 = sext i32 %107 to i64
  %109 = icmp slt i64 %indvars.iv.next208, %108
  br i1 %109, label %68, label %.preheader156, !llvm.loop !34

.preheader:                                       ; preds = %.preheader.preheader, %._crit_edge192
  %110 = phi i32 [ %59, %.preheader.preheader ], [ %264, %._crit_edge192 ]
  %indvars.iv236 = phi i64 [ 0, %.preheader.preheader ], [ %indvars.iv.next237, %._crit_edge192 ]
  %111 = icmp sgt i32 %110, 0
  br i1 %111, label %.lr.ph191, label %._crit_edge192

.lr.ph191:                                        ; preds = %.preheader
  %112 = trunc nuw nsw i64 %indvars.iv236 to i32
  %113 = add i32 %12, %112
  %.not196 = icmp eq i64 %indvars.iv236, 0
  %114 = mul i64 %indvars.iv236, %40
  %xtraiter = and i64 %indvars.iv236, 7
  %115 = icmp ult i64 %indvars.iv236, 8
  %unroll_iter = and i64 %indvars.iv236, 9223372036854775800
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %116

116:                                              ; preds = %.lr.ph191, %.loopexit155
  %indvars.iv233 = phi i64 [ 0, %.lr.ph191 ], [ %indvars.iv.next234, %.loopexit155 ]
  %.2189 = phi i32 [ -1, %.lr.ph191 ], [ %.4, %.loopexit155 ]
  %117 = getelementptr inbounds i32, ptr %23, i64 %indvars.iv233
  %118 = load i32, ptr %117, align 4, !tbaa !25
  %119 = icmp eq i32 %118, 1
  br i1 %119, label %120, label %125

120:                                              ; preds = %116
  %121 = load ptr, ptr %60, align 8, !tbaa !26
  %122 = getelementptr inbounds i32, ptr %121, i64 %indvars.iv233
  %123 = load i32, ptr %122, align 4, !tbaa !25
  %124 = add nsw i32 %123, %.2189
  br label %.loopexit155

125:                                              ; preds = %116
  %.idx243 = mul i64 %indvars.iv233, 24
  %126 = getelementptr inbounds i8, ptr %42, i64 %.idx243
  %127 = tail call double @distance(ptr noundef %1, ptr noundef %126) #7
  %128 = load ptr, ptr %60, align 8, !tbaa !26
  %129 = getelementptr inbounds i32, ptr %128, i64 %indvars.iv233
  %130 = load i32, ptr %129, align 4, !tbaa !25
  %131 = icmp sgt i32 %130, 0
  br i1 %131, label %.lr.ph187, label %.loopexit155

.lr.ph187:                                        ; preds = %125
  %132 = mul nsw i64 %indvars.iv233, %67
  %133 = sext i32 %.2189 to i64
  %invariant.gep248 = getelementptr i32, ptr %9, i64 %132
  br label %134

134:                                              ; preds = %.lr.ph187, %.loopexit
  %indvars.iv228 = phi i64 [ 0, %.lr.ph187 ], [ %indvars.iv.next229, %.loopexit ]
  %indvars.iv226 = phi i64 [ %133, %.lr.ph187 ], [ %indvars.iv.next227, %.loopexit ]
  %indvars.iv.next227 = add nsw i64 %indvars.iv226, 1
  %135 = getelementptr inbounds %struct.ScreenedGrid, ptr %21, i64 %indvars.iv.next227
  %136 = getelementptr inbounds i8, ptr %135, i64 8
  %137 = load i32, ptr %136, align 4, !tbaa !35
  %138 = icmp eq i32 %137, 1
  br i1 %138, label %.loopexit, label %139

139:                                              ; preds = %134
  %140 = load ptr, ptr %61, align 8, !tbaa !28
  %141 = getelementptr inbounds i32, ptr %140, i64 %indvars.iv.next227
  %142 = load i32, ptr %141, align 4, !tbaa !25
  %143 = add i32 %113, %142
  %.fr = freeze i32 %143
  %144 = load ptr, ptr %62, align 8, !tbaa !27
  %145 = getelementptr inbounds i32, ptr %144, i64 %indvars.iv.next227
  %146 = load i32, ptr %145, align 4, !tbaa !25
  %147 = icmp sgt i32 %146, 0
  br i1 %147, label %.lr.ph183, label %.loopexit

.lr.ph183:                                        ; preds = %139
  %gep249 = getelementptr i32, ptr %invariant.gep248, i64 %indvars.iv228
  %148 = load i32, ptr %gep249, align 4, !tbaa !25
  %149 = getelementptr inbounds i8, ptr %135, i64 4
  %.not154172 = icmp slt i32 %.fr, 0
  %150 = mul i64 %indvars.iv.next227, %37
  %151 = add i64 %150, %114
  br i1 %.not154172, label %.lr.ph183.split.us.preheader, label %.lr.ph183.split.preheader

.lr.ph183.split.preheader:                        ; preds = %.lr.ph183
  %152 = add nuw i32 %.fr, 1
  %153 = sext i32 %148 to i64
  %wide.trip.count = zext i32 %152 to i64
  %xtraiter259 = and i64 %wide.trip.count, 1
  %154 = icmp eq i32 %.fr, 0
  %unroll_iter262 = and i64 %wide.trip.count, 4294967294
  %lcmp.mod261.not = icmp eq i64 %xtraiter259, 0
  br label %.lr.ph183.split

.lr.ph183.split.us.preheader:                     ; preds = %.lr.ph183
  %155 = sext i32 %148 to i64
  br label %.lr.ph183.split.us

.lr.ph183.split.us:                               ; preds = %.lr.ph183.split.us.preheader, %._crit_edge180.split.us.us
  %156 = phi ptr [ %144, %.lr.ph183.split.us.preheader ], [ %160, %._crit_edge180.split.us.us ]
  %indvars.iv223 = phi i64 [ 0, %.lr.ph183.split.us.preheader ], [ %indvars.iv.next224, %._crit_edge180.split.us.us ]
  %157 = load i32, ptr %135, align 4, !tbaa !37
  %158 = load i32, ptr %149, align 4, !tbaa !38
  %159 = icmp slt i32 %157, %158
  br i1 %159, label %.lr.ph179.us, label %._crit_edge180.split.us.us

._crit_edge180.split.us.us.loopexit:              ; preds = %173
  %.pre242 = load ptr, ptr %62, align 8, !tbaa !27
  br label %._crit_edge180.split.us.us

._crit_edge180.split.us.us:                       ; preds = %._crit_edge180.split.us.us.loopexit, %.lr.ph183.split.us
  %160 = phi ptr [ %.pre242, %._crit_edge180.split.us.us.loopexit ], [ %156, %.lr.ph183.split.us ]
  %indvars.iv.next224 = add nuw nsw i64 %indvars.iv223, 1
  %161 = getelementptr inbounds i32, ptr %160, i64 %indvars.iv.next227
  %162 = load i32, ptr %161, align 4, !tbaa !25
  %163 = sext i32 %162 to i64
  %164 = icmp slt i64 %indvars.iv.next224, %163
  br i1 %164, label %.lr.ph183.split.us, label %.loopexit, !llvm.loop !39

.lr.ph179.us:                                     ; preds = %.lr.ph183.split.us
  %165 = load ptr, ptr %63, align 8, !tbaa !30
  %166 = getelementptr double, ptr %165, i64 %indvars.iv223
  %167 = getelementptr double, ptr %166, i64 %155
  %168 = load double, ptr %167, align 8, !tbaa !40
  %169 = fmul double %168, 2.000000e+00
  %170 = fmul double %127, %169
  %171 = fneg double %168
  %172 = sext i32 %157 to i64
  br label %173

173:                                              ; preds = %173, %.lr.ph179.us
  %indvars.iv220 = phi i64 [ %indvars.iv.next221, %173 ], [ %172, %.lr.ph179.us ]
  %174 = load ptr, ptr %65, align 8, !tbaa !41
  %175 = getelementptr inbounds double, ptr %45, i64 %indvars.iv220
  %176 = load double, ptr %175, align 8, !tbaa !40
  %177 = fmul double %170, %176
  tail call void @weightedBesselFunction(ptr noundef %174, i32 noundef 1, i32 noundef %.fr, double noundef %177, ptr noundef %49) #7
  %178 = load double, ptr %175, align 8, !tbaa !40
  %179 = fsub double %127, %178
  %180 = fmul double %179, %171
  %181 = fmul double %179, %180
  %182 = tail call double @exp(double noundef %181) #7
  %indvars.iv.next221 = add nsw i64 %indvars.iv220, 1
  %183 = load i32, ptr %149, align 4, !tbaa !38
  %184 = sext i32 %183 to i64
  %185 = icmp slt i64 %indvars.iv.next221, %184
  br i1 %185, label %173, label %._crit_edge180.split.us.us.loopexit, !llvm.loop !42

.lr.ph183.split:                                  ; preds = %.lr.ph183.split.preheader, %._crit_edge180.split
  %186 = phi ptr [ %144, %.lr.ph183.split.preheader ], [ %250, %._crit_edge180.split ]
  %indvars.iv217 = phi i64 [ 0, %.lr.ph183.split.preheader ], [ %indvars.iv.next218, %._crit_edge180.split ]
  %187 = add nsw i64 %indvars.iv217, %153
  %188 = load ptr, ptr %63, align 8, !tbaa !30
  %189 = getelementptr inbounds double, ptr %188, i64 %187
  %190 = load double, ptr %189, align 8, !tbaa !40
  %191 = load ptr, ptr %64, align 8, !tbaa !29
  %192 = getelementptr inbounds double, ptr %191, i64 %187
  %193 = load double, ptr %192, align 8, !tbaa !40
  br i1 %.not196, label %._crit_edge170, label %.lr.ph169.preheader

.lr.ph169.preheader:                              ; preds = %.lr.ph183.split
  br i1 %115, label %._crit_edge170.loopexit.unr-lcssa, label %.lr.ph169

.lr.ph169:                                        ; preds = %.lr.ph169.preheader, %.lr.ph169
  %.0149166 = phi double [ %201, %.lr.ph169 ], [ %193, %.lr.ph169.preheader ]
  %niter = phi i64 [ %niter.next.7, %.lr.ph169 ], [ 0, %.lr.ph169.preheader ]
  %194 = fmul double %190, %.0149166
  %195 = fmul double %190, %194
  %196 = fmul double %190, %195
  %197 = fmul double %190, %196
  %198 = fmul double %190, %197
  %199 = fmul double %190, %198
  %200 = fmul double %190, %199
  %201 = fmul double %190, %200
  %niter.next.7 = add i64 %niter, 8
  %niter.ncmp.7 = icmp eq i64 %niter.next.7, %unroll_iter
  br i1 %niter.ncmp.7, label %._crit_edge170.loopexit.unr-lcssa, label %.lr.ph169, !llvm.loop !43

._crit_edge170.loopexit.unr-lcssa:                ; preds = %.lr.ph169, %.lr.ph169.preheader
  %.lcssa.ph = phi double [ poison, %.lr.ph169.preheader ], [ %201, %.lr.ph169 ]
  %.0149166.unr = phi double [ %193, %.lr.ph169.preheader ], [ %201, %.lr.ph169 ]
  br i1 %lcmp.mod.not, label %._crit_edge170, label %.lr.ph169.epil

.lr.ph169.epil:                                   ; preds = %._crit_edge170.loopexit.unr-lcssa, %.lr.ph169.epil
  %.0149166.epil = phi double [ %202, %.lr.ph169.epil ], [ %.0149166.unr, %._crit_edge170.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.lr.ph169.epil ], [ 0, %._crit_edge170.loopexit.unr-lcssa ]
  %202 = fmul double %190, %.0149166.epil
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge170, label %.lr.ph169.epil, !llvm.loop !44

._crit_edge170:                                   ; preds = %._crit_edge170.loopexit.unr-lcssa, %.lr.ph169.epil, %.lr.ph183.split
  %.0149.lcssa = phi double [ %193, %.lr.ph183.split ], [ %.lcssa.ph, %._crit_edge170.loopexit.unr-lcssa ], [ %202, %.lr.ph169.epil ]
  %203 = load i32, ptr %135, align 4, !tbaa !37
  %204 = load i32, ptr %149, align 4, !tbaa !38
  %205 = icmp slt i32 %203, %204
  br i1 %205, label %.lr.ph179, label %._crit_edge180.split

.lr.ph179:                                        ; preds = %._crit_edge170
  %206 = fmul double %190, 2.000000e+00
  %207 = fmul double %127, %206
  %208 = fneg double %190
  %209 = sext i32 %203 to i64
  br label %.lr.ph175

.lr.ph175:                                        ; preds = %.lr.ph179, %._crit_edge176
  %indvars.iv214 = phi i64 [ %209, %.lr.ph179 ], [ %indvars.iv.next215, %._crit_edge176 ]
  %210 = load ptr, ptr %65, align 8, !tbaa !41
  %211 = getelementptr inbounds double, ptr %45, i64 %indvars.iv214
  %212 = load double, ptr %211, align 8, !tbaa !40
  %213 = fmul double %207, %212
  tail call void @weightedBesselFunction(ptr noundef %210, i32 noundef 1, i32 noundef %.fr, double noundef %213, ptr noundef %49) #7
  %214 = load double, ptr %211, align 8, !tbaa !40
  %215 = fsub double %127, %214
  %216 = fmul double %215, %208
  %217 = fmul double %215, %216
  %218 = tail call double @exp(double noundef %217) #7
  %219 = add i64 %151, %indvars.iv214
  br i1 %154, label %._crit_edge176.unr-lcssa, label %.lr.ph175.new

.lr.ph175.new:                                    ; preds = %.lr.ph175, %.lr.ph175.new
  %indvars.iv210 = phi i64 [ %indvars.iv.next211.1, %.lr.ph175.new ], [ 0, %.lr.ph175 ]
  %niter263 = phi i64 [ %niter263.next.1, %.lr.ph175.new ], [ 0, %.lr.ph175 ]
  %220 = getelementptr inbounds double, ptr %49, i64 %indvars.iv210
  %221 = load double, ptr %220, align 8, !tbaa !40
  %222 = fmul double %.0149.lcssa, %221
  %223 = mul i64 %indvars.iv210, %34
  %224 = add i64 %219, %223
  %sext = shl i64 %224, 32
  %225 = ashr exact i64 %sext, 29
  %226 = getelementptr inbounds i8, ptr %32, i64 %225
  %227 = load double, ptr %226, align 8, !tbaa !40
  %228 = tail call double @llvm.fmuladd.f64(double %222, double %218, double %227)
  store double %228, ptr %226, align 8, !tbaa !40
  %indvars.iv.next211 = or disjoint i64 %indvars.iv210, 1
  %229 = getelementptr inbounds double, ptr %49, i64 %indvars.iv.next211
  %230 = load double, ptr %229, align 8, !tbaa !40
  %231 = fmul double %.0149.lcssa, %230
  %232 = mul i64 %indvars.iv.next211, %34
  %233 = add i64 %219, %232
  %sext.1 = shl i64 %233, 32
  %234 = ashr exact i64 %sext.1, 29
  %235 = getelementptr inbounds i8, ptr %32, i64 %234
  %236 = load double, ptr %235, align 8, !tbaa !40
  %237 = tail call double @llvm.fmuladd.f64(double %231, double %218, double %236)
  store double %237, ptr %235, align 8, !tbaa !40
  %indvars.iv.next211.1 = add nuw nsw i64 %indvars.iv210, 2
  %niter263.next.1 = add i64 %niter263, 2
  %niter263.ncmp.1 = icmp eq i64 %niter263.next.1, %unroll_iter262
  br i1 %niter263.ncmp.1, label %._crit_edge176.unr-lcssa, label %.lr.ph175.new, !llvm.loop !46

._crit_edge176.unr-lcssa:                         ; preds = %.lr.ph175.new, %.lr.ph175
  %indvars.iv210.unr = phi i64 [ 0, %.lr.ph175 ], [ %indvars.iv.next211.1, %.lr.ph175.new ]
  br i1 %lcmp.mod261.not, label %._crit_edge176, label %._crit_edge176.epilog-lcssa

._crit_edge176.epilog-lcssa:                      ; preds = %._crit_edge176.unr-lcssa
  %238 = getelementptr inbounds double, ptr %49, i64 %indvars.iv210.unr
  %239 = load double, ptr %238, align 8, !tbaa !40
  %240 = fmul double %.0149.lcssa, %239
  %241 = mul i64 %indvars.iv210.unr, %34
  %242 = add i64 %219, %241
  %sext.epil = shl i64 %242, 32
  %243 = ashr exact i64 %sext.epil, 29
  %244 = getelementptr inbounds i8, ptr %32, i64 %243
  %245 = load double, ptr %244, align 8, !tbaa !40
  %246 = tail call double @llvm.fmuladd.f64(double %240, double %218, double %245)
  store double %246, ptr %244, align 8, !tbaa !40
  br label %._crit_edge176

._crit_edge176:                                   ; preds = %._crit_edge176.unr-lcssa, %._crit_edge176.epilog-lcssa
  %indvars.iv.next215 = add nsw i64 %indvars.iv214, 1
  %247 = load i32, ptr %149, align 4, !tbaa !38
  %248 = sext i32 %247 to i64
  %249 = icmp slt i64 %indvars.iv.next215, %248
  br i1 %249, label %.lr.ph175, label %._crit_edge180.split.loopexit, !llvm.loop !42

._crit_edge180.split.loopexit:                    ; preds = %._crit_edge176
  %.pre241 = load ptr, ptr %62, align 8, !tbaa !27
  br label %._crit_edge180.split

._crit_edge180.split:                             ; preds = %._crit_edge180.split.loopexit, %._crit_edge170
  %250 = phi ptr [ %.pre241, %._crit_edge180.split.loopexit ], [ %186, %._crit_edge170 ]
  %indvars.iv.next218 = add nuw nsw i64 %indvars.iv217, 1
  %251 = getelementptr inbounds i32, ptr %250, i64 %indvars.iv.next227
  %252 = load i32, ptr %251, align 4, !tbaa !25
  %253 = sext i32 %252 to i64
  %254 = icmp slt i64 %indvars.iv.next218, %253
  br i1 %254, label %.lr.ph183.split, label %.loopexit, !llvm.loop !39

.loopexit:                                        ; preds = %._crit_edge180.split, %._crit_edge180.split.us.us, %139, %134
  %indvars.iv.next229 = add nuw nsw i64 %indvars.iv228, 1
  %255 = load ptr, ptr %60, align 8, !tbaa !26
  %256 = getelementptr inbounds i32, ptr %255, i64 %indvars.iv233
  %257 = load i32, ptr %256, align 4, !tbaa !25
  %258 = sext i32 %257 to i64
  %259 = icmp slt i64 %indvars.iv.next229, %258
  br i1 %259, label %134, label %.loopexit155.loopexit, !llvm.loop !47

.loopexit155.loopexit:                            ; preds = %.loopexit
  %260 = trunc nsw i64 %indvars.iv.next227 to i32
  br label %.loopexit155

.loopexit155:                                     ; preds = %.loopexit155.loopexit, %125, %120
  %.4 = phi i32 [ %124, %120 ], [ %.2189, %125 ], [ %260, %.loopexit155.loopexit ]
  %indvars.iv.next234 = add nuw nsw i64 %indvars.iv233, 1
  %261 = load i32, ptr %0, align 8, !tbaa !12
  %262 = sext i32 %261 to i64
  %263 = icmp slt i64 %indvars.iv.next234, %262
  br i1 %263, label %116, label %._crit_edge192, !llvm.loop !48

._crit_edge192:                                   ; preds = %.loopexit155, %.preheader
  %264 = phi i32 [ %110, %.preheader ], [ %261, %.loopexit155 ]
  %indvars.iv.next237 = add nuw nsw i64 %indvars.iv236, 1
  %exitcond240.not = icmp eq i64 %indvars.iv.next237, %wide.trip.count239
  br i1 %exitcond240.not, label %._crit_edge195, label %.preheader, !llvm.loop !49

._crit_edge195:                                   ; preds = %._crit_edge192, %.preheader.lr.ph, %.preheader156
  tail call void @free(ptr noundef %23) #7
  tail call void @free(ptr noundef %9) #7
  tail call void @free(ptr noundef %49) #7
  ret { ptr, ptr } %30
}

declare double @distance(ptr noundef, ptr noundef) local_unnamed_addr #2

declare double @shellRadius(i32 noundef, i32 noundef, ptr noundef, ptr noundef, double noundef) local_unnamed_addr #2

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @exp(double noundef) local_unnamed_addr #4

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

attributes #0 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 = { 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 #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 nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress 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 #5 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { nounwind allocsize(0,1) }
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, !7, i64 28}
!6 = !{!"_Type2", !7, i64 0, !10, i64 8, !10, i64 16, !7, i64 24, !7, i64 28, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !7, i64 72, !7, i64 76, !7, i64 80, !7, i64 84, !7, i64 88, !10, i64 96, !10, i64 104, !7, i64 112, !10, i64 120, !10, i64 128, !7, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !7, i64 168, !7, i64 172, !7, i64 176, !7, i64 180, !10, i64 184, !7, i64 192, !10, i64 200, !11, i64 208, !11, i64 216, !11, i64 224, !7, i64 232}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!6, !7, i64 0}
!13 = !{!6, !7, i64 72}
!14 = !{!6, !7, i64 88}
!15 = !{!6, !10, i64 184}
!16 = !{!6, !7, i64 24}
!17 = !{!10, !10, i64 0}
!18 = !{!6, !7, i64 80}
!19 = !{!20, !7, i64 4}
!20 = !{!"", !7, i64 0, !7, i64 4, !10, i64 8, !10, i64 16, !11, i64 24, !11, i64 32, !7, i64 40, !7, i64 44}
!21 = !{!22, !22, i64 0}
!22 = !{!"long", !8, i64 0}
!23 = !{!6, !10, i64 8}
!24 = !{!20, !10, i64 8}
!25 = !{!7, !7, i64 0}
!26 = !{!6, !10, i64 16}
!27 = !{!6, !10, i64 40}
!28 = !{!6, !10, i64 32}
!29 = !{!6, !10, i64 48}
!30 = !{!6, !10, i64 56}
!31 = !{!6, !11, i64 216}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}
!35 = !{!36, !7, i64 8}
!36 = !{!"", !7, i64 0, !7, i64 4, !7, i64 8}
!37 = !{!36, !7, i64 0}
!38 = !{!36, !7, i64 4}
!39 = distinct !{!39, !33}
!40 = !{!11, !11, i64 0}
!41 = !{!6, !10, i64 160}
!42 = distinct !{!42, !33}
!43 = distinct !{!43, !33}
!44 = distinct !{!44, !45}
!45 = !{!"llvm.loop.unroll.disable"}
!46 = distinct !{!46, !33}
!47 = distinct !{!47, !33}
!48 = distinct !{!48, !33}
!49 = distinct !{!49, !33, !50}
!50 = !{!"llvm.loop.unswitch.partial.disable"}


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