; LLVM IR from CLASS-SZ/class_sz :: class-sz/source (primordial)

; 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.primordial = type { double, i32, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, double, double, double, double, double, double, double, double, double, double, double, i32, double, i32, ptr, double, double, double, double, double, double, double, double, double, double, i32, ptr, ptr, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, double, double, double, double, i16, [2048 x i8] }

@.str = external hidden unnamed_addr constant [7 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [13 x i8], align 1
@__func__.primordial_spectrum_at_k = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [195 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local i32 @primordial_spectrum_at_k(ptr noundef %0, i32 noundef %1, i32 noundef %2, double noundef %3, ptr noundef %4) #0 {
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca double, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca double, align 8
  %16 = alloca i32, align 4
  %17 = alloca [2048 x i8], align 16
  %18 = alloca [2048 x i8], align 16
  %19 = alloca i32, align 4
  %20 = alloca [2048 x i8], align 16
  %21 = alloca [2048 x i8], align 16
  %22 = alloca [2048 x i8], align 16
  %23 = alloca [2048 x i8], align 16
  store ptr %0, ptr %7, align 8, !tbaa !5
  store i32 %1, ptr %8, align 4, !tbaa !9
  store i32 %2, ptr %9, align 4, !tbaa !9
  store double %3, ptr %10, align 8, !tbaa !11
  store ptr %4, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  %24 = load i32, ptr %9, align 4, !tbaa !9
  %25 = icmp eq i32 %24, 0
  br i1 %25, label %26, label %41

26:                                               ; preds = %5
  %27 = load double, ptr %10, align 8, !tbaa !11
  %28 = fcmp ole double %27, 0.000000e+00
  br i1 %28, label %29, label %38

29:                                               ; preds = %26
  call void @llvm.lifetime.start.p0(i64 2048, ptr %17) #4
  %30 = getelementptr inbounds [2048 x i8], ptr %17, i64 0, i64 0
  %31 = load double, ptr %10, align 8, !tbaa !11
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %30, ptr noundef @.str, double noundef %31)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %18) #4
  %32 = getelementptr inbounds [2048 x i8], ptr %18, i64 0, i64 0
  %33 = getelementptr inbounds [2048 x i8], ptr %17, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %32, ptr noundef @.str.1, ptr noundef @.str.2, ptr noundef %33)
  %34 = load ptr, ptr %7, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.primordial, ptr %34, i32 0, i32 106
  %36 = getelementptr inbounds [2048 x i8], ptr %35, i64 0, i64 0
  %37 = getelementptr inbounds [2048 x i8], ptr %18, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %36, ptr noundef @.str.3, ptr noundef @__func__.primordial_spectrum_at_k, i32 noundef 73, ptr noundef %37)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr %17) #4
  store i32 1, ptr %6, align 4
  store i32 1, ptr %19, align 4
  br label %780

38:                                               ; preds = %26
  %39 = load double, ptr %10, align 8, !tbaa !11
  %40 = call double @log(double noundef %39) #4
  store double %40, ptr %15, align 8, !tbaa !11
  br label %43

41:                                               ; preds = %5
  %42 = load double, ptr %10, align 8, !tbaa !11
  store double %42, ptr %15, align 8, !tbaa !11
  br label %43

43:                                               ; preds = %41, %38
  %44 = load double, ptr %15, align 8, !tbaa !11
  %45 = load ptr, ptr %7, align 8, !tbaa !5
  %46 = getelementptr inbounds %struct.primordial, ptr %45, i32 0, i32 81
  %47 = load ptr, ptr %46, align 8, !tbaa !13
  %48 = load ptr, ptr %7, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.primordial, ptr %48, i32 0, i32 80
  %50 = load i32, ptr %49, align 8, !tbaa !16
  %51 = sub nsw i32 %50, 1
  %52 = sext i32 %51 to i64
  %53 = getelementptr inbounds double, ptr %47, i64 %52
  %54 = load double, ptr %53, align 8, !tbaa !11
  %55 = fcmp ogt double %44, %54
  br i1 %55, label %64, label %56

56:                                               ; preds = %43
  %57 = load double, ptr %15, align 8, !tbaa !11
  %58 = load ptr, ptr %7, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.primordial, ptr %58, i32 0, i32 81
  %60 = load ptr, ptr %59, align 8, !tbaa !13
  %61 = getelementptr inbounds double, ptr %60, i64 0
  %62 = load double, ptr %61, align 8, !tbaa !11
  %63 = fcmp olt double %57, %62
  br i1 %63, label %64, label %466

64:                                               ; preds = %56, %43
  %65 = load ptr, ptr %7, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.primordial, ptr %65, i32 0, i32 1
  %67 = load i32, ptr %66, align 8, !tbaa !17
  %68 = icmp ne i32 %67, 0
  br i1 %68, label %69, label %96

69:                                               ; preds = %64
  call void @llvm.lifetime.start.p0(i64 2048, ptr %20) #4
  %70 = getelementptr inbounds [2048 x i8], ptr %20, i64 0, i64 0
  %71 = load double, ptr %15, align 8, !tbaa !11
  %72 = call double @exp(double noundef %71) #4
  %73 = load ptr, ptr %7, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.primordial, ptr %73, i32 0, i32 81
  %75 = load ptr, ptr %74, align 8, !tbaa !13
  %76 = getelementptr inbounds double, ptr %75, i64 0
  %77 = load double, ptr %76, align 8, !tbaa !11
  %78 = call double @exp(double noundef %77) #4
  %79 = load ptr, ptr %7, align 8, !tbaa !5
  %80 = getelementptr inbounds %struct.primordial, ptr %79, i32 0, i32 81
  %81 = load ptr, ptr %80, align 8, !tbaa !13
  %82 = load ptr, ptr %7, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.primordial, ptr %82, i32 0, i32 80
  %84 = load i32, ptr %83, align 8, !tbaa !16
  %85 = sub nsw i32 %84, 1
  %86 = sext i32 %85 to i64
  %87 = getelementptr inbounds double, ptr %81, i64 %86
  %88 = load double, ptr %87, align 8, !tbaa !11
  %89 = call double @exp(double noundef %88) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %70, ptr noundef @.str.4, double noundef %72, double noundef %78, double noundef %89)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %21) #4
  %90 = getelementptr inbounds [2048 x i8], ptr %21, i64 0, i64 0
  %91 = getelementptr inbounds [2048 x i8], ptr %20, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %90, ptr noundef @.str.1, ptr noundef @.str.5, ptr noundef %91)
  %92 = load ptr, ptr %7, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.primordial, ptr %92, i32 0, i32 106
  %94 = getelementptr inbounds [2048 x i8], ptr %93, i64 0, i64 0
  %95 = getelementptr inbounds [2048 x i8], ptr %21, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %94, ptr noundef @.str.3, ptr noundef @__func__.primordial_spectrum_at_k, i32 noundef 87, ptr noundef %95)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr %20) #4
  store i32 1, ptr %6, align 4
  store i32 1, ptr %19, align 4
  br label %780

96:                                               ; preds = %64
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %97

97:                                               ; preds = %206, %96
  %98 = load i32, ptr %12, align 4, !tbaa !9
  %99 = load ptr, ptr %7, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.primordial, ptr %99, i32 0, i32 78
  %101 = load ptr, ptr %100, align 8, !tbaa !18
  %102 = load i32, ptr %8, align 4, !tbaa !9
  %103 = sext i32 %102 to i64
  %104 = getelementptr inbounds i32, ptr %101, i64 %103
  %105 = load i32, ptr %104, align 4, !tbaa !9
  %106 = icmp slt i32 %98, %105
  br i1 %106, label %107, label %209

107:                                              ; preds = %97
  %108 = load i32, ptr %12, align 4, !tbaa !9
  store i32 %108, ptr %13, align 4, !tbaa !9
  br label %109

109:                                              ; preds = %202, %107
  %110 = load i32, ptr %13, align 4, !tbaa !9
  %111 = load ptr, ptr %7, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.primordial, ptr %111, i32 0, i32 78
  %113 = load ptr, ptr %112, align 8, !tbaa !18
  %114 = load i32, ptr %8, align 4, !tbaa !9
  %115 = sext i32 %114 to i64
  %116 = getelementptr inbounds i32, ptr %113, i64 %115
  %117 = load i32, ptr %116, align 4, !tbaa !9
  %118 = icmp slt i32 %110, %117
  br i1 %118, label %119, label %205

119:                                              ; preds = %109
  %120 = load i32, ptr %12, align 4, !tbaa !9
  %121 = load i32, ptr %13, align 4, !tbaa !9
  %122 = icmp sle i32 %120, %121
  br i1 %122, label %123, label %141

123:                                              ; preds = %119
  %124 = load i32, ptr %13, align 4, !tbaa !9
  %125 = load ptr, ptr %7, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.primordial, ptr %125, i32 0, i32 78
  %127 = load ptr, ptr %126, align 8, !tbaa !18
  %128 = load i32, ptr %8, align 4, !tbaa !9
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds i32, ptr %127, i64 %129
  %131 = load i32, ptr %130, align 4, !tbaa !9
  %132 = load i32, ptr %12, align 4, !tbaa !9
  %133 = mul nsw i32 %131, %132
  %134 = add nsw i32 %124, %133
  %135 = load i32, ptr %12, align 4, !tbaa !9
  %136 = load i32, ptr %12, align 4, !tbaa !9
  %137 = add nsw i32 %136, 1
  %138 = mul nsw i32 %135, %137
  %139 = sdiv i32 %138, 2
  %140 = sub nsw i32 %134, %139
  br label %159

141:                                              ; preds = %119
  %142 = load i32, ptr %12, align 4, !tbaa !9
  %143 = load ptr, ptr %7, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.primordial, ptr %143, i32 0, i32 78
  %145 = load ptr, ptr %144, align 8, !tbaa !18
  %146 = load i32, ptr %8, align 4, !tbaa !9
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds i32, ptr %145, i64 %147
  %149 = load i32, ptr %148, align 4, !tbaa !9
  %150 = load i32, ptr %13, align 4, !tbaa !9
  %151 = mul nsw i32 %149, %150
  %152 = add nsw i32 %142, %151
  %153 = load i32, ptr %13, align 4, !tbaa !9
  %154 = load i32, ptr %13, align 4, !tbaa !9
  %155 = add nsw i32 %154, 1
  %156 = mul nsw i32 %153, %155
  %157 = sdiv i32 %156, 2
  %158 = sub nsw i32 %152, %157
  br label %159

159:                                              ; preds = %141, %123
  %160 = phi i32 [ %140, %123 ], [ %158, %141 ]
  store i32 %160, ptr %14, align 4, !tbaa !9
  %161 = load ptr, ptr %7, align 8, !tbaa !5
  %162 = getelementptr inbounds %struct.primordial, ptr %161, i32 0, i32 84
  %163 = load ptr, ptr %162, align 8, !tbaa !19
  %164 = load i32, ptr %8, align 4, !tbaa !9
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds ptr, ptr %163, i64 %165
  %167 = load ptr, ptr %166, align 8, !tbaa !5
  %168 = load i32, ptr %14, align 4, !tbaa !9
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds i16, ptr %167, i64 %169
  %171 = load i16, ptr %170, align 2, !tbaa !20
  %172 = sext i16 %171 to i32
  %173 = icmp eq i32 %172, 1
  br i1 %173, label %174, label %196

174:                                              ; preds = %159
  %175 = load ptr, ptr %7, align 8, !tbaa !5
  %176 = load i32, ptr %8, align 4, !tbaa !9
  %177 = load i32, ptr %14, align 4, !tbaa !9
  %178 = load double, ptr %15, align 8, !tbaa !11
  %179 = call double @exp(double noundef %178) #4
  %180 = load ptr, ptr %11, align 8, !tbaa !5
  %181 = load i32, ptr %14, align 4, !tbaa !9
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds double, ptr %180, i64 %182
  %184 = call i32 @primordial_analytic_spectrum(ptr noundef %175, i32 noundef %176, i32 noundef %177, double noundef %179, ptr noundef %183)
  %185 = icmp eq i32 %184, 1
  br i1 %185, label %186, label %195

186:                                              ; preds = %174
  call void @llvm.lifetime.start.p0(i64 2048, ptr %22) #4
  %187 = getelementptr inbounds [2048 x i8], ptr %22, i64 0, i64 0
  %188 = load ptr, ptr %7, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.primordial, ptr %188, i32 0, i32 106
  %190 = getelementptr inbounds [2048 x i8], ptr %189, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %187, ptr noundef @.str.6, ptr noundef @.str.7, ptr noundef %190)
  %191 = load ptr, ptr %7, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.primordial, ptr %191, i32 0, i32 106
  %193 = getelementptr inbounds [2048 x i8], ptr %192, i64 0, i64 0
  %194 = getelementptr inbounds [2048 x i8], ptr %22, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %193, ptr noundef @.str.3, ptr noundef @__func__.primordial_spectrum_at_k, i32 noundef 104, ptr noundef %194)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %22) #4
  store i32 1, ptr %6, align 4
  store i32 1, ptr %19, align 4
  br label %780

195:                                              ; preds = %174
  br label %201

196:                                              ; preds = %159
  %197 = load ptr, ptr %11, align 8, !tbaa !5
  %198 = load i32, ptr %14, align 4, !tbaa !9
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds double, ptr %197, i64 %199
  store double 0.000000e+00, ptr %200, align 8, !tbaa !11
  br label %201

201:                                              ; preds = %196, %195
  br label %202

202:                                              ; preds = %201
  %203 = load i32, ptr %13, align 4, !tbaa !9
  %204 = add nsw i32 %203, 1
  store i32 %204, ptr %13, align 4, !tbaa !9
  br label %109, !llvm.loop !21

205:                                              ; preds = %109
  br label %206

206:                                              ; preds = %205
  %207 = load i32, ptr %12, align 4, !tbaa !9
  %208 = add nsw i32 %207, 1
  store i32 %208, ptr %12, align 4, !tbaa !9
  br label %97, !llvm.loop !23

209:                                              ; preds = %97
  %210 = load i32, ptr %9, align 4, !tbaa !9
  %211 = icmp eq i32 %210, 1
  br i1 %211, label %212, label %465

212:                                              ; preds = %209
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %213

213:                                              ; preds = %275, %212
  %214 = load i32, ptr %12, align 4, !tbaa !9
  %215 = load ptr, ptr %7, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.primordial, ptr %215, i32 0, i32 78
  %217 = load ptr, ptr %216, align 8, !tbaa !18
  %218 = load i32, ptr %8, align 4, !tbaa !9
  %219 = sext i32 %218 to i64
  %220 = getelementptr inbounds i32, ptr %217, i64 %219
  %221 = load i32, ptr %220, align 4, !tbaa !9
  %222 = icmp slt i32 %214, %221
  br i1 %222, label %223, label %278

223:                                              ; preds = %213
  %224 = load i32, ptr %12, align 4, !tbaa !9
  %225 = load i32, ptr %12, align 4, !tbaa !9
  %226 = icmp sle i32 %224, %225
  br i1 %226, label %227, label %245

227:                                              ; preds = %223
  %228 = load i32, ptr %12, align 4, !tbaa !9
  %229 = load ptr, ptr %7, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.primordial, ptr %229, i32 0, i32 78
  %231 = load ptr, ptr %230, align 8, !tbaa !18
  %232 = load i32, ptr %8, align 4, !tbaa !9
  %233 = sext i32 %232 to i64
  %234 = getelementptr inbounds i32, ptr %231, i64 %233
  %235 = load i32, ptr %234, align 4, !tbaa !9
  %236 = load i32, ptr %12, align 4, !tbaa !9
  %237 = mul nsw i32 %235, %236
  %238 = add nsw i32 %228, %237
  %239 = load i32, ptr %12, align 4, !tbaa !9
  %240 = load i32, ptr %12, align 4, !tbaa !9
  %241 = add nsw i32 %240, 1
  %242 = mul nsw i32 %239, %241
  %243 = sdiv i32 %242, 2
  %244 = sub nsw i32 %238, %243
  br label %263

245:                                              ; preds = %223
  %246 = load i32, ptr %12, align 4, !tbaa !9
  %247 = load ptr, ptr %7, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.primordial, ptr %247, i32 0, i32 78
  %249 = load ptr, ptr %248, align 8, !tbaa !18
  %250 = load i32, ptr %8, align 4, !tbaa !9
  %251 = sext i32 %250 to i64
  %252 = getelementptr inbounds i32, ptr %249, i64 %251
  %253 = load i32, ptr %252, align 4, !tbaa !9
  %254 = load i32, ptr %12, align 4, !tbaa !9
  %255 = mul nsw i32 %253, %254
  %256 = add nsw i32 %246, %255
  %257 = load i32, ptr %12, align 4, !tbaa !9
  %258 = load i32, ptr %12, align 4, !tbaa !9
  %259 = add nsw i32 %258, 1
  %260 = mul nsw i32 %257, %259
  %261 = sdiv i32 %260, 2
  %262 = sub nsw i32 %256, %261
  br label %263

263:                                              ; preds = %245, %227
  %264 = phi i32 [ %244, %227 ], [ %262, %245 ]
  store i32 %264, ptr %14, align 4, !tbaa !9
  %265 = load ptr, ptr %11, align 8, !tbaa !5
  %266 = load i32, ptr %14, align 4, !tbaa !9
  %267 = sext i32 %266 to i64
  %268 = getelementptr inbounds double, ptr %265, i64 %267
  %269 = load double, ptr %268, align 8, !tbaa !11
  %270 = call double @log(double noundef %269) #4
  %271 = load ptr, ptr %11, align 8, !tbaa !5
  %272 = load i32, ptr %14, align 4, !tbaa !9
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds double, ptr %271, i64 %273
  store double %270, ptr %274, align 8, !tbaa !11
  br label %275

275:                                              ; preds = %263
  %276 = load i32, ptr %12, align 4, !tbaa !9
  %277 = add nsw i32 %276, 1
  store i32 %277, ptr %12, align 4, !tbaa !9
  br label %213, !llvm.loop !24

278:                                              ; preds = %213
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %279

279:                                              ; preds = %461, %278
  %280 = load i32, ptr %12, align 4, !tbaa !9
  %281 = load ptr, ptr %7, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.primordial, ptr %281, i32 0, i32 78
  %283 = load ptr, ptr %282, align 8, !tbaa !18
  %284 = load i32, ptr %8, align 4, !tbaa !9
  %285 = sext i32 %284 to i64
  %286 = getelementptr inbounds i32, ptr %283, i64 %285
  %287 = load i32, ptr %286, align 4, !tbaa !9
  %288 = icmp slt i32 %280, %287
  br i1 %288, label %289, label %464

289:                                              ; preds = %279
  %290 = load i32, ptr %12, align 4, !tbaa !9
  %291 = add nsw i32 %290, 1
  store i32 %291, ptr %13, align 4, !tbaa !9
  br label %292

292:                                              ; preds = %457, %289
  %293 = load i32, ptr %13, align 4, !tbaa !9
  %294 = load ptr, ptr %7, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.primordial, ptr %294, i32 0, i32 78
  %296 = load ptr, ptr %295, align 8, !tbaa !18
  %297 = load i32, ptr %8, align 4, !tbaa !9
  %298 = sext i32 %297 to i64
  %299 = getelementptr inbounds i32, ptr %296, i64 %298
  %300 = load i32, ptr %299, align 4, !tbaa !9
  %301 = icmp slt i32 %293, %300
  br i1 %301, label %302, label %460

302:                                              ; preds = %292
  %303 = load i32, ptr %12, align 4, !tbaa !9
  %304 = load i32, ptr %13, align 4, !tbaa !9
  %305 = icmp sle i32 %303, %304
  br i1 %305, label %306, label %324

306:                                              ; preds = %302
  %307 = load i32, ptr %13, align 4, !tbaa !9
  %308 = load ptr, ptr %7, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.primordial, ptr %308, i32 0, i32 78
  %310 = load ptr, ptr %309, align 8, !tbaa !18
  %311 = load i32, ptr %8, align 4, !tbaa !9
  %312 = sext i32 %311 to i64
  %313 = getelementptr inbounds i32, ptr %310, i64 %312
  %314 = load i32, ptr %313, align 4, !tbaa !9
  %315 = load i32, ptr %12, align 4, !tbaa !9
  %316 = mul nsw i32 %314, %315
  %317 = add nsw i32 %307, %316
  %318 = load i32, ptr %12, align 4, !tbaa !9
  %319 = load i32, ptr %12, align 4, !tbaa !9
  %320 = add nsw i32 %319, 1
  %321 = mul nsw i32 %318, %320
  %322 = sdiv i32 %321, 2
  %323 = sub nsw i32 %317, %322
  br label %342

324:                                              ; preds = %302
  %325 = load i32, ptr %12, align 4, !tbaa !9
  %326 = load ptr, ptr %7, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct.primordial, ptr %326, i32 0, i32 78
  %328 = load ptr, ptr %327, align 8, !tbaa !18
  %329 = load i32, ptr %8, align 4, !tbaa !9
  %330 = sext i32 %329 to i64
  %331 = getelementptr inbounds i32, ptr %328, i64 %330
  %332 = load i32, ptr %331, align 4, !tbaa !9
  %333 = load i32, ptr %13, align 4, !tbaa !9
  %334 = mul nsw i32 %332, %333
  %335 = add nsw i32 %325, %334
  %336 = load i32, ptr %13, align 4, !tbaa !9
  %337 = load i32, ptr %13, align 4, !tbaa !9
  %338 = add nsw i32 %337, 1
  %339 = mul nsw i32 %336, %338
  %340 = sdiv i32 %339, 2
  %341 = sub nsw i32 %335, %340
  br label %342

342:                                              ; preds = %324, %306
  %343 = phi i32 [ %323, %306 ], [ %341, %324 ]
  store i32 %343, ptr %14, align 4, !tbaa !9
  %344 = load ptr, ptr %7, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.primordial, ptr %344, i32 0, i32 84
  %346 = load ptr, ptr %345, align 8, !tbaa !19
  %347 = load i32, ptr %8, align 4, !tbaa !9
  %348 = sext i32 %347 to i64
  %349 = getelementptr inbounds ptr, ptr %346, i64 %348
  %350 = load ptr, ptr %349, align 8, !tbaa !5
  %351 = load i32, ptr %14, align 4, !tbaa !9
  %352 = sext i32 %351 to i64
  %353 = getelementptr inbounds i16, ptr %350, i64 %352
  %354 = load i16, ptr %353, align 2, !tbaa !20
  %355 = sext i16 %354 to i32
  %356 = icmp eq i32 %355, 1
  br i1 %356, label %357, label %456

357:                                              ; preds = %342
  %358 = load ptr, ptr %11, align 8, !tbaa !5
  %359 = load i32, ptr %12, align 4, !tbaa !9
  %360 = load i32, ptr %12, align 4, !tbaa !9
  %361 = icmp sle i32 %359, %360
  br i1 %361, label %362, label %380

362:                                              ; preds = %357
  %363 = load i32, ptr %12, align 4, !tbaa !9
  %364 = load ptr, ptr %7, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.primordial, ptr %364, i32 0, i32 78
  %366 = load ptr, ptr %365, align 8, !tbaa !18
  %367 = load i32, ptr %8, align 4, !tbaa !9
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds i32, ptr %366, i64 %368
  %370 = load i32, ptr %369, align 4, !tbaa !9
  %371 = load i32, ptr %12, align 4, !tbaa !9
  %372 = mul nsw i32 %370, %371
  %373 = add nsw i32 %363, %372
  %374 = load i32, ptr %12, align 4, !tbaa !9
  %375 = load i32, ptr %12, align 4, !tbaa !9
  %376 = add nsw i32 %375, 1
  %377 = mul nsw i32 %374, %376
  %378 = sdiv i32 %377, 2
  %379 = sub nsw i32 %373, %378
  br label %398

380:                                              ; preds = %357
  %381 = load i32, ptr %12, align 4, !tbaa !9
  %382 = load ptr, ptr %7, align 8, !tbaa !5
  %383 = getelementptr inbounds %struct.primordial, ptr %382, i32 0, i32 78
  %384 = load ptr, ptr %383, align 8, !tbaa !18
  %385 = load i32, ptr %8, align 4, !tbaa !9
  %386 = sext i32 %385 to i64
  %387 = getelementptr inbounds i32, ptr %384, i64 %386
  %388 = load i32, ptr %387, align 4, !tbaa !9
  %389 = load i32, ptr %12, align 4, !tbaa !9
  %390 = mul nsw i32 %388, %389
  %391 = add nsw i32 %381, %390
  %392 = load i32, ptr %12, align 4, !tbaa !9
  %393 = load i32, ptr %12, align 4, !tbaa !9
  %394 = add nsw i32 %393, 1
  %395 = mul nsw i32 %392, %394
  %396 = sdiv i32 %395, 2
  %397 = sub nsw i32 %391, %396
  br label %398

398:                                              ; preds = %380, %362
  %399 = phi i32 [ %379, %362 ], [ %397, %380 ]
  %400 = sext i32 %399 to i64
  %401 = getelementptr inbounds double, ptr %358, i64 %400
  %402 = load double, ptr %401, align 8, !tbaa !11
  %403 = load ptr, ptr %11, align 8, !tbaa !5
  %404 = load i32, ptr %13, align 4, !tbaa !9
  %405 = load i32, ptr %13, align 4, !tbaa !9
  %406 = icmp sle i32 %404, %405
  br i1 %406, label %407, label %425

407:                                              ; preds = %398
  %408 = load i32, ptr %13, align 4, !tbaa !9
  %409 = load ptr, ptr %7, align 8, !tbaa !5
  %410 = getelementptr inbounds %struct.primordial, ptr %409, i32 0, i32 78
  %411 = load ptr, ptr %410, align 8, !tbaa !18
  %412 = load i32, ptr %8, align 4, !tbaa !9
  %413 = sext i32 %412 to i64
  %414 = getelementptr inbounds i32, ptr %411, i64 %413
  %415 = load i32, ptr %414, align 4, !tbaa !9
  %416 = load i32, ptr %13, align 4, !tbaa !9
  %417 = mul nsw i32 %415, %416
  %418 = add nsw i32 %408, %417
  %419 = load i32, ptr %13, align 4, !tbaa !9
  %420 = load i32, ptr %13, align 4, !tbaa !9
  %421 = add nsw i32 %420, 1
  %422 = mul nsw i32 %419, %421
  %423 = sdiv i32 %422, 2
  %424 = sub nsw i32 %418, %423
  br label %443

425:                                              ; preds = %398
  %426 = load i32, ptr %13, align 4, !tbaa !9
  %427 = load ptr, ptr %7, align 8, !tbaa !5
  %428 = getelementptr inbounds %struct.primordial, ptr %427, i32 0, i32 78
  %429 = load ptr, ptr %428, align 8, !tbaa !18
  %430 = load i32, ptr %8, align 4, !tbaa !9
  %431 = sext i32 %430 to i64
  %432 = getelementptr inbounds i32, ptr %429, i64 %431
  %433 = load i32, ptr %432, align 4, !tbaa !9
  %434 = load i32, ptr %13, align 4, !tbaa !9
  %435 = mul nsw i32 %433, %434
  %436 = add nsw i32 %426, %435
  %437 = load i32, ptr %13, align 4, !tbaa !9
  %438 = load i32, ptr %13, align 4, !tbaa !9
  %439 = add nsw i32 %438, 1
  %440 = mul nsw i32 %437, %439
  %441 = sdiv i32 %440, 2
  %442 = sub nsw i32 %436, %441
  br label %443

443:                                              ; preds = %425, %407
  %444 = phi i32 [ %424, %407 ], [ %442, %425 ]
  %445 = sext i32 %444 to i64
  %446 = getelementptr inbounds double, ptr %403, i64 %445
  %447 = load double, ptr %446, align 8, !tbaa !11
  %448 = fmul double %402, %447
  %449 = call double @sqrt(double noundef %448) #4
  %450 = load ptr, ptr %11, align 8, !tbaa !5
  %451 = load i32, ptr %14, align 4, !tbaa !9
  %452 = sext i32 %451 to i64
  %453 = getelementptr inbounds double, ptr %450, i64 %452
  %454 = load double, ptr %453, align 8, !tbaa !11
  %455 = fdiv double %454, %449
  store double %455, ptr %453, align 8, !tbaa !11
  br label %456

456:                                              ; preds = %443, %342
  br label %457

457:                                              ; preds = %456
  %458 = load i32, ptr %13, align 4, !tbaa !9
  %459 = add nsw i32 %458, 1
  store i32 %459, ptr %13, align 4, !tbaa !9
  br label %292, !llvm.loop !25

460:                                              ; preds = %292
  br label %461

461:                                              ; preds = %460
  %462 = load i32, ptr %12, align 4, !tbaa !9
  %463 = add nsw i32 %462, 1
  store i32 %463, ptr %12, align 4, !tbaa !9
  br label %279, !llvm.loop !26

464:                                              ; preds = %279
  br label %465

465:                                              ; preds = %464, %209
  br label %779

466:                                              ; preds = %56
  %467 = load ptr, ptr %7, align 8, !tbaa !5
  %468 = getelementptr inbounds %struct.primordial, ptr %467, i32 0, i32 81
  %469 = load ptr, ptr %468, align 8, !tbaa !13
  %470 = load ptr, ptr %7, align 8, !tbaa !5
  %471 = getelementptr inbounds %struct.primordial, ptr %470, i32 0, i32 80
  %472 = load i32, ptr %471, align 8, !tbaa !16
  %473 = load ptr, ptr %7, align 8, !tbaa !5
  %474 = getelementptr inbounds %struct.primordial, ptr %473, i32 0, i32 82
  %475 = load ptr, ptr %474, align 8, !tbaa !27
  %476 = load i32, ptr %8, align 4, !tbaa !9
  %477 = sext i32 %476 to i64
  %478 = getelementptr inbounds ptr, ptr %475, i64 %477
  %479 = load ptr, ptr %478, align 8, !tbaa !5
  %480 = load ptr, ptr %7, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.primordial, ptr %480, i32 0, i32 83
  %482 = load ptr, ptr %481, align 8, !tbaa !28
  %483 = load i32, ptr %8, align 4, !tbaa !9
  %484 = sext i32 %483 to i64
  %485 = getelementptr inbounds ptr, ptr %482, i64 %484
  %486 = load ptr, ptr %485, align 8, !tbaa !5
  %487 = load ptr, ptr %7, align 8, !tbaa !5
  %488 = getelementptr inbounds %struct.primordial, ptr %487, i32 0, i32 79
  %489 = load ptr, ptr %488, align 8, !tbaa !29
  %490 = load i32, ptr %8, align 4, !tbaa !9
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds i32, ptr %489, i64 %491
  %493 = load i32, ptr %492, align 4, !tbaa !9
  %494 = load double, ptr %15, align 8, !tbaa !11
  %495 = load ptr, ptr %11, align 8, !tbaa !5
  %496 = load ptr, ptr %7, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.primordial, ptr %496, i32 0, i32 79
  %498 = load ptr, ptr %497, align 8, !tbaa !29
  %499 = load i32, ptr %8, align 4, !tbaa !9
  %500 = sext i32 %499 to i64
  %501 = getelementptr inbounds i32, ptr %498, i64 %500
  %502 = load i32, ptr %501, align 4, !tbaa !9
  %503 = load ptr, ptr %7, align 8, !tbaa !5
  %504 = getelementptr inbounds %struct.primordial, ptr %503, i32 0, i32 106
  %505 = getelementptr inbounds [2048 x i8], ptr %504, i64 0, i64 0
  %506 = call i32 @array_interpolate_spline(ptr noundef %469, i32 noundef %472, ptr noundef %479, ptr noundef %486, i32 noundef %493, double noundef %494, ptr noundef %16, ptr noundef %495, i32 noundef %502, ptr noundef %505)
  %507 = icmp eq i32 %506, 1
  br i1 %507, label %508, label %517

508:                                              ; preds = %466
  call void @llvm.lifetime.start.p0(i64 2048, ptr %23) #4
  %509 = getelementptr inbounds [2048 x i8], ptr %23, i64 0, i64 0
  %510 = load ptr, ptr %7, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.primordial, ptr %510, i32 0, i32 106
  %512 = getelementptr inbounds [2048 x i8], ptr %511, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %509, ptr noundef @.str.6, ptr noundef @.str.8, ptr noundef %512)
  %513 = load ptr, ptr %7, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.primordial, ptr %513, i32 0, i32 106
  %515 = getelementptr inbounds [2048 x i8], ptr %514, i64 0, i64 0
  %516 = getelementptr inbounds [2048 x i8], ptr %23, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %515, ptr noundef @.str.3, ptr noundef @__func__.primordial_spectrum_at_k, i32 noundef 148, ptr noundef %516)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %23) #4
  store i32 1, ptr %6, align 4
  store i32 1, ptr %19, align 4
  br label %780

517:                                              ; preds = %466
  %518 = load i32, ptr %9, align 4, !tbaa !9
  %519 = icmp eq i32 %518, 0
  br i1 %519, label %520, label %778

520:                                              ; preds = %517
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %521

521:                                              ; preds = %583, %520
  %522 = load i32, ptr %12, align 4, !tbaa !9
  %523 = load ptr, ptr %7, align 8, !tbaa !5
  %524 = getelementptr inbounds %struct.primordial, ptr %523, i32 0, i32 78
  %525 = load ptr, ptr %524, align 8, !tbaa !18
  %526 = load i32, ptr %8, align 4, !tbaa !9
  %527 = sext i32 %526 to i64
  %528 = getelementptr inbounds i32, ptr %525, i64 %527
  %529 = load i32, ptr %528, align 4, !tbaa !9
  %530 = icmp slt i32 %522, %529
  br i1 %530, label %531, label %586

531:                                              ; preds = %521
  %532 = load i32, ptr %12, align 4, !tbaa !9
  %533 = load i32, ptr %12, align 4, !tbaa !9
  %534 = icmp sle i32 %532, %533
  br i1 %534, label %535, label %553

535:                                              ; preds = %531
  %536 = load i32, ptr %12, align 4, !tbaa !9
  %537 = load ptr, ptr %7, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.primordial, ptr %537, i32 0, i32 78
  %539 = load ptr, ptr %538, align 8, !tbaa !18
  %540 = load i32, ptr %8, align 4, !tbaa !9
  %541 = sext i32 %540 to i64
  %542 = getelementptr inbounds i32, ptr %539, i64 %541
  %543 = load i32, ptr %542, align 4, !tbaa !9
  %544 = load i32, ptr %12, align 4, !tbaa !9
  %545 = mul nsw i32 %543, %544
  %546 = add nsw i32 %536, %545
  %547 = load i32, ptr %12, align 4, !tbaa !9
  %548 = load i32, ptr %12, align 4, !tbaa !9
  %549 = add nsw i32 %548, 1
  %550 = mul nsw i32 %547, %549
  %551 = sdiv i32 %550, 2
  %552 = sub nsw i32 %546, %551
  br label %571

553:                                              ; preds = %531
  %554 = load i32, ptr %12, align 4, !tbaa !9
  %555 = load ptr, ptr %7, align 8, !tbaa !5
  %556 = getelementptr inbounds %struct.primordial, ptr %555, i32 0, i32 78
  %557 = load ptr, ptr %556, align 8, !tbaa !18
  %558 = load i32, ptr %8, align 4, !tbaa !9
  %559 = sext i32 %558 to i64
  %560 = getelementptr inbounds i32, ptr %557, i64 %559
  %561 = load i32, ptr %560, align 4, !tbaa !9
  %562 = load i32, ptr %12, align 4, !tbaa !9
  %563 = mul nsw i32 %561, %562
  %564 = add nsw i32 %554, %563
  %565 = load i32, ptr %12, align 4, !tbaa !9
  %566 = load i32, ptr %12, align 4, !tbaa !9
  %567 = add nsw i32 %566, 1
  %568 = mul nsw i32 %565, %567
  %569 = sdiv i32 %568, 2
  %570 = sub nsw i32 %564, %569
  br label %571

571:                                              ; preds = %553, %535
  %572 = phi i32 [ %552, %535 ], [ %570, %553 ]
  store i32 %572, ptr %14, align 4, !tbaa !9
  %573 = load ptr, ptr %11, align 8, !tbaa !5
  %574 = load i32, ptr %14, align 4, !tbaa !9
  %575 = sext i32 %574 to i64
  %576 = getelementptr inbounds double, ptr %573, i64 %575
  %577 = load double, ptr %576, align 8, !tbaa !11
  %578 = call double @exp(double noundef %577) #4
  %579 = load ptr, ptr %11, align 8, !tbaa !5
  %580 = load i32, ptr %14, align 4, !tbaa !9
  %581 = sext i32 %580 to i64
  %582 = getelementptr inbounds double, ptr %579, i64 %581
  store double %578, ptr %582, align 8, !tbaa !11
  br label %583

583:                                              ; preds = %571
  %584 = load i32, ptr %12, align 4, !tbaa !9
  %585 = add nsw i32 %584, 1
  store i32 %585, ptr %12, align 4, !tbaa !9
  br label %521, !llvm.loop !30

586:                                              ; preds = %521
  store i32 0, ptr %12, align 4, !tbaa !9
  br label %587

587:                                              ; preds = %774, %586
  %588 = load i32, ptr %12, align 4, !tbaa !9
  %589 = load ptr, ptr %7, align 8, !tbaa !5
  %590 = getelementptr inbounds %struct.primordial, ptr %589, i32 0, i32 78
  %591 = load ptr, ptr %590, align 8, !tbaa !18
  %592 = load i32, ptr %8, align 4, !tbaa !9
  %593 = sext i32 %592 to i64
  %594 = getelementptr inbounds i32, ptr %591, i64 %593
  %595 = load i32, ptr %594, align 4, !tbaa !9
  %596 = icmp slt i32 %588, %595
  br i1 %596, label %597, label %777

597:                                              ; preds = %587
  %598 = load i32, ptr %12, align 4, !tbaa !9
  %599 = add nsw i32 %598, 1
  store i32 %599, ptr %13, align 4, !tbaa !9
  br label %600

600:                                              ; preds = %770, %597
  %601 = load i32, ptr %13, align 4, !tbaa !9
  %602 = load ptr, ptr %7, align 8, !tbaa !5
  %603 = getelementptr inbounds %struct.primordial, ptr %602, i32 0, i32 78
  %604 = load ptr, ptr %603, align 8, !tbaa !18
  %605 = load i32, ptr %8, align 4, !tbaa !9
  %606 = sext i32 %605 to i64
  %607 = getelementptr inbounds i32, ptr %604, i64 %606
  %608 = load i32, ptr %607, align 4, !tbaa !9
  %609 = icmp slt i32 %601, %608
  br i1 %609, label %610, label %773

610:                                              ; preds = %600
  %611 = load i32, ptr %12, align 4, !tbaa !9
  %612 = load i32, ptr %13, align 4, !tbaa !9
  %613 = icmp sle i32 %611, %612
  br i1 %613, label %614, label %632

614:                                              ; preds = %610
  %615 = load i32, ptr %13, align 4, !tbaa !9
  %616 = load ptr, ptr %7, align 8, !tbaa !5
  %617 = getelementptr inbounds %struct.primordial, ptr %616, i32 0, i32 78
  %618 = load ptr, ptr %617, align 8, !tbaa !18
  %619 = load i32, ptr %8, align 4, !tbaa !9
  %620 = sext i32 %619 to i64
  %621 = getelementptr inbounds i32, ptr %618, i64 %620
  %622 = load i32, ptr %621, align 4, !tbaa !9
  %623 = load i32, ptr %12, align 4, !tbaa !9
  %624 = mul nsw i32 %622, %623
  %625 = add nsw i32 %615, %624
  %626 = load i32, ptr %12, align 4, !tbaa !9
  %627 = load i32, ptr %12, align 4, !tbaa !9
  %628 = add nsw i32 %627, 1
  %629 = mul nsw i32 %626, %628
  %630 = sdiv i32 %629, 2
  %631 = sub nsw i32 %625, %630
  br label %650

632:                                              ; preds = %610
  %633 = load i32, ptr %12, align 4, !tbaa !9
  %634 = load ptr, ptr %7, align 8, !tbaa !5
  %635 = getelementptr inbounds %struct.primordial, ptr %634, i32 0, i32 78
  %636 = load ptr, ptr %635, align 8, !tbaa !18
  %637 = load i32, ptr %8, align 4, !tbaa !9
  %638 = sext i32 %637 to i64
  %639 = getelementptr inbounds i32, ptr %636, i64 %638
  %640 = load i32, ptr %639, align 4, !tbaa !9
  %641 = load i32, ptr %13, align 4, !tbaa !9
  %642 = mul nsw i32 %640, %641
  %643 = add nsw i32 %633, %642
  %644 = load i32, ptr %13, align 4, !tbaa !9
  %645 = load i32, ptr %13, align 4, !tbaa !9
  %646 = add nsw i32 %645, 1
  %647 = mul nsw i32 %644, %646
  %648 = sdiv i32 %647, 2
  %649 = sub nsw i32 %643, %648
  br label %650

650:                                              ; preds = %632, %614
  %651 = phi i32 [ %631, %614 ], [ %649, %632 ]
  store i32 %651, ptr %14, align 4, !tbaa !9
  %652 = load ptr, ptr %7, align 8, !tbaa !5
  %653 = getelementptr inbounds %struct.primordial, ptr %652, i32 0, i32 84
  %654 = load ptr, ptr %653, align 8, !tbaa !19
  %655 = load i32, ptr %8, align 4, !tbaa !9
  %656 = sext i32 %655 to i64
  %657 = getelementptr inbounds ptr, ptr %654, i64 %656
  %658 = load ptr, ptr %657, align 8, !tbaa !5
  %659 = load i32, ptr %14, align 4, !tbaa !9
  %660 = sext i32 %659 to i64
  %661 = getelementptr inbounds i16, ptr %658, i64 %660
  %662 = load i16, ptr %661, align 2, !tbaa !20
  %663 = sext i16 %662 to i32
  %664 = icmp eq i32 %663, 1
  br i1 %664, label %665, label %764

665:                                              ; preds = %650
  %666 = load ptr, ptr %11, align 8, !tbaa !5
  %667 = load i32, ptr %12, align 4, !tbaa !9
  %668 = load i32, ptr %12, align 4, !tbaa !9
  %669 = icmp sle i32 %667, %668
  br i1 %669, label %670, label %688

670:                                              ; preds = %665
  %671 = load i32, ptr %12, align 4, !tbaa !9
  %672 = load ptr, ptr %7, align 8, !tbaa !5
  %673 = getelementptr inbounds %struct.primordial, ptr %672, i32 0, i32 78
  %674 = load ptr, ptr %673, align 8, !tbaa !18
  %675 = load i32, ptr %8, align 4, !tbaa !9
  %676 = sext i32 %675 to i64
  %677 = getelementptr inbounds i32, ptr %674, i64 %676
  %678 = load i32, ptr %677, align 4, !tbaa !9
  %679 = load i32, ptr %12, align 4, !tbaa !9
  %680 = mul nsw i32 %678, %679
  %681 = add nsw i32 %671, %680
  %682 = load i32, ptr %12, align 4, !tbaa !9
  %683 = load i32, ptr %12, align 4, !tbaa !9
  %684 = add nsw i32 %683, 1
  %685 = mul nsw i32 %682, %684
  %686 = sdiv i32 %685, 2
  %687 = sub nsw i32 %681, %686
  br label %706

688:                                              ; preds = %665
  %689 = load i32, ptr %12, align 4, !tbaa !9
  %690 = load ptr, ptr %7, align 8, !tbaa !5
  %691 = getelementptr inbounds %struct.primordial, ptr %690, i32 0, i32 78
  %692 = load ptr, ptr %691, align 8, !tbaa !18
  %693 = load i32, ptr %8, align 4, !tbaa !9
  %694 = sext i32 %693 to i64
  %695 = getelementptr inbounds i32, ptr %692, i64 %694
  %696 = load i32, ptr %695, align 4, !tbaa !9
  %697 = load i32, ptr %12, align 4, !tbaa !9
  %698 = mul nsw i32 %696, %697
  %699 = add nsw i32 %689, %698
  %700 = load i32, ptr %12, align 4, !tbaa !9
  %701 = load i32, ptr %12, align 4, !tbaa !9
  %702 = add nsw i32 %701, 1
  %703 = mul nsw i32 %700, %702
  %704 = sdiv i32 %703, 2
  %705 = sub nsw i32 %699, %704
  br label %706

706:                                              ; preds = %688, %670
  %707 = phi i32 [ %687, %670 ], [ %705, %688 ]
  %708 = sext i32 %707 to i64
  %709 = getelementptr inbounds double, ptr %666, i64 %708
  %710 = load double, ptr %709, align 8, !tbaa !11
  %711 = load ptr, ptr %11, align 8, !tbaa !5
  %712 = load i32, ptr %13, align 4, !tbaa !9
  %713 = load i32, ptr %13, align 4, !tbaa !9
  %714 = icmp sle i32 %712, %713
  br i1 %714, label %715, label %733

715:                                              ; preds = %706
  %716 = load i32, ptr %13, align 4, !tbaa !9
  %717 = load ptr, ptr %7, align 8, !tbaa !5
  %718 = getelementptr inbounds %struct.primordial, ptr %717, i32 0, i32 78
  %719 = load ptr, ptr %718, align 8, !tbaa !18
  %720 = load i32, ptr %8, align 4, !tbaa !9
  %721 = sext i32 %720 to i64
  %722 = getelementptr inbounds i32, ptr %719, i64 %721
  %723 = load i32, ptr %722, align 4, !tbaa !9
  %724 = load i32, ptr %13, align 4, !tbaa !9
  %725 = mul nsw i32 %723, %724
  %726 = add nsw i32 %716, %725
  %727 = load i32, ptr %13, align 4, !tbaa !9
  %728 = load i32, ptr %13, align 4, !tbaa !9
  %729 = add nsw i32 %728, 1
  %730 = mul nsw i32 %727, %729
  %731 = sdiv i32 %730, 2
  %732 = sub nsw i32 %726, %731
  br label %751

733:                                              ; preds = %706
  %734 = load i32, ptr %13, align 4, !tbaa !9
  %735 = load ptr, ptr %7, align 8, !tbaa !5
  %736 = getelementptr inbounds %struct.primordial, ptr %735, i32 0, i32 78
  %737 = load ptr, ptr %736, align 8, !tbaa !18
  %738 = load i32, ptr %8, align 4, !tbaa !9
  %739 = sext i32 %738 to i64
  %740 = getelementptr inbounds i32, ptr %737, i64 %739
  %741 = load i32, ptr %740, align 4, !tbaa !9
  %742 = load i32, ptr %13, align 4, !tbaa !9
  %743 = mul nsw i32 %741, %742
  %744 = add nsw i32 %734, %743
  %745 = load i32, ptr %13, align 4, !tbaa !9
  %746 = load i32, ptr %13, align 4, !tbaa !9
  %747 = add nsw i32 %746, 1
  %748 = mul nsw i32 %745, %747
  %749 = sdiv i32 %748, 2
  %750 = sub nsw i32 %744, %749
  br label %751

751:                                              ; preds = %733, %715
  %752 = phi i32 [ %732, %715 ], [ %750, %733 ]
  %753 = sext i32 %752 to i64
  %754 = getelementptr inbounds double, ptr %711, i64 %753
  %755 = load double, ptr %754, align 8, !tbaa !11
  %756 = fmul double %710, %755
  %757 = call double @sqrt(double noundef %756) #4
  %758 = load ptr, ptr %11, align 8, !tbaa !5
  %759 = load i32, ptr %14, align 4, !tbaa !9
  %760 = sext i32 %759 to i64
  %761 = getelementptr inbounds double, ptr %758, i64 %760
  %762 = load double, ptr %761, align 8, !tbaa !11
  %763 = fmul double %762, %757
  store double %763, ptr %761, align 8, !tbaa !11
  br label %769

764:                                              ; preds = %650
  %765 = load ptr, ptr %11, align 8, !tbaa !5
  %766 = load i32, ptr %14, align 4, !tbaa !9
  %767 = sext i32 %766 to i64
  %768 = getelementptr inbounds double, ptr %765, i64 %767
  store double 0.000000e+00, ptr %768, align 8, !tbaa !11
  br label %769

769:                                              ; preds = %764, %751
  br label %770

770:                                              ; preds = %769
  %771 = load i32, ptr %13, align 4, !tbaa !9
  %772 = add nsw i32 %771, 1
  store i32 %772, ptr %13, align 4, !tbaa !9
  br label %600, !llvm.loop !31

773:                                              ; preds = %600
  br label %774

774:                                              ; preds = %773
  %775 = load i32, ptr %12, align 4, !tbaa !9
  %776 = add nsw i32 %775, 1
  store i32 %776, ptr %12, align 4, !tbaa !9
  br label %587, !llvm.loop !32

777:                                              ; preds = %587
  br label %778

778:                                              ; preds = %777, %517
  br label %779

779:                                              ; preds = %778, %465
  store i32 0, ptr %6, align 4
  store i32 1, ptr %19, align 4
  br label %780

780:                                              ; preds = %779, %508, %186, %69, %29
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  %781 = load i32, ptr %6, align 4
  ret i32 %781
}

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

declare void @class_protect_sprintf(ptr noundef, ptr noundef, ...) #2

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

; Function Attrs: nounwind
declare double @log(double noundef) #3

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

; Function Attrs: nounwind uwtable
declare dso_local i32 @primordial_analytic_spectrum(ptr noundef, i32 noundef, i32 noundef, double noundef, ptr noundef) #0

; Function Attrs: nounwind
declare double @sqrt(double noundef) #3

declare i32 @array_interpolate_spline(ptr noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, double noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) #2

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { 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 #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !6, i64 648}
!14 = !{!"primordial", !12, i64 0, !10, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !12, i64 128, !12, i64 136, !12, i64 144, !12, i64 152, !12, i64 160, !12, i64 168, !12, i64 176, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !12, i64 232, !12, i64 240, !12, i64 248, !12, i64 256, !12, i64 264, !12, i64 272, !12, i64 280, !12, i64 288, !12, i64 296, !12, i64 304, !12, i64 312, !12, i64 320, !12, i64 328, !12, i64 336, !12, i64 344, !12, i64 352, !12, i64 360, !12, i64 368, !12, i64 376, !12, i64 384, !12, i64 392, !12, i64 400, !10, i64 408, !12, i64 416, !12, i64 424, !12, i64 432, !12, i64 440, !12, i64 448, !12, i64 456, !12, i64 464, !12, i64 472, !12, i64 480, !12, i64 488, !12, i64 496, !10, i64 504, !12, i64 512, !10, i64 520, !6, i64 528, !12, i64 536, !12, i64 544, !12, i64 552, !12, i64 560, !12, i64 568, !12, i64 576, !12, i64 584, !12, i64 592, !12, i64 600, !12, i64 608, !10, i64 616, !6, i64 624, !6, i64 632, !10, i64 640, !6, i64 648, !6, i64 656, !6, i64 664, !6, i64 672, !6, i64 680, !6, i64 688, !6, i64 696, !10, i64 704, !10, i64 708, !10, i64 712, !10, i64 716, !10, i64 720, !10, i64 724, !10, i64 728, !10, i64 732, !10, i64 736, !10, i64 740, !10, i64 744, !10, i64 748, !10, i64 752, !12, i64 760, !12, i64 768, !12, i64 776, !12, i64 784, !15, i64 792, !7, i64 794}
!15 = !{!"short", !7, i64 0}
!16 = !{!14, !10, i64 640}
!17 = !{!14, !10, i64 8}
!18 = !{!14, !6, i64 624}
!19 = !{!14, !6, i64 672}
!20 = !{!15, !15, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = distinct !{!23, !22}
!24 = distinct !{!24, !22}
!25 = distinct !{!25, !22}
!26 = distinct !{!26, !22}
!27 = !{!14, !6, i64 656}
!28 = !{!14, !6, i64 664}
!29 = !{!14, !6, i64 632}
!30 = distinct !{!30, !22}
!31 = distinct !{!31, !22}
!32 = distinct !{!32, !22}


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

@.str = external hidden unnamed_addr constant [7 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [13 x i8], align 1
@__func__.primordial_spectrum_at_k = external hidden unnamed_addr constant [25 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [41 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [95 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [195 x i8], align 1

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @primordial_spectrum_at_k(ptr noundef %0, i32 noundef %1, i32 noundef %2, double noundef %3, ptr noundef %4) local_unnamed_addr #0 {
  %6 = alloca i32, align 4
  %7 = alloca [2048 x i8], align 16
  %8 = alloca [2048 x i8], align 16
  %9 = alloca [2048 x i8], align 16
  %10 = alloca [2048 x i8], align 16
  %11 = alloca [2048 x i8], align 16
  %12 = alloca [2048 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %6) #4
  %13 = icmp eq i32 %2, 0
  br i1 %13, label %14, label %20

14:                                               ; preds = %5
  %15 = fcmp ugt double %3, 0.000000e+00
  br i1 %15, label %18, label %16

16:                                               ; preds = %14
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %7) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %7, ptr noundef nonnull @.str, double noundef %3) #4
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %8) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %8, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, ptr noundef nonnull %7) #4
  %17 = getelementptr inbounds i8, ptr %0, i64 794
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %17, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.primordial_spectrum_at_k, i32 noundef 73, ptr noundef nonnull %8) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %8) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %7) #4
  br label %.loopexit252

18:                                               ; preds = %14
  %19 = tail call double @log(double noundef %3) #4
  br label %20

20:                                               ; preds = %5, %18
  %.0 = phi double [ %19, %18 ], [ %3, %5 ]
  %21 = getelementptr inbounds i8, ptr %0, i64 648
  %22 = load ptr, ptr %21, align 8, !tbaa !5
  %23 = getelementptr inbounds i8, ptr %0, i64 640
  %24 = load i32, ptr %23, align 8, !tbaa !13
  %25 = sext i32 %24 to i64
  %26 = getelementptr double, ptr %22, i64 %25
  %27 = getelementptr i8, ptr %26, i64 -8
  %28 = load double, ptr %27, align 8, !tbaa !14
  %29 = fcmp ogt double %.0, %28
  br i1 %29, label %33, label %30

30:                                               ; preds = %20
  %31 = load double, ptr %22, align 8, !tbaa !14
  %32 = fcmp olt double %.0, %31
  br i1 %32, label %33, label %185

33:                                               ; preds = %30, %20
  %34 = getelementptr inbounds i8, ptr %0, i64 8
  %35 = load i32, ptr %34, align 8, !tbaa !15
  %.not244 = icmp eq i32 %35, 0
  br i1 %.not244, label %.preheader255, label %43

.preheader255:                                    ; preds = %33
  %36 = getelementptr inbounds i8, ptr %0, i64 624
  %37 = sext i32 %1 to i64
  %38 = load ptr, ptr %36, align 8, !tbaa !16
  %39 = getelementptr inbounds i32, ptr %38, i64 %37
  %40 = load i32, ptr %39, align 4, !tbaa !17
  %41 = icmp sgt i32 %40, 0
  br i1 %41, label %.preheader254.lr.ph, label %._crit_edge272

.preheader254.lr.ph:                              ; preds = %.preheader255
  %42 = getelementptr inbounds i8, ptr %0, i64 672
  br label %.preheader254

43:                                               ; preds = %33
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %9) #4
  %44 = tail call double @exp(double noundef %.0) #4
  %45 = load ptr, ptr %21, align 8, !tbaa !5
  %46 = load double, ptr %45, align 8, !tbaa !14
  %47 = tail call double @exp(double noundef %46) #4
  %48 = load ptr, ptr %21, align 8, !tbaa !5
  %49 = load i32, ptr %23, align 8, !tbaa !13
  %50 = sext i32 %49 to i64
  %51 = getelementptr double, ptr %48, i64 %50
  %52 = getelementptr i8, ptr %51, i64 -8
  %53 = load double, ptr %52, align 8, !tbaa !14
  %54 = tail call double @exp(double noundef %53) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %9, ptr noundef nonnull @.str.4, double noundef %44, double noundef %47, double noundef %54) #4
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %10) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %10, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.5, ptr noundef nonnull %9) #4
  %55 = getelementptr inbounds i8, ptr %0, i64 794
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %55, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.primordial_spectrum_at_k, i32 noundef 87, ptr noundef nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %10) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %9) #4
  br label %.loopexit252

.preheader254:                                    ; preds = %.preheader254.lr.ph, %._crit_edge
  %56 = phi i32 [ %40, %.preheader254.lr.ph ], [ %102, %._crit_edge ]
  %57 = phi ptr [ %38, %.preheader254.lr.ph ], [ %103, %._crit_edge ]
  %.0233271 = phi i32 [ 0, %.preheader254.lr.ph ], [ %59, %._crit_edge ]
  %58 = icmp slt i32 %.0233271, %56
  %59 = add nuw nsw i32 %.0233271, 1
  br i1 %58, label %.lr.ph270, label %._crit_edge

.lr.ph270:                                        ; preds = %.preheader254
  %60 = mul nuw nsw i32 %59, %.0233271
  %61 = lshr i32 %60, 1
  br label %62

62:                                               ; preds = %.lr.ph270, %95
  %63 = phi ptr [ %57, %.lr.ph270 ], [ %96, %95 ]
  %64 = phi ptr [ %57, %.lr.ph270 ], [ %97, %95 ]
  %65 = phi i32 [ %56, %.lr.ph270 ], [ %100, %95 ]
  %.0232269 = phi i32 [ %.0233271, %.lr.ph270 ], [ %98, %95 ]
  %.not246 = icmp ugt i32 %.0233271, %.0232269
  br i1 %.not246, label %70, label %66

66:                                               ; preds = %62
  %67 = mul nsw i32 %65, %.0233271
  %68 = sub nsw i32 %.0232269, %61
  %69 = add i32 %68, %67
  br label %77

70:                                               ; preds = %62
  %71 = mul nsw i32 %65, %.0232269
  %72 = add nsw i32 %71, %.0233271
  %73 = add nuw nsw i32 %.0232269, 1
  %74 = mul nuw nsw i32 %73, %.0232269
  %75 = lshr i32 %74, 1
  %76 = sub i32 %72, %75
  br label %77

77:                                               ; preds = %70, %66
  %78 = phi i32 [ %69, %66 ], [ %76, %70 ]
  %79 = load ptr, ptr %42, align 8, !tbaa !18
  %80 = getelementptr inbounds ptr, ptr %79, i64 %37
  %81 = load ptr, ptr %80, align 8, !tbaa !19
  %82 = sext i32 %78 to i64
  %83 = getelementptr inbounds i16, ptr %81, i64 %82
  %84 = load i16, ptr %83, align 2, !tbaa !20
  %85 = icmp eq i16 %84, 1
  br i1 %85, label %86, label %93

86:                                               ; preds = %77
  %87 = tail call double @exp(double noundef %.0) #4
  %88 = getelementptr inbounds double, ptr %4, i64 %82
  %89 = tail call i32 @primordial_analytic_spectrum(ptr noundef nonnull %0, i32 noundef %1, i32 noundef %78, double noundef %87, ptr noundef %88)
  %90 = icmp eq i32 %89, 1
  br i1 %90, label %91, label %._crit_edge282

._crit_edge282:                                   ; preds = %86
  %.pre283 = load ptr, ptr %36, align 8, !tbaa !16
  br label %95

91:                                               ; preds = %86
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %11) #4
  %92 = getelementptr inbounds i8, ptr %0, i64 794
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %11, ptr noundef nonnull @.str.6, ptr noundef nonnull @.str.7, ptr noundef nonnull %92) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %92, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.primordial_spectrum_at_k, i32 noundef 104, ptr noundef nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %11) #4
  br label %.loopexit252

93:                                               ; preds = %77
  %94 = getelementptr inbounds double, ptr %4, i64 %82
  store double 0.000000e+00, ptr %94, align 8, !tbaa !14
  br label %95

95:                                               ; preds = %._crit_edge282, %93
  %96 = phi ptr [ %.pre283, %._crit_edge282 ], [ %63, %93 ]
  %97 = phi ptr [ %.pre283, %._crit_edge282 ], [ %64, %93 ]
  %98 = add nuw nsw i32 %.0232269, 1
  %99 = getelementptr inbounds i32, ptr %97, i64 %37
  %100 = load i32, ptr %99, align 4, !tbaa !17
  %101 = icmp slt i32 %98, %100
  br i1 %101, label %62, label %._crit_edge.loopexit, !llvm.loop !21

._crit_edge.loopexit:                             ; preds = %95
  %.phi.trans.insert286 = getelementptr inbounds i32, ptr %96, i64 %37
  %.pre287 = load i32, ptr %.phi.trans.insert286, align 4, !tbaa !17
  br label %._crit_edge

._crit_edge:                                      ; preds = %.preheader254, %._crit_edge.loopexit
  %102 = phi i32 [ %.pre287, %._crit_edge.loopexit ], [ %56, %.preheader254 ]
  %103 = phi ptr [ %96, %._crit_edge.loopexit ], [ %57, %.preheader254 ]
  %104 = icmp slt i32 %59, %102
  br i1 %104, label %.preheader254, label %._crit_edge272, !llvm.loop !23

._crit_edge272:                                   ; preds = %._crit_edge, %.preheader255
  %105 = phi i32 [ %40, %.preheader255 ], [ %102, %._crit_edge ]
  %106 = icmp eq i32 %2, 1
  %107 = icmp sgt i32 %105, 0
  %or.cond = and i1 %106, %107
  br i1 %or.cond, label %.lr.ph275, label %.loopexit252

.preheader:                                       ; preds = %.lr.ph275
  %108 = icmp sgt i32 %123, 0
  br i1 %108, label %.lr.ph280, label %.loopexit252

.lr.ph280:                                        ; preds = %.preheader
  %109 = getelementptr inbounds i8, ptr %0, i64 672
  br label %128

.lr.ph275:                                        ; preds = %._crit_edge272, %.lr.ph275
  %110 = phi i32 [ %123, %.lr.ph275 ], [ %105, %._crit_edge272 ]
  %.1234274 = phi i32 [ %113, %.lr.ph275 ], [ 0, %._crit_edge272 ]
  %111 = add i32 %110, 1
  %112 = mul i32 %111, %.1234274
  %113 = add nuw nsw i32 %.1234274, 1
  %114 = mul nuw nsw i32 %113, %.1234274
  %115 = lshr i32 %114, 1
  %116 = sub nsw i32 %112, %115
  %117 = sext i32 %116 to i64
  %118 = getelementptr inbounds double, ptr %4, i64 %117
  %119 = load double, ptr %118, align 8, !tbaa !14
  %120 = tail call double @log(double noundef %119) #4
  store double %120, ptr %118, align 8, !tbaa !14
  %121 = load ptr, ptr %36, align 8, !tbaa !16
  %122 = getelementptr inbounds i32, ptr %121, i64 %37
  %123 = load i32, ptr %122, align 4, !tbaa !17
  %124 = icmp slt i32 %113, %123
  br i1 %124, label %.lr.ph275, label %.preheader, !llvm.loop !24

.loopexit.loopexit:                               ; preds = %179
  %.phi.trans.insert288 = getelementptr inbounds i32, ptr %180, i64 %37
  %.pre289 = load i32, ptr %.phi.trans.insert288, align 4, !tbaa !17
  br label %.loopexit

.loopexit:                                        ; preds = %.loopexit.loopexit, %128
  %125 = phi i32 [ %.pre289, %.loopexit.loopexit ], [ %129, %128 ]
  %126 = phi ptr [ %180, %.loopexit.loopexit ], [ %130, %128 ]
  %127 = icmp slt i32 %131, %125
  br i1 %127, label %128, label %.loopexit252, !llvm.loop !25

128:                                              ; preds = %.lr.ph280, %.loopexit
  %129 = phi i32 [ %123, %.lr.ph280 ], [ %125, %.loopexit ]
  %130 = phi ptr [ %121, %.lr.ph280 ], [ %126, %.loopexit ]
  %.2235279 = phi i32 [ 0, %.lr.ph280 ], [ %131, %.loopexit ]
  %131 = add nuw nsw i32 %.2235279, 1
  %132 = icmp slt i32 %131, %129
  br i1 %132, label %.lr.ph278, label %.loopexit

.lr.ph278:                                        ; preds = %128
  %133 = mul nuw nsw i32 %131, %.2235279
  %134 = lshr i32 %133, 1
  br label %135

135:                                              ; preds = %.lr.ph278, %179
  %136 = phi ptr [ %130, %.lr.ph278 ], [ %180, %179 ]
  %137 = phi ptr [ %130, %.lr.ph278 ], [ %181, %179 ]
  %138 = phi i32 [ %129, %.lr.ph278 ], [ %183, %179 ]
  %.1276 = phi i32 [ %131, %.lr.ph278 ], [ %.pre-phi295, %179 ]
  %.not245 = icmp ugt i32 %.2235279, %.1276
  br i1 %.not245, label %143, label %139

139:                                              ; preds = %135
  %140 = mul nsw i32 %138, %.2235279
  %141 = sub nsw i32 %.1276, %134
  %142 = add i32 %141, %140
  br label %150

143:                                              ; preds = %135
  %144 = mul nsw i32 %138, %.1276
  %145 = add nsw i32 %144, %.2235279
  %146 = add nuw nsw i32 %.1276, 1
  %147 = mul nuw nsw i32 %146, %.1276
  %148 = lshr i32 %147, 1
  %149 = sub i32 %145, %148
  br label %150

150:                                              ; preds = %143, %139
  %151 = phi i32 [ %142, %139 ], [ %149, %143 ]
  %152 = load ptr, ptr %109, align 8, !tbaa !18
  %153 = getelementptr inbounds ptr, ptr %152, i64 %37
  %154 = load ptr, ptr %153, align 8, !tbaa !19
  %155 = sext i32 %151 to i64
  %156 = getelementptr inbounds i16, ptr %154, i64 %155
  %157 = load i16, ptr %156, align 2, !tbaa !20
  %158 = icmp eq i16 %157, 1
  br i1 %158, label %159, label %._crit_edge291

._crit_edge291:                                   ; preds = %150
  %.pre294 = add nuw nsw i32 %.1276, 1
  br label %179

159:                                              ; preds = %150
  %160 = add i32 %138, 1
  %161 = mul i32 %160, %.2235279
  %162 = sub nsw i32 %161, %134
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds double, ptr %4, i64 %163
  %165 = load double, ptr %164, align 8, !tbaa !14
  %166 = mul i32 %160, %.1276
  %167 = add nuw nsw i32 %.1276, 1
  %168 = mul nuw nsw i32 %167, %.1276
  %169 = lshr i32 %168, 1
  %170 = sub nsw i32 %166, %169
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds double, ptr %4, i64 %171
  %173 = load double, ptr %172, align 8, !tbaa !14
  %174 = fmul double %165, %173
  %175 = tail call double @sqrt(double noundef %174) #4
  %176 = getelementptr inbounds double, ptr %4, i64 %155
  %177 = load double, ptr %176, align 8, !tbaa !14
  %178 = fdiv double %177, %175
  store double %178, ptr %176, align 8, !tbaa !14
  %.pre284 = load ptr, ptr %36, align 8, !tbaa !16
  br label %179

179:                                              ; preds = %._crit_edge291, %159
  %.pre-phi295 = phi i32 [ %.pre294, %._crit_edge291 ], [ %167, %159 ]
  %180 = phi ptr [ %136, %._crit_edge291 ], [ %.pre284, %159 ]
  %181 = phi ptr [ %137, %._crit_edge291 ], [ %.pre284, %159 ]
  %182 = getelementptr inbounds i32, ptr %181, i64 %37
  %183 = load i32, ptr %182, align 4, !tbaa !17
  %184 = icmp slt i32 %.pre-phi295, %183
  br i1 %184, label %135, label %.loopexit.loopexit, !llvm.loop !26

185:                                              ; preds = %30
  %186 = getelementptr inbounds i8, ptr %0, i64 656
  %187 = load ptr, ptr %186, align 8, !tbaa !27
  %188 = sext i32 %1 to i64
  %189 = getelementptr inbounds ptr, ptr %187, i64 %188
  %190 = load ptr, ptr %189, align 8, !tbaa !19
  %191 = getelementptr inbounds i8, ptr %0, i64 664
  %192 = load ptr, ptr %191, align 8, !tbaa !28
  %193 = getelementptr inbounds ptr, ptr %192, i64 %188
  %194 = load ptr, ptr %193, align 8, !tbaa !19
  %195 = getelementptr inbounds i8, ptr %0, i64 632
  %196 = load ptr, ptr %195, align 8, !tbaa !29
  %197 = getelementptr inbounds i32, ptr %196, i64 %188
  %198 = load i32, ptr %197, align 4, !tbaa !17
  %199 = getelementptr inbounds i8, ptr %0, i64 794
  %200 = call i32 @array_interpolate_spline(ptr noundef nonnull %22, i32 noundef %24, ptr noundef %190, ptr noundef %194, i32 noundef %198, double noundef %.0, ptr noundef nonnull %6, ptr noundef %4, i32 noundef %198, ptr noundef nonnull %199) #4
  %201 = icmp eq i32 %200, 1
  br i1 %201, label %202, label %203

202:                                              ; preds = %185
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %12) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %12, ptr noundef nonnull @.str.6, ptr noundef nonnull @.str.8, ptr noundef nonnull %199) #4
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %199, ptr noundef nonnull @.str.3, ptr noundef nonnull @__func__.primordial_spectrum_at_k, i32 noundef 148, ptr noundef nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %12) #4
  br label %.loopexit252

203:                                              ; preds = %185
  br i1 %13, label %.preheader259, label %.loopexit252

.preheader259:                                    ; preds = %203
  %204 = getelementptr inbounds i8, ptr %0, i64 624
  %205 = load ptr, ptr %204, align 8, !tbaa !16
  %206 = getelementptr inbounds i32, ptr %205, i64 %188
  %207 = load i32, ptr %206, align 4, !tbaa !17
  %208 = icmp sgt i32 %207, 0
  br i1 %208, label %.lr.ph, label %.loopexit252

.preheader257:                                    ; preds = %.lr.ph
  %209 = icmp sgt i32 %224, 0
  br i1 %209, label %.lr.ph268, label %.loopexit252

.lr.ph268:                                        ; preds = %.preheader257
  %210 = getelementptr inbounds i8, ptr %0, i64 672
  br label %229

.lr.ph:                                           ; preds = %.preheader259, %.lr.ph
  %211 = phi i32 [ %224, %.lr.ph ], [ %207, %.preheader259 ]
  %.3264 = phi i32 [ %214, %.lr.ph ], [ 0, %.preheader259 ]
  %212 = add i32 %211, 1
  %213 = mul i32 %212, %.3264
  %214 = add nuw nsw i32 %.3264, 1
  %215 = mul nuw nsw i32 %214, %.3264
  %216 = lshr i32 %215, 1
  %217 = sub nsw i32 %213, %216
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds double, ptr %4, i64 %218
  %220 = load double, ptr %219, align 8, !tbaa !14
  %221 = call double @exp(double noundef %220) #4
  store double %221, ptr %219, align 8, !tbaa !14
  %222 = load ptr, ptr %204, align 8, !tbaa !16
  %223 = getelementptr inbounds i32, ptr %222, i64 %188
  %224 = load i32, ptr %223, align 4, !tbaa !17
  %225 = icmp slt i32 %214, %224
  br i1 %225, label %.lr.ph, label %.preheader257, !llvm.loop !30

.loopexit256.loopexit:                            ; preds = %282
  %.phi.trans.insert = getelementptr inbounds i32, ptr %283, i64 %188
  %.pre285 = load i32, ptr %.phi.trans.insert, align 4, !tbaa !17
  br label %.loopexit256

.loopexit256:                                     ; preds = %.loopexit256.loopexit, %229
  %226 = phi i32 [ %.pre285, %.loopexit256.loopexit ], [ %230, %229 ]
  %227 = phi ptr [ %283, %.loopexit256.loopexit ], [ %231, %229 ]
  %228 = icmp slt i32 %232, %226
  br i1 %228, label %229, label %.loopexit252, !llvm.loop !31

229:                                              ; preds = %.lr.ph268, %.loopexit256
  %230 = phi i32 [ %224, %.lr.ph268 ], [ %226, %.loopexit256 ]
  %231 = phi ptr [ %222, %.lr.ph268 ], [ %227, %.loopexit256 ]
  %.4267 = phi i32 [ 0, %.lr.ph268 ], [ %232, %.loopexit256 ]
  %232 = add nuw nsw i32 %.4267, 1
  %233 = icmp slt i32 %232, %230
  br i1 %233, label %.lr.ph266, label %.loopexit256

.lr.ph266:                                        ; preds = %229
  %234 = mul nuw nsw i32 %232, %.4267
  %235 = lshr i32 %234, 1
  br label %236

236:                                              ; preds = %.lr.ph266, %282
  %237 = phi ptr [ %231, %.lr.ph266 ], [ %283, %282 ]
  %238 = phi ptr [ %231, %.lr.ph266 ], [ %284, %282 ]
  %239 = phi i32 [ %230, %.lr.ph266 ], [ %286, %282 ]
  %.2265 = phi i32 [ %232, %.lr.ph266 ], [ %.pre-phi, %282 ]
  %.not = icmp ugt i32 %.4267, %.2265
  br i1 %.not, label %244, label %240

240:                                              ; preds = %236
  %241 = mul nsw i32 %239, %.4267
  %242 = sub nsw i32 %.2265, %235
  %243 = add i32 %242, %241
  br label %251

244:                                              ; preds = %236
  %245 = mul nsw i32 %239, %.2265
  %246 = add nsw i32 %245, %.4267
  %247 = add nuw nsw i32 %.2265, 1
  %248 = mul nuw nsw i32 %247, %.2265
  %249 = lshr i32 %248, 1
  %250 = sub i32 %246, %249
  br label %251

251:                                              ; preds = %244, %240
  %252 = phi i32 [ %243, %240 ], [ %250, %244 ]
  %253 = load ptr, ptr %210, align 8, !tbaa !18
  %254 = getelementptr inbounds ptr, ptr %253, i64 %188
  %255 = load ptr, ptr %254, align 8, !tbaa !19
  %256 = sext i32 %252 to i64
  %257 = getelementptr inbounds i16, ptr %255, i64 %256
  %258 = load i16, ptr %257, align 2, !tbaa !20
  %259 = icmp eq i16 %258, 1
  br i1 %259, label %260, label %280

260:                                              ; preds = %251
  %261 = add i32 %239, 1
  %262 = mul i32 %261, %.4267
  %263 = sub nsw i32 %262, %235
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds double, ptr %4, i64 %264
  %266 = load double, ptr %265, align 8, !tbaa !14
  %267 = mul i32 %261, %.2265
  %268 = add nuw nsw i32 %.2265, 1
  %269 = mul nuw nsw i32 %268, %.2265
  %270 = lshr i32 %269, 1
  %271 = sub nsw i32 %267, %270
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds double, ptr %4, i64 %272
  %274 = load double, ptr %273, align 8, !tbaa !14
  %275 = fmul double %266, %274
  %276 = call double @sqrt(double noundef %275) #4
  %277 = getelementptr inbounds double, ptr %4, i64 %256
  %278 = load double, ptr %277, align 8, !tbaa !14
  %279 = fmul double %276, %278
  store double %279, ptr %277, align 8, !tbaa !14
  %.pre = load ptr, ptr %204, align 8, !tbaa !16
  br label %282

280:                                              ; preds = %251
  %281 = getelementptr inbounds double, ptr %4, i64 %256
  store double 0.000000e+00, ptr %281, align 8, !tbaa !14
  %.pre290 = add nuw nsw i32 %.2265, 1
  br label %282

282:                                              ; preds = %260, %280
  %.pre-phi = phi i32 [ %268, %260 ], [ %.pre290, %280 ]
  %283 = phi ptr [ %.pre, %260 ], [ %237, %280 ]
  %284 = phi ptr [ %.pre, %260 ], [ %238, %280 ]
  %285 = getelementptr inbounds i32, ptr %284, i64 %188
  %286 = load i32, ptr %285, align 4, !tbaa !17
  %287 = icmp slt i32 %.pre-phi, %286
  br i1 %287, label %236, label %.loopexit256.loopexit, !llvm.loop !32

.loopexit252:                                     ; preds = %.loopexit256, %.loopexit, %.preheader259, %.preheader257, %.preheader, %._crit_edge272, %203, %202, %91, %43, %16
  %.0236 = phi i32 [ 1, %16 ], [ 1, %43 ], [ 1, %91 ], [ 1, %202 ], [ 0, %203 ], [ 0, %._crit_edge272 ], [ 0, %.preheader ], [ 0, %.preheader257 ], [ 0, %.preheader259 ], [ 0, %.loopexit ], [ 0, %.loopexit256 ]
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %6) #4
  ret i32 %.0236
}

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

declare void @class_protect_sprintf(ptr noundef, ptr noundef, ...) local_unnamed_addr #2

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

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

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

; Function Attrs: nounwind uwtable
declare dso_local i32 @primordial_analytic_spectrum(ptr noundef, i32 noundef, i32 noundef, double noundef, ptr noundef) local_unnamed_addr #0

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

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

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 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 #4 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !11, i64 648}
!6 = !{!"primordial", !7, i64 0, !10, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !7, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !7, i64 168, !7, i64 176, !7, i64 184, !7, i64 192, !7, i64 200, !7, i64 208, !7, i64 216, !7, i64 224, !7, i64 232, !7, i64 240, !7, i64 248, !7, i64 256, !7, i64 264, !7, i64 272, !7, i64 280, !7, i64 288, !7, i64 296, !7, i64 304, !7, i64 312, !7, i64 320, !7, i64 328, !7, i64 336, !7, i64 344, !7, i64 352, !7, i64 360, !7, i64 368, !7, i64 376, !7, i64 384, !7, i64 392, !7, i64 400, !10, i64 408, !7, i64 416, !7, i64 424, !7, i64 432, !7, i64 440, !7, i64 448, !7, i64 456, !7, i64 464, !7, i64 472, !7, i64 480, !7, i64 488, !7, i64 496, !10, i64 504, !7, i64 512, !10, i64 520, !11, i64 528, !7, i64 536, !7, i64 544, !7, i64 552, !7, i64 560, !7, i64 568, !7, i64 576, !7, i64 584, !7, i64 592, !7, i64 600, !7, i64 608, !10, i64 616, !11, i64 624, !11, i64 632, !10, i64 640, !11, i64 648, !11, i64 656, !11, i64 664, !11, i64 672, !11, i64 680, !11, i64 688, !11, i64 696, !10, i64 704, !10, i64 708, !10, i64 712, !10, i64 716, !10, i64 720, !10, i64 724, !10, i64 728, !10, i64 732, !10, i64 736, !10, i64 740, !10, i64 744, !10, i64 748, !10, i64 752, !7, i64 760, !7, i64 768, !7, i64 776, !7, i64 784, !12, i64 792, !8, i64 794}
!7 = !{!"double", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"short", !8, i64 0}
!13 = !{!6, !10, i64 640}
!14 = !{!7, !7, i64 0}
!15 = !{!6, !10, i64 8}
!16 = !{!6, !11, i64 624}
!17 = !{!10, !10, i64 0}
!18 = !{!6, !11, i64 672}
!19 = !{!11, !11, i64 0}
!20 = !{!12, !12, i64 0}
!21 = distinct !{!21, !22}
!22 = !{!"llvm.loop.mustprogress"}
!23 = distinct !{!23, !22}
!24 = distinct !{!24, !22}
!25 = distinct !{!25, !22}
!26 = distinct !{!26, !22}
!27 = !{!6, !11, i64 656}
!28 = !{!6, !11, i64 664}
!29 = !{!6, !11, i64 632}
!30 = distinct !{!30, !22}
!31 = distinct !{!31, !22}
!32 = distinct !{!32, !22}


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