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

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

; 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 { ptr, ptr } @calcQ(ptr noundef, ptr noundef, ptr noundef, double noundef, i32 noundef, double noundef, double noundef, double noundef, double noundef, double noundef, double noundef, double noundef, double noundef) #2

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

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

declare void @doubleArray_free(ptr, ptr) #4

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcChi(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, double noundef %4, ptr noundef %5, double noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i32 noundef %10, ptr noundef byval(%struct.doubleArray) align 8 %11, i32 noundef %12, i32 noundef %13, i32 noundef %14, i32 noundef %15, ptr noundef byval(%struct.doubleArray) align 8 %16) #2 {
  %18 = alloca %struct.doubleArray, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca double, align 8
  %24 = alloca ptr, align 8
  %25 = alloca double, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca i32, align 4
  %38 = alloca ptr, align 8
  %39 = alloca ptr, align 8
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca double, align 8
  %43 = alloca double, align 8
  %44 = alloca double, align 8
  %45 = alloca double, align 8
  %46 = alloca double, align 8
  %47 = alloca [3 x double], align 16
  %48 = alloca [3 x double], align 16
  %49 = alloca i32, align 4
  %50 = alloca i32, align 4
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  %56 = alloca i32, align 4
  %57 = alloca i32, align 4
  %58 = alloca i32, align 4
  %59 = alloca i32, align 4
  %60 = alloca i32, align 4
  %61 = alloca i32, align 4
  %62 = alloca i32, align 4
  %63 = alloca i32, align 4
  %64 = alloca i32, align 4
  %65 = alloca ptr, align 8
  %66 = alloca ptr, align 8
  %67 = alloca ptr, align 8
  %68 = alloca i32, align 4
  %69 = alloca i32, align 4
  %70 = alloca %struct.doubleArray, align 8
  %71 = alloca i32, align 4
  %72 = alloca i32, align 4
  %73 = alloca %struct.doubleArray, align 8
  %74 = alloca i32, align 4
  store ptr %0, ptr %19, align 8, !tbaa !5
  store ptr %1, ptr %20, align 8, !tbaa !5
  store ptr %2, ptr %21, align 8, !tbaa !5
  store ptr %3, ptr %22, align 8, !tbaa !5
  store double %4, ptr %23, align 8, !tbaa !9
  store ptr %5, ptr %24, align 8, !tbaa !5
  store double %6, ptr %25, align 8, !tbaa !9
  store i32 %7, ptr %26, align 4, !tbaa !11
  store i32 %8, ptr %27, align 4, !tbaa !11
  store i32 %9, ptr %28, align 4, !tbaa !11
  store i32 %10, ptr %29, align 4, !tbaa !11
  store i32 %12, ptr %30, align 4, !tbaa !11
  store i32 %13, ptr %31, align 4, !tbaa !11
  store i32 %14, ptr %32, align 4, !tbaa !11
  store i32 %15, ptr %33, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #6
  %75 = load ptr, ptr %19, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.Type1, ptr %75, i32 0, i32 0
  %77 = load ptr, ptr %76, align 8, !tbaa !13
  %78 = load i32, ptr %27, align 4, !tbaa !11
  %79 = sext i32 %78 to i64
  %80 = getelementptr inbounds i32, ptr %77, i64 %79
  %81 = load i32, ptr %80, align 4, !tbaa !11
  store i32 %81, ptr %34, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #6
  %82 = load ptr, ptr %19, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.Type1, ptr %82, i32 0, i32 2
  %84 = load ptr, ptr %83, align 8, !tbaa !15
  %85 = load i32, ptr %28, align 4, !tbaa !11
  %86 = sext i32 %85 to i64
  %87 = getelementptr inbounds double, ptr %84, i64 %86
  store ptr %87, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #6
  %88 = load ptr, ptr %19, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.Type1, ptr %88, i32 0, i32 1
  %90 = load ptr, ptr %89, align 8, !tbaa !16
  %91 = load i32, ptr %28, align 4, !tbaa !11
  %92 = sext i32 %91 to i64
  %93 = getelementptr inbounds double, ptr %90, i64 %92
  store ptr %93, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #6
  %94 = load ptr, ptr %19, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.Type1, ptr %94, i32 0, i32 0
  %96 = load ptr, ptr %95, align 8, !tbaa !13
  %97 = load i32, ptr %31, align 4, !tbaa !11
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds i32, ptr %96, i64 %98
  %100 = load i32, ptr %99, align 4, !tbaa !11
  store i32 %100, ptr %37, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #6
  %101 = load ptr, ptr %19, align 8, !tbaa !5
  %102 = getelementptr inbounds %struct.Type1, ptr %101, i32 0, i32 2
  %103 = load ptr, ptr %102, align 8, !tbaa !15
  %104 = load i32, ptr %32, align 4, !tbaa !11
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds double, ptr %103, i64 %105
  store ptr %106, ptr %38, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #6
  %107 = load ptr, ptr %19, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.Type1, ptr %107, i32 0, i32 1
  %109 = load ptr, ptr %108, align 8, !tbaa !16
  %110 = load i32, ptr %32, align 4, !tbaa !11
  %111 = sext i32 %110 to i64
  %112 = getelementptr inbounds double, ptr %109, i64 %111
  store ptr %112, ptr %39, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #6
  call void @llvm.lifetime.start.p0(i64 24, ptr %47) #6
  call void @llvm.lifetime.start.p0(i64 24, ptr %48) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #6
  %113 = load i32, ptr %26, align 4, !tbaa !11
  %114 = load i32, ptr %30, align 4, !tbaa !11
  %115 = add nsw i32 %113, %114
  store i32 %115, ptr %49, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %62) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %63) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #6
  %116 = load ptr, ptr %19, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.Type1, ptr %116, i32 0, i32 9
  %118 = load ptr, ptr %117, align 8, !tbaa !17
  store ptr %118, ptr %66, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #6
  %119 = load ptr, ptr %19, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.Type1, ptr %119, i32 0, i32 7
  %121 = load ptr, ptr %120, align 8, !tbaa !18
  store ptr %121, ptr %67, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %68) #6
  %122 = load ptr, ptr %19, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.Type1, ptr %122, i32 0, i32 8
  %124 = load i32, ptr %123, align 8, !tbaa !19
  store i32 %124, ptr %68, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %69) #6
  %125 = load ptr, ptr %19, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.Type1, ptr %125, i32 0, i32 10
  %127 = load i32, ptr %126, align 8, !tbaa !20
  %128 = add nsw i32 %127, 1
  %129 = load ptr, ptr %19, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.Type1, ptr %129, i32 0, i32 10
  %131 = load i32, ptr %130, align 8, !tbaa !20
  %132 = add nsw i32 %131, 1
  %133 = mul nsw i32 %128, %132
  store i32 %133, ptr %69, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 16, ptr %70) #6
  %134 = load i32, ptr %26, align 4, !tbaa !11
  %135 = add nsw i32 %134, 1
  %136 = load i32, ptr %26, align 4, !tbaa !11
  %137 = add nsw i32 %136, 2
  %138 = mul nsw i32 %135, %137
  %139 = load i32, ptr %26, align 4, !tbaa !11
  %140 = add nsw i32 %139, 3
  %141 = mul nsw i32 %138, %140
  %142 = sdiv i32 %141, 6
  %143 = load i32, ptr %30, align 4, !tbaa !11
  %144 = add nsw i32 %143, 1
  %145 = load i32, ptr %30, align 4, !tbaa !11
  %146 = add nsw i32 %145, 2
  %147 = mul nsw i32 %144, %146
  %148 = load i32, ptr %30, align 4, !tbaa !11
  %149 = add nsw i32 %148, 3
  %150 = mul nsw i32 %147, %149
  %151 = sdiv i32 %150, 6
  %152 = call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %142, i32 noundef %151)
  %153 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 0
  %154 = extractvalue { ptr, ptr } %152, 0
  store ptr %154, ptr %153, align 8
  %155 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 1
  %156 = extractvalue { ptr, ptr } %152, 1
  store ptr %156, ptr %155, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %71) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %72) #6
  %157 = getelementptr inbounds %struct.doubleArray, ptr %18, i32 0, i32 0
  %158 = load ptr, ptr %157, align 8, !tbaa !21
  %159 = getelementptr inbounds i64, ptr %158, i64 2
  %160 = load i64, ptr %159, align 8, !tbaa !23
  %161 = trunc i64 %160 to i32
  store i32 %161, ptr %72, align 4, !tbaa !11
  store i32 0, ptr %40, align 4, !tbaa !11
  br label %162

162:                                              ; preds = %492, %17
  %163 = load i32, ptr %40, align 4, !tbaa !11
  %164 = load i32, ptr %34, align 4, !tbaa !11
  %165 = icmp slt i32 %163, %164
  br i1 %165, label %166, label %495

166:                                              ; preds = %162
  %167 = load ptr, ptr %35, align 8, !tbaa !5
  %168 = load i32, ptr %40, align 4, !tbaa !11
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds double, ptr %167, i64 %169
  %171 = load double, ptr %170, align 8, !tbaa !9
  store double %171, ptr %43, align 8, !tbaa !9
  %172 = load ptr, ptr %36, align 8, !tbaa !5
  %173 = load i32, ptr %40, align 4, !tbaa !11
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds double, ptr %172, i64 %174
  %176 = load double, ptr %175, align 8, !tbaa !9
  store double %176, ptr %42, align 8, !tbaa !9
  store i32 0, ptr %58, align 4, !tbaa !11
  br label %177

177:                                              ; preds = %185, %166
  %178 = load i32, ptr %58, align 4, !tbaa !11
  %179 = load i32, ptr %29, align 4, !tbaa !11
  %180 = icmp slt i32 %178, %179
  br i1 %180, label %181, label %188

181:                                              ; preds = %177
  %182 = load double, ptr %43, align 8, !tbaa !9
  %183 = load double, ptr %42, align 8, !tbaa !9
  %184 = fmul double %183, %182
  store double %184, ptr %42, align 8, !tbaa !9
  br label %185

185:                                              ; preds = %181
  %186 = load i32, ptr %58, align 4, !tbaa !11
  %187 = add nsw i32 %186, 1
  store i32 %187, ptr %58, align 4, !tbaa !11
  br label %177, !llvm.loop !25

188:                                              ; preds = %177
  store i32 0, ptr %41, align 4, !tbaa !11
  br label %189

189:                                              ; preds = %488, %188
  %190 = load i32, ptr %41, align 4, !tbaa !11
  %191 = load i32, ptr %37, align 4, !tbaa !11
  %192 = icmp slt i32 %190, %191
  br i1 %192, label %193, label %491

193:                                              ; preds = %189
  %194 = load ptr, ptr %38, align 8, !tbaa !5
  %195 = load i32, ptr %41, align 4, !tbaa !11
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds double, ptr %194, i64 %196
  %198 = load double, ptr %197, align 8, !tbaa !9
  store double %198, ptr %45, align 8, !tbaa !9
  %199 = load ptr, ptr %39, align 8, !tbaa !5
  %200 = load i32, ptr %41, align 4, !tbaa !11
  %201 = sext i32 %200 to i64
  %202 = getelementptr inbounds double, ptr %199, i64 %201
  %203 = load double, ptr %202, align 8, !tbaa !9
  store double %203, ptr %44, align 8, !tbaa !9
  store i32 0, ptr %58, align 4, !tbaa !11
  br label %204

204:                                              ; preds = %212, %193
  %205 = load i32, ptr %58, align 4, !tbaa !11
  %206 = load i32, ptr %33, align 4, !tbaa !11
  %207 = icmp slt i32 %205, %206
  br i1 %207, label %208, label %215

208:                                              ; preds = %204
  %209 = load double, ptr %45, align 8, !tbaa !9
  %210 = load double, ptr %44, align 8, !tbaa !9
  %211 = fmul double %210, %209
  store double %211, ptr %44, align 8, !tbaa !9
  br label %212

212:                                              ; preds = %208
  %213 = load i32, ptr %58, align 4, !tbaa !11
  %214 = add nsw i32 %213, 1
  store i32 %214, ptr %58, align 4, !tbaa !11
  br label %204, !llvm.loop !27

215:                                              ; preds = %204
  store i32 0, ptr %58, align 4, !tbaa !11
  br label %216

216:                                              ; preds = %238, %215
  %217 = load i32, ptr %58, align 4, !tbaa !11
  %218 = icmp slt i32 %217, 3
  br i1 %218, label %219, label %241

219:                                              ; preds = %216
  %220 = load double, ptr %43, align 8, !tbaa !9
  %221 = load ptr, ptr %22, align 8, !tbaa !5
  %222 = load i32, ptr %58, align 4, !tbaa !11
  %223 = sext i32 %222 to i64
  %224 = getelementptr inbounds double, ptr %221, i64 %223
  %225 = load double, ptr %224, align 8, !tbaa !9
  %226 = load double, ptr %45, align 8, !tbaa !9
  %227 = load ptr, ptr %24, align 8, !tbaa !5
  %228 = load i32, ptr %58, align 4, !tbaa !11
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds double, ptr %227, i64 %229
  %231 = load double, ptr %230, align 8, !tbaa !9
  %232 = fmul double %226, %231
  %233 = call double @llvm.fmuladd.f64(double %220, double %225, double %232)
  %234 = fmul double 2.000000e+00, %233
  %235 = load i32, ptr %58, align 4, !tbaa !11
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds [3 x double], ptr %47, i64 0, i64 %236
  store double %234, ptr %237, align 8, !tbaa !9
  br label %238

238:                                              ; preds = %219
  %239 = load i32, ptr %58, align 4, !tbaa !11
  %240 = add nsw i32 %239, 1
  store i32 %240, ptr %58, align 4, !tbaa !11
  br label %216, !llvm.loop !28

241:                                              ; preds = %216
  %242 = getelementptr inbounds [3 x double], ptr %47, i64 0, i64 0
  %243 = getelementptr inbounds [3 x double], ptr %48, i64 0, i64 0
  call void @sphericalCoordinates(ptr noundef %242, ptr noundef %243)
  %244 = load i32, ptr %49, align 4, !tbaa !11
  %245 = getelementptr inbounds [3 x double], ptr %48, i64 0, i64 1
  %246 = load double, ptr %245, align 8, !tbaa !9
  %247 = getelementptr inbounds [3 x double], ptr %48, i64 0, i64 2
  %248 = load double, ptr %247, align 16, !tbaa !9
  %249 = load ptr, ptr %19, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.Type1, ptr %249, i32 0, i32 3
  %251 = load ptr, ptr %250, align 8, !tbaa !29
  %252 = load ptr, ptr %19, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.Type1, ptr %252, i32 0, i32 4
  %254 = load ptr, ptr %253, align 8, !tbaa !30
  %255 = call ptr @realSphericalHarmonics(i32 noundef %244, double noundef %246, double noundef %248, ptr noundef %251, ptr noundef %254)
  store ptr %255, ptr %65, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %73) #6
  %256 = load ptr, ptr %19, align 8, !tbaa !5
  %257 = load ptr, ptr %20, align 8, !tbaa !5
  %258 = load ptr, ptr %21, align 8, !tbaa !5
  %259 = getelementptr inbounds [3 x double], ptr %48, i64 0, i64 0
  %260 = load double, ptr %259, align 16, !tbaa !9
  %261 = load i32, ptr %49, align 4, !tbaa !11
  %262 = load double, ptr %23, align 8, !tbaa !9
  %263 = load double, ptr %42, align 8, !tbaa !9
  %264 = load double, ptr %43, align 8, !tbaa !9
  %265 = load i32, ptr %29, align 4, !tbaa !11
  %266 = sitofp i32 %265 to double
  %267 = load double, ptr %25, align 8, !tbaa !9
  %268 = load double, ptr %44, align 8, !tbaa !9
  %269 = load double, ptr %45, align 8, !tbaa !9
  %270 = load i32, ptr %33, align 4, !tbaa !11
  %271 = sitofp i32 %270 to double
  %272 = call { ptr, ptr } @calcQ(ptr noundef %256, ptr noundef %257, ptr noundef %258, double noundef %260, i32 noundef %261, double noundef %262, double noundef %263, double noundef %264, double noundef %266, double noundef %267, double noundef %268, double noundef %269, double noundef %271)
  %273 = getelementptr inbounds { ptr, ptr }, ptr %73, i32 0, i32 0
  %274 = extractvalue { ptr, ptr } %272, 0
  store ptr %274, ptr %273, align 8
  %275 = getelementptr inbounds { ptr, ptr }, ptr %73, i32 0, i32 1
  %276 = extractvalue { ptr, ptr } %272, 1
  store ptr %276, ptr %275, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %70, ptr align 8 %73, i64 16, i1 false), !tbaa.struct !31
  call void @llvm.lifetime.end.p0(i64 16, ptr %73) #6
  %277 = getelementptr inbounds %struct.doubleArray, ptr %70, i32 0, i32 1
  %278 = load ptr, ptr %277, align 8, !tbaa !32
  %279 = icmp eq ptr null, %278
  br i1 %279, label %280, label %286

280:                                              ; preds = %241
  %281 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 0
  %282 = load ptr, ptr %281, align 8
  %283 = getelementptr inbounds { ptr, ptr }, ptr %18, i32 0, i32 1
  %284 = load ptr, ptr %283, align 8
  call void @doubleArray_free(ptr %282, ptr %284)
  %285 = load ptr, ptr %65, align 8, !tbaa !5
  call void @free(ptr noundef %285) #6
  store i32 1, ptr %74, align 4
  br label %496

286:                                              ; preds = %241
  %287 = getelementptr inbounds %struct.doubleArray, ptr %70, i32 0, i32 0
  %288 = load ptr, ptr %287, align 8, !tbaa !21
  %289 = getelementptr inbounds i64, ptr %288, i64 2
  %290 = load i64, ptr %289, align 8, !tbaa !23
  %291 = trunc i64 %290 to i32
  store i32 %291, ptr %71, align 4, !tbaa !11
  store i32 0, ptr %50, align 4, !tbaa !11
  br label %292

292:                                              ; preds = %479, %286
  %293 = load i32, ptr %50, align 4, !tbaa !11
  %294 = load i32, ptr %26, align 4, !tbaa !11
  %295 = icmp sle i32 %293, %294
  br i1 %295, label %296, label %482

296:                                              ; preds = %292
  store i32 0, ptr %51, align 4, !tbaa !11
  br label %297

297:                                              ; preds = %475, %296
  %298 = load i32, ptr %51, align 4, !tbaa !11
  %299 = load i32, ptr %26, align 4, !tbaa !11
  %300 = load i32, ptr %50, align 4, !tbaa !11
  %301 = sub nsw i32 %299, %300
  %302 = icmp sle i32 %298, %301
  br i1 %302, label %303, label %478

303:                                              ; preds = %297
  store i32 0, ptr %52, align 4, !tbaa !11
  br label %304

304:                                              ; preds = %471, %303
  %305 = load i32, ptr %52, align 4, !tbaa !11
  %306 = load i32, ptr %26, align 4, !tbaa !11
  %307 = load i32, ptr %50, align 4, !tbaa !11
  %308 = sub nsw i32 %306, %307
  %309 = load i32, ptr %51, align 4, !tbaa !11
  %310 = sub nsw i32 %308, %309
  %311 = icmp sle i32 %305, %310
  br i1 %311, label %312, label %474

312:                                              ; preds = %304
  %313 = load ptr, ptr %67, align 8, !tbaa !5
  %314 = load i32, ptr %50, align 4, !tbaa !11
  %315 = load i32, ptr %68, align 4, !tbaa !11
  %316 = mul nsw i32 %314, %315
  %317 = load i32, ptr %68, align 4, !tbaa !11
  %318 = mul nsw i32 %316, %317
  %319 = load i32, ptr %51, align 4, !tbaa !11
  %320 = load i32, ptr %68, align 4, !tbaa !11
  %321 = mul nsw i32 %319, %320
  %322 = add nsw i32 %318, %321
  %323 = load i32, ptr %52, align 4, !tbaa !11
  %324 = add nsw i32 %322, %323
  %325 = sext i32 %324 to i64
  %326 = getelementptr inbounds i32, ptr %313, i64 %325
  %327 = load i32, ptr %326, align 4, !tbaa !11
  store i32 %327, ptr %56, align 4, !tbaa !11
  store i32 0, ptr %53, align 4, !tbaa !11
  br label %328

328:                                              ; preds = %467, %312
  %329 = load i32, ptr %53, align 4, !tbaa !11
  %330 = load i32, ptr %30, align 4, !tbaa !11
  %331 = icmp sle i32 %329, %330
  br i1 %331, label %332, label %470

332:                                              ; preds = %328
  %333 = load i32, ptr %50, align 4, !tbaa !11
  %334 = load i32, ptr %53, align 4, !tbaa !11
  %335 = add nsw i32 %333, %334
  store i32 %335, ptr %62, align 4, !tbaa !11
  store i32 0, ptr %54, align 4, !tbaa !11
  br label %336

336:                                              ; preds = %463, %332
  %337 = load i32, ptr %54, align 4, !tbaa !11
  %338 = load i32, ptr %30, align 4, !tbaa !11
  %339 = load i32, ptr %53, align 4, !tbaa !11
  %340 = sub nsw i32 %338, %339
  %341 = icmp sle i32 %337, %340
  br i1 %341, label %342, label %466

342:                                              ; preds = %336
  %343 = load i32, ptr %51, align 4, !tbaa !11
  %344 = load i32, ptr %54, align 4, !tbaa !11
  %345 = add nsw i32 %343, %344
  store i32 %345, ptr %63, align 4, !tbaa !11
  store i32 0, ptr %55, align 4, !tbaa !11
  br label %346

346:                                              ; preds = %459, %342
  %347 = load i32, ptr %55, align 4, !tbaa !11
  %348 = load i32, ptr %30, align 4, !tbaa !11
  %349 = load i32, ptr %53, align 4, !tbaa !11
  %350 = sub nsw i32 %348, %349
  %351 = load i32, ptr %54, align 4, !tbaa !11
  %352 = sub nsw i32 %350, %351
  %353 = icmp sle i32 %347, %352
  br i1 %353, label %354, label %462

354:                                              ; preds = %346
  %355 = load ptr, ptr %67, align 8, !tbaa !5
  %356 = load i32, ptr %53, align 4, !tbaa !11
  %357 = load i32, ptr %68, align 4, !tbaa !11
  %358 = mul nsw i32 %356, %357
  %359 = load i32, ptr %68, align 4, !tbaa !11
  %360 = mul nsw i32 %358, %359
  %361 = load i32, ptr %54, align 4, !tbaa !11
  %362 = load i32, ptr %68, align 4, !tbaa !11
  %363 = mul nsw i32 %361, %362
  %364 = add nsw i32 %360, %363
  %365 = load i32, ptr %55, align 4, !tbaa !11
  %366 = add nsw i32 %364, %365
  %367 = sext i32 %366 to i64
  %368 = getelementptr inbounds i32, ptr %355, i64 %367
  %369 = load i32, ptr %368, align 4, !tbaa !11
  store i32 %369, ptr %57, align 4, !tbaa !11
  %370 = load i32, ptr %52, align 4, !tbaa !11
  %371 = load i32, ptr %55, align 4, !tbaa !11
  %372 = add nsw i32 %370, %371
  store i32 %372, ptr %64, align 4, !tbaa !11
  %373 = load i32, ptr %62, align 4, !tbaa !11
  %374 = load i32, ptr %63, align 4, !tbaa !11
  %375 = add nsw i32 %373, %374
  %376 = load i32, ptr %64, align 4, !tbaa !11
  %377 = add nsw i32 %375, %376
  store i32 %377, ptr %61, align 4, !tbaa !11
  %378 = load ptr, ptr %67, align 8, !tbaa !5
  %379 = load i32, ptr %62, align 4, !tbaa !11
  %380 = load i32, ptr %68, align 4, !tbaa !11
  %381 = mul nsw i32 %379, %380
  %382 = load i32, ptr %68, align 4, !tbaa !11
  %383 = mul nsw i32 %381, %382
  %384 = load i32, ptr %63, align 4, !tbaa !11
  %385 = load i32, ptr %68, align 4, !tbaa !11
  %386 = mul nsw i32 %384, %385
  %387 = add nsw i32 %383, %386
  %388 = load i32, ptr %64, align 4, !tbaa !11
  %389 = add nsw i32 %387, %388
  %390 = sext i32 %389 to i64
  %391 = getelementptr inbounds i32, ptr %378, i64 %390
  %392 = load i32, ptr %391, align 4, !tbaa !11
  store i32 %392, ptr %58, align 4, !tbaa !11
  %393 = load i32, ptr %61, align 4, !tbaa !11
  store i32 %393, ptr %59, align 4, !tbaa !11
  br label %394

394:                                              ; preds = %455, %354
  %395 = load i32, ptr %59, align 4, !tbaa !11
  %396 = icmp sge i32 %395, 0
  br i1 %396, label %397, label %458

397:                                              ; preds = %394
  store double 0.000000e+00, ptr %46, align 8, !tbaa !9
  store i32 0, ptr %60, align 4, !tbaa !11
  br label %398

398:                                              ; preds = %429, %397
  %399 = load i32, ptr %60, align 4, !tbaa !11
  %400 = load i32, ptr %59, align 4, !tbaa !11
  %401 = mul nsw i32 2, %400
  %402 = add nsw i32 %401, 1
  %403 = icmp slt i32 %399, %402
  br i1 %403, label %404, label %432

404:                                              ; preds = %398
  %405 = load ptr, ptr %65, align 8, !tbaa !5
  %406 = load i32, ptr %59, align 4, !tbaa !11
  %407 = load i32, ptr %59, align 4, !tbaa !11
  %408 = mul nsw i32 %406, %407
  %409 = load i32, ptr %60, align 4, !tbaa !11
  %410 = add nsw i32 %408, %409
  %411 = sext i32 %410 to i64
  %412 = getelementptr inbounds double, ptr %405, i64 %411
  %413 = load double, ptr %412, align 8, !tbaa !9
  %414 = load ptr, ptr %66, align 8, !tbaa !5
  %415 = load i32, ptr %58, align 4, !tbaa !11
  %416 = load i32, ptr %69, align 4, !tbaa !11
  %417 = mul nsw i32 %415, %416
  %418 = load i32, ptr %59, align 4, !tbaa !11
  %419 = load i32, ptr %59, align 4, !tbaa !11
  %420 = mul nsw i32 %418, %419
  %421 = load i32, ptr %60, align 4, !tbaa !11
  %422 = add nsw i32 %420, %421
  %423 = add nsw i32 %417, %422
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds double, ptr %414, i64 %424
  %426 = load double, ptr %425, align 8, !tbaa !9
  %427 = load double, ptr %46, align 8, !tbaa !9
  %428 = call double @llvm.fmuladd.f64(double %413, double %426, double %427)
  store double %428, ptr %46, align 8, !tbaa !9
  br label %429

429:                                              ; preds = %404
  %430 = load i32, ptr %60, align 4, !tbaa !11
  %431 = add nsw i32 %430, 1
  store i32 %431, ptr %60, align 4, !tbaa !11
  br label %398, !llvm.loop !33

432:                                              ; preds = %398
  %433 = load double, ptr %46, align 8, !tbaa !9
  %434 = getelementptr inbounds %struct.doubleArray, ptr %70, i32 0, i32 1
  %435 = load ptr, ptr %434, align 8, !tbaa !32
  %436 = load i32, ptr %61, align 4, !tbaa !11
  %437 = load i32, ptr %71, align 4, !tbaa !11
  %438 = mul nsw i32 %436, %437
  %439 = load i32, ptr %59, align 4, !tbaa !11
  %440 = add nsw i32 %438, %439
  %441 = sext i32 %440 to i64
  %442 = getelementptr inbounds double, ptr %435, i64 %441
  %443 = load double, ptr %442, align 8, !tbaa !9
  %444 = getelementptr inbounds %struct.doubleArray, ptr %18, i32 0, i32 1
  %445 = load ptr, ptr %444, align 8, !tbaa !32
  %446 = load i32, ptr %56, align 4, !tbaa !11
  %447 = load i32, ptr %72, align 4, !tbaa !11
  %448 = mul nsw i32 %446, %447
  %449 = load i32, ptr %57, align 4, !tbaa !11
  %450 = add nsw i32 %448, %449
  %451 = sext i32 %450 to i64
  %452 = getelementptr inbounds double, ptr %445, i64 %451
  %453 = load double, ptr %452, align 8, !tbaa !9
  %454 = call double @llvm.fmuladd.f64(double %433, double %443, double %453)
  store double %454, ptr %452, align 8, !tbaa !9
  br label %455

455:                                              ; preds = %432
  %456 = load i32, ptr %59, align 4, !tbaa !11
  %457 = sub nsw i32 %456, 2
  store i32 %457, ptr %59, align 4, !tbaa !11
  br label %394, !llvm.loop !34

458:                                              ; preds = %394
  br label %459

459:                                              ; preds = %458
  %460 = load i32, ptr %55, align 4, !tbaa !11
  %461 = add nsw i32 %460, 1
  store i32 %461, ptr %55, align 4, !tbaa !11
  br label %346, !llvm.loop !35

462:                                              ; preds = %346
  br label %463

463:                                              ; preds = %462
  %464 = load i32, ptr %54, align 4, !tbaa !11
  %465 = add nsw i32 %464, 1
  store i32 %465, ptr %54, align 4, !tbaa !11
  br label %336, !llvm.loop !36

466:                                              ; preds = %336
  br label %467

467:                                              ; preds = %466
  %468 = load i32, ptr %53, align 4, !tbaa !11
  %469 = add nsw i32 %468, 1
  store i32 %469, ptr %53, align 4, !tbaa !11
  br label %328, !llvm.loop !37

470:                                              ; preds = %328
  br label %471

471:                                              ; preds = %470
  %472 = load i32, ptr %52, align 4, !tbaa !11
  %473 = add nsw i32 %472, 1
  store i32 %473, ptr %52, align 4, !tbaa !11
  br label %304, !llvm.loop !38

474:                                              ; preds = %304
  br label %475

475:                                              ; preds = %474
  %476 = load i32, ptr %51, align 4, !tbaa !11
  %477 = add nsw i32 %476, 1
  store i32 %477, ptr %51, align 4, !tbaa !11
  br label %297, !llvm.loop !39

478:                                              ; preds = %297
  br label %479

479:                                              ; preds = %478
  %480 = load i32, ptr %50, align 4, !tbaa !11
  %481 = add nsw i32 %480, 1
  store i32 %481, ptr %50, align 4, !tbaa !11
  br label %292, !llvm.loop !40

482:                                              ; preds = %292
  %483 = getelementptr inbounds { ptr, ptr }, ptr %70, i32 0, i32 0
  %484 = load ptr, ptr %483, align 8
  %485 = getelementptr inbounds { ptr, ptr }, ptr %70, i32 0, i32 1
  %486 = load ptr, ptr %485, align 8
  call void @doubleArray_free(ptr %484, ptr %486)
  %487 = load ptr, ptr %65, align 8, !tbaa !5
  call void @free(ptr noundef %487) #6
  br label %488

488:                                              ; preds = %482
  %489 = load i32, ptr %41, align 4, !tbaa !11
  %490 = add nsw i32 %489, 1
  store i32 %490, ptr %41, align 4, !tbaa !11
  br label %189, !llvm.loop !41

491:                                              ; preds = %189
  br label %492

492:                                              ; preds = %491
  %493 = load i32, ptr %40, align 4, !tbaa !11
  %494 = add nsw i32 %493, 1
  store i32 %494, ptr %40, align 4, !tbaa !11
  br label %162, !llvm.loop !42

495:                                              ; preds = %162
  store i32 1, ptr %74, align 4
  br label %496

496:                                              ; preds = %495, %280
  call void @llvm.lifetime.end.p0(i64 4, ptr %72) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %71) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr %70) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %69) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %68) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %63) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %62) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr %48) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr %47) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #6
  %497 = load { ptr, ptr }, ptr %18, align 8
  ret { ptr, ptr } %497
}

declare void @sphericalCoordinates(ptr noundef, ptr noundef) #4

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

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

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 nosync nounwind speculatable willreturn memory(none) }
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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { 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 = !{!"double", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !12, i64 40, !6, i64 48, !6, i64 56, !12, i64 64, !6, i64 72, !12, i64 80, !6, i64 88, !12, i64 96, !12, i64 100, !6, i64 104, !12, i64 112, !6, i64 120, !10, i64 128, !10, i64 136, !10, i64 144}
!15 = !{!14, !6, i64 16}
!16 = !{!14, !6, i64 8}
!17 = !{!14, !6, i64 72}
!18 = !{!14, !6, i64 56}
!19 = !{!14, !12, i64 64}
!20 = !{!14, !12, i64 80}
!21 = !{!22, !6, i64 0}
!22 = !{!"", !6, i64 0, !6, i64 8}
!23 = !{!24, !24, i64 0}
!24 = !{!"long", !7, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = distinct !{!27, !26}
!28 = distinct !{!28, !26}
!29 = !{!14, !6, i64 24}
!30 = !{!14, !6, i64 32}
!31 = !{i64 0, i64 8, !5, i64 8, i64 8, !5}
!32 = !{!22, !6, i64 8}
!33 = distinct !{!33, !26}
!34 = distinct !{!34, !26}
!35 = distinct !{!35, !26}
!36 = distinct !{!36, !26}
!37 = distinct !{!37, !26}
!38 = distinct !{!38, !26}
!39 = distinct !{!39, !26}
!40 = distinct !{!40, !26}
!41 = distinct !{!41, !26}
!42 = distinct !{!42, !26}


; 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.doubleArray = type { ptr, ptr }

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

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

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

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

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

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

declare void @doubleArray_free(ptr, ptr) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcChi(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr nocapture noundef readonly %3, double noundef %4, ptr nocapture noundef readonly %5, double noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9, i32 noundef %10, ptr nocapture noundef readnone byval(%struct.doubleArray) align 8 %11, i32 noundef %12, i32 noundef %13, i32 noundef %14, i32 noundef %15, ptr nocapture noundef readnone byval(%struct.doubleArray) align 8 %16) local_unnamed_addr #2 {
  %18 = alloca [3 x double], align 16
  %19 = alloca [3 x double], align 16
  %20 = load ptr, ptr %0, align 8, !tbaa !5
  %21 = sext i32 %8 to i64
  %22 = getelementptr inbounds i32, ptr %20, i64 %21
  %23 = load i32, ptr %22, align 4, !tbaa !12
  %24 = getelementptr inbounds i8, ptr %0, i64 16
  %25 = load ptr, ptr %24, align 8, !tbaa !13
  %26 = sext i32 %9 to i64
  %27 = getelementptr inbounds double, ptr %25, i64 %26
  %28 = getelementptr inbounds i8, ptr %0, i64 8
  %29 = load ptr, ptr %28, align 8, !tbaa !14
  %30 = getelementptr inbounds double, ptr %29, i64 %26
  %31 = sext i32 %13 to i64
  %32 = getelementptr inbounds i32, ptr %20, i64 %31
  %33 = load i32, ptr %32, align 4, !tbaa !12
  %34 = sext i32 %14 to i64
  %35 = getelementptr inbounds double, ptr %25, i64 %34
  %36 = getelementptr inbounds double, ptr %29, i64 %34
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %18) #6
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %19) #6
  %37 = add nsw i32 %12, %7
  %38 = getelementptr inbounds i8, ptr %0, i64 72
  %39 = load ptr, ptr %38, align 8, !tbaa !15
  %40 = getelementptr inbounds i8, ptr %0, i64 56
  %41 = load ptr, ptr %40, align 8, !tbaa !16
  %42 = getelementptr inbounds i8, ptr %0, i64 64
  %43 = load i32, ptr %42, align 8, !tbaa !17
  %44 = getelementptr inbounds i8, ptr %0, i64 80
  %45 = load i32, ptr %44, align 8, !tbaa !18
  %46 = add nsw i32 %45, 1
  %47 = mul nsw i32 %46, %46
  %48 = add i32 %7, 1
  %49 = add nsw i32 %7, 2
  %50 = mul nsw i32 %48, %49
  %51 = add nsw i32 %7, 3
  %52 = mul nsw i32 %50, %51
  %53 = sdiv i32 %52, 6
  %54 = add i32 %12, 1
  %55 = add nsw i32 %12, 2
  %56 = mul nsw i32 %54, %55
  %57 = add nsw i32 %12, 3
  %58 = mul nsw i32 %56, %57
  %59 = sdiv i32 %58, 6
  %60 = tail call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %53, i32 noundef %59) #6
  %61 = extractvalue { ptr, ptr } %60, 0
  %62 = extractvalue { ptr, ptr } %60, 1
  %63 = getelementptr inbounds i8, ptr %61, i64 16
  %64 = load i64, ptr %63, align 8, !tbaa !19
  %65 = trunc i64 %64 to i32
  %66 = icmp sgt i32 %23, 0
  br i1 %66, label %.lr.ph232, label %.loopexit

.lr.ph232:                                        ; preds = %17
  %67 = icmp sgt i32 %10, 0
  %68 = icmp sgt i32 %33, 0
  %69 = icmp sgt i32 %15, 0
  %70 = getelementptr inbounds i8, ptr %19, i64 8
  %71 = getelementptr inbounds i8, ptr %19, i64 16
  %72 = getelementptr inbounds i8, ptr %0, i64 24
  %73 = getelementptr inbounds i8, ptr %0, i64 32
  %74 = sitofp i32 %10 to double
  %75 = sitofp i32 %15 to double
  br i1 %68, label %.lr.ph232.split.us.preheader, label %.loopexit

.lr.ph232.split.us.preheader:                     ; preds = %.lr.ph232
  %76 = sext i32 %12 to i64
  %77 = sext i32 %7 to i64
  %wide.trip.count307 = zext nneg i32 %23 to i64
  %wide.trip.count302 = zext nneg i32 %33 to i64
  %78 = getelementptr inbounds i8, ptr %3, i64 16
  %79 = getelementptr inbounds i8, ptr %5, i64 16
  %80 = getelementptr inbounds i8, ptr %18, i64 16
  %wide.trip.count297 = zext i32 %48 to i64
  %wide.trip.count282 = zext i32 %54 to i64
  %xtraiter = and i32 %10, 7
  %81 = icmp ult i32 %10, 8
  %unroll_iter = and i32 %10, 2147483640
  %lcmp.mod.not = icmp eq i32 %xtraiter, 0
  %xtraiter330 = and i32 %15, 7
  %82 = icmp ult i32 %15, 8
  %unroll_iter334 = and i32 %15, 2147483640
  %lcmp.mod332.not = icmp eq i32 %xtraiter330, 0
  %83 = or i32 %7, %12
  %brmerge.not = icmp sgt i32 %83, -1
  br label %.lr.ph232.split.us

.lr.ph232.split.us:                               ; preds = %.lr.ph232.split.us.preheader, %._crit_edge229.us
  %indvars.iv304 = phi i64 [ 0, %.lr.ph232.split.us.preheader ], [ %indvars.iv.next305, %._crit_edge229.us ]
  %84 = getelementptr inbounds double, ptr %27, i64 %indvars.iv304
  %85 = load double, ptr %84, align 8, !tbaa !21
  %86 = getelementptr inbounds double, ptr %30, i64 %indvars.iv304
  %87 = load double, ptr %86, align 8, !tbaa !21
  br i1 %67, label %.lr.ph.us.preheader, label %.preheader189.us

.lr.ph.us.preheader:                              ; preds = %.lr.ph232.split.us
  br i1 %81, label %.preheader189.us.loopexit.unr-lcssa, label %.lr.ph.us

88:                                               ; preds = %.preheader189.us, %._crit_edge226.us
  %indvars.iv299 = phi i64 [ 0, %.preheader189.us ], [ %indvars.iv.next300, %._crit_edge226.us ]
  %89 = getelementptr inbounds double, ptr %35, i64 %indvars.iv299
  %90 = load double, ptr %89, align 8, !tbaa !21
  %91 = getelementptr inbounds double, ptr %36, i64 %indvars.iv299
  %92 = load double, ptr %91, align 8, !tbaa !21
  br i1 %69, label %.lr.ph194.us.preheader, label %.preheader188.us

.lr.ph194.us.preheader:                           ; preds = %88
  br i1 %82, label %.preheader188.us.loopexit.unr-lcssa, label %.lr.ph194.us

93:                                               ; preds = %.preheader188.us
  br i1 %brmerge.not, label %.preheader187.us234.preheader, label %._crit_edge226.us

.lr.ph213.us:                                     ; preds = %.lr.ph217.us, %._crit_edge214.us
  %indvars.iv284 = phi i64 [ 0, %.lr.ph217.us ], [ %indvars.iv.next285, %._crit_edge214.us ]
  %indvars.iv259 = phi i32 [ %indvars.iv257, %.lr.ph217.us ], [ %indvars.iv.next260, %._crit_edge214.us ]
  %gep320 = getelementptr i32, ptr %invariant.gep319, i64 %indvars.iv284
  %94 = load i32, ptr %gep320, align 4, !tbaa !12
  %95 = mul nsw i32 %94, %65
  br label %96

96:                                               ; preds = %._crit_edge209.us, %.lr.ph213.us
  %indvars.iv279 = phi i64 [ %indvars.iv.next280, %._crit_edge209.us ], [ 0, %.lr.ph213.us ]
  %indvars.iv276 = phi i32 [ %indvars.iv.next277, %._crit_edge209.us ], [ %54, %.lr.ph213.us ]
  %indvars.iv261 = phi i32 [ %indvars.iv.next262, %._crit_edge209.us ], [ %indvars.iv259, %.lr.ph213.us ]
  %97 = add nuw nsw i64 %indvars.iv279, %indvars.iv294
  %98 = sub nsw i64 %76, %indvars.iv279
  %.not183205.us = icmp slt i64 %98, 0
  br i1 %.not183205.us, label %._crit_edge209.us, label %.lr.ph208.us

99:                                               ; preds = %.lr.ph208.us, %._crit_edge204.us
  %indvars.iv273 = phi i64 [ 0, %.lr.ph208.us ], [ %indvars.iv.next274, %._crit_edge204.us ]
  %indvars.iv263 = phi i32 [ %indvars.iv261, %.lr.ph208.us ], [ %indvars.iv.next264, %._crit_edge204.us ]
  %100 = sub nsw i64 %98, %indvars.iv273
  %.not184200.us = icmp slt i64 %100, 0
  br i1 %.not184200.us, label %._crit_edge204.us, label %.lr.ph203.us

._crit_edge.us:                                   ; preds = %.epilog-lcssa
  %indvars.iv.next271 = add nuw nsw i64 %indvars.iv270, 1
  %.not184.us.not = icmp slt i64 %indvars.iv270, %100
  %indvars.iv.next266 = add i32 %indvars.iv265, 1
  br i1 %.not184.us.not, label %.preheader.lr.ph.us, label %._crit_edge204.us, !llvm.loop !22

101:                                              ; preds = %101, %.preheader.us.new
  %indvars.iv = phi i64 [ 0, %.preheader.us.new ], [ %indvars.iv.next.3, %101 ]
  %.0163198.us = phi double [ 0.000000e+00, %.preheader.us.new ], [ %121, %101 ]
  %niter341 = phi i64 [ 0, %.preheader.us.new ], [ %niter341.next.3, %101 ]
  %102 = add nuw nsw i64 %indvars.iv, %151
  %103 = getelementptr inbounds double, ptr %172, i64 %102
  %104 = load double, ptr %103, align 8, !tbaa !21
  %gep = getelementptr double, ptr %invariant.gep, i64 %102
  %105 = load double, ptr %gep, align 8, !tbaa !21
  %106 = call double @llvm.fmuladd.f64(double %104, double %105, double %.0163198.us)
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %107 = add nuw nsw i64 %indvars.iv.next, %151
  %108 = getelementptr inbounds double, ptr %172, i64 %107
  %109 = load double, ptr %108, align 8, !tbaa !21
  %gep.1 = getelementptr double, ptr %invariant.gep, i64 %107
  %110 = load double, ptr %gep.1, align 8, !tbaa !21
  %111 = call double @llvm.fmuladd.f64(double %109, double %110, double %106)
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %112 = add nuw nsw i64 %indvars.iv.next.1, %151
  %113 = getelementptr inbounds double, ptr %172, i64 %112
  %114 = load double, ptr %113, align 8, !tbaa !21
  %gep.2 = getelementptr double, ptr %invariant.gep, i64 %112
  %115 = load double, ptr %gep.2, align 8, !tbaa !21
  %116 = call double @llvm.fmuladd.f64(double %114, double %115, double %111)
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %117 = add nuw nsw i64 %indvars.iv.next.2, %151
  %118 = getelementptr inbounds double, ptr %172, i64 %117
  %119 = load double, ptr %118, align 8, !tbaa !21
  %gep.3 = getelementptr double, ptr %invariant.gep, i64 %117
  %120 = load double, ptr %gep.3, align 8, !tbaa !21
  %121 = call double @llvm.fmuladd.f64(double %119, double %120, double %116)
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %niter341.next.3 = add i64 %niter341, 4
  %niter341.ncmp.3.not = icmp eq i64 %niter341.next.3, %unroll_iter340
  br i1 %niter341.ncmp.3.not, label %.epil.preheader, label %101, !llvm.loop !24

.epil.preheader:                                  ; preds = %.preheader.us, %101
  %indvars.iv.unr = phi i64 [ 0, %.preheader.us ], [ %indvars.iv.next.3, %101 ]
  %.0163198.us.unr = phi double [ 0.000000e+00, %.preheader.us ], [ %121, %101 ]
  br label %122

122:                                              ; preds = %122, %.epil.preheader
  %indvars.iv.epil = phi i64 [ %indvars.iv.unr, %.epil.preheader ], [ %indvars.iv.next.epil, %122 ]
  %.0163198.us.epil = phi double [ %.0163198.us.unr, %.epil.preheader ], [ %127, %122 ]
  %epil.iter337 = phi i64 [ 0, %.epil.preheader ], [ %epil.iter337.next, %122 ]
  %123 = add nuw nsw i64 %indvars.iv.epil, %151
  %124 = getelementptr inbounds double, ptr %172, i64 %123
  %125 = load double, ptr %124, align 8, !tbaa !21
  %gep.epil = getelementptr double, ptr %invariant.gep, i64 %123
  %126 = load double, ptr %gep.epil, align 8, !tbaa !21
  %127 = call double @llvm.fmuladd.f64(double %125, double %126, double %.0163198.us.epil)
  %indvars.iv.next.epil = add nuw nsw i64 %indvars.iv.epil, 1
  %epil.iter337.next = add i64 %epil.iter337, 1
  %epil.iter337.cmp.not = icmp eq i64 %epil.iter337, %194
  br i1 %epil.iter337.cmp.not, label %.epilog-lcssa, label %122, !llvm.loop !25

.epilog-lcssa:                                    ; preds = %122
  %gep314 = getelementptr double, ptr %invariant.gep313, i64 %indvars.iv267
  %128 = load double, ptr %gep314, align 8, !tbaa !21
  %129 = call double @llvm.fmuladd.f64(double %127, double %128, double %147)
  store double %129, ptr %192, align 8, !tbaa !21
  %indvars.iv.next268 = add nsw i64 %indvars.iv267, -2
  %130 = icmp sgt i64 %indvars.iv267, 1
  %indvar.next = add i64 %indvar, 1
  br i1 %130, label %.preheader.us, label %._crit_edge.us, !llvm.loop !27

._crit_edge204.us:                                ; preds = %._crit_edge.us, %99
  %indvars.iv.next274 = add nuw nsw i64 %indvars.iv273, 1
  %indvars.iv.next264 = add i32 %indvars.iv263, 1
  %exitcond278.not = icmp eq i64 %indvars.iv.next274, %wide.trip.count
  br i1 %exitcond278.not, label %._crit_edge209.us, label %99, !llvm.loop !28

._crit_edge209.us:                                ; preds = %._crit_edge204.us, %96
  %indvars.iv.next280 = add nuw nsw i64 %indvars.iv279, 1
  %indvars.iv.next262 = add i32 %indvars.iv261, 1
  %indvars.iv.next277 = add i32 %indvars.iv276, -1
  %exitcond283.not = icmp eq i64 %indvars.iv.next280, %wide.trip.count282
  br i1 %exitcond283.not, label %._crit_edge214.us, label %96, !llvm.loop !29

._crit_edge218.split.us:                          ; preds = %._crit_edge214.us, %.preheader186.us
  %indvars.iv.next288 = add nuw nsw i64 %indvars.iv287, 1
  %indvars.iv.next258 = add i32 %indvars.iv257, 1
  %exitcond293.not = icmp eq i64 %indvars.iv.next288, %wide.trip.count292
  br i1 %exitcond293.not, label %._crit_edge222.split.us, label %.preheader186.us, !llvm.loop !30

._crit_edge222.split.us:                          ; preds = %._crit_edge218.split.us, %.preheader187.us234
  %indvars.iv.next295 = add nuw nsw i64 %indvars.iv294, 1
  %indvars.iv.next291 = add i32 %indvars.iv290, -1
  %exitcond298.not = icmp eq i64 %indvars.iv.next295, %wide.trip.count297
  br i1 %exitcond298.not, label %._crit_edge226.us, label %.preheader187.us234, !llvm.loop !31

._crit_edge226.us:                                ; preds = %._crit_edge222.split.us, %93
  call void @doubleArray_free(ptr %175, ptr nonnull %176) #6
  call void @free(ptr noundef %172) #6
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %exitcond303.not = icmp eq i64 %indvars.iv.next300, %wide.trip.count302
  br i1 %exitcond303.not, label %._crit_edge229.us, label %88, !llvm.loop !32

.lr.ph194.us:                                     ; preds = %.lr.ph194.us.preheader, %.lr.ph194.us
  %.0162193.us = phi double [ %138, %.lr.ph194.us ], [ %92, %.lr.ph194.us.preheader ]
  %niter335 = phi i32 [ %niter335.next.7, %.lr.ph194.us ], [ 0, %.lr.ph194.us.preheader ]
  %131 = fmul double %90, %.0162193.us
  %132 = fmul double %90, %131
  %133 = fmul double %90, %132
  %134 = fmul double %90, %133
  %135 = fmul double %90, %134
  %136 = fmul double %90, %135
  %137 = fmul double %90, %136
  %138 = fmul double %90, %137
  %niter335.next.7 = add i32 %niter335, 8
  %niter335.ncmp.7 = icmp eq i32 %niter335.next.7, %unroll_iter334
  br i1 %niter335.ncmp.7, label %.preheader188.us.loopexit.unr-lcssa, label %.lr.ph194.us, !llvm.loop !33

.lr.ph.us:                                        ; preds = %.lr.ph.us.preheader, %.lr.ph.us
  %.0161191.us = phi double [ %146, %.lr.ph.us ], [ %87, %.lr.ph.us.preheader ]
  %niter = phi i32 [ %niter.next.7, %.lr.ph.us ], [ 0, %.lr.ph.us.preheader ]
  %139 = fmul double %85, %.0161191.us
  %140 = fmul double %85, %139
  %141 = fmul double %85, %140
  %142 = fmul double %85, %141
  %143 = fmul double %85, %142
  %144 = fmul double %85, %143
  %145 = fmul double %85, %144
  %146 = fmul double %85, %145
  %niter.next.7 = add i32 %niter, 8
  %niter.ncmp.7 = icmp eq i32 %niter.next.7, %unroll_iter
  br i1 %niter.ncmp.7, label %.preheader189.us.loopexit.unr-lcssa, label %.lr.ph.us, !llvm.loop !34

.preheader.us:                                    ; preds = %.preheader.lr.ph.us, %.epilog-lcssa
  %indvar = phi i64 [ 0, %.preheader.lr.ph.us ], [ %indvar.next, %.epilog-lcssa ]
  %indvars.iv267 = phi i64 [ %183, %.preheader.lr.ph.us ], [ %indvars.iv.next268, %.epilog-lcssa ]
  %147 = phi double [ %.promoted.us, %.preheader.lr.ph.us ], [ %129, %.epilog-lcssa ]
  %148 = shl i64 %indvar, 2
  %149 = sub i64 %182, %148
  %150 = and i64 %149, 4294967294
  %151 = mul nuw nsw i64 %indvars.iv267, %indvars.iv267
  %152 = icmp ult i64 %150, 3
  br i1 %152, label %.epil.preheader, label %.preheader.us.new

.preheader.us.new:                                ; preds = %.preheader.us
  %unroll_iter340 = and i64 %149, 4294967292
  br label %101

.preheader186.us:                                 ; preds = %.preheader186.lr.ph.us237, %._crit_edge218.split.us
  %indvars.iv287 = phi i64 [ 0, %.preheader186.lr.ph.us237 ], [ %indvars.iv.next288, %._crit_edge218.split.us ]
  %indvars.iv257 = phi i32 [ %213, %.preheader186.lr.ph.us237 ], [ %indvars.iv.next258, %._crit_edge218.split.us ]
  %153 = sub nsw i64 %154, %indvars.iv287
  %.not181215.us = icmp slt i64 %153, 0
  br i1 %.not181215.us, label %._crit_edge218.split.us, label %.lr.ph217.us

.preheader187.us234:                              ; preds = %.preheader187.us234.preheader, %._crit_edge222.split.us
  %indvars.iv294 = phi i64 [ 0, %.preheader187.us234.preheader ], [ %indvars.iv.next295, %._crit_edge222.split.us ]
  %indvars.iv290 = phi i32 [ %48, %.preheader187.us234.preheader ], [ %indvars.iv.next291, %._crit_edge222.split.us ]
  %154 = sub nsw i64 %77, %indvars.iv294
  %.not180219.us236 = icmp slt i64 %154, 0
  br i1 %.not180219.us236, label %._crit_edge222.split.us, label %.preheader186.lr.ph.us237

.preheader188.us.loopexit.unr-lcssa:              ; preds = %.lr.ph194.us, %.lr.ph194.us.preheader
  %.lcssa325.ph = phi double [ poison, %.lr.ph194.us.preheader ], [ %138, %.lr.ph194.us ]
  %.0162193.us.unr = phi double [ %92, %.lr.ph194.us.preheader ], [ %138, %.lr.ph194.us ]
  br i1 %lcmp.mod332.not, label %.preheader188.us, label %.lr.ph194.us.epil

.lr.ph194.us.epil:                                ; preds = %.preheader188.us.loopexit.unr-lcssa, %.lr.ph194.us.epil
  %.0162193.us.epil = phi double [ %155, %.lr.ph194.us.epil ], [ %.0162193.us.unr, %.preheader188.us.loopexit.unr-lcssa ]
  %epil.iter331 = phi i32 [ %epil.iter331.next, %.lr.ph194.us.epil ], [ 0, %.preheader188.us.loopexit.unr-lcssa ]
  %155 = fmul double %90, %.0162193.us.epil
  %epil.iter331.next = add i32 %epil.iter331, 1
  %epil.iter331.cmp.not = icmp eq i32 %epil.iter331.next, %xtraiter330
  br i1 %epil.iter331.cmp.not, label %.preheader188.us, label %.lr.ph194.us.epil, !llvm.loop !35

.preheader188.us:                                 ; preds = %.preheader188.us.loopexit.unr-lcssa, %.lr.ph194.us.epil, %88
  %.0162.lcssa.us = phi double [ %92, %88 ], [ %.lcssa325.ph, %.preheader188.us.loopexit.unr-lcssa ], [ %155, %.lr.ph194.us.epil ]
  %156 = load <2 x double>, ptr %3, align 8, !tbaa !21
  %157 = load <2 x double>, ptr %5, align 8, !tbaa !21
  %158 = insertelement <2 x double> poison, double %90, i64 0
  %159 = shufflevector <2 x double> %158, <2 x double> poison, <2 x i32> zeroinitializer
  %160 = fmul <2 x double> %159, %157
  %161 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %180, <2 x double> %156, <2 x double> %160)
  %162 = fmul <2 x double> %161, <double 2.000000e+00, double 2.000000e+00>
  store <2 x double> %162, ptr %18, align 16, !tbaa !21
  %163 = load double, ptr %78, align 8, !tbaa !21
  %164 = load double, ptr %79, align 8, !tbaa !21
  %165 = fmul double %90, %164
  %166 = call double @llvm.fmuladd.f64(double %85, double %163, double %165)
  %167 = fmul double %166, 2.000000e+00
  store double %167, ptr %80, align 16, !tbaa !21
  call void @sphericalCoordinates(ptr noundef nonnull %18, ptr noundef nonnull %19) #6
  %168 = load double, ptr %70, align 8, !tbaa !21
  %169 = load double, ptr %71, align 16, !tbaa !21
  %170 = load ptr, ptr %72, align 8, !tbaa !36
  %171 = load ptr, ptr %73, align 8, !tbaa !37
  %172 = call ptr @realSphericalHarmonics(i32 noundef %37, double noundef %168, double noundef %169, ptr noundef %170, ptr noundef %171) #6
  %173 = load double, ptr %19, align 16, !tbaa !21
  %174 = call { ptr, ptr } @calcQ(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, double noundef %173, i32 noundef %37, double noundef %4, double noundef %.0161.lcssa.us, double noundef %85, double noundef %74, double noundef %6, double noundef %.0162.lcssa.us, double noundef %90, double noundef %75)
  %175 = extractvalue { ptr, ptr } %174, 0
  %176 = extractvalue { ptr, ptr } %174, 1
  %177 = icmp eq ptr %176, null
  br i1 %177, label %.split.us, label %93

.preheader189.us.loopexit.unr-lcssa:              ; preds = %.lr.ph.us, %.lr.ph.us.preheader
  %.lcssa.ph = phi double [ poison, %.lr.ph.us.preheader ], [ %146, %.lr.ph.us ]
  %.0161191.us.unr = phi double [ %87, %.lr.ph.us.preheader ], [ %146, %.lr.ph.us ]
  br i1 %lcmp.mod.not, label %.preheader189.us, label %.lr.ph.us.epil

.lr.ph.us.epil:                                   ; preds = %.preheader189.us.loopexit.unr-lcssa, %.lr.ph.us.epil
  %.0161191.us.epil = phi double [ %178, %.lr.ph.us.epil ], [ %.0161191.us.unr, %.preheader189.us.loopexit.unr-lcssa ]
  %epil.iter = phi i32 [ %epil.iter.next, %.lr.ph.us.epil ], [ 0, %.preheader189.us.loopexit.unr-lcssa ]
  %178 = fmul double %85, %.0161191.us.epil
  %epil.iter.next = add i32 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i32 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %.preheader189.us, label %.lr.ph.us.epil, !llvm.loop !38

.preheader189.us:                                 ; preds = %.preheader189.us.loopexit.unr-lcssa, %.lr.ph.us.epil, %.lr.ph232.split.us
  %.0161.lcssa.us = phi double [ %87, %.lr.ph232.split.us ], [ %.lcssa.ph, %.preheader189.us.loopexit.unr-lcssa ], [ %178, %.lr.ph.us.epil ]
  %179 = insertelement <2 x double> poison, double %85, i64 0
  %180 = shufflevector <2 x double> %179, <2 x double> poison, <2 x i32> zeroinitializer
  br label %88

.preheader.lr.ph.us:                              ; preds = %._crit_edge.us, %.lr.ph203.us
  %indvars.iv270 = phi i64 [ 0, %.lr.ph203.us ], [ %indvars.iv.next271, %._crit_edge.us ]
  %indvars.iv265 = phi i32 [ %indvars.iv263, %.lr.ph203.us ], [ %indvars.iv.next266, %._crit_edge.us ]
  %181 = sext i32 %indvars.iv265 to i64
  %182 = shl nsw i64 %181, 1
  %183 = sext i32 %indvars.iv265 to i64
  %184 = add nuw nsw i64 %indvars.iv270, %indvars.iv284
  %185 = add nuw nsw i64 %199, %184
  %gep316 = getelementptr i32, ptr %invariant.gep315, i64 %184
  %186 = load i32, ptr %gep316, align 4, !tbaa !12
  %gep318 = getelementptr i32, ptr %invariant.gep317, i64 %indvars.iv270
  %187 = load i32, ptr %gep318, align 4, !tbaa !12
  %188 = mul nsw i32 %47, %186
  %189 = mul nsw i64 %185, %218
  %190 = add nsw i32 %187, %95
  %191 = sext i32 %190 to i64
  %192 = getelementptr inbounds double, ptr %62, i64 %191
  %.promoted.us = load double, ptr %192, align 8, !tbaa !21
  %193 = sext i32 %188 to i64
  %invariant.gep = getelementptr double, ptr %39, i64 %193
  %invariant.gep313 = getelementptr double, ptr %176, i64 %189
  %194 = and i64 %182, 2
  br label %.preheader.us

.lr.ph203.us:                                     ; preds = %99
  %195 = add nuw nsw i64 %indvars.iv273, %indvars.iv287
  %196 = trunc nuw nsw i64 %indvars.iv273 to i32
  %197 = add i32 %206, %196
  %198 = mul i32 %197, %43
  %199 = add nuw nsw i64 %195, %97
  %200 = trunc nsw i64 %195 to i32
  %201 = add i32 %208, %200
  %202 = mul i32 %201, %43
  %203 = sext i32 %198 to i64
  %204 = sext i32 %202 to i64
  %invariant.gep315 = getelementptr i32, ptr %41, i64 %204
  %invariant.gep317 = getelementptr i32, ptr %41, i64 %203
  br label %.preheader.lr.ph.us

.lr.ph208.us:                                     ; preds = %96
  %wide.trip.count = zext i32 %indvars.iv276 to i64
  %205 = trunc i64 %indvars.iv279 to i32
  %206 = mul i32 %43, %205
  %207 = trunc i64 %97 to i32
  %208 = mul i32 %43, %207
  br label %99

._crit_edge214.us:                                ; preds = %._crit_edge209.us
  %indvars.iv.next285 = add nuw nsw i64 %indvars.iv284, 1
  %.not181.us.not = icmp slt i64 %indvars.iv284, %153
  %indvars.iv.next260 = add i32 %indvars.iv259, 1
  br i1 %.not181.us.not, label %.lr.ph213.us, label %._crit_edge218.split.us, !llvm.loop !39

.lr.ph217.us:                                     ; preds = %.preheader186.us
  %209 = trunc nuw nsw i64 %indvars.iv287 to i32
  %210 = add i32 %215, %209
  %211 = mul i32 %210, %43
  %212 = sext i32 %211 to i64
  %invariant.gep319 = getelementptr i32, ptr %41, i64 %212
  br label %.lr.ph213.us

.preheader186.lr.ph.us237:                        ; preds = %.preheader187.us234
  %wide.trip.count292 = zext i32 %indvars.iv290 to i64
  %213 = trunc i64 %indvars.iv294 to i32
  %214 = trunc i64 %indvars.iv294 to i32
  %215 = mul i32 %43, %214
  br label %.preheader186.us

.preheader187.us234.preheader:                    ; preds = %93
  %216 = getelementptr inbounds i8, ptr %175, i64 16
  %217 = load i64, ptr %216, align 8, !tbaa !19
  %sext = shl i64 %217, 32
  %218 = ashr exact i64 %sext, 32
  br label %.preheader187.us234

._crit_edge229.us:                                ; preds = %._crit_edge226.us
  %indvars.iv.next305 = add nuw nsw i64 %indvars.iv304, 1
  %exitcond308.not = icmp eq i64 %indvars.iv.next305, %wide.trip.count307
  br i1 %exitcond308.not, label %.loopexit, label %.lr.ph232.split.us, !llvm.loop !40

.split.us:                                        ; preds = %.preheader188.us
  call void @doubleArray_free(ptr %61, ptr %62) #6
  call void @free(ptr noundef %172) #6
  br label %.loopexit

.loopexit:                                        ; preds = %._crit_edge229.us, %.lr.ph232, %17, %.split.us
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %19) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %18) #6
  ret { ptr, ptr } %60
}

declare void @sphericalCoordinates(ptr noundef, ptr noundef) local_unnamed_addr #4

declare ptr @realSphericalHarmonics(i32 noundef, double noundef, double noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x double> @llvm.fmuladd.v2f64(<2 x double>, <2 x double>, <2 x double>) #5

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { 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 0}
!6 = !{!"", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !7, i64 48, !7, i64 56, !10, i64 64, !7, i64 72, !10, i64 80, !7, i64 88, !10, i64 96, !10, i64 100, !7, i64 104, !10, i64 112, !7, i64 120, !11, i64 128, !11, i64 136, !11, i64 144}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!10, !10, i64 0}
!13 = !{!6, !7, i64 16}
!14 = !{!6, !7, i64 8}
!15 = !{!6, !7, i64 72}
!16 = !{!6, !7, i64 56}
!17 = !{!6, !10, i64 64}
!18 = !{!6, !10, i64 80}
!19 = !{!20, !20, i64 0}
!20 = !{!"long", !8, i64 0}
!21 = !{!11, !11, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = distinct !{!24, !23}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.unroll.disable"}
!27 = distinct !{!27, !23}
!28 = distinct !{!28, !23}
!29 = distinct !{!29, !23}
!30 = distinct !{!30, !23}
!31 = distinct !{!31, !23}
!32 = distinct !{!32, !23}
!33 = distinct !{!33, !23}
!34 = distinct !{!34, !23}
!35 = distinct !{!35, !26}
!36 = !{!6, !7, i64 24}
!37 = !{!6, !7, i64 32}
!38 = distinct !{!38, !26}
!39 = distinct !{!39, !23}
!40 = distinct !{!40, !23}


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