; LLVM IR from CLASS-SZ/class_sz :: class-sz/hyrec (hydrogen)

; 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.TWO_PHOTON_PARAMS = type { [311 x double], [311 x double], [311 x double], [311 x double], [311 x double] }

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

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

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

; 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 double @exp(double noundef) #1

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

; Function Attrs: nounwind uwtable
declare dso_local void @interpolate_rates(ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, ptr noundef) #3

; Function Attrs: nounwind uwtable
declare dso_local void @populateTS_2photon(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, double noundef, double noundef, double noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef) #3

declare ptr @create_1D_array(i32 noundef) #4

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

; Function Attrs: nounwind uwtable
declare dso_local void @solve_real_virt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #3

; Function Attrs: nounwind uwtable
declare dso_local void @fplus_from_fminus(ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, double noundef, i32 noundef, double noundef, ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local double @rec_HMLA_2photon_dxedlna(double noundef %0, double noundef %1, double noundef %2, double noundef %3, double noundef %4, ptr noundef %5, ptr noundef %6, double noundef %7, double noundef %8, ptr noundef %9, ptr noundef %10, i32 noundef %11, double noundef %12, double noundef %13) #3 {
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca [2 x double], align 16
  %30 = alloca [311 x double], align 16
  %31 = alloca double, align 8
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca [311 x double], align 16
  %35 = alloca [3 x double], align 16
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca [2 x [2 x double]], align 16
  %39 = alloca [2 x [2 x double]], align 16
  %40 = alloca [2 x ptr], align 16
  %41 = alloca [2 x ptr], align 16
  %42 = alloca [3 x ptr], align 16
  %43 = alloca [2 x double], align 16
  %44 = alloca [311 x double], align 16
  %45 = alloca [311 x double], align 16
  %46 = alloca [2 x double], align 16
  %47 = alloca [2 x double], align 16
  %48 = alloca double, align 8
  %49 = alloca double, align 8
  %50 = alloca double, align 8
  %51 = alloca double, align 8
  store double %0, ptr %15, align 8, !tbaa !5
  store double %1, ptr %16, align 8, !tbaa !5
  store double %2, ptr %17, align 8, !tbaa !5
  store double %3, ptr %18, align 8, !tbaa !5
  store double %4, ptr %19, align 8, !tbaa !5
  store ptr %5, ptr %20, align 8, !tbaa !9
  store ptr %6, ptr %21, align 8, !tbaa !9
  store double %7, ptr %22, align 8, !tbaa !5
  store double %8, ptr %23, align 8, !tbaa !5
  store ptr %9, ptr %24, align 8, !tbaa !9
  store ptr %10, ptr %25, align 8, !tbaa !9
  store i32 %11, ptr %26, align 4, !tbaa !11
  store double %12, ptr %27, align 8, !tbaa !5
  store double %13, ptr %28, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 16, ptr %29) #5
  call void @llvm.lifetime.start.p0(i64 2488, ptr %30) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.start.p0(i64 2488, ptr %34) #5
  call void @llvm.lifetime.start.p0(i64 24, ptr %35) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #5
  call void @llvm.lifetime.start.p0(i64 32, ptr %38) #5
  call void @llvm.lifetime.start.p0(i64 32, ptr %39) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr %40) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr %41) #5
  call void @llvm.lifetime.start.p0(i64 24, ptr %42) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr %43) #5
  call void @llvm.lifetime.start.p0(i64 2488, ptr %44) #5
  call void @llvm.lifetime.start.p0(i64 2488, ptr %45) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr %46) #5
  call void @llvm.lifetime.start.p0(i64 16, ptr %47) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #5
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %52

52:                                               ; preds = %60, %14
  %53 = load i32, ptr %37, align 4, !tbaa !11
  %54 = icmp ult i32 %53, 2
  br i1 %54, label %55, label %63

55:                                               ; preds = %52
  %56 = call ptr @create_1D_array(i32 noundef 311)
  %57 = load i32, ptr %37, align 4, !tbaa !11
  %58 = zext i32 %57 to i64
  %59 = getelementptr inbounds [2 x ptr], ptr %40, i64 0, i64 %58
  store ptr %56, ptr %59, align 8, !tbaa !9
  br label %60

60:                                               ; preds = %55
  %61 = load i32, ptr %37, align 4, !tbaa !11
  %62 = add i32 %61, 1
  store i32 %62, ptr %37, align 4, !tbaa !11
  br label %52, !llvm.loop !13

63:                                               ; preds = %52
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %64

64:                                               ; preds = %72, %63
  %65 = load i32, ptr %37, align 4, !tbaa !11
  %66 = icmp ult i32 %65, 2
  br i1 %66, label %67, label %75

67:                                               ; preds = %64
  %68 = call ptr @create_1D_array(i32 noundef 311)
  %69 = load i32, ptr %37, align 4, !tbaa !11
  %70 = zext i32 %69 to i64
  %71 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 %70
  store ptr %68, ptr %71, align 8, !tbaa !9
  br label %72

72:                                               ; preds = %67
  %73 = load i32, ptr %37, align 4, !tbaa !11
  %74 = add i32 %73, 1
  store i32 %74, ptr %37, align 4, !tbaa !11
  br label %64, !llvm.loop !15

75:                                               ; preds = %64
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %76

76:                                               ; preds = %84, %75
  %77 = load i32, ptr %37, align 4, !tbaa !11
  %78 = icmp ult i32 %77, 3
  br i1 %78, label %79, label %87

79:                                               ; preds = %76
  %80 = call ptr @create_1D_array(i32 noundef 311)
  %81 = load i32, ptr %37, align 4, !tbaa !11
  %82 = zext i32 %81 to i64
  %83 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 %82
  store ptr %80, ptr %83, align 8, !tbaa !9
  br label %84

84:                                               ; preds = %79
  %85 = load i32, ptr %37, align 4, !tbaa !11
  %86 = add i32 %85, 1
  store i32 %86, ptr %37, align 4, !tbaa !11
  br label %76, !llvm.loop !16

87:                                               ; preds = %76
  %88 = getelementptr inbounds [311 x double], ptr %34, i64 0, i64 0
  %89 = getelementptr inbounds [3 x double], ptr %35, i64 0, i64 0
  %90 = load ptr, ptr %24, align 8, !tbaa !9
  %91 = load ptr, ptr %25, align 8, !tbaa !9
  %92 = load double, ptr %19, align 8, !tbaa !5
  %93 = load double, ptr %22, align 8, !tbaa !5
  %94 = load double, ptr %23, align 8, !tbaa !5
  %95 = load i32, ptr %26, align 4, !tbaa !11
  %96 = load double, ptr %27, align 8, !tbaa !5
  %97 = load ptr, ptr %21, align 8, !tbaa !9
  %98 = getelementptr inbounds %struct.TWO_PHOTON_PARAMS, ptr %97, i32 0, i32 0
  %99 = getelementptr inbounds [311 x double], ptr %98, i64 0, i64 0
  call void @fplus_from_fminus(ptr noundef %88, ptr noundef %89, ptr noundef %90, ptr noundef %91, double noundef %92, double noundef %93, double noundef %94, i32 noundef %95, double noundef %96, ptr noundef %99)
  %100 = getelementptr inbounds [2 x [2 x double]], ptr %38, i64 0, i64 0
  %101 = getelementptr inbounds [2 x ptr], ptr %40, i64 0, i64 0
  %102 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 0
  %103 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 0
  %104 = getelementptr inbounds [2 x double], ptr %43, i64 0, i64 0
  %105 = getelementptr inbounds [311 x double], ptr %44, i64 0, i64 0
  %106 = getelementptr inbounds [311 x double], ptr %45, i64 0, i64 0
  %107 = load double, ptr %15, align 8, !tbaa !5
  %108 = load double, ptr %18, align 8, !tbaa !5
  %109 = load double, ptr %19, align 8, !tbaa !5
  %110 = load double, ptr %16, align 8, !tbaa !5
  %111 = load double, ptr %17, align 8, !tbaa !5
  %112 = load ptr, ptr %20, align 8, !tbaa !9
  %113 = load ptr, ptr %21, align 8, !tbaa !9
  %114 = getelementptr inbounds [311 x double], ptr %34, i64 0, i64 0
  %115 = getelementptr inbounds [3 x double], ptr %35, i64 0, i64 0
  %116 = getelementptr inbounds [2 x double], ptr %46, i64 0, i64 0
  %117 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 0
  %118 = load double, ptr %27, align 8, !tbaa !5
  call void @populateTS_2photon(ptr noundef %100, ptr noundef %101, ptr noundef %102, ptr noundef %103, ptr noundef %104, ptr noundef %105, ptr noundef %106, double noundef %107, double noundef %108, double noundef %109, double noundef %110, double noundef %111, ptr noundef %112, ptr noundef %113, ptr noundef %114, ptr noundef %115, ptr noundef %116, ptr noundef %117, double noundef %118)
  %119 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 0
  %120 = getelementptr inbounds [311 x double], ptr %30, i64 0, i64 0
  %121 = getelementptr inbounds [2 x [2 x double]], ptr %38, i64 0, i64 0
  %122 = getelementptr inbounds [2 x ptr], ptr %40, i64 0, i64 0
  %123 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 0
  %124 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 0
  %125 = getelementptr inbounds [2 x double], ptr %43, i64 0, i64 0
  %126 = getelementptr inbounds [311 x double], ptr %44, i64 0, i64 0
  call void @solve_real_virt(ptr noundef %119, ptr noundef %120, ptr noundef %121, ptr noundef %122, ptr noundef %123, ptr noundef %124, ptr noundef %125, ptr noundef %126)
  %127 = load double, ptr %17, align 8, !tbaa !5
  %128 = fmul double 0x433090E1CA8B9039, %127
  %129 = load double, ptr %16, align 8, !tbaa !5
  %130 = fdiv double %128, %129
  %131 = load double, ptr %15, align 8, !tbaa !5
  %132 = fsub double 1.000000e+00, %131
  %133 = fdiv double %130, %132
  store double %133, ptr %48, align 8, !tbaa !5
  %134 = getelementptr inbounds [2 x double], ptr %46, i64 0, i64 0
  %135 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 0
  %136 = load double, ptr %19, align 8, !tbaa !5
  %137 = load double, ptr %18, align 8, !tbaa !5
  %138 = load double, ptr %19, align 8, !tbaa !5
  %139 = fdiv double %137, %138
  %140 = load ptr, ptr %20, align 8, !tbaa !9
  call void @interpolate_rates(ptr noundef %134, ptr noundef %135, ptr noundef %49, double noundef %136, double noundef %139, ptr noundef %140)
  %141 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 0
  %142 = load double, ptr %141, align 16, !tbaa !5
  %143 = load double, ptr %49, align 8, !tbaa !5
  %144 = call double @llvm.fmuladd.f64(double 3.000000e+00, double %143, double %142)
  %145 = fadd double %144, 8.220600e+00
  %146 = getelementptr inbounds [2 x [2 x double]], ptr %39, i64 0, i64 0
  %147 = getelementptr inbounds [2 x double], ptr %146, i64 0, i64 0
  store double %145, ptr %147, align 16, !tbaa !5
  %148 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 1
  %149 = load double, ptr %148, align 8, !tbaa !5
  %150 = load double, ptr %49, align 8, !tbaa !5
  %151 = fadd double %149, %150
  %152 = load double, ptr %48, align 8, !tbaa !5
  %153 = fadd double %151, %152
  %154 = getelementptr inbounds [2 x [2 x double]], ptr %39, i64 0, i64 1
  %155 = getelementptr inbounds [2 x double], ptr %154, i64 0, i64 1
  store double %153, ptr %155, align 8, !tbaa !5
  %156 = load double, ptr %48, align 8, !tbaa !5
  %157 = load double, ptr %49, align 8, !tbaa !5
  %158 = fmul double %157, 8.220600e+00
  %159 = getelementptr inbounds [2 x [2 x double]], ptr %39, i64 0, i64 0
  %160 = getelementptr inbounds [2 x double], ptr %159, i64 0, i64 0
  %161 = load double, ptr %160, align 16, !tbaa !5
  %162 = fdiv double %158, %161
  %163 = fadd double %156, %162
  %164 = getelementptr inbounds [2 x [2 x double]], ptr %39, i64 0, i64 1
  %165 = getelementptr inbounds [2 x double], ptr %164, i64 0, i64 1
  %166 = load double, ptr %165, align 8, !tbaa !5
  %167 = load double, ptr %49, align 8, !tbaa !5
  %168 = fmul double %167, 3.000000e+00
  %169 = load double, ptr %49, align 8, !tbaa !5
  %170 = fmul double %168, %169
  %171 = getelementptr inbounds [2 x [2 x double]], ptr %39, i64 0, i64 0
  %172 = getelementptr inbounds [2 x double], ptr %171, i64 0, i64 0
  %173 = load double, ptr %172, align 16, !tbaa !5
  %174 = fdiv double %170, %173
  %175 = fsub double %166, %174
  %176 = fdiv double %163, %175
  store double %176, ptr %50, align 8, !tbaa !5
  %177 = load double, ptr %15, align 8, !tbaa !5
  %178 = fcmp olt double %177, 1.000000e+00
  br i1 %178, label %179, label %185

179:                                              ; preds = %87
  %180 = load double, ptr %15, align 8, !tbaa !5
  %181 = call double @pow(double noundef %180, double noundef 4.639290e-01) #5
  %182 = fsub double 1.000000e+00, %181
  %183 = call double @pow(double noundef %182, double noundef 1.702370e+00) #5
  %184 = fmul double 3.692020e-01, %183
  store double %184, ptr %51, align 8, !tbaa !5
  br label %186

185:                                              ; preds = %87
  store double 0.000000e+00, ptr %51, align 8, !tbaa !5
  br label %186

186:                                              ; preds = %185, %179
  %187 = load double, ptr %16, align 8, !tbaa !5
  %188 = fneg double %187
  %189 = load double, ptr %15, align 8, !tbaa !5
  %190 = fmul double %188, %189
  %191 = load double, ptr %15, align 8, !tbaa !5
  %192 = fmul double %190, %191
  %193 = getelementptr inbounds [2 x double], ptr %46, i64 0, i64 0
  %194 = load double, ptr %193, align 16, !tbaa !5
  %195 = getelementptr inbounds [2 x double], ptr %46, i64 0, i64 1
  %196 = load double, ptr %195, align 8, !tbaa !5
  %197 = fadd double %194, %196
  %198 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 0
  %199 = load double, ptr %198, align 16, !tbaa !5
  %200 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 0
  %201 = load double, ptr %200, align 16, !tbaa !5
  %202 = fmul double %199, %201
  %203 = call double @llvm.fmuladd.f64(double %192, double %197, double %202)
  %204 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 1
  %205 = load double, ptr %204, align 8, !tbaa !5
  %206 = getelementptr inbounds [2 x double], ptr %47, i64 0, i64 1
  %207 = load double, ptr %206, align 8, !tbaa !5
  %208 = call double @llvm.fmuladd.f64(double %205, double %207, double %203)
  %209 = load double, ptr %51, align 8, !tbaa !5
  %210 = load double, ptr %16, align 8, !tbaa !5
  %211 = fdiv double %209, %210
  %212 = load double, ptr %28, align 8, !tbaa !5
  %213 = fmul double %211, %212
  %214 = load double, ptr %50, align 8, !tbaa !5
  %215 = fsub double 1.000000e+00, %214
  %216 = fdiv double %215, 0x402465BDE9FCF0EC
  %217 = fadd double 0x3FB2D36E4F11087F, %216
  %218 = call double @llvm.fmuladd.f64(double %213, double %217, double %208)
  store double %218, ptr %31, align 8, !tbaa !5
  store i32 0, ptr %36, align 4, !tbaa !11
  br label %219

219:                                              ; preds = %369, %186
  %220 = load i32, ptr %36, align 4, !tbaa !11
  %221 = icmp ult i32 %220, 311
  br i1 %221, label %222, label %372

222:                                              ; preds = %219
  %223 = load i32, ptr %36, align 4, !tbaa !11
  %224 = zext i32 %223 to i64
  %225 = getelementptr inbounds [311 x double], ptr %45, i64 0, i64 %224
  %226 = load double, ptr %225, align 8, !tbaa !5
  %227 = fcmp une double %226, 0.000000e+00
  br i1 %227, label %228, label %354

228:                                              ; preds = %222
  %229 = load i32, ptr %36, align 4, !tbaa !11
  %230 = zext i32 %229 to i64
  %231 = getelementptr inbounds [311 x double], ptr %45, i64 0, i64 %230
  %232 = load double, ptr %231, align 8, !tbaa !5
  %233 = fneg double %232
  %234 = call double @exp(double noundef %233) #5
  %235 = fsub double 1.000000e+00, %234
  %236 = load i32, ptr %36, align 4, !tbaa !11
  %237 = zext i32 %236 to i64
  %238 = getelementptr inbounds [311 x double], ptr %45, i64 0, i64 %237
  %239 = load double, ptr %238, align 8, !tbaa !5
  %240 = fdiv double %235, %239
  store double %240, ptr %32, align 8, !tbaa !5
  %241 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 0
  %242 = load double, ptr %241, align 16, !tbaa !5
  %243 = fneg double %242
  %244 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 0
  %245 = load ptr, ptr %244, align 16, !tbaa !9
  %246 = load i32, ptr %36, align 4, !tbaa !11
  %247 = zext i32 %246 to i64
  %248 = getelementptr inbounds double, ptr %245, i64 %247
  %249 = load double, ptr %248, align 8, !tbaa !5
  %250 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 1
  %251 = load double, ptr %250, align 8, !tbaa !5
  %252 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 1
  %253 = load ptr, ptr %252, align 8, !tbaa !9
  %254 = load i32, ptr %36, align 4, !tbaa !11
  %255 = zext i32 %254 to i64
  %256 = getelementptr inbounds double, ptr %253, i64 %255
  %257 = load double, ptr %256, align 8, !tbaa !5
  %258 = fmul double %251, %257
  %259 = fneg double %258
  %260 = call double @llvm.fmuladd.f64(double %243, double %249, double %259)
  store double %260, ptr %33, align 8, !tbaa !5
  %261 = load i32, ptr %36, align 4, !tbaa !11
  %262 = icmp eq i32 %261, 0
  br i1 %262, label %263, label %271

263:                                              ; preds = %228
  %264 = getelementptr inbounds [311 x double], ptr %30, i64 0, i64 1
  %265 = load double, ptr %264, align 8, !tbaa !5
  %266 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 2
  %267 = load ptr, ptr %266, align 16, !tbaa !9
  %268 = getelementptr inbounds double, ptr %267, i64 0
  %269 = load double, ptr %268, align 8, !tbaa !5
  %270 = fmul double %265, %269
  br label %309

271:                                              ; preds = %228
  %272 = load i32, ptr %36, align 4, !tbaa !11
  %273 = icmp eq i32 %272, 310
  br i1 %273, label %274, label %282

274:                                              ; preds = %271
  %275 = getelementptr inbounds [311 x double], ptr %30, i64 0, i64 309
  %276 = load double, ptr %275, align 8, !tbaa !5
  %277 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 1
  %278 = load ptr, ptr %277, align 8, !tbaa !9
  %279 = getelementptr inbounds double, ptr %278, i64 310
  %280 = load double, ptr %279, align 8, !tbaa !5
  %281 = fmul double %276, %280
  br label %307

282:                                              ; preds = %271
  %283 = load i32, ptr %36, align 4, !tbaa !11
  %284 = add i32 %283, 1
  %285 = zext i32 %284 to i64
  %286 = getelementptr inbounds [311 x double], ptr %30, i64 0, i64 %285
  %287 = load double, ptr %286, align 8, !tbaa !5
  %288 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 2
  %289 = load ptr, ptr %288, align 16, !tbaa !9
  %290 = load i32, ptr %36, align 4, !tbaa !11
  %291 = zext i32 %290 to i64
  %292 = getelementptr inbounds double, ptr %289, i64 %291
  %293 = load double, ptr %292, align 8, !tbaa !5
  %294 = load i32, ptr %36, align 4, !tbaa !11
  %295 = sub i32 %294, 1
  %296 = zext i32 %295 to i64
  %297 = getelementptr inbounds [311 x double], ptr %30, i64 0, i64 %296
  %298 = load double, ptr %297, align 8, !tbaa !5
  %299 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 1
  %300 = load ptr, ptr %299, align 8, !tbaa !9
  %301 = load i32, ptr %36, align 4, !tbaa !11
  %302 = zext i32 %301 to i64
  %303 = getelementptr inbounds double, ptr %300, i64 %302
  %304 = load double, ptr %303, align 8, !tbaa !5
  %305 = fmul double %298, %304
  %306 = call double @llvm.fmuladd.f64(double %287, double %293, double %305)
  br label %307

307:                                              ; preds = %282, %274
  %308 = phi double [ %281, %274 ], [ %306, %282 ]
  br label %309

309:                                              ; preds = %307, %263
  %310 = phi double [ %270, %263 ], [ %308, %307 ]
  %311 = load double, ptr %33, align 8, !tbaa !5
  %312 = fsub double %311, %310
  store double %312, ptr %33, align 8, !tbaa !5
  %313 = load double, ptr %15, align 8, !tbaa !5
  %314 = fsub double 1.000000e+00, %313
  %315 = load double, ptr %32, align 8, !tbaa !5
  %316 = fsub double 1.000000e+00, %315
  %317 = fmul double %314, %316
  %318 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 0
  %319 = load ptr, ptr %318, align 16, !tbaa !9
  %320 = load i32, ptr %36, align 4, !tbaa !11
  %321 = zext i32 %320 to i64
  %322 = getelementptr inbounds double, ptr %319, i64 %321
  %323 = load double, ptr %322, align 8, !tbaa !5
  %324 = fmul double %317, %323
  %325 = load double, ptr %33, align 8, !tbaa !5
  %326 = fdiv double %325, %324
  store double %326, ptr %33, align 8, !tbaa !5
  %327 = load i32, ptr %36, align 4, !tbaa !11
  %328 = zext i32 %327 to i64
  %329 = getelementptr inbounds [311 x double], ptr %34, i64 0, i64 %328
  %330 = load double, ptr %329, align 8, !tbaa !5
  %331 = load double, ptr %33, align 8, !tbaa !5
  %332 = load i32, ptr %36, align 4, !tbaa !11
  %333 = zext i32 %332 to i64
  %334 = getelementptr inbounds [311 x double], ptr %34, i64 0, i64 %333
  %335 = load double, ptr %334, align 8, !tbaa !5
  %336 = fsub double %331, %335
  %337 = load i32, ptr %36, align 4, !tbaa !11
  %338 = zext i32 %337 to i64
  %339 = getelementptr inbounds [311 x double], ptr %45, i64 0, i64 %338
  %340 = load double, ptr %339, align 8, !tbaa !5
  %341 = fneg double %340
  %342 = call double @exp(double noundef %341) #5
  %343 = fsub double 1.000000e+00, %342
  %344 = call double @llvm.fmuladd.f64(double %336, double %343, double %330)
  %345 = call double @log(double noundef %344) #5
  %346 = load ptr, ptr %24, align 8, !tbaa !9
  %347 = load i32, ptr %36, align 4, !tbaa !11
  %348 = zext i32 %347 to i64
  %349 = getelementptr inbounds ptr, ptr %346, i64 %348
  %350 = load ptr, ptr %349, align 8, !tbaa !9
  %351 = load i32, ptr %26, align 4, !tbaa !11
  %352 = zext i32 %351 to i64
  %353 = getelementptr inbounds double, ptr %350, i64 %352
  store double %345, ptr %353, align 8, !tbaa !5
  br label %368

354:                                              ; preds = %222
  %355 = load i32, ptr %36, align 4, !tbaa !11
  %356 = zext i32 %355 to i64
  %357 = getelementptr inbounds [311 x double], ptr %34, i64 0, i64 %356
  %358 = load double, ptr %357, align 8, !tbaa !5
  %359 = call double @log(double noundef %358) #5
  %360 = load ptr, ptr %24, align 8, !tbaa !9
  %361 = load i32, ptr %36, align 4, !tbaa !11
  %362 = zext i32 %361 to i64
  %363 = getelementptr inbounds ptr, ptr %360, i64 %362
  %364 = load ptr, ptr %363, align 8, !tbaa !9
  %365 = load i32, ptr %26, align 4, !tbaa !11
  %366 = zext i32 %365 to i64
  %367 = getelementptr inbounds double, ptr %364, i64 %366
  store double %359, ptr %367, align 8, !tbaa !5
  br label %368

368:                                              ; preds = %354, %309
  br label %369

369:                                              ; preds = %368
  %370 = load i32, ptr %36, align 4, !tbaa !11
  %371 = add i32 %370, 1
  store i32 %371, ptr %36, align 4, !tbaa !11
  br label %219, !llvm.loop !17

372:                                              ; preds = %219
  %373 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 1
  %374 = load double, ptr %373, align 8, !tbaa !5
  %375 = fdiv double %374, 3.000000e+00
  %376 = load double, ptr %15, align 8, !tbaa !5
  %377 = fsub double 1.000000e+00, %376
  %378 = fdiv double %375, %377
  %379 = call double @log(double noundef %378) #5
  %380 = load ptr, ptr %25, align 8, !tbaa !9
  %381 = getelementptr inbounds ptr, ptr %380, i64 0
  %382 = load ptr, ptr %381, align 8, !tbaa !9
  %383 = load i32, ptr %26, align 4, !tbaa !11
  %384 = zext i32 %383 to i64
  %385 = getelementptr inbounds double, ptr %382, i64 %384
  store double %379, ptr %385, align 8, !tbaa !5
  %386 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 0
  %387 = load double, ptr %386, align 16, !tbaa !5
  %388 = load double, ptr %15, align 8, !tbaa !5
  %389 = fsub double 1.000000e+00, %388
  %390 = fdiv double %387, %389
  %391 = call double @log(double noundef %390) #5
  %392 = load double, ptr %19, align 8, !tbaa !5
  %393 = fdiv double 0x3FFE37E9F25A4877, %392
  %394 = fsub double %391, %393
  %395 = load ptr, ptr %25, align 8, !tbaa !9
  %396 = getelementptr inbounds ptr, ptr %395, i64 1
  %397 = load ptr, ptr %396, align 8, !tbaa !9
  %398 = load i32, ptr %26, align 4, !tbaa !11
  %399 = zext i32 %398 to i64
  %400 = getelementptr inbounds double, ptr %397, i64 %399
  store double %394, ptr %400, align 8, !tbaa !5
  %401 = getelementptr inbounds [2 x double], ptr %29, i64 0, i64 0
  %402 = load double, ptr %401, align 16, !tbaa !5
  %403 = load double, ptr %15, align 8, !tbaa !5
  %404 = fsub double 1.000000e+00, %403
  %405 = fdiv double %402, %404
  %406 = call double @log(double noundef %405) #5
  %407 = load double, ptr %19, align 8, !tbaa !5
  %408 = fdiv double 0x400465BDE9FCF0EC, %407
  %409 = fsub double %406, %408
  %410 = load ptr, ptr %25, align 8, !tbaa !9
  %411 = getelementptr inbounds ptr, ptr %410, i64 2
  %412 = load ptr, ptr %411, align 8, !tbaa !9
  %413 = load i32, ptr %26, align 4, !tbaa !11
  %414 = zext i32 %413 to i64
  %415 = getelementptr inbounds double, ptr %412, i64 %414
  store double %409, ptr %415, align 8, !tbaa !5
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %416

416:                                              ; preds = %424, %372
  %417 = load i32, ptr %37, align 4, !tbaa !11
  %418 = icmp ult i32 %417, 2
  br i1 %418, label %419, label %427

419:                                              ; preds = %416
  %420 = load i32, ptr %37, align 4, !tbaa !11
  %421 = zext i32 %420 to i64
  %422 = getelementptr inbounds [2 x ptr], ptr %40, i64 0, i64 %421
  %423 = load ptr, ptr %422, align 8, !tbaa !9
  call void @free(ptr noundef %423) #5
  br label %424

424:                                              ; preds = %419
  %425 = load i32, ptr %37, align 4, !tbaa !11
  %426 = add i32 %425, 1
  store i32 %426, ptr %37, align 4, !tbaa !11
  br label %416, !llvm.loop !18

427:                                              ; preds = %416
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %428

428:                                              ; preds = %436, %427
  %429 = load i32, ptr %37, align 4, !tbaa !11
  %430 = icmp ult i32 %429, 2
  br i1 %430, label %431, label %439

431:                                              ; preds = %428
  %432 = load i32, ptr %37, align 4, !tbaa !11
  %433 = zext i32 %432 to i64
  %434 = getelementptr inbounds [2 x ptr], ptr %41, i64 0, i64 %433
  %435 = load ptr, ptr %434, align 8, !tbaa !9
  call void @free(ptr noundef %435) #5
  br label %436

436:                                              ; preds = %431
  %437 = load i32, ptr %37, align 4, !tbaa !11
  %438 = add i32 %437, 1
  store i32 %438, ptr %37, align 4, !tbaa !11
  br label %428, !llvm.loop !19

439:                                              ; preds = %428
  store i32 0, ptr %37, align 4, !tbaa !11
  br label %440

440:                                              ; preds = %448, %439
  %441 = load i32, ptr %37, align 4, !tbaa !11
  %442 = icmp ult i32 %441, 3
  br i1 %442, label %443, label %451

443:                                              ; preds = %440
  %444 = load i32, ptr %37, align 4, !tbaa !11
  %445 = zext i32 %444 to i64
  %446 = getelementptr inbounds [3 x ptr], ptr %42, i64 0, i64 %445
  %447 = load ptr, ptr %446, align 8, !tbaa !9
  call void @free(ptr noundef %447) #5
  br label %448

448:                                              ; preds = %443
  %449 = load i32, ptr %37, align 4, !tbaa !11
  %450 = add i32 %449, 1
  store i32 %450, ptr %37, align 4, !tbaa !11
  br label %440, !llvm.loop !20

451:                                              ; preds = %440
  %452 = load double, ptr %31, align 8, !tbaa !5
  %453 = load double, ptr %17, align 8, !tbaa !5
  %454 = fdiv double %452, %453
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %47) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %46) #5
  call void @llvm.lifetime.end.p0(i64 2488, ptr %45) #5
  call void @llvm.lifetime.end.p0(i64 2488, ptr %44) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %43) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %41) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %39) #5
  call void @llvm.lifetime.end.p0(i64 32, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 2488, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 2488, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 16, ptr %29) #5
  ret double %454
}

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

!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 = !{!"double", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = distinct !{!15, !14}
!16 = distinct !{!16, !14}
!17 = distinct !{!17, !14}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @pow(double noundef, double noundef) local_unnamed_addr #1

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

; 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 nofree nounwind willreturn memory(write)
declare double @exp(double noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
declare dso_local void @interpolate_rates(ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
declare dso_local void @populateTS_2photon(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, double noundef, double noundef, double noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef) local_unnamed_addr #3

declare ptr @create_1D_array(i32 noundef) local_unnamed_addr #4

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

; Function Attrs: nounwind uwtable
declare dso_local void @solve_real_virt(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
declare dso_local void @fplus_from_fminus(ptr noundef, ptr noundef, ptr noundef, ptr noundef, double noundef, double noundef, double noundef, i32 noundef, double noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local double @rec_HMLA_2photon_dxedlna(double noundef %0, double noundef %1, double noundef %2, double noundef %3, double noundef %4, ptr noundef %5, ptr noundef %6, double noundef %7, double noundef %8, ptr noundef %9, ptr noundef %10, i32 noundef %11, double noundef %12, double noundef %13) local_unnamed_addr #3 {
.preheader101.preheader:
  %14 = alloca [2 x double], align 16
  %15 = alloca [311 x double], align 16
  %16 = alloca [311 x double], align 16
  %17 = alloca [3 x double], align 16
  %18 = alloca [2 x [2 x double]], align 16
  %19 = alloca [2 x ptr], align 16
  %20 = alloca [2 x ptr], align 16
  %21 = alloca [3 x ptr], align 16
  %22 = alloca [2 x double], align 16
  %23 = alloca [311 x double], align 16
  %24 = alloca [311 x double], align 16
  %25 = alloca [2 x double], align 16
  %26 = alloca [2 x double], align 16
  %27 = alloca double, align 8
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %14) #6
  call void @llvm.lifetime.start.p0(i64 2488, ptr nonnull %15) #6
  call void @llvm.lifetime.start.p0(i64 2488, ptr nonnull %16) #6
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %17) #6
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %18) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %19) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %20) #6
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %21) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %22) #6
  call void @llvm.lifetime.start.p0(i64 2488, ptr nonnull %23) #6
  call void @llvm.lifetime.start.p0(i64 2488, ptr nonnull %24) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %25) #6
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %26) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %27) #6
  %28 = tail call ptr @create_1D_array(i32 noundef 311) #6
  store ptr %28, ptr %19, align 16, !tbaa !5
  %29 = tail call ptr @create_1D_array(i32 noundef 311) #6
  %30 = getelementptr inbounds i8, ptr %19, i64 8
  store ptr %29, ptr %30, align 8, !tbaa !5
  %31 = tail call ptr @create_1D_array(i32 noundef 311) #6
  store ptr %31, ptr %20, align 16, !tbaa !5
  %32 = tail call ptr @create_1D_array(i32 noundef 311) #6
  %33 = getelementptr inbounds i8, ptr %20, i64 8
  store ptr %32, ptr %33, align 8, !tbaa !5
  %34 = tail call ptr @create_1D_array(i32 noundef 311) #6
  store ptr %34, ptr %21, align 16, !tbaa !5
  %35 = tail call ptr @create_1D_array(i32 noundef 311) #6
  %36 = getelementptr inbounds i8, ptr %21, i64 8
  store ptr %35, ptr %36, align 8, !tbaa !5
  %37 = tail call ptr @create_1D_array(i32 noundef 311) #6
  %38 = getelementptr inbounds i8, ptr %21, i64 16
  store ptr %37, ptr %38, align 16, !tbaa !5
  call void @fplus_from_fminus(ptr noundef nonnull %16, ptr noundef nonnull %17, ptr noundef %9, ptr noundef %10, double noundef %4, double noundef %7, double noundef %8, i32 noundef %11, double noundef %12, ptr noundef %6)
  call void @populateTS_2photon(ptr noundef nonnull %18, ptr noundef nonnull %19, ptr noundef nonnull %20, ptr noundef nonnull %21, ptr noundef nonnull %22, ptr noundef nonnull %23, ptr noundef nonnull %24, double noundef %0, double noundef %3, double noundef %4, double noundef %1, double noundef %2, ptr noundef %5, ptr noundef %6, ptr noundef nonnull %16, ptr noundef nonnull %17, ptr noundef nonnull %25, ptr noundef nonnull %26, double noundef %12)
  call void @solve_real_virt(ptr noundef nonnull %14, ptr noundef nonnull %15, ptr noundef nonnull %18, ptr noundef nonnull %19, ptr noundef nonnull %20, ptr noundef nonnull %21, ptr noundef nonnull %22, ptr noundef nonnull %23)
  %39 = fsub double 1.000000e+00, %0
  %40 = fdiv double %3, %4
  call void @interpolate_rates(ptr noundef nonnull %25, ptr noundef nonnull %26, ptr noundef nonnull %27, double noundef %4, double noundef %40, ptr noundef %5)
  %41 = load double, ptr %26, align 16, !tbaa !9
  %42 = load double, ptr %27, align 8, !tbaa !9
  %43 = getelementptr inbounds i8, ptr %26, i64 8
  %44 = load double, ptr %43, align 8, !tbaa !9
  %45 = fcmp olt double %0, 1.000000e+00
  br i1 %45, label %46, label %51

46:                                               ; preds = %.preheader101.preheader
  %47 = call double @pow(double noundef %0, double noundef 4.639290e-01) #6
  %48 = fsub double 1.000000e+00, %47
  %49 = call double @pow(double noundef %48, double noundef 1.702370e+00) #6
  %50 = fmul double %49, 3.692020e-01
  %.pre = load double, ptr %26, align 16, !tbaa !9
  %.pre124 = load double, ptr %43, align 8, !tbaa !9
  br label %51

51:                                               ; preds = %.preheader101.preheader, %46
  %52 = phi double [ %.pre124, %46 ], [ %44, %.preheader101.preheader ]
  %53 = phi double [ %.pre, %46 ], [ %41, %.preheader101.preheader ]
  %.0 = phi double [ %50, %46 ], [ 0.000000e+00, %.preheader101.preheader ]
  %54 = load double, ptr %25, align 16, !tbaa !9
  %55 = getelementptr inbounds i8, ptr %25, i64 8
  %56 = load double, ptr %55, align 8, !tbaa !9
  %57 = load double, ptr %14, align 16, !tbaa !9
  %58 = getelementptr inbounds i8, ptr %14, i64 8
  %59 = load double, ptr %58, align 8, !tbaa !9
  %60 = zext i32 %11 to i64
  %61 = getelementptr inbounds i8, ptr %15, i64 2472
  %62 = getelementptr inbounds i8, ptr %15, i64 8
  br label %63

63:                                               ; preds = %51, %132
  %indvars.iv = phi i64 [ 0, %51 ], [ %indvars.iv.next, %132 ]
  %64 = getelementptr inbounds [311 x double], ptr %24, i64 0, i64 %indvars.iv
  %65 = load double, ptr %64, align 8, !tbaa !9
  %66 = fcmp une double %65, 0.000000e+00
  br i1 %66, label %67, label %129

67:                                               ; preds = %63
  %68 = fneg double %65
  %69 = call double @exp(double noundef %68) #6
  %70 = fsub double 1.000000e+00, %69
  %71 = load double, ptr %64, align 8, !tbaa !9
  %72 = fdiv double %70, %71
  %73 = load double, ptr %14, align 16, !tbaa !9
  %74 = fneg double %73
  %75 = load ptr, ptr %20, align 16, !tbaa !5
  %76 = getelementptr inbounds double, ptr %75, i64 %indvars.iv
  %77 = load double, ptr %76, align 8, !tbaa !9
  %78 = load double, ptr %58, align 8, !tbaa !9
  %79 = load ptr, ptr %33, align 8, !tbaa !5
  %80 = getelementptr inbounds double, ptr %79, i64 %indvars.iv
  %81 = load double, ptr %80, align 8, !tbaa !9
  %82 = fneg double %78
  %83 = fmul double %81, %82
  %84 = call double @llvm.fmuladd.f64(double %74, double %77, double %83)
  %85 = trunc nuw nsw i64 %indvars.iv to i32
  switch i32 %85, label %97 [
    i32 0, label %86
    i32 310, label %91
  ]

86:                                               ; preds = %67
  %87 = load double, ptr %62, align 8, !tbaa !9
  %88 = load ptr, ptr %38, align 16, !tbaa !5
  %89 = load double, ptr %88, align 8, !tbaa !9
  %90 = fmul double %87, %89
  br label %112

91:                                               ; preds = %67
  %92 = load double, ptr %61, align 8, !tbaa !9
  %93 = load ptr, ptr %36, align 8, !tbaa !5
  %94 = getelementptr inbounds i8, ptr %93, i64 2480
  %95 = load double, ptr %94, align 8, !tbaa !9
  %96 = fmul double %92, %95
  br label %112

97:                                               ; preds = %67
  %98 = add nuw nsw i64 %indvars.iv, 1
  %99 = getelementptr inbounds [311 x double], ptr %15, i64 0, i64 %98
  %100 = load double, ptr %99, align 8, !tbaa !9
  %101 = load ptr, ptr %38, align 16, !tbaa !5
  %102 = getelementptr inbounds double, ptr %101, i64 %indvars.iv
  %103 = load double, ptr %102, align 8, !tbaa !9
  %104 = add nsw i64 %indvars.iv, -1
  %105 = getelementptr inbounds [311 x double], ptr %15, i64 0, i64 %104
  %106 = load double, ptr %105, align 8, !tbaa !9
  %107 = load ptr, ptr %36, align 8, !tbaa !5
  %108 = getelementptr inbounds double, ptr %107, i64 %indvars.iv
  %109 = load double, ptr %108, align 8, !tbaa !9
  %110 = fmul double %106, %109
  %111 = call double @llvm.fmuladd.f64(double %100, double %103, double %110)
  br label %112

112:                                              ; preds = %91, %97, %86
  %113 = phi double [ %90, %86 ], [ %96, %91 ], [ %111, %97 ]
  %114 = fsub double %84, %113
  %115 = fsub double 1.000000e+00, %72
  %116 = fmul double %39, %115
  %117 = load ptr, ptr %21, align 16, !tbaa !5
  %118 = getelementptr inbounds double, ptr %117, i64 %indvars.iv
  %119 = load double, ptr %118, align 8, !tbaa !9
  %120 = fmul double %116, %119
  %121 = fdiv double %114, %120
  %122 = getelementptr inbounds [311 x double], ptr %16, i64 0, i64 %indvars.iv
  %123 = load double, ptr %122, align 8, !tbaa !9
  %124 = fsub double %121, %123
  %125 = fneg double %71
  %126 = call double @exp(double noundef %125) #6
  %127 = fsub double 1.000000e+00, %126
  %128 = call double @llvm.fmuladd.f64(double %124, double %127, double %123)
  br label %132

129:                                              ; preds = %63
  %130 = getelementptr inbounds [311 x double], ptr %16, i64 0, i64 %indvars.iv
  %131 = load double, ptr %130, align 8, !tbaa !9
  br label %132

132:                                              ; preds = %112, %129
  %.sink128 = phi double [ %128, %112 ], [ %131, %129 ]
  %133 = call double @log(double noundef %.sink128) #6
  %134 = getelementptr inbounds ptr, ptr %9, i64 %indvars.iv
  %135 = load ptr, ptr %134, align 8, !tbaa !5
  %136 = getelementptr inbounds double, ptr %135, i64 %60
  store double %133, ptr %136, align 8, !tbaa !9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 311
  br i1 %exitcond.not, label %.preheader99.preheader, label %63, !llvm.loop !11

.preheader99.preheader:                           ; preds = %132
  %137 = load double, ptr %58, align 8, !tbaa !9
  %138 = fdiv double %137, 3.000000e+00
  %139 = fdiv double %138, %39
  %140 = call double @log(double noundef %139) #6
  %141 = load ptr, ptr %10, align 8, !tbaa !5
  %142 = getelementptr inbounds double, ptr %141, i64 %60
  store double %140, ptr %142, align 8, !tbaa !9
  %143 = load double, ptr %14, align 16, !tbaa !9
  %144 = fdiv double %143, %39
  %145 = call double @log(double noundef %144) #6
  %146 = fdiv double 0x3FFE37E9F25A4877, %4
  %147 = fsub double %145, %146
  %148 = getelementptr inbounds i8, ptr %10, i64 8
  %149 = load ptr, ptr %148, align 8, !tbaa !5
  %150 = getelementptr inbounds double, ptr %149, i64 %60
  store double %147, ptr %150, align 8, !tbaa !9
  %151 = load double, ptr %14, align 16, !tbaa !9
  %152 = fdiv double %151, %39
  %153 = call double @log(double noundef %152) #6
  %154 = fdiv double 0x400465BDE9FCF0EC, %4
  %155 = fsub double %153, %154
  %156 = getelementptr inbounds i8, ptr %10, i64 16
  %157 = load ptr, ptr %156, align 8, !tbaa !5
  %158 = getelementptr inbounds double, ptr %157, i64 %60
  store double %155, ptr %158, align 8, !tbaa !9
  %159 = load ptr, ptr %19, align 16, !tbaa !5
  call void @free(ptr noundef %159) #6
  %160 = load ptr, ptr %30, align 8, !tbaa !5
  call void @free(ptr noundef %160) #6
  %161 = load ptr, ptr %20, align 16, !tbaa !5
  call void @free(ptr noundef %161) #6
  %162 = load ptr, ptr %33, align 8, !tbaa !5
  call void @free(ptr noundef %162) #6
  %163 = load ptr, ptr %21, align 16, !tbaa !5
  call void @free(ptr noundef %163) #6
  %164 = load ptr, ptr %36, align 8, !tbaa !5
  call void @free(ptr noundef %164) #6
  %165 = load ptr, ptr %38, align 16, !tbaa !5
  call void @free(ptr noundef %165) #6
  %166 = fdiv double %.0, %1
  %167 = fmul double %166, %13
  %168 = fmul double %2, 0x433090E1CA8B9039
  %169 = fdiv double %168, %1
  %170 = fdiv double %169, %39
  %171 = fmul double %42, 8.220600e+00
  %172 = call double @llvm.fmuladd.f64(double %42, double 3.000000e+00, double %41)
  %173 = fadd double %172, 8.220600e+00
  %174 = fdiv double %171, %173
  %175 = fadd double %170, %174
  %176 = fadd double %42, %44
  %177 = fadd double %170, %176
  %178 = fmul double %42, 3.000000e+00
  %179 = fmul double %42, %178
  %180 = fdiv double %179, %173
  %181 = fsub double %177, %180
  %182 = fdiv double %175, %181
  %183 = fsub double 1.000000e+00, %182
  %184 = fdiv double %183, 0x402465BDE9FCF0EC
  %185 = fadd double %184, 0x3FB2D36E4F11087F
  %186 = fneg double %1
  %187 = fmul double %186, %0
  %188 = fmul double %187, %0
  %189 = fadd double %54, %56
  %190 = fmul double %57, %53
  %191 = call double @llvm.fmuladd.f64(double %188, double %189, double %190)
  %192 = call double @llvm.fmuladd.f64(double %59, double %52, double %191)
  %193 = call double @llvm.fmuladd.f64(double %167, double %185, double %192)
  %194 = fdiv double %193, %2
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %27) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %26) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %25) #6
  call void @llvm.lifetime.end.p0(i64 2488, ptr nonnull %24) #6
  call void @llvm.lifetime.end.p0(i64 2488, ptr nonnull %23) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %22) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %21) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %20) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %19) #6
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %18) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %17) #6
  call void @llvm.lifetime.end.p0(i64 2488, ptr nonnull %16) #6
  call void @llvm.lifetime.end.p0(i64 2488, ptr nonnull %15) #6
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %14) #6
  ret double %194
}

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { 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 #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 = { 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 #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 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopRotatePass,LoopSimplifyPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass