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

; 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.recombination = type { i32, i32, i32, i32, i32, i32, i32, i32, ptr, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i16, double, double, double, double, double, double, double }
%struct.reionization = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, i32, i32 }
%struct.thermo = type { double, i32, i32, i32, double, double, i16, i16, double, double, double, double, i32, ptr, ptr, double, i32, ptr, ptr, double, i32, ptr, ptr, double, i16, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i16, i16, i16, [2048 x i8] }
%struct.background = type { double, double, double, double, double, double, double, i32, double, double, double, double, i16, double, double, double, double, double, double, double, double, double, i16, double, double, ptr, i32, i32, double, i32, ptr, ptr, double, ptr, double, ptr, double, ptr, double, ptr, ptr, ptr, double, double, double, double, i32, ptr, double, double, double, double, double, double, double, double, double, double, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i16, i16, i16, i16, i16, i16, [2048 x i8], i16, [2048 x i8] }
%struct.precision = type { double, double, double, double, double, double, double, double, double, double, double, double, double, [256 x i8], double, i32, double, i32, i32, double, i32, 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, i32, [256 x i8], [256 x i8], [256 x i8], double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i32, double, double, i32, i32, i32, i32, i32, i32, i32, i32, double, double, double, double, double, double, double, double, i32, double, double, i32, double, double, i32, double, i32, double, double, i32, double, double, double, i32, double, double, double, double, double, i32, double, double, double, double, double, double, 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, i32, double, double, double, double, i32, double, double, i32, i32, i32, double, double, [2048 x i8] }

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [44 x i8], align 1
@__func__.thermodynamics_init = external hidden unnamed_addr constant [20 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [102 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [81 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [79 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [296 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [256 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [168 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [196 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [176 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [209 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [175 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [205 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [119 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [176 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [200 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [167 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [194 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [191 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [161 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [185 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [77 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [143 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [206 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [91 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [150 x i8], align 1
@.str.67 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.68 = external hidden unnamed_addr constant [138 x i8], align 1
@.str.69 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.70 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.71 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.72 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.73 = external hidden unnamed_addr constant [99 x i8], align 1
@.str.74 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.75 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.76 = external hidden unnamed_addr constant [100 x i8], align 1
@.str.77 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.78 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.79 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.81 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.82 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.83 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.91 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.95 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.101 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [78 x i8], align 1

; 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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @thermodynamics_init(ptr noundef %0, ptr noundef %1, ptr noundef %2) #4 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca double, align 8
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  %16 = alloca %struct.recombination, align 8
  %17 = alloca %struct.reionization, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca double, align 8
  %21 = alloca double, align 8
  %22 = alloca double, align 8
  %23 = alloca i32, align 4
  %24 = alloca double, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca double, align 8
  %31 = alloca double, align 8
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca double, align 8
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca double, align 8
  %42 = alloca [2048 x i8], align 16
  %43 = alloca i32, align 4
  %44 = alloca [2048 x i8], align 16
  %45 = alloca [2048 x i8], align 16
  %46 = alloca [2048 x i8], align 16
  %47 = alloca [2048 x i8], align 16
  %48 = alloca [2048 x i8], align 16
  %49 = alloca [2048 x i8], align 16
  %50 = alloca [2048 x i8], align 16
  %51 = alloca [2048 x i8], align 16
  %52 = alloca [2048 x i8], align 16
  %53 = alloca [2048 x i8], align 16
  %54 = alloca [2048 x i8], align 16
  %55 = alloca [2048 x i8], align 16
  %56 = alloca [2048 x i8], align 16
  %57 = alloca [2048 x i8], align 16
  %58 = alloca [2048 x i8], align 16
  %59 = alloca [2048 x i8], align 16
  %60 = alloca [2048 x i8], align 16
  %61 = alloca [2048 x i8], align 16
  %62 = alloca [2048 x i8], align 16
  %63 = alloca [2048 x i8], align 16
  %64 = alloca [2048 x i8], align 16
  %65 = alloca [2048 x i8], align 16
  %66 = alloca [2048 x i8], align 16
  %67 = alloca [2048 x i8], align 16
  %68 = alloca [2048 x i8], align 16
  %69 = alloca [2048 x i8], align 16
  %70 = alloca [2048 x i8], align 16
  %71 = alloca [2048 x i8], align 16
  %72 = alloca [2048 x i8], align 16
  %73 = alloca i32, align 4
  %74 = alloca [2048 x i8], align 16
  %75 = alloca [2048 x i8], align 16
  %76 = alloca [2048 x i8], align 16
  %77 = alloca [2048 x i8], align 16
  %78 = alloca i32, align 4
  %79 = alloca [2048 x i8], align 16
  %80 = alloca [2048 x i8], align 16
  %81 = alloca [2048 x i8], align 16
  %82 = alloca [2048 x i8], align 16
  %83 = alloca [2048 x i8], align 16
  %84 = alloca [2048 x i8], align 16
  %85 = alloca [2048 x i8], align 16
  %86 = alloca [2048 x i8], align 16
  %87 = alloca [2048 x i8], align 16
  %88 = alloca i32, align 4
  %89 = alloca [2048 x i8], align 16
  %90 = alloca [2048 x i8], align 16
  %91 = alloca [2048 x i8], align 16
  %92 = alloca [2048 x i8], align 16
  %93 = alloca [2048 x i8], align 16
  %94 = alloca [2048 x i8], align 16
  %95 = alloca [2048 x i8], align 16
  %96 = alloca [2048 x i8], align 16
  %97 = alloca [2048 x i8], align 16
  %98 = alloca [2048 x i8], align 16
  %99 = alloca [2048 x i8], align 16
  %100 = alloca [2048 x i8], align 16
  %101 = alloca [2048 x i8], align 16
  %102 = alloca [2048 x i8], align 16
  %103 = alloca [2048 x i8], align 16
  %104 = alloca [2048 x i8], align 16
  %105 = alloca [2048 x i8], align 16
  %106 = alloca [2048 x i8], align 16
  %107 = alloca [2048 x i8], align 16
  %108 = alloca [2048 x i8], align 16
  %109 = alloca [2048 x i8], align 16
  %110 = alloca [2048 x i8], align 16
  %111 = alloca [2048 x i8], align 16
  %112 = alloca [2048 x i8], align 16
  %113 = alloca [2048 x i8], align 16
  %114 = alloca [2048 x i8], align 16
  %115 = alloca [2048 x i8], align 16
  %116 = alloca [2048 x i8], align 16
  %117 = alloca [2048 x i8], align 16
  %118 = alloca [2048 x i8], align 16
  %119 = alloca [2048 x i8], align 16
  %120 = alloca [2048 x i8], align 16
  %121 = alloca [2048 x i8], align 16
  %122 = alloca [2048 x i8], align 16
  %123 = alloca [2048 x i8], align 16
  %124 = alloca [2048 x i8], align 16
  %125 = alloca [2048 x i8], align 16
  %126 = alloca [2048 x i8], align 16
  %127 = alloca [2048 x i8], align 16
  %128 = alloca [2048 x i8], align 16
  %129 = alloca [2048 x i8], align 16
  %130 = alloca [2048 x i8], align 16
  %131 = alloca [2048 x i8], align 16
  %132 = alloca [2048 x i8], align 16
  %133 = alloca [2048 x i8], align 16
  %134 = alloca [2048 x i8], align 16
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.start.p0(i64 264, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 128, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #6
  store double 0.000000e+00, ptr %37, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #6
  %135 = load ptr, ptr %7, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.thermo, ptr %135, i32 0, i32 92
  %137 = load i16, ptr %136, align 4, !tbaa !11
  %138 = sext i16 %137 to i32
  %139 = icmp sgt i32 %138, 0
  br i1 %139, label %140, label %142

140:                                              ; preds = %3
  %141 = call i32 (ptr, ...) @printf(ptr noundef @.str.5)
  br label %142

142:                                              ; preds = %140, %3
  %143 = load ptr, ptr %7, align 8, !tbaa !5
  %144 = getelementptr inbounds %struct.thermo, ptr %143, i32 0, i32 0
  %145 = load double, ptr %144, align 8, !tbaa !15
  %146 = fcmp oeq double %145, -1.000000e+00
  br i1 %146, label %147, label %174

147:                                              ; preds = %142
  %148 = load ptr, ptr %5, align 8, !tbaa !5
  %149 = load ptr, ptr %6, align 8, !tbaa !5
  %150 = load ptr, ptr %7, align 8, !tbaa !5
  %151 = call i32 @thermodynamics_helium_from_bbn(ptr noundef %148, ptr noundef %149, ptr noundef %150)
  %152 = icmp eq i32 %151, 1
  br i1 %152, label %153, label %162

153:                                              ; preds = %147
  call void @llvm.lifetime.start.p0(i64 2048, ptr %42) #6
  %154 = getelementptr inbounds [2048 x i8], ptr %42, i64 0, i64 0
  %155 = load ptr, ptr %7, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.thermo, ptr %155, i32 0, i32 93
  %157 = getelementptr inbounds [2048 x i8], ptr %156, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %154, ptr noundef @.str, ptr noundef @.str.6, ptr noundef %157)
  %158 = load ptr, ptr %7, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.thermo, ptr %158, i32 0, i32 93
  %160 = getelementptr inbounds [2048 x i8], ptr %159, i64 0, i64 0
  %161 = getelementptr inbounds [2048 x i8], ptr %42, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %160, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 341, ptr noundef %161)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %42) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

162:                                              ; preds = %147
  %163 = load ptr, ptr %7, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.thermo, ptr %163, i32 0, i32 92
  %165 = load i16, ptr %164, align 4, !tbaa !11
  %166 = sext i16 %165 to i32
  %167 = icmp sgt i32 %166, 0
  br i1 %167, label %168, label %173

168:                                              ; preds = %162
  %169 = load ptr, ptr %7, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.thermo, ptr %169, i32 0, i32 0
  %171 = load double, ptr %170, align 8, !tbaa !15
  %172 = call i32 (ptr, ...) @printf(ptr noundef @.str.7, double noundef %171)
  br label %173

173:                                              ; preds = %168, %162
  br label %183

174:                                              ; preds = %142
  %175 = load ptr, ptr %7, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.thermo, ptr %175, i32 0, i32 92
  %177 = load i16, ptr %176, align 4, !tbaa !11
  %178 = sext i16 %177 to i32
  %179 = icmp sgt i32 %178, 0
  br i1 %179, label %180, label %182

180:                                              ; preds = %174
  %181 = call i32 (ptr, ...) @printf(ptr noundef @.str.8)
  br label %182

182:                                              ; preds = %180, %174
  br label %183

183:                                              ; preds = %182, %173
  %184 = load ptr, ptr %7, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.thermo, ptr %184, i32 0, i32 0
  %186 = load double, ptr %185, align 8, !tbaa !15
  %187 = fcmp olt double %186, 1.000000e-02
  br i1 %187, label %193, label %188

188:                                              ; preds = %183
  %189 = load ptr, ptr %7, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.thermo, ptr %189, i32 0, i32 0
  %191 = load double, ptr %190, align 8, !tbaa !15
  %192 = fcmp ogt double %191, 5.000000e-01
  br i1 %192, label %193, label %204

193:                                              ; preds = %188, %183
  call void @llvm.lifetime.start.p0(i64 2048, ptr %44) #6
  %194 = getelementptr inbounds [2048 x i8], ptr %44, i64 0, i64 0
  %195 = load ptr, ptr %7, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.thermo, ptr %195, i32 0, i32 0
  %197 = load double, ptr %196, align 8, !tbaa !15
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %194, ptr noundef @.str.9, double noundef %197, double noundef 1.000000e-02, double noundef 5.000000e-01)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %45) #6
  %198 = getelementptr inbounds [2048 x i8], ptr %45, i64 0, i64 0
  %199 = getelementptr inbounds [2048 x i8], ptr %44, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %198, ptr noundef @.str.10, ptr noundef @.str.11, ptr noundef %199)
  %200 = load ptr, ptr %7, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.thermo, ptr %200, i32 0, i32 93
  %202 = getelementptr inbounds [2048 x i8], ptr %201, i64 0, i64 0
  %203 = getelementptr inbounds [2048 x i8], ptr %45, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %202, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 352, ptr noundef %203)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %45) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %44) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

204:                                              ; preds = %188
  %205 = load ptr, ptr %7, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.thermo, ptr %205, i32 0, i32 23
  %207 = load double, ptr %206, align 8, !tbaa !16
  %208 = fcmp olt double %207, 0.000000e+00
  br i1 %208, label %209, label %217

209:                                              ; preds = %204
  call void @llvm.lifetime.start.p0(i64 2048, ptr %46) #6
  %210 = getelementptr inbounds [2048 x i8], ptr %46, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %210, ptr noundef @.str.12)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %47) #6
  %211 = getelementptr inbounds [2048 x i8], ptr %47, i64 0, i64 0
  %212 = getelementptr inbounds [2048 x i8], ptr %46, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %211, ptr noundef @.str.10, ptr noundef @.str.13, ptr noundef %212)
  %213 = load ptr, ptr %7, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.thermo, ptr %213, i32 0, i32 93
  %215 = getelementptr inbounds [2048 x i8], ptr %214, i64 0, i64 0
  %216 = getelementptr inbounds [2048 x i8], ptr %47, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %215, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 358, ptr noundef %216)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %47) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %46) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

217:                                              ; preds = %204
  %218 = load ptr, ptr %7, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.thermo, ptr %218, i32 0, i32 23
  %220 = load double, ptr %219, align 8, !tbaa !16
  %221 = fcmp ogt double %220, 1.000000e-04
  br i1 %221, label %222, label %233

222:                                              ; preds = %217
  call void @llvm.lifetime.start.p0(i64 2048, ptr %48) #6
  %223 = getelementptr inbounds [2048 x i8], ptr %48, i64 0, i64 0
  %224 = load ptr, ptr %7, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.thermo, ptr %224, i32 0, i32 23
  %226 = load double, ptr %225, align 8, !tbaa !16
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %223, ptr noundef @.str.14, double noundef %226)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %49) #6
  %227 = getelementptr inbounds [2048 x i8], ptr %49, i64 0, i64 0
  %228 = getelementptr inbounds [2048 x i8], ptr %48, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %227, ptr noundef @.str.10, ptr noundef @.str.15, ptr noundef %228)
  %229 = load ptr, ptr %7, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.thermo, ptr %229, i32 0, i32 93
  %231 = getelementptr inbounds [2048 x i8], ptr %230, i64 0, i64 0
  %232 = getelementptr inbounds [2048 x i8], ptr %49, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %231, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 363, ptr noundef %232)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %49) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %48) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

233:                                              ; preds = %217
  %234 = load ptr, ptr %7, align 8, !tbaa !5
  %235 = getelementptr inbounds %struct.thermo, ptr %234, i32 0, i32 26
  %236 = load double, ptr %235, align 8, !tbaa !17
  %237 = fcmp ogt double %236, 0.000000e+00
  br i1 %237, label %238, label %246

238:                                              ; preds = %233
  call void @llvm.lifetime.start.p0(i64 2048, ptr %50) #6
  %239 = getelementptr inbounds [2048 x i8], ptr %50, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %239, ptr noundef @.str.16)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %51) #6
  %240 = getelementptr inbounds [2048 x i8], ptr %51, i64 0, i64 0
  %241 = getelementptr inbounds [2048 x i8], ptr %50, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %240, ptr noundef @.str.10, ptr noundef @.str.17, ptr noundef %241)
  %242 = load ptr, ptr %7, align 8, !tbaa !5
  %243 = getelementptr inbounds %struct.thermo, ptr %242, i32 0, i32 93
  %244 = getelementptr inbounds [2048 x i8], ptr %243, i64 0, i64 0
  %245 = getelementptr inbounds [2048 x i8], ptr %51, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %244, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 367, ptr noundef %245)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %51) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %50) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

246:                                              ; preds = %233
  %247 = load ptr, ptr %7, align 8, !tbaa !5
  %248 = getelementptr inbounds %struct.thermo, ptr %247, i32 0, i32 27
  %249 = load double, ptr %248, align 8, !tbaa !18
  %250 = fcmp olt double %249, 0.000000e+00
  br i1 %250, label %251, label %259

251:                                              ; preds = %246
  call void @llvm.lifetime.start.p0(i64 2048, ptr %52) #6
  %252 = getelementptr inbounds [2048 x i8], ptr %52, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %252, ptr noundef @.str.18)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %53) #6
  %253 = getelementptr inbounds [2048 x i8], ptr %53, i64 0, i64 0
  %254 = getelementptr inbounds [2048 x i8], ptr %52, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %253, ptr noundef @.str.10, ptr noundef @.str.19, ptr noundef %254)
  %255 = load ptr, ptr %7, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.thermo, ptr %255, i32 0, i32 93
  %257 = getelementptr inbounds [2048 x i8], ptr %256, i64 0, i64 0
  %258 = getelementptr inbounds [2048 x i8], ptr %53, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %257, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 371, ptr noundef %258)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %53) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %52) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

259:                                              ; preds = %246
  %260 = load ptr, ptr %7, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.thermo, ptr %260, i32 0, i32 29
  %262 = load double, ptr %261, align 8, !tbaa !19
  %263 = fcmp olt double %262, 0.000000e+00
  br i1 %263, label %264, label %272

264:                                              ; preds = %259
  call void @llvm.lifetime.start.p0(i64 2048, ptr %54) #6
  %265 = getelementptr inbounds [2048 x i8], ptr %54, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %265, ptr noundef @.str.18)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %55) #6
  %266 = getelementptr inbounds [2048 x i8], ptr %55, i64 0, i64 0
  %267 = getelementptr inbounds [2048 x i8], ptr %54, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %266, ptr noundef @.str.10, ptr noundef @.str.20, ptr noundef %267)
  %268 = load ptr, ptr %7, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.thermo, ptr %268, i32 0, i32 93
  %270 = getelementptr inbounds [2048 x i8], ptr %269, i64 0, i64 0
  %271 = getelementptr inbounds [2048 x i8], ptr %55, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %270, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 375, ptr noundef %271)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %55) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %54) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

272:                                              ; preds = %259
  %273 = load ptr, ptr %7, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.thermo, ptr %273, i32 0, i32 28
  %275 = load double, ptr %274, align 8, !tbaa !20
  %276 = fcmp olt double %275, 0.000000e+00
  br i1 %276, label %277, label %285

277:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 2048, ptr %56) #6
  %278 = getelementptr inbounds [2048 x i8], ptr %56, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %278, ptr noundef @.str.18)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %57) #6
  %279 = getelementptr inbounds [2048 x i8], ptr %57, i64 0, i64 0
  %280 = getelementptr inbounds [2048 x i8], ptr %56, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %279, ptr noundef @.str.10, ptr noundef @.str.21, ptr noundef %280)
  %281 = load ptr, ptr %7, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.thermo, ptr %281, i32 0, i32 93
  %283 = getelementptr inbounds [2048 x i8], ptr %282, i64 0, i64 0
  %284 = getelementptr inbounds [2048 x i8], ptr %57, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %283, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 379, ptr noundef %284)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %57) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %56) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

285:                                              ; preds = %272
  %286 = load ptr, ptr %7, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.thermo, ptr %286, i32 0, i32 23
  %288 = load double, ptr %287, align 8, !tbaa !16
  %289 = fcmp ogt double %288, 0.000000e+00
  br i1 %289, label %290, label %310

290:                                              ; preds = %285
  %291 = load ptr, ptr %6, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.background, ptr %291, i32 0, i32 119
  %293 = load i16, ptr %292, align 4, !tbaa !21
  %294 = sext i16 %293 to i32
  %295 = icmp eq i32 %294, 0
  br i1 %295, label %296, label %310

296:                                              ; preds = %290
  %297 = load ptr, ptr %6, align 8, !tbaa !5
  %298 = getelementptr inbounds %struct.background, ptr %297, i32 0, i32 128
  %299 = load i16, ptr %298, align 2, !tbaa !23
  %300 = sext i16 %299 to i32
  %301 = icmp eq i32 %300, 0
  br i1 %301, label %302, label %310

302:                                              ; preds = %296
  call void @llvm.lifetime.start.p0(i64 2048, ptr %58) #6
  %303 = getelementptr inbounds [2048 x i8], ptr %58, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %303, ptr noundef @.str.22)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %59) #6
  %304 = getelementptr inbounds [2048 x i8], ptr %59, i64 0, i64 0
  %305 = getelementptr inbounds [2048 x i8], ptr %58, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %304, ptr noundef @.str.10, ptr noundef @.str.23, ptr noundef %305)
  %306 = load ptr, ptr %7, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.thermo, ptr %306, i32 0, i32 93
  %308 = getelementptr inbounds [2048 x i8], ptr %307, i64 0, i64 0
  %309 = getelementptr inbounds [2048 x i8], ptr %59, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %308, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 383, ptr noundef %309)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %59) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %58) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

310:                                              ; preds = %296, %290, %285
  %311 = load ptr, ptr %7, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.thermo, ptr %311, i32 0, i32 30
  %313 = load double, ptr %312, align 8, !tbaa !24
  %314 = fcmp ogt double %313, 0.000000e+00
  br i1 %314, label %315, label %328

315:                                              ; preds = %310
  %316 = load ptr, ptr %7, align 8, !tbaa !5
  %317 = getelementptr inbounds %struct.thermo, ptr %316, i32 0, i32 1
  %318 = load i32, ptr %317, align 8, !tbaa !25
  %319 = icmp eq i32 %318, 0
  br i1 %319, label %320, label %328

320:                                              ; preds = %315
  call void @llvm.lifetime.start.p0(i64 2048, ptr %60) #6
  %321 = getelementptr inbounds [2048 x i8], ptr %60, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %321, ptr noundef @.str.24)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %61) #6
  %322 = getelementptr inbounds [2048 x i8], ptr %61, i64 0, i64 0
  %323 = getelementptr inbounds [2048 x i8], ptr %60, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %322, ptr noundef @.str.10, ptr noundef @.str.25, ptr noundef %323)
  %324 = load ptr, ptr %7, align 8, !tbaa !5
  %325 = getelementptr inbounds %struct.thermo, ptr %324, i32 0, i32 93
  %326 = getelementptr inbounds [2048 x i8], ptr %325, i64 0, i64 0
  %327 = getelementptr inbounds [2048 x i8], ptr %61, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %326, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 387, ptr noundef %327)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %61) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %60) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

328:                                              ; preds = %315, %310
  %329 = load ptr, ptr %7, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.thermo, ptr %329, i32 0, i32 30
  %331 = load double, ptr %330, align 8, !tbaa !24
  %332 = fcmp olt double %331, 0.000000e+00
  br i1 %332, label %333, label %341

333:                                              ; preds = %328
  call void @llvm.lifetime.start.p0(i64 2048, ptr %62) #6
  %334 = getelementptr inbounds [2048 x i8], ptr %62, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %334, ptr noundef @.str.26)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %63) #6
  %335 = getelementptr inbounds [2048 x i8], ptr %63, i64 0, i64 0
  %336 = getelementptr inbounds [2048 x i8], ptr %62, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %335, ptr noundef @.str.10, ptr noundef @.str.27, ptr noundef %336)
  %337 = load ptr, ptr %7, align 8, !tbaa !5
  %338 = getelementptr inbounds %struct.thermo, ptr %337, i32 0, i32 93
  %339 = getelementptr inbounds [2048 x i8], ptr %338, i64 0, i64 0
  %340 = getelementptr inbounds [2048 x i8], ptr %63, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %339, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 391, ptr noundef %340)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %63) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %62) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

341:                                              ; preds = %328
  %342 = load ptr, ptr %7, align 8, !tbaa !5
  %343 = getelementptr inbounds %struct.thermo, ptr %342, i32 0, i32 31
  %344 = load double, ptr %343, align 8, !tbaa !26
  %345 = fcmp olt double %344, 0.000000e+00
  br i1 %345, label %346, label %354

346:                                              ; preds = %341
  call void @llvm.lifetime.start.p0(i64 2048, ptr %64) #6
  %347 = getelementptr inbounds [2048 x i8], ptr %64, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %347, ptr noundef @.str.26)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %65) #6
  %348 = getelementptr inbounds [2048 x i8], ptr %65, i64 0, i64 0
  %349 = getelementptr inbounds [2048 x i8], ptr %64, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %348, ptr noundef @.str.10, ptr noundef @.str.28, ptr noundef %349)
  %350 = load ptr, ptr %7, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.thermo, ptr %350, i32 0, i32 93
  %352 = getelementptr inbounds [2048 x i8], ptr %351, i64 0, i64 0
  %353 = getelementptr inbounds [2048 x i8], ptr %65, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %352, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 395, ptr noundef %353)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %65) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %64) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

354:                                              ; preds = %341
  %355 = load ptr, ptr %7, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.thermo, ptr %355, i32 0, i32 92
  %357 = load i16, ptr %356, align 4, !tbaa !11
  %358 = sext i16 %357 to i32
  %359 = icmp sgt i32 %358, 0
  br i1 %359, label %360, label %383

360:                                              ; preds = %354
  %361 = load ptr, ptr %7, align 8, !tbaa !5
  %362 = getelementptr inbounds %struct.thermo, ptr %361, i32 0, i32 23
  %363 = load double, ptr %362, align 8, !tbaa !16
  %364 = fcmp ogt double %363, 0.000000e+00
  br i1 %364, label %365, label %382

365:                                              ; preds = %360
  %366 = load ptr, ptr %7, align 8, !tbaa !5
  %367 = getelementptr inbounds %struct.thermo, ptr %366, i32 0, i32 2
  %368 = load i32, ptr %367, align 4, !tbaa !27
  %369 = icmp eq i32 %368, 0
  br i1 %369, label %370, label %382

370:                                              ; preds = %365
  %371 = load ptr, ptr %5, align 8, !tbaa !5
  %372 = getelementptr inbounds %struct.precision, ptr %371, i32 0, i32 20
  %373 = load i32, ptr %372, align 8, !tbaa !28
  %374 = icmp sge i32 %373, 3
  br i1 %374, label %375, label %382

375:                                              ; preds = %370
  %376 = load ptr, ptr %7, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.thermo, ptr %376, i32 0, i32 1
  %378 = load i32, ptr %377, align 8, !tbaa !25
  %379 = icmp eq i32 %378, 0
  br i1 %379, label %380, label %382

380:                                              ; preds = %375
  %381 = call i32 (ptr, ...) @printf(ptr noundef @.str.29)
  br label %382

382:                                              ; preds = %380, %375, %370, %365, %360
  br label %383

383:                                              ; preds = %382, %354
  %384 = load ptr, ptr %7, align 8, !tbaa !5
  %385 = getelementptr inbounds %struct.thermo, ptr %384, i32 0, i32 25
  %386 = load double, ptr %385, align 8, !tbaa !30
  %387 = fcmp olt double %386, 0.000000e+00
  br i1 %387, label %388, label %396

388:                                              ; preds = %383
  call void @llvm.lifetime.start.p0(i64 2048, ptr %66) #6
  %389 = getelementptr inbounds [2048 x i8], ptr %66, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %389, ptr noundef @.str.30)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %67) #6
  %390 = getelementptr inbounds [2048 x i8], ptr %67, i64 0, i64 0
  %391 = getelementptr inbounds [2048 x i8], ptr %66, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %390, ptr noundef @.str.10, ptr noundef @.str.31, ptr noundef %391)
  %392 = load ptr, ptr %7, align 8, !tbaa !5
  %393 = getelementptr inbounds %struct.thermo, ptr %392, i32 0, i32 93
  %394 = getelementptr inbounds [2048 x i8], ptr %393, i64 0, i64 0
  %395 = getelementptr inbounds [2048 x i8], ptr %67, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %394, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 403, ptr noundef %395)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %67) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %66) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

396:                                              ; preds = %383
  %397 = load ptr, ptr %7, align 8, !tbaa !5
  %398 = getelementptr inbounds %struct.thermo, ptr %397, i32 0, i32 25
  %399 = load double, ptr %398, align 8, !tbaa !30
  %400 = fcmp ogt double %399, 0.000000e+00
  br i1 %400, label %401, label %421

401:                                              ; preds = %396
  %402 = load ptr, ptr %6, align 8, !tbaa !5
  %403 = getelementptr inbounds %struct.background, ptr %402, i32 0, i32 119
  %404 = load i16, ptr %403, align 4, !tbaa !21
  %405 = sext i16 %404 to i32
  %406 = icmp eq i32 %405, 0
  br i1 %406, label %407, label %421

407:                                              ; preds = %401
  %408 = load ptr, ptr %6, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.background, ptr %408, i32 0, i32 128
  %410 = load i16, ptr %409, align 2, !tbaa !23
  %411 = sext i16 %410 to i32
  %412 = icmp eq i32 %411, 0
  br i1 %412, label %413, label %421

413:                                              ; preds = %407
  call void @llvm.lifetime.start.p0(i64 2048, ptr %68) #6
  %414 = getelementptr inbounds [2048 x i8], ptr %68, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %414, ptr noundef @.str.32)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %69) #6
  %415 = getelementptr inbounds [2048 x i8], ptr %69, i64 0, i64 0
  %416 = getelementptr inbounds [2048 x i8], ptr %68, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %415, ptr noundef @.str.10, ptr noundef @.str.33, ptr noundef %416)
  %417 = load ptr, ptr %7, align 8, !tbaa !5
  %418 = getelementptr inbounds %struct.thermo, ptr %417, i32 0, i32 93
  %419 = getelementptr inbounds [2048 x i8], ptr %418, i64 0, i64 0
  %420 = getelementptr inbounds [2048 x i8], ptr %69, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %419, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 407, ptr noundef %420)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %69) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %68) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

421:                                              ; preds = %407, %401, %396
  %422 = load ptr, ptr %7, align 8, !tbaa !5
  %423 = getelementptr inbounds %struct.thermo, ptr %422, i32 0, i32 0
  %424 = load double, ptr %423, align 8, !tbaa !15
  %425 = fcmp oeq double %424, 1.000000e+00
  br i1 %425, label %426, label %434

426:                                              ; preds = %421
  call void @llvm.lifetime.start.p0(i64 2048, ptr %70) #6
  %427 = getelementptr inbounds [2048 x i8], ptr %70, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %427, ptr noundef @.str.34)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %71) #6
  %428 = getelementptr inbounds [2048 x i8], ptr %71, i64 0, i64 0
  %429 = getelementptr inbounds [2048 x i8], ptr %70, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %428, ptr noundef @.str.10, ptr noundef @.str.35, ptr noundef %429)
  %430 = load ptr, ptr %7, align 8, !tbaa !5
  %431 = getelementptr inbounds %struct.thermo, ptr %430, i32 0, i32 93
  %432 = getelementptr inbounds [2048 x i8], ptr %431, i64 0, i64 0
  %433 = getelementptr inbounds [2048 x i8], ptr %71, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %432, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 415, ptr noundef %433)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %71) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %70) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

434:                                              ; preds = %421
  store ptr %16, ptr %18, align 8, !tbaa !5
  store ptr %17, ptr %19, align 8, !tbaa !5
  %435 = load ptr, ptr %6, align 8, !tbaa !5
  %436 = load ptr, ptr %7, align 8, !tbaa !5
  %437 = load ptr, ptr %18, align 8, !tbaa !5
  %438 = load ptr, ptr %19, align 8, !tbaa !5
  %439 = call i32 @thermodynamics_indices(ptr noundef %435, ptr noundef %436, ptr noundef %437, ptr noundef %438)
  %440 = icmp eq i32 %439, 1
  br i1 %440, label %441, label %450

441:                                              ; preds = %434
  call void @llvm.lifetime.start.p0(i64 2048, ptr %72) #6
  %442 = getelementptr inbounds [2048 x i8], ptr %72, i64 0, i64 0
  %443 = load ptr, ptr %7, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.thermo, ptr %443, i32 0, i32 93
  %445 = getelementptr inbounds [2048 x i8], ptr %444, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %442, ptr noundef @.str, ptr noundef @.str.36, ptr noundef %445)
  %446 = load ptr, ptr %7, align 8, !tbaa !5
  %447 = getelementptr inbounds %struct.thermo, ptr %446, i32 0, i32 93
  %448 = getelementptr inbounds [2048 x i8], ptr %447, i64 0, i64 0
  %449 = getelementptr inbounds [2048 x i8], ptr %72, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %448, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 426, ptr noundef %449)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %72) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

450:                                              ; preds = %434
  %451 = load ptr, ptr %6, align 8, !tbaa !5
  %452 = getelementptr inbounds %struct.background, ptr %451, i32 0, i32 99
  %453 = load i32, ptr %452, align 8, !tbaa !31
  %454 = sext i32 %453 to i64
  %455 = mul i64 %454, 8
  %456 = call noalias ptr @malloc(i64 noundef %455) #7
  store ptr %456, ptr %10, align 8, !tbaa !5
  %457 = load ptr, ptr %10, align 8, !tbaa !5
  %458 = icmp eq ptr %457, null
  br i1 %458, label %459, label %472

459:                                              ; preds = %450
  call void @llvm.lifetime.start.p0(i64 4, ptr %73) #6
  %460 = load ptr, ptr %6, align 8, !tbaa !5
  %461 = getelementptr inbounds %struct.background, ptr %460, i32 0, i32 99
  %462 = load i32, ptr %461, align 8, !tbaa !31
  %463 = sext i32 %462 to i64
  %464 = mul i64 %463, 8
  %465 = trunc i64 %464 to i32
  store i32 %465, ptr %73, align 4, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 2048, ptr %74) #6
  %466 = getelementptr inbounds [2048 x i8], ptr %74, i64 0, i64 0
  %467 = load i32, ptr %73, align 4, !tbaa !32
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %466, ptr noundef @.str.37, ptr noundef @.str.38, i32 noundef %467)
  %468 = load ptr, ptr %6, align 8, !tbaa !5
  %469 = getelementptr inbounds %struct.background, ptr %468, i32 0, i32 149
  %470 = getelementptr inbounds [2048 x i8], ptr %469, i64 0, i64 0
  %471 = getelementptr inbounds [2048 x i8], ptr %74, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %470, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 430, ptr noundef %471)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %74) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %73) #6
  br label %4592

472:                                              ; preds = %450
  %473 = load ptr, ptr %5, align 8, !tbaa !5
  %474 = load ptr, ptr %6, align 8, !tbaa !5
  %475 = load ptr, ptr %7, align 8, !tbaa !5
  %476 = load ptr, ptr %18, align 8, !tbaa !5
  %477 = load ptr, ptr %10, align 8, !tbaa !5
  %478 = call i32 @thermodynamics_recombination(ptr noundef %473, ptr noundef %474, ptr noundef %475, ptr noundef %476, ptr noundef %477)
  %479 = icmp eq i32 %478, 1
  br i1 %479, label %480, label %490

480:                                              ; preds = %472
  call void @llvm.lifetime.start.p0(i64 2048, ptr %75) #6
  %481 = getelementptr inbounds [2048 x i8], ptr %75, i64 0, i64 0
  %482 = load ptr, ptr %7, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.thermo, ptr %482, i32 0, i32 93
  %484 = getelementptr inbounds [2048 x i8], ptr %483, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %481, ptr noundef @.str, ptr noundef @.str.39, ptr noundef %484)
  %485 = load ptr, ptr %7, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct.thermo, ptr %485, i32 0, i32 93
  %487 = getelementptr inbounds [2048 x i8], ptr %486, i64 0, i64 0
  %488 = getelementptr inbounds [2048 x i8], ptr %75, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %487, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 437, ptr noundef %488)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %75) #6
  %489 = load ptr, ptr %10, align 8, !tbaa !5
  call void @free(ptr noundef %489) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

490:                                              ; preds = %472
  %491 = load ptr, ptr %7, align 8, !tbaa !5
  %492 = getelementptr inbounds %struct.thermo, ptr %491, i32 0, i32 2
  %493 = load i32, ptr %492, align 4, !tbaa !27
  %494 = icmp ne i32 %493, 0
  br i1 %494, label %495, label %518

495:                                              ; preds = %490
  %496 = load ptr, ptr %5, align 8, !tbaa !5
  %497 = load ptr, ptr %6, align 8, !tbaa !5
  %498 = load ptr, ptr %7, align 8, !tbaa !5
  %499 = load ptr, ptr %18, align 8, !tbaa !5
  %500 = load ptr, ptr %19, align 8, !tbaa !5
  %501 = load ptr, ptr %10, align 8, !tbaa !5
  %502 = call i32 @thermodynamics_reionization(ptr noundef %496, ptr noundef %497, ptr noundef %498, ptr noundef %499, ptr noundef %500, ptr noundef %501)
  %503 = icmp eq i32 %502, 1
  br i1 %503, label %504, label %517

504:                                              ; preds = %495
  call void @llvm.lifetime.start.p0(i64 2048, ptr %76) #6
  %505 = getelementptr inbounds [2048 x i8], ptr %76, i64 0, i64 0
  %506 = load ptr, ptr %7, align 8, !tbaa !5
  %507 = getelementptr inbounds %struct.thermo, ptr %506, i32 0, i32 93
  %508 = getelementptr inbounds [2048 x i8], ptr %507, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %505, ptr noundef @.str, ptr noundef @.str.40, ptr noundef %508)
  %509 = load ptr, ptr %7, align 8, !tbaa !5
  %510 = getelementptr inbounds %struct.thermo, ptr %509, i32 0, i32 93
  %511 = getelementptr inbounds [2048 x i8], ptr %510, i64 0, i64 0
  %512 = getelementptr inbounds [2048 x i8], ptr %76, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %511, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 445, ptr noundef %512)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %76) #6
  %513 = load ptr, ptr %18, align 8, !tbaa !5
  %514 = getelementptr inbounds %struct.recombination, ptr %513, i32 0, i32 8
  %515 = load ptr, ptr %514, align 8, !tbaa !33
  call void @free(ptr noundef %515) #6
  %516 = load ptr, ptr %10, align 8, !tbaa !5
  call void @free(ptr noundef %516) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

517:                                              ; preds = %495
  br label %523

518:                                              ; preds = %490
  %519 = load ptr, ptr %19, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.reionization, ptr %519, i32 0, i32 9
  store i32 0, ptr %520, align 4, !tbaa !35
  %521 = load ptr, ptr %19, align 8, !tbaa !5
  %522 = getelementptr inbounds %struct.reionization, ptr %521, i32 0, i32 27
  store i32 -1, ptr %522, align 4, !tbaa !37
  br label %523

523:                                              ; preds = %518, %517
  %524 = load ptr, ptr %5, align 8, !tbaa !5
  %525 = load ptr, ptr %6, align 8, !tbaa !5
  %526 = load ptr, ptr %7, align 8, !tbaa !5
  %527 = load ptr, ptr %18, align 8, !tbaa !5
  %528 = load ptr, ptr %19, align 8, !tbaa !5
  %529 = call i32 @thermodynamics_merge_reco_and_reio(ptr noundef %524, ptr noundef %525, ptr noundef %526, ptr noundef %527, ptr noundef %528)
  %530 = icmp eq i32 %529, 1
  br i1 %530, label %531, label %540

531:                                              ; preds = %523
  call void @llvm.lifetime.start.p0(i64 2048, ptr %77) #6
  %532 = getelementptr inbounds [2048 x i8], ptr %77, i64 0, i64 0
  %533 = load ptr, ptr %7, align 8, !tbaa !5
  %534 = getelementptr inbounds %struct.thermo, ptr %533, i32 0, i32 93
  %535 = getelementptr inbounds [2048 x i8], ptr %534, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %532, ptr noundef @.str, ptr noundef @.str.41, ptr noundef %535)
  %536 = load ptr, ptr %7, align 8, !tbaa !5
  %537 = getelementptr inbounds %struct.thermo, ptr %536, i32 0, i32 93
  %538 = getelementptr inbounds [2048 x i8], ptr %537, i64 0, i64 0
  %539 = getelementptr inbounds [2048 x i8], ptr %77, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %538, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 457, ptr noundef %539)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %77) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

540:                                              ; preds = %523
  %541 = load ptr, ptr %7, align 8, !tbaa !5
  %542 = getelementptr inbounds %struct.thermo, ptr %541, i32 0, i32 62
  %543 = load i32, ptr %542, align 8, !tbaa !38
  %544 = sext i32 %543 to i64
  %545 = mul i64 %544, 8
  %546 = call noalias ptr @malloc(i64 noundef %545) #7
  store ptr %546, ptr %12, align 8, !tbaa !5
  %547 = load ptr, ptr %12, align 8, !tbaa !5
  %548 = icmp eq ptr %547, null
  br i1 %548, label %549, label %562

549:                                              ; preds = %540
  call void @llvm.lifetime.start.p0(i64 4, ptr %78) #6
  %550 = load ptr, ptr %7, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.thermo, ptr %550, i32 0, i32 62
  %552 = load i32, ptr %551, align 8, !tbaa !38
  %553 = sext i32 %552 to i64
  %554 = mul i64 %553, 8
  %555 = trunc i64 %554 to i32
  store i32 %555, ptr %78, align 4, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 2048, ptr %79) #6
  %556 = getelementptr inbounds [2048 x i8], ptr %79, i64 0, i64 0
  %557 = load i32, ptr %78, align 4, !tbaa !32
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %556, ptr noundef @.str.37, ptr noundef @.str.42, i32 noundef %557)
  %558 = load ptr, ptr %7, align 8, !tbaa !5
  %559 = getelementptr inbounds %struct.thermo, ptr %558, i32 0, i32 93
  %560 = getelementptr inbounds [2048 x i8], ptr %559, i64 0, i64 0
  %561 = getelementptr inbounds [2048 x i8], ptr %79, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %560, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 461, ptr noundef %561)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %79) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %78) #6
  br label %4592

562:                                              ; preds = %540
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %563

563:                                              ; preds = %594, %562
  %564 = load i32, ptr %8, align 4, !tbaa !32
  %565 = load ptr, ptr %7, align 8, !tbaa !5
  %566 = getelementptr inbounds %struct.thermo, ptr %565, i32 0, i32 62
  %567 = load i32, ptr %566, align 8, !tbaa !38
  %568 = icmp slt i32 %564, %567
  br i1 %568, label %569, label %597

569:                                              ; preds = %563
  %570 = load ptr, ptr %6, align 8, !tbaa !5
  %571 = load ptr, ptr %7, align 8, !tbaa !5
  %572 = getelementptr inbounds %struct.thermo, ptr %571, i32 0, i32 63
  %573 = load ptr, ptr %572, align 8, !tbaa !39
  %574 = load i32, ptr %8, align 4, !tbaa !32
  %575 = sext i32 %574 to i64
  %576 = getelementptr inbounds double, ptr %573, i64 %575
  %577 = load double, ptr %576, align 8, !tbaa !9
  %578 = load ptr, ptr %12, align 8, !tbaa !5
  %579 = load i32, ptr %8, align 4, !tbaa !32
  %580 = sext i32 %579 to i64
  %581 = getelementptr inbounds double, ptr %578, i64 %580
  %582 = call i32 @background_tau_of_z(ptr noundef %570, double noundef %577, ptr noundef %581)
  %583 = icmp eq i32 %582, 1
  br i1 %583, label %584, label %593

584:                                              ; preds = %569
  call void @llvm.lifetime.start.p0(i64 2048, ptr %80) #6
  %585 = getelementptr inbounds [2048 x i8], ptr %80, i64 0, i64 0
  %586 = load ptr, ptr %6, align 8, !tbaa !5
  %587 = getelementptr inbounds %struct.background, ptr %586, i32 0, i32 149
  %588 = getelementptr inbounds [2048 x i8], ptr %587, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %585, ptr noundef @.str, ptr noundef @.str.43, ptr noundef %588)
  %589 = load ptr, ptr %7, align 8, !tbaa !5
  %590 = getelementptr inbounds %struct.thermo, ptr %589, i32 0, i32 93
  %591 = getelementptr inbounds [2048 x i8], ptr %590, i64 0, i64 0
  %592 = getelementptr inbounds [2048 x i8], ptr %80, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %591, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 468, ptr noundef %592)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %80) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

593:                                              ; preds = %569
  br label %594

594:                                              ; preds = %593
  %595 = load i32, ptr %8, align 4, !tbaa !32
  %596 = add nsw i32 %595, 1
  store i32 %596, ptr %8, align 4, !tbaa !32
  br label %563, !llvm.loop !40

597:                                              ; preds = %563
  %598 = load ptr, ptr %12, align 8, !tbaa !5
  %599 = load ptr, ptr %7, align 8, !tbaa !5
  %600 = getelementptr inbounds %struct.thermo, ptr %599, i32 0, i32 62
  %601 = load i32, ptr %600, align 8, !tbaa !38
  %602 = sub nsw i32 %601, 1
  %603 = sext i32 %602 to i64
  %604 = getelementptr inbounds double, ptr %598, i64 %603
  %605 = load double, ptr %604, align 8, !tbaa !9
  %606 = load ptr, ptr %7, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.thermo, ptr %606, i32 0, i32 88
  store double %605, ptr %607, align 8, !tbaa !42
  %608 = load ptr, ptr %6, align 8, !tbaa !5
  %609 = getelementptr inbounds %struct.background, ptr %608, i32 0, i32 99
  %610 = load i32, ptr %609, align 8, !tbaa !31
  %611 = sub nsw i32 %610, 1
  store i32 %611, ptr %11, align 4, !tbaa !32
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %612

612:                                              ; preds = %825, %597
  %613 = load i32, ptr %8, align 4, !tbaa !32
  %614 = load ptr, ptr %7, align 8, !tbaa !5
  %615 = getelementptr inbounds %struct.thermo, ptr %614, i32 0, i32 62
  %616 = load i32, ptr %615, align 8, !tbaa !38
  %617 = icmp slt i32 %613, %616
  br i1 %617, label %618, label %828

618:                                              ; preds = %612
  %619 = load ptr, ptr %6, align 8, !tbaa !5
  %620 = load ptr, ptr %12, align 8, !tbaa !5
  %621 = load i32, ptr %8, align 4, !tbaa !32
  %622 = sext i32 %621 to i64
  %623 = getelementptr inbounds double, ptr %620, i64 %622
  %624 = load double, ptr %623, align 8, !tbaa !9
  %625 = load ptr, ptr %6, align 8, !tbaa !5
  %626 = getelementptr inbounds %struct.background, ptr %625, i32 0, i32 142
  %627 = load i16, ptr %626, align 2, !tbaa !43
  %628 = load ptr, ptr %6, align 8, !tbaa !5
  %629 = getelementptr inbounds %struct.background, ptr %628, i32 0, i32 145
  %630 = load i16, ptr %629, align 8, !tbaa !44
  %631 = load ptr, ptr %10, align 8, !tbaa !5
  %632 = call i32 @background_at_tau(ptr noundef %619, double noundef %624, i16 noundef signext %627, i16 noundef signext %630, ptr noundef %11, ptr noundef %631)
  %633 = icmp eq i32 %632, 1
  br i1 %633, label %634, label %643

634:                                              ; preds = %618
  call void @llvm.lifetime.start.p0(i64 2048, ptr %81) #6
  %635 = getelementptr inbounds [2048 x i8], ptr %81, i64 0, i64 0
  %636 = load ptr, ptr %6, align 8, !tbaa !5
  %637 = getelementptr inbounds %struct.background, ptr %636, i32 0, i32 149
  %638 = getelementptr inbounds [2048 x i8], ptr %637, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %635, ptr noundef @.str, ptr noundef @.str.44, ptr noundef %638)
  %639 = load ptr, ptr %7, align 8, !tbaa !5
  %640 = getelementptr inbounds %struct.thermo, ptr %639, i32 0, i32 93
  %641 = getelementptr inbounds [2048 x i8], ptr %640, i64 0, i64 0
  %642 = getelementptr inbounds [2048 x i8], ptr %81, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %641, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 490, ptr noundef %642)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %81) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

643:                                              ; preds = %618
  %644 = load ptr, ptr %10, align 8, !tbaa !5
  %645 = load ptr, ptr %6, align 8, !tbaa !5
  %646 = getelementptr inbounds %struct.background, ptr %645, i32 0, i32 63
  %647 = load i32, ptr %646, align 8, !tbaa !45
  %648 = sext i32 %647 to i64
  %649 = getelementptr inbounds double, ptr %644, i64 %648
  %650 = load double, ptr %649, align 8, !tbaa !9
  %651 = fmul double 7.500000e-01, %650
  %652 = load ptr, ptr %10, align 8, !tbaa !5
  %653 = load ptr, ptr %6, align 8, !tbaa !5
  %654 = getelementptr inbounds %struct.background, ptr %653, i32 0, i32 62
  %655 = load i32, ptr %654, align 4, !tbaa !46
  %656 = sext i32 %655 to i64
  %657 = getelementptr inbounds double, ptr %652, i64 %656
  %658 = load double, ptr %657, align 8, !tbaa !9
  %659 = fdiv double %651, %658
  store double %659, ptr %15, align 8, !tbaa !9
  %660 = load double, ptr %15, align 8, !tbaa !9
  %661 = fdiv double -1.000000e+00, %660
  %662 = load ptr, ptr %7, align 8, !tbaa !5
  %663 = getelementptr inbounds %struct.thermo, ptr %662, i32 0, i32 64
  %664 = load ptr, ptr %663, align 8, !tbaa !47
  %665 = load i32, ptr %8, align 4, !tbaa !32
  %666 = load ptr, ptr %7, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.thermo, ptr %666, i32 0, i32 61
  %668 = load i32, ptr %667, align 4, !tbaa !48
  %669 = mul nsw i32 %665, %668
  %670 = load ptr, ptr %7, align 8, !tbaa !5
  %671 = getelementptr inbounds %struct.thermo, ptr %670, i32 0, i32 37
  %672 = load i32, ptr %671, align 4, !tbaa !49
  %673 = add nsw i32 %669, %672
  %674 = sext i32 %673 to i64
  %675 = getelementptr inbounds double, ptr %664, i64 %674
  %676 = load double, ptr %675, align 8, !tbaa !9
  %677 = fmul double %661, %676
  %678 = load ptr, ptr %7, align 8, !tbaa !5
  %679 = getelementptr inbounds %struct.thermo, ptr %678, i32 0, i32 64
  %680 = load ptr, ptr %679, align 8, !tbaa !47
  %681 = load i32, ptr %8, align 4, !tbaa !32
  %682 = load ptr, ptr %7, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.thermo, ptr %682, i32 0, i32 61
  %684 = load i32, ptr %683, align 4, !tbaa !48
  %685 = mul nsw i32 %681, %684
  %686 = load ptr, ptr %7, align 8, !tbaa !5
  %687 = getelementptr inbounds %struct.thermo, ptr %686, i32 0, i32 39
  %688 = load i32, ptr %687, align 4, !tbaa !50
  %689 = add nsw i32 %685, %688
  %690 = sext i32 %689 to i64
  %691 = getelementptr inbounds double, ptr %680, i64 %690
  store double %677, ptr %691, align 8, !tbaa !9
  %692 = load ptr, ptr %6, align 8, !tbaa !5
  %693 = getelementptr inbounds %struct.background, ptr %692, i32 0, i32 128
  %694 = load i16, ptr %693, align 2, !tbaa !23
  %695 = sext i16 %694 to i32
  %696 = icmp eq i32 %695, 1
  br i1 %696, label %697, label %824

697:                                              ; preds = %643
  %698 = load ptr, ptr %7, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct.thermo, ptr %698, i32 0, i32 32
  %700 = load double, ptr %699, align 8, !tbaa !51
  %701 = load ptr, ptr %7, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.thermo, ptr %701, i32 0, i32 63
  %703 = load ptr, ptr %702, align 8, !tbaa !39
  %704 = load i32, ptr %8, align 4, !tbaa !32
  %705 = sext i32 %704 to i64
  %706 = getelementptr inbounds double, ptr %703, i64 %705
  %707 = load double, ptr %706, align 8, !tbaa !9
  %708 = fadd double 1.000000e+00, %707
  %709 = fdiv double %708, 1.000000e+07
  %710 = load ptr, ptr %7, align 8, !tbaa !5
  %711 = getelementptr inbounds %struct.thermo, ptr %710, i32 0, i32 34
  %712 = load double, ptr %711, align 8, !tbaa !52
  %713 = call double @pow(double noundef %709, double noundef %712) #6
  %714 = fmul double %700, %713
  %715 = load ptr, ptr %6, align 8, !tbaa !5
  %716 = getelementptr inbounds %struct.background, ptr %715, i32 0, i32 17
  %717 = load double, ptr %716, align 8, !tbaa !53
  %718 = fmul double %714, %717
  %719 = load ptr, ptr %6, align 8, !tbaa !5
  %720 = getelementptr inbounds %struct.background, ptr %719, i32 0, i32 42
  %721 = load double, ptr %720, align 8, !tbaa !54
  %722 = call double @pow(double noundef %721, double noundef 2.000000e+00) #6
  %723 = fmul double %718, %722
  %724 = load ptr, ptr %7, align 8, !tbaa !5
  %725 = getelementptr inbounds %struct.thermo, ptr %724, i32 0, i32 64
  %726 = load ptr, ptr %725, align 8, !tbaa !47
  %727 = load i32, ptr %8, align 4, !tbaa !32
  %728 = load ptr, ptr %7, align 8, !tbaa !5
  %729 = getelementptr inbounds %struct.thermo, ptr %728, i32 0, i32 61
  %730 = load i32, ptr %729, align 4, !tbaa !48
  %731 = mul nsw i32 %727, %730
  %732 = load ptr, ptr %7, align 8, !tbaa !5
  %733 = getelementptr inbounds %struct.thermo, ptr %732, i32 0, i32 45
  %734 = load i32, ptr %733, align 4, !tbaa !55
  %735 = add nsw i32 %731, %734
  %736 = sext i32 %735 to i64
  %737 = getelementptr inbounds double, ptr %726, i64 %736
  store double %723, ptr %737, align 8, !tbaa !9
  %738 = load ptr, ptr %10, align 8, !tbaa !5
  %739 = load ptr, ptr %6, align 8, !tbaa !5
  %740 = getelementptr inbounds %struct.background, ptr %739, i32 0, i32 70
  %741 = load i32, ptr %740, align 4, !tbaa !56
  %742 = sext i32 %741 to i64
  %743 = getelementptr inbounds double, ptr %738, i64 %742
  %744 = load double, ptr %743, align 8, !tbaa !9
  %745 = fmul double 0x3FF5555555555555, %744
  %746 = load ptr, ptr %10, align 8, !tbaa !5
  %747 = load ptr, ptr %6, align 8, !tbaa !5
  %748 = getelementptr inbounds %struct.background, ptr %747, i32 0, i32 69
  %749 = load i32, ptr %748, align 8, !tbaa !57
  %750 = sext i32 %749 to i64
  %751 = getelementptr inbounds double, ptr %746, i64 %750
  %752 = load double, ptr %751, align 8, !tbaa !9
  %753 = fdiv double %745, %752
  %754 = load ptr, ptr %7, align 8, !tbaa !5
  %755 = getelementptr inbounds %struct.thermo, ptr %754, i32 0, i32 64
  %756 = load ptr, ptr %755, align 8, !tbaa !47
  %757 = load i32, ptr %8, align 4, !tbaa !32
  %758 = load ptr, ptr %7, align 8, !tbaa !5
  %759 = getelementptr inbounds %struct.thermo, ptr %758, i32 0, i32 61
  %760 = load i32, ptr %759, align 4, !tbaa !48
  %761 = mul nsw i32 %757, %760
  %762 = load ptr, ptr %7, align 8, !tbaa !5
  %763 = getelementptr inbounds %struct.thermo, ptr %762, i32 0, i32 45
  %764 = load i32, ptr %763, align 4, !tbaa !55
  %765 = add nsw i32 %761, %764
  %766 = sext i32 %765 to i64
  %767 = getelementptr inbounds double, ptr %756, i64 %766
  %768 = load double, ptr %767, align 8, !tbaa !9
  %769 = fmul double %753, %768
  %770 = load ptr, ptr %7, align 8, !tbaa !5
  %771 = getelementptr inbounds %struct.thermo, ptr %770, i32 0, i32 64
  %772 = load ptr, ptr %771, align 8, !tbaa !47
  %773 = load i32, ptr %8, align 4, !tbaa !32
  %774 = load ptr, ptr %7, align 8, !tbaa !5
  %775 = getelementptr inbounds %struct.thermo, ptr %774, i32 0, i32 61
  %776 = load i32, ptr %775, align 4, !tbaa !48
  %777 = mul nsw i32 %773, %776
  %778 = load ptr, ptr %7, align 8, !tbaa !5
  %779 = getelementptr inbounds %struct.thermo, ptr %778, i32 0, i32 46
  %780 = load i32, ptr %779, align 8, !tbaa !58
  %781 = add nsw i32 %777, %780
  %782 = sext i32 %781 to i64
  %783 = getelementptr inbounds double, ptr %772, i64 %782
  store double %769, ptr %783, align 8, !tbaa !9
  %784 = load ptr, ptr %7, align 8, !tbaa !5
  %785 = getelementptr inbounds %struct.thermo, ptr %784, i32 0, i32 33
  %786 = load double, ptr %785, align 8, !tbaa !59
  %787 = load ptr, ptr %7, align 8, !tbaa !5
  %788 = getelementptr inbounds %struct.thermo, ptr %787, i32 0, i32 63
  %789 = load ptr, ptr %788, align 8, !tbaa !39
  %790 = load i32, ptr %8, align 4, !tbaa !32
  %791 = sext i32 %790 to i64
  %792 = getelementptr inbounds double, ptr %789, i64 %791
  %793 = load double, ptr %792, align 8, !tbaa !9
  %794 = fadd double 1.000000e+00, %793
  %795 = fdiv double %794, 1.000000e+07
  %796 = load ptr, ptr %7, align 8, !tbaa !5
  %797 = getelementptr inbounds %struct.thermo, ptr %796, i32 0, i32 34
  %798 = load double, ptr %797, align 8, !tbaa !52
  %799 = call double @pow(double noundef %795, double noundef %798) #6
  %800 = fmul double %786, %799
  %801 = load ptr, ptr %6, align 8, !tbaa !5
  %802 = getelementptr inbounds %struct.background, ptr %801, i32 0, i32 15
  %803 = load double, ptr %802, align 8, !tbaa !60
  %804 = fmul double %800, %803
  %805 = load ptr, ptr %6, align 8, !tbaa !5
  %806 = getelementptr inbounds %struct.background, ptr %805, i32 0, i32 42
  %807 = load double, ptr %806, align 8, !tbaa !54
  %808 = call double @pow(double noundef %807, double noundef 2.000000e+00) #6
  %809 = fmul double %804, %808
  %810 = load ptr, ptr %7, align 8, !tbaa !5
  %811 = getelementptr inbounds %struct.thermo, ptr %810, i32 0, i32 64
  %812 = load ptr, ptr %811, align 8, !tbaa !47
  %813 = load i32, ptr %8, align 4, !tbaa !32
  %814 = load ptr, ptr %7, align 8, !tbaa !5
  %815 = getelementptr inbounds %struct.thermo, ptr %814, i32 0, i32 61
  %816 = load i32, ptr %815, align 4, !tbaa !48
  %817 = mul nsw i32 %813, %816
  %818 = load ptr, ptr %7, align 8, !tbaa !5
  %819 = getelementptr inbounds %struct.thermo, ptr %818, i32 0, i32 48
  %820 = load i32, ptr %819, align 8, !tbaa !61
  %821 = add nsw i32 %817, %820
  %822 = sext i32 %821 to i64
  %823 = getelementptr inbounds double, ptr %812, i64 %822
  store double %809, ptr %823, align 8, !tbaa !9
  br label %824

824:                                              ; preds = %697, %643
  br label %825

825:                                              ; preds = %824
  %826 = load i32, ptr %8, align 4, !tbaa !32
  %827 = add nsw i32 %826, 1
  store i32 %827, ptr %8, align 4, !tbaa !32
  br label %612, !llvm.loop !62

828:                                              ; preds = %612
  %829 = load ptr, ptr %12, align 8, !tbaa !5
  %830 = load ptr, ptr %7, align 8, !tbaa !5
  %831 = getelementptr inbounds %struct.thermo, ptr %830, i32 0, i32 62
  %832 = load i32, ptr %831, align 8, !tbaa !38
  %833 = load ptr, ptr %7, align 8, !tbaa !5
  %834 = getelementptr inbounds %struct.thermo, ptr %833, i32 0, i32 64
  %835 = load ptr, ptr %834, align 8, !tbaa !47
  %836 = load ptr, ptr %7, align 8, !tbaa !5
  %837 = getelementptr inbounds %struct.thermo, ptr %836, i32 0, i32 61
  %838 = load i32, ptr %837, align 4, !tbaa !48
  %839 = load ptr, ptr %7, align 8, !tbaa !5
  %840 = getelementptr inbounds %struct.thermo, ptr %839, i32 0, i32 39
  %841 = load i32, ptr %840, align 4, !tbaa !50
  %842 = load ptr, ptr %7, align 8, !tbaa !5
  %843 = getelementptr inbounds %struct.thermo, ptr %842, i32 0, i32 40
  %844 = load i32, ptr %843, align 8, !tbaa !63
  %845 = load ptr, ptr %7, align 8, !tbaa !5
  %846 = getelementptr inbounds %struct.thermo, ptr %845, i32 0, i32 93
  %847 = getelementptr inbounds [2048 x i8], ptr %846, i64 0, i64 0
  %848 = call i32 @array_spline_table_line_to_line(ptr noundef %829, i32 noundef %832, ptr noundef %835, i32 noundef %838, i32 noundef %841, i32 noundef %844, i16 noundef signext 1, ptr noundef %847)
  %849 = icmp eq i32 %848, 1
  br i1 %849, label %850, label %859

850:                                              ; preds = %828
  call void @llvm.lifetime.start.p0(i64 2048, ptr %82) #6
  %851 = getelementptr inbounds [2048 x i8], ptr %82, i64 0, i64 0
  %852 = load ptr, ptr %7, align 8, !tbaa !5
  %853 = getelementptr inbounds %struct.thermo, ptr %852, i32 0, i32 93
  %854 = getelementptr inbounds [2048 x i8], ptr %853, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %851, ptr noundef @.str, ptr noundef @.str.45, ptr noundef %854)
  %855 = load ptr, ptr %7, align 8, !tbaa !5
  %856 = getelementptr inbounds %struct.thermo, ptr %855, i32 0, i32 93
  %857 = getelementptr inbounds [2048 x i8], ptr %856, i64 0, i64 0
  %858 = getelementptr inbounds [2048 x i8], ptr %82, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %857, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 527, ptr noundef %858)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %82) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

859:                                              ; preds = %828
  %860 = load ptr, ptr %12, align 8, !tbaa !5
  %861 = load ptr, ptr %7, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.thermo, ptr %861, i32 0, i32 62
  %863 = load i32, ptr %862, align 8, !tbaa !38
  %864 = load ptr, ptr %7, align 8, !tbaa !5
  %865 = getelementptr inbounds %struct.thermo, ptr %864, i32 0, i32 64
  %866 = load ptr, ptr %865, align 8, !tbaa !47
  %867 = load ptr, ptr %7, align 8, !tbaa !5
  %868 = getelementptr inbounds %struct.thermo, ptr %867, i32 0, i32 61
  %869 = load i32, ptr %868, align 4, !tbaa !48
  %870 = load ptr, ptr %7, align 8, !tbaa !5
  %871 = getelementptr inbounds %struct.thermo, ptr %870, i32 0, i32 39
  %872 = load i32, ptr %871, align 4, !tbaa !50
  %873 = load ptr, ptr %7, align 8, !tbaa !5
  %874 = getelementptr inbounds %struct.thermo, ptr %873, i32 0, i32 40
  %875 = load i32, ptr %874, align 8, !tbaa !63
  %876 = load ptr, ptr %7, align 8, !tbaa !5
  %877 = getelementptr inbounds %struct.thermo, ptr %876, i32 0, i32 38
  %878 = load i32, ptr %877, align 8, !tbaa !64
  %879 = load ptr, ptr %7, align 8, !tbaa !5
  %880 = getelementptr inbounds %struct.thermo, ptr %879, i32 0, i32 93
  %881 = getelementptr inbounds [2048 x i8], ptr %880, i64 0, i64 0
  %882 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef %860, i32 noundef %863, ptr noundef %866, i32 noundef %869, i32 noundef %872, i32 noundef %875, i32 noundef %878, ptr noundef %881)
  %883 = icmp eq i32 %882, 1
  br i1 %883, label %884, label %893

884:                                              ; preds = %859
  call void @llvm.lifetime.start.p0(i64 2048, ptr %83) #6
  %885 = getelementptr inbounds [2048 x i8], ptr %83, i64 0, i64 0
  %886 = load ptr, ptr %7, align 8, !tbaa !5
  %887 = getelementptr inbounds %struct.thermo, ptr %886, i32 0, i32 93
  %888 = getelementptr inbounds [2048 x i8], ptr %887, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %885, ptr noundef @.str, ptr noundef @.str.46, ptr noundef %888)
  %889 = load ptr, ptr %7, align 8, !tbaa !5
  %890 = getelementptr inbounds %struct.thermo, ptr %889, i32 0, i32 93
  %891 = getelementptr inbounds [2048 x i8], ptr %890, i64 0, i64 0
  %892 = getelementptr inbounds [2048 x i8], ptr %83, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %891, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 539, ptr noundef %892)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %83) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

893:                                              ; preds = %859
  %894 = load ptr, ptr %6, align 8, !tbaa !5
  %895 = getelementptr inbounds %struct.background, ptr %894, i32 0, i32 128
  %896 = load i16, ptr %895, align 2, !tbaa !23
  %897 = sext i16 %896 to i32
  %898 = icmp eq i32 %897, 1
  br i1 %898, label %899, label %1030

899:                                              ; preds = %893
  %900 = load ptr, ptr %12, align 8, !tbaa !5
  %901 = load ptr, ptr %7, align 8, !tbaa !5
  %902 = getelementptr inbounds %struct.thermo, ptr %901, i32 0, i32 62
  %903 = load i32, ptr %902, align 8, !tbaa !38
  %904 = load ptr, ptr %7, align 8, !tbaa !5
  %905 = getelementptr inbounds %struct.thermo, ptr %904, i32 0, i32 64
  %906 = load ptr, ptr %905, align 8, !tbaa !47
  %907 = load ptr, ptr %7, align 8, !tbaa !5
  %908 = getelementptr inbounds %struct.thermo, ptr %907, i32 0, i32 61
  %909 = load i32, ptr %908, align 4, !tbaa !48
  %910 = load ptr, ptr %7, align 8, !tbaa !5
  %911 = getelementptr inbounds %struct.thermo, ptr %910, i32 0, i32 46
  %912 = load i32, ptr %911, align 8, !tbaa !58
  %913 = load ptr, ptr %7, align 8, !tbaa !5
  %914 = getelementptr inbounds %struct.thermo, ptr %913, i32 0, i32 47
  %915 = load i32, ptr %914, align 4, !tbaa !65
  %916 = load ptr, ptr %7, align 8, !tbaa !5
  %917 = getelementptr inbounds %struct.thermo, ptr %916, i32 0, i32 93
  %918 = getelementptr inbounds [2048 x i8], ptr %917, i64 0, i64 0
  %919 = call i32 @array_spline_table_line_to_line(ptr noundef %900, i32 noundef %903, ptr noundef %906, i32 noundef %909, i32 noundef %912, i32 noundef %915, i16 noundef signext 1, ptr noundef %918)
  %920 = icmp eq i32 %919, 1
  br i1 %920, label %921, label %930

921:                                              ; preds = %899
  call void @llvm.lifetime.start.p0(i64 2048, ptr %84) #6
  %922 = getelementptr inbounds [2048 x i8], ptr %84, i64 0, i64 0
  %923 = load ptr, ptr %7, align 8, !tbaa !5
  %924 = getelementptr inbounds %struct.thermo, ptr %923, i32 0, i32 93
  %925 = getelementptr inbounds [2048 x i8], ptr %924, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %922, ptr noundef @.str, ptr noundef @.str.47, ptr noundef %925)
  %926 = load ptr, ptr %7, align 8, !tbaa !5
  %927 = getelementptr inbounds %struct.thermo, ptr %926, i32 0, i32 93
  %928 = getelementptr inbounds [2048 x i8], ptr %927, i64 0, i64 0
  %929 = getelementptr inbounds [2048 x i8], ptr %84, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %928, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 557, ptr noundef %929)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %84) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

930:                                              ; preds = %899
  %931 = load ptr, ptr %12, align 8, !tbaa !5
  %932 = load ptr, ptr %7, align 8, !tbaa !5
  %933 = getelementptr inbounds %struct.thermo, ptr %932, i32 0, i32 62
  %934 = load i32, ptr %933, align 8, !tbaa !38
  %935 = load ptr, ptr %7, align 8, !tbaa !5
  %936 = getelementptr inbounds %struct.thermo, ptr %935, i32 0, i32 64
  %937 = load ptr, ptr %936, align 8, !tbaa !47
  %938 = load ptr, ptr %7, align 8, !tbaa !5
  %939 = getelementptr inbounds %struct.thermo, ptr %938, i32 0, i32 61
  %940 = load i32, ptr %939, align 4, !tbaa !48
  %941 = load ptr, ptr %7, align 8, !tbaa !5
  %942 = getelementptr inbounds %struct.thermo, ptr %941, i32 0, i32 46
  %943 = load i32, ptr %942, align 8, !tbaa !58
  %944 = load ptr, ptr %7, align 8, !tbaa !5
  %945 = getelementptr inbounds %struct.thermo, ptr %944, i32 0, i32 47
  %946 = load i32, ptr %945, align 4, !tbaa !65
  %947 = load ptr, ptr %7, align 8, !tbaa !5
  %948 = getelementptr inbounds %struct.thermo, ptr %947, i32 0, i32 49
  %949 = load i32, ptr %948, align 4, !tbaa !66
  %950 = load ptr, ptr %7, align 8, !tbaa !5
  %951 = getelementptr inbounds %struct.thermo, ptr %950, i32 0, i32 93
  %952 = getelementptr inbounds [2048 x i8], ptr %951, i64 0, i64 0
  %953 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef %931, i32 noundef %934, ptr noundef %937, i32 noundef %940, i32 noundef %943, i32 noundef %946, i32 noundef %949, ptr noundef %952)
  %954 = icmp eq i32 %953, 1
  br i1 %954, label %955, label %964

955:                                              ; preds = %930
  call void @llvm.lifetime.start.p0(i64 2048, ptr %85) #6
  %956 = getelementptr inbounds [2048 x i8], ptr %85, i64 0, i64 0
  %957 = load ptr, ptr %7, align 8, !tbaa !5
  %958 = getelementptr inbounds %struct.thermo, ptr %957, i32 0, i32 93
  %959 = getelementptr inbounds [2048 x i8], ptr %958, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %956, ptr noundef @.str, ptr noundef @.str.48, ptr noundef %959)
  %960 = load ptr, ptr %7, align 8, !tbaa !5
  %961 = getelementptr inbounds %struct.thermo, ptr %960, i32 0, i32 93
  %962 = getelementptr inbounds [2048 x i8], ptr %961, i64 0, i64 0
  %963 = getelementptr inbounds [2048 x i8], ptr %85, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %962, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 570, ptr noundef %963)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %85) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

964:                                              ; preds = %930
  %965 = load ptr, ptr %12, align 8, !tbaa !5
  %966 = load ptr, ptr %7, align 8, !tbaa !5
  %967 = getelementptr inbounds %struct.thermo, ptr %966, i32 0, i32 62
  %968 = load i32, ptr %967, align 8, !tbaa !38
  %969 = load ptr, ptr %7, align 8, !tbaa !5
  %970 = getelementptr inbounds %struct.thermo, ptr %969, i32 0, i32 64
  %971 = load ptr, ptr %970, align 8, !tbaa !47
  %972 = load ptr, ptr %7, align 8, !tbaa !5
  %973 = getelementptr inbounds %struct.thermo, ptr %972, i32 0, i32 61
  %974 = load i32, ptr %973, align 4, !tbaa !48
  %975 = load ptr, ptr %7, align 8, !tbaa !5
  %976 = getelementptr inbounds %struct.thermo, ptr %975, i32 0, i32 45
  %977 = load i32, ptr %976, align 4, !tbaa !55
  %978 = load ptr, ptr %7, align 8, !tbaa !5
  %979 = getelementptr inbounds %struct.thermo, ptr %978, i32 0, i32 47
  %980 = load i32, ptr %979, align 4, !tbaa !65
  %981 = load ptr, ptr %7, align 8, !tbaa !5
  %982 = getelementptr inbounds %struct.thermo, ptr %981, i32 0, i32 93
  %983 = getelementptr inbounds [2048 x i8], ptr %982, i64 0, i64 0
  %984 = call i32 @array_spline_table_line_to_line(ptr noundef %965, i32 noundef %968, ptr noundef %971, i32 noundef %974, i32 noundef %977, i32 noundef %980, i16 noundef signext 1, ptr noundef %983)
  %985 = icmp eq i32 %984, 1
  br i1 %985, label %986, label %995

986:                                              ; preds = %964
  call void @llvm.lifetime.start.p0(i64 2048, ptr %86) #6
  %987 = getelementptr inbounds [2048 x i8], ptr %86, i64 0, i64 0
  %988 = load ptr, ptr %7, align 8, !tbaa !5
  %989 = getelementptr inbounds %struct.thermo, ptr %988, i32 0, i32 93
  %990 = getelementptr inbounds [2048 x i8], ptr %989, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %987, ptr noundef @.str, ptr noundef @.str.49, ptr noundef %990)
  %991 = load ptr, ptr %7, align 8, !tbaa !5
  %992 = getelementptr inbounds %struct.thermo, ptr %991, i32 0, i32 93
  %993 = getelementptr inbounds [2048 x i8], ptr %992, i64 0, i64 0
  %994 = getelementptr inbounds [2048 x i8], ptr %86, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %993, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 583, ptr noundef %994)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %86) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

995:                                              ; preds = %964
  %996 = load ptr, ptr %12, align 8, !tbaa !5
  %997 = load ptr, ptr %7, align 8, !tbaa !5
  %998 = getelementptr inbounds %struct.thermo, ptr %997, i32 0, i32 62
  %999 = load i32, ptr %998, align 8, !tbaa !38
  %1000 = load ptr, ptr %7, align 8, !tbaa !5
  %1001 = getelementptr inbounds %struct.thermo, ptr %1000, i32 0, i32 64
  %1002 = load ptr, ptr %1001, align 8, !tbaa !47
  %1003 = load ptr, ptr %7, align 8, !tbaa !5
  %1004 = getelementptr inbounds %struct.thermo, ptr %1003, i32 0, i32 61
  %1005 = load i32, ptr %1004, align 4, !tbaa !48
  %1006 = load ptr, ptr %7, align 8, !tbaa !5
  %1007 = getelementptr inbounds %struct.thermo, ptr %1006, i32 0, i32 45
  %1008 = load i32, ptr %1007, align 4, !tbaa !55
  %1009 = load ptr, ptr %7, align 8, !tbaa !5
  %1010 = getelementptr inbounds %struct.thermo, ptr %1009, i32 0, i32 47
  %1011 = load i32, ptr %1010, align 4, !tbaa !65
  %1012 = load ptr, ptr %7, align 8, !tbaa !5
  %1013 = getelementptr inbounds %struct.thermo, ptr %1012, i32 0, i32 50
  %1014 = load i32, ptr %1013, align 8, !tbaa !67
  %1015 = load ptr, ptr %7, align 8, !tbaa !5
  %1016 = getelementptr inbounds %struct.thermo, ptr %1015, i32 0, i32 93
  %1017 = getelementptr inbounds [2048 x i8], ptr %1016, i64 0, i64 0
  %1018 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef %996, i32 noundef %999, ptr noundef %1002, i32 noundef %1005, i32 noundef %1008, i32 noundef %1011, i32 noundef %1014, ptr noundef %1017)
  %1019 = icmp eq i32 %1018, 1
  br i1 %1019, label %1020, label %1029

1020:                                             ; preds = %995
  call void @llvm.lifetime.start.p0(i64 2048, ptr %87) #6
  %1021 = getelementptr inbounds [2048 x i8], ptr %87, i64 0, i64 0
  %1022 = load ptr, ptr %7, align 8, !tbaa !5
  %1023 = getelementptr inbounds %struct.thermo, ptr %1022, i32 0, i32 93
  %1024 = getelementptr inbounds [2048 x i8], ptr %1023, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1021, ptr noundef @.str, ptr noundef @.str.50, ptr noundef %1024)
  %1025 = load ptr, ptr %7, align 8, !tbaa !5
  %1026 = getelementptr inbounds %struct.thermo, ptr %1025, i32 0, i32 93
  %1027 = getelementptr inbounds [2048 x i8], ptr %1026, i64 0, i64 0
  %1028 = getelementptr inbounds [2048 x i8], ptr %87, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1027, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 596, ptr noundef %1028)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %87) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1029:                                             ; preds = %995
  br label %1030

1030:                                             ; preds = %1029, %893
  %1031 = load ptr, ptr %7, align 8, !tbaa !5
  %1032 = getelementptr inbounds %struct.thermo, ptr %1031, i32 0, i32 7
  %1033 = load i16, ptr %1032, align 2, !tbaa !68
  %1034 = sext i16 %1033 to i32
  %1035 = icmp eq i32 %1034, 1
  br i1 %1035, label %1036, label %1315

1036:                                             ; preds = %1030
  %1037 = load ptr, ptr %7, align 8, !tbaa !5
  %1038 = getelementptr inbounds %struct.thermo, ptr %1037, i32 0, i32 62
  %1039 = load i32, ptr %1038, align 8, !tbaa !38
  %1040 = sext i32 %1039 to i64
  %1041 = mul i64 %1040, 8
  %1042 = call noalias ptr @malloc(i64 noundef %1041) #7
  store ptr %1042, ptr %13, align 8, !tbaa !5
  %1043 = load ptr, ptr %13, align 8, !tbaa !5
  %1044 = icmp eq ptr %1043, null
  br i1 %1044, label %1045, label %1058

1045:                                             ; preds = %1036
  call void @llvm.lifetime.start.p0(i64 4, ptr %88) #6
  %1046 = load ptr, ptr %7, align 8, !tbaa !5
  %1047 = getelementptr inbounds %struct.thermo, ptr %1046, i32 0, i32 62
  %1048 = load i32, ptr %1047, align 8, !tbaa !38
  %1049 = sext i32 %1048 to i64
  %1050 = mul i64 %1049, 8
  %1051 = trunc i64 %1050 to i32
  store i32 %1051, ptr %88, align 4, !tbaa !32
  call void @llvm.lifetime.start.p0(i64 2048, ptr %89) #6
  %1052 = getelementptr inbounds [2048 x i8], ptr %89, i64 0, i64 0
  %1053 = load i32, ptr %88, align 4, !tbaa !32
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1052, ptr noundef @.str.37, ptr noundef @.str.51, i32 noundef %1053)
  %1054 = load ptr, ptr %7, align 8, !tbaa !5
  %1055 = getelementptr inbounds %struct.thermo, ptr %1054, i32 0, i32 93
  %1056 = getelementptr inbounds [2048 x i8], ptr %1055, i64 0, i64 0
  %1057 = getelementptr inbounds [2048 x i8], ptr %89, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1056, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 610, ptr noundef %1057)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %89) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %88) #6
  br label %4592

1058:                                             ; preds = %1036
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %1059

1059:                                             ; preds = %1167, %1058
  %1060 = load i32, ptr %8, align 4, !tbaa !32
  %1061 = load ptr, ptr %7, align 8, !tbaa !5
  %1062 = getelementptr inbounds %struct.thermo, ptr %1061, i32 0, i32 62
  %1063 = load i32, ptr %1062, align 8, !tbaa !38
  %1064 = icmp slt i32 %1060, %1063
  br i1 %1064, label %1065, label %1170

1065:                                             ; preds = %1059
  %1066 = load ptr, ptr %12, align 8, !tbaa !5
  %1067 = load ptr, ptr %7, align 8, !tbaa !5
  %1068 = getelementptr inbounds %struct.thermo, ptr %1067, i32 0, i32 62
  %1069 = load i32, ptr %1068, align 8, !tbaa !38
  %1070 = sub nsw i32 %1069, 1
  %1071 = load i32, ptr %8, align 4, !tbaa !32
  %1072 = sub nsw i32 %1070, %1071
  %1073 = sext i32 %1072 to i64
  %1074 = getelementptr inbounds double, ptr %1066, i64 %1073
  %1075 = load double, ptr %1074, align 8, !tbaa !9
  %1076 = load ptr, ptr %13, align 8, !tbaa !5
  %1077 = load i32, ptr %8, align 4, !tbaa !32
  %1078 = sext i32 %1077 to i64
  %1079 = getelementptr inbounds double, ptr %1076, i64 %1078
  store double %1075, ptr %1079, align 8, !tbaa !9
  %1080 = load ptr, ptr %6, align 8, !tbaa !5
  %1081 = load ptr, ptr %13, align 8, !tbaa !5
  %1082 = load i32, ptr %8, align 4, !tbaa !32
  %1083 = sext i32 %1082 to i64
  %1084 = getelementptr inbounds double, ptr %1081, i64 %1083
  %1085 = load double, ptr %1084, align 8, !tbaa !9
  %1086 = load ptr, ptr %6, align 8, !tbaa !5
  %1087 = getelementptr inbounds %struct.background, ptr %1086, i32 0, i32 142
  %1088 = load i16, ptr %1087, align 2, !tbaa !43
  %1089 = load ptr, ptr %6, align 8, !tbaa !5
  %1090 = getelementptr inbounds %struct.background, ptr %1089, i32 0, i32 145
  %1091 = load i16, ptr %1090, align 8, !tbaa !44
  %1092 = load ptr, ptr %10, align 8, !tbaa !5
  %1093 = call i32 @background_at_tau(ptr noundef %1080, double noundef %1085, i16 noundef signext %1088, i16 noundef signext %1091, ptr noundef %11, ptr noundef %1092)
  %1094 = icmp eq i32 %1093, 1
  br i1 %1094, label %1095, label %1104

1095:                                             ; preds = %1065
  call void @llvm.lifetime.start.p0(i64 2048, ptr %90) #6
  %1096 = getelementptr inbounds [2048 x i8], ptr %90, i64 0, i64 0
  %1097 = load ptr, ptr %6, align 8, !tbaa !5
  %1098 = getelementptr inbounds %struct.background, ptr %1097, i32 0, i32 149
  %1099 = getelementptr inbounds [2048 x i8], ptr %1098, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1096, ptr noundef @.str, ptr noundef @.str.52, ptr noundef %1099)
  %1100 = load ptr, ptr %7, align 8, !tbaa !5
  %1101 = getelementptr inbounds %struct.thermo, ptr %1100, i32 0, i32 93
  %1102 = getelementptr inbounds [2048 x i8], ptr %1101, i64 0, i64 0
  %1103 = getelementptr inbounds [2048 x i8], ptr %90, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1102, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 624, ptr noundef %1103)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %90) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1104:                                             ; preds = %1065
  %1105 = load ptr, ptr %10, align 8, !tbaa !5
  %1106 = load ptr, ptr %6, align 8, !tbaa !5
  %1107 = getelementptr inbounds %struct.background, ptr %1106, i32 0, i32 63
  %1108 = load i32, ptr %1107, align 8, !tbaa !45
  %1109 = sext i32 %1108 to i64
  %1110 = getelementptr inbounds double, ptr %1105, i64 %1109
  %1111 = load double, ptr %1110, align 8, !tbaa !9
  %1112 = fmul double 7.500000e-01, %1111
  %1113 = load ptr, ptr %10, align 8, !tbaa !5
  %1114 = load ptr, ptr %6, align 8, !tbaa !5
  %1115 = getelementptr inbounds %struct.background, ptr %1114, i32 0, i32 62
  %1116 = load i32, ptr %1115, align 4, !tbaa !46
  %1117 = sext i32 %1116 to i64
  %1118 = getelementptr inbounds double, ptr %1113, i64 %1117
  %1119 = load double, ptr %1118, align 8, !tbaa !9
  %1120 = fdiv double %1112, %1119
  store double %1120, ptr %15, align 8, !tbaa !9
  %1121 = load ptr, ptr %7, align 8, !tbaa !5
  %1122 = getelementptr inbounds %struct.thermo, ptr %1121, i32 0, i32 64
  %1123 = load ptr, ptr %1122, align 8, !tbaa !47
  %1124 = load ptr, ptr %7, align 8, !tbaa !5
  %1125 = getelementptr inbounds %struct.thermo, ptr %1124, i32 0, i32 62
  %1126 = load i32, ptr %1125, align 8, !tbaa !38
  %1127 = sub nsw i32 %1126, 1
  %1128 = load i32, ptr %8, align 4, !tbaa !32
  %1129 = sub nsw i32 %1127, %1128
  %1130 = load ptr, ptr %7, align 8, !tbaa !5
  %1131 = getelementptr inbounds %struct.thermo, ptr %1130, i32 0, i32 61
  %1132 = load i32, ptr %1131, align 4, !tbaa !48
  %1133 = mul nsw i32 %1129, %1132
  %1134 = load ptr, ptr %7, align 8, !tbaa !5
  %1135 = getelementptr inbounds %struct.thermo, ptr %1134, i32 0, i32 37
  %1136 = load i32, ptr %1135, align 4, !tbaa !49
  %1137 = add nsw i32 %1133, %1136
  %1138 = sext i32 %1137 to i64
  %1139 = getelementptr inbounds double, ptr %1123, i64 %1138
  %1140 = load double, ptr %1139, align 8, !tbaa !9
  %1141 = fdiv double 0x3FC5555555555555, %1140
  %1142 = load double, ptr %15, align 8, !tbaa !9
  %1143 = load double, ptr %15, align 8, !tbaa !9
  %1144 = fmul double %1142, %1143
  %1145 = load double, ptr %15, align 8, !tbaa !9
  %1146 = fadd double 1.000000e+00, %1145
  %1147 = fdiv double %1144, %1146
  %1148 = fadd double %1147, 0x3FF1111111111111
  %1149 = fmul double %1141, %1148
  %1150 = load double, ptr %15, align 8, !tbaa !9
  %1151 = fadd double 1.000000e+00, %1150
  %1152 = fdiv double %1149, %1151
  %1153 = load ptr, ptr %7, align 8, !tbaa !5
  %1154 = getelementptr inbounds %struct.thermo, ptr %1153, i32 0, i32 64
  %1155 = load ptr, ptr %1154, align 8, !tbaa !47
  %1156 = load i32, ptr %8, align 4, !tbaa !32
  %1157 = load ptr, ptr %7, align 8, !tbaa !5
  %1158 = getelementptr inbounds %struct.thermo, ptr %1157, i32 0, i32 61
  %1159 = load i32, ptr %1158, align 4, !tbaa !48
  %1160 = mul nsw i32 %1156, %1159
  %1161 = load ptr, ptr %7, align 8, !tbaa !5
  %1162 = getelementptr inbounds %struct.thermo, ptr %1161, i32 0, i32 39
  %1163 = load i32, ptr %1162, align 4, !tbaa !50
  %1164 = add nsw i32 %1160, %1163
  %1165 = sext i32 %1164 to i64
  %1166 = getelementptr inbounds double, ptr %1155, i64 %1165
  store double %1152, ptr %1166, align 8, !tbaa !9
  br label %1167

1167:                                             ; preds = %1104
  %1168 = load i32, ptr %8, align 4, !tbaa !32
  %1169 = add nsw i32 %1168, 1
  store i32 %1169, ptr %8, align 4, !tbaa !32
  br label %1059, !llvm.loop !69

1170:                                             ; preds = %1059
  %1171 = load ptr, ptr %13, align 8, !tbaa !5
  %1172 = load ptr, ptr %7, align 8, !tbaa !5
  %1173 = getelementptr inbounds %struct.thermo, ptr %1172, i32 0, i32 62
  %1174 = load i32, ptr %1173, align 8, !tbaa !38
  %1175 = load ptr, ptr %7, align 8, !tbaa !5
  %1176 = getelementptr inbounds %struct.thermo, ptr %1175, i32 0, i32 64
  %1177 = load ptr, ptr %1176, align 8, !tbaa !47
  %1178 = load ptr, ptr %7, align 8, !tbaa !5
  %1179 = getelementptr inbounds %struct.thermo, ptr %1178, i32 0, i32 61
  %1180 = load i32, ptr %1179, align 4, !tbaa !48
  %1181 = load ptr, ptr %7, align 8, !tbaa !5
  %1182 = getelementptr inbounds %struct.thermo, ptr %1181, i32 0, i32 39
  %1183 = load i32, ptr %1182, align 4, !tbaa !50
  %1184 = load ptr, ptr %7, align 8, !tbaa !5
  %1185 = getelementptr inbounds %struct.thermo, ptr %1184, i32 0, i32 40
  %1186 = load i32, ptr %1185, align 8, !tbaa !63
  %1187 = load ptr, ptr %7, align 8, !tbaa !5
  %1188 = getelementptr inbounds %struct.thermo, ptr %1187, i32 0, i32 93
  %1189 = getelementptr inbounds [2048 x i8], ptr %1188, i64 0, i64 0
  %1190 = call i32 @array_spline_table_line_to_line(ptr noundef %1171, i32 noundef %1174, ptr noundef %1177, i32 noundef %1180, i32 noundef %1183, i32 noundef %1186, i16 noundef signext 1, ptr noundef %1189)
  %1191 = icmp eq i32 %1190, 1
  br i1 %1191, label %1192, label %1201

1192:                                             ; preds = %1170
  call void @llvm.lifetime.start.p0(i64 2048, ptr %91) #6
  %1193 = getelementptr inbounds [2048 x i8], ptr %91, i64 0, i64 0
  %1194 = load ptr, ptr %7, align 8, !tbaa !5
  %1195 = getelementptr inbounds %struct.thermo, ptr %1194, i32 0, i32 93
  %1196 = getelementptr inbounds [2048 x i8], ptr %1195, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1193, ptr noundef @.str, ptr noundef @.str.53, ptr noundef %1196)
  %1197 = load ptr, ptr %7, align 8, !tbaa !5
  %1198 = getelementptr inbounds %struct.thermo, ptr %1197, i32 0, i32 93
  %1199 = getelementptr inbounds [2048 x i8], ptr %1198, i64 0, i64 0
  %1200 = getelementptr inbounds [2048 x i8], ptr %91, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1199, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 644, ptr noundef %1200)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %91) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1201:                                             ; preds = %1170
  %1202 = load ptr, ptr %13, align 8, !tbaa !5
  %1203 = load ptr, ptr %7, align 8, !tbaa !5
  %1204 = getelementptr inbounds %struct.thermo, ptr %1203, i32 0, i32 62
  %1205 = load i32, ptr %1204, align 8, !tbaa !38
  %1206 = load ptr, ptr %7, align 8, !tbaa !5
  %1207 = getelementptr inbounds %struct.thermo, ptr %1206, i32 0, i32 64
  %1208 = load ptr, ptr %1207, align 8, !tbaa !47
  %1209 = load ptr, ptr %7, align 8, !tbaa !5
  %1210 = getelementptr inbounds %struct.thermo, ptr %1209, i32 0, i32 61
  %1211 = load i32, ptr %1210, align 4, !tbaa !48
  %1212 = load ptr, ptr %7, align 8, !tbaa !5
  %1213 = getelementptr inbounds %struct.thermo, ptr %1212, i32 0, i32 39
  %1214 = load i32, ptr %1213, align 4, !tbaa !50
  %1215 = load ptr, ptr %7, align 8, !tbaa !5
  %1216 = getelementptr inbounds %struct.thermo, ptr %1215, i32 0, i32 40
  %1217 = load i32, ptr %1216, align 8, !tbaa !63
  %1218 = load ptr, ptr %7, align 8, !tbaa !5
  %1219 = getelementptr inbounds %struct.thermo, ptr %1218, i32 0, i32 42
  %1220 = load i32, ptr %1219, align 8, !tbaa !70
  %1221 = load ptr, ptr %7, align 8, !tbaa !5
  %1222 = getelementptr inbounds %struct.thermo, ptr %1221, i32 0, i32 93
  %1223 = getelementptr inbounds [2048 x i8], ptr %1222, i64 0, i64 0
  %1224 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef %1202, i32 noundef %1205, ptr noundef %1208, i32 noundef %1211, i32 noundef %1214, i32 noundef %1217, i32 noundef %1220, ptr noundef %1223)
  %1225 = icmp eq i32 %1224, 1
  br i1 %1225, label %1226, label %1235

1226:                                             ; preds = %1201
  call void @llvm.lifetime.start.p0(i64 2048, ptr %92) #6
  %1227 = getelementptr inbounds [2048 x i8], ptr %92, i64 0, i64 0
  %1228 = load ptr, ptr %7, align 8, !tbaa !5
  %1229 = getelementptr inbounds %struct.thermo, ptr %1228, i32 0, i32 93
  %1230 = getelementptr inbounds [2048 x i8], ptr %1229, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1227, ptr noundef @.str, ptr noundef @.str.54, ptr noundef %1230)
  %1231 = load ptr, ptr %7, align 8, !tbaa !5
  %1232 = getelementptr inbounds %struct.thermo, ptr %1231, i32 0, i32 93
  %1233 = getelementptr inbounds [2048 x i8], ptr %1232, i64 0, i64 0
  %1234 = getelementptr inbounds [2048 x i8], ptr %92, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1233, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 657, ptr noundef %1234)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %92) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1235:                                             ; preds = %1201
  %1236 = load ptr, ptr %13, align 8, !tbaa !5
  call void @free(ptr noundef %1236) #6
  %1237 = load ptr, ptr %12, align 8, !tbaa !5
  %1238 = load ptr, ptr %7, align 8, !tbaa !5
  %1239 = getelementptr inbounds %struct.thermo, ptr %1238, i32 0, i32 62
  %1240 = load i32, ptr %1239, align 8, !tbaa !38
  %1241 = sub nsw i32 %1240, 1
  %1242 = sext i32 %1241 to i64
  %1243 = getelementptr inbounds double, ptr %1237, i64 %1242
  %1244 = load double, ptr %1243, align 8, !tbaa !9
  store double %1244, ptr %21, align 8, !tbaa !9
  %1245 = load ptr, ptr %7, align 8, !tbaa !5
  %1246 = getelementptr inbounds %struct.thermo, ptr %1245, i32 0, i32 64
  %1247 = load ptr, ptr %1246, align 8, !tbaa !47
  %1248 = load ptr, ptr %7, align 8, !tbaa !5
  %1249 = getelementptr inbounds %struct.thermo, ptr %1248, i32 0, i32 62
  %1250 = load i32, ptr %1249, align 8, !tbaa !38
  %1251 = sub nsw i32 %1250, 1
  %1252 = load ptr, ptr %7, align 8, !tbaa !5
  %1253 = getelementptr inbounds %struct.thermo, ptr %1252, i32 0, i32 61
  %1254 = load i32, ptr %1253, align 4, !tbaa !48
  %1255 = mul nsw i32 %1251, %1254
  %1256 = load ptr, ptr %7, align 8, !tbaa !5
  %1257 = getelementptr inbounds %struct.thermo, ptr %1256, i32 0, i32 37
  %1258 = load i32, ptr %1257, align 4, !tbaa !49
  %1259 = add nsw i32 %1255, %1258
  %1260 = sext i32 %1259 to i64
  %1261 = getelementptr inbounds double, ptr %1247, i64 %1260
  %1262 = load double, ptr %1261, align 8, !tbaa !9
  store double %1262, ptr %24, align 8, !tbaa !9
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %1263

1263:                                             ; preds = %1311, %1235
  %1264 = load i32, ptr %8, align 4, !tbaa !32
  %1265 = load ptr, ptr %7, align 8, !tbaa !5
  %1266 = getelementptr inbounds %struct.thermo, ptr %1265, i32 0, i32 62
  %1267 = load i32, ptr %1266, align 8, !tbaa !38
  %1268 = icmp slt i32 %1264, %1267
  br i1 %1268, label %1269, label %1314

1269:                                             ; preds = %1263
  %1270 = load double, ptr %21, align 8, !tbaa !9
  %1271 = fmul double 0x3FAE573AC901E574, %1270
  %1272 = load double, ptr %24, align 8, !tbaa !9
  %1273 = fdiv double %1271, %1272
  %1274 = load ptr, ptr %7, align 8, !tbaa !5
  %1275 = getelementptr inbounds %struct.thermo, ptr %1274, i32 0, i32 64
  %1276 = load ptr, ptr %1275, align 8, !tbaa !47
  %1277 = load ptr, ptr %7, align 8, !tbaa !5
  %1278 = getelementptr inbounds %struct.thermo, ptr %1277, i32 0, i32 62
  %1279 = load i32, ptr %1278, align 8, !tbaa !38
  %1280 = sub nsw i32 %1279, 1
  %1281 = load i32, ptr %8, align 4, !tbaa !32
  %1282 = sub nsw i32 %1280, %1281
  %1283 = load ptr, ptr %7, align 8, !tbaa !5
  %1284 = getelementptr inbounds %struct.thermo, ptr %1283, i32 0, i32 61
  %1285 = load i32, ptr %1284, align 4, !tbaa !48
  %1286 = mul nsw i32 %1282, %1285
  %1287 = load ptr, ptr %7, align 8, !tbaa !5
  %1288 = getelementptr inbounds %struct.thermo, ptr %1287, i32 0, i32 42
  %1289 = load i32, ptr %1288, align 8, !tbaa !70
  %1290 = add nsw i32 %1286, %1289
  %1291 = sext i32 %1290 to i64
  %1292 = getelementptr inbounds double, ptr %1276, i64 %1291
  %1293 = load double, ptr %1292, align 8, !tbaa !9
  %1294 = fadd double %1273, %1293
  %1295 = call double @sqrt(double noundef %1294) #6
  %1296 = fmul double 0x401921FB54442D18, %1295
  %1297 = load ptr, ptr %7, align 8, !tbaa !5
  %1298 = getelementptr inbounds %struct.thermo, ptr %1297, i32 0, i32 64
  %1299 = load ptr, ptr %1298, align 8, !tbaa !47
  %1300 = load i32, ptr %8, align 4, !tbaa !32
  %1301 = load ptr, ptr %7, align 8, !tbaa !5
  %1302 = getelementptr inbounds %struct.thermo, ptr %1301, i32 0, i32 61
  %1303 = load i32, ptr %1302, align 4, !tbaa !48
  %1304 = mul nsw i32 %1300, %1303
  %1305 = load ptr, ptr %7, align 8, !tbaa !5
  %1306 = getelementptr inbounds %struct.thermo, ptr %1305, i32 0, i32 60
  %1307 = load i32, ptr %1306, align 8, !tbaa !71
  %1308 = add nsw i32 %1304, %1307
  %1309 = sext i32 %1308 to i64
  %1310 = getelementptr inbounds double, ptr %1299, i64 %1309
  store double %1296, ptr %1310, align 8, !tbaa !9
  br label %1311

1311:                                             ; preds = %1269
  %1312 = load i32, ptr %8, align 4, !tbaa !32
  %1313 = add nsw i32 %1312, 1
  store i32 %1313, ptr %8, align 4, !tbaa !32
  br label %1263, !llvm.loop !72

1314:                                             ; preds = %1263
  br label %1315

1315:                                             ; preds = %1314, %1030
  %1316 = load ptr, ptr %12, align 8, !tbaa !5
  %1317 = load ptr, ptr %7, align 8, !tbaa !5
  %1318 = getelementptr inbounds %struct.thermo, ptr %1317, i32 0, i32 62
  %1319 = load i32, ptr %1318, align 8, !tbaa !38
  %1320 = load ptr, ptr %7, align 8, !tbaa !5
  %1321 = getelementptr inbounds %struct.thermo, ptr %1320, i32 0, i32 64
  %1322 = load ptr, ptr %1321, align 8, !tbaa !47
  %1323 = load ptr, ptr %7, align 8, !tbaa !5
  %1324 = getelementptr inbounds %struct.thermo, ptr %1323, i32 0, i32 61
  %1325 = load i32, ptr %1324, align 4, !tbaa !48
  %1326 = load ptr, ptr %7, align 8, !tbaa !5
  %1327 = getelementptr inbounds %struct.thermo, ptr %1326, i32 0, i32 37
  %1328 = load i32, ptr %1327, align 4, !tbaa !49
  %1329 = load ptr, ptr %7, align 8, !tbaa !5
  %1330 = getelementptr inbounds %struct.thermo, ptr %1329, i32 0, i32 40
  %1331 = load i32, ptr %1330, align 8, !tbaa !63
  %1332 = load ptr, ptr %7, align 8, !tbaa !5
  %1333 = getelementptr inbounds %struct.thermo, ptr %1332, i32 0, i32 93
  %1334 = getelementptr inbounds [2048 x i8], ptr %1333, i64 0, i64 0
  %1335 = call i32 @array_spline_table_line_to_line(ptr noundef %1316, i32 noundef %1319, ptr noundef %1322, i32 noundef %1325, i32 noundef %1328, i32 noundef %1331, i16 noundef signext 1, ptr noundef %1334)
  %1336 = icmp eq i32 %1335, 1
  br i1 %1336, label %1337, label %1346

1337:                                             ; preds = %1315
  call void @llvm.lifetime.start.p0(i64 2048, ptr %93) #6
  %1338 = getelementptr inbounds [2048 x i8], ptr %93, i64 0, i64 0
  %1339 = load ptr, ptr %7, align 8, !tbaa !5
  %1340 = getelementptr inbounds %struct.thermo, ptr %1339, i32 0, i32 93
  %1341 = getelementptr inbounds [2048 x i8], ptr %1340, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1338, ptr noundef @.str, ptr noundef @.str.55, ptr noundef %1341)
  %1342 = load ptr, ptr %7, align 8, !tbaa !5
  %1343 = getelementptr inbounds %struct.thermo, ptr %1342, i32 0, i32 93
  %1344 = getelementptr inbounds [2048 x i8], ptr %1343, i64 0, i64 0
  %1345 = getelementptr inbounds [2048 x i8], ptr %93, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1344, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 690, ptr noundef %1345)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %93) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1346:                                             ; preds = %1315
  %1347 = load ptr, ptr %12, align 8, !tbaa !5
  %1348 = load ptr, ptr %7, align 8, !tbaa !5
  %1349 = getelementptr inbounds %struct.thermo, ptr %1348, i32 0, i32 62
  %1350 = load i32, ptr %1349, align 8, !tbaa !38
  %1351 = load ptr, ptr %7, align 8, !tbaa !5
  %1352 = getelementptr inbounds %struct.thermo, ptr %1351, i32 0, i32 64
  %1353 = load ptr, ptr %1352, align 8, !tbaa !47
  %1354 = load ptr, ptr %7, align 8, !tbaa !5
  %1355 = getelementptr inbounds %struct.thermo, ptr %1354, i32 0, i32 61
  %1356 = load i32, ptr %1355, align 4, !tbaa !48
  %1357 = load ptr, ptr %7, align 8, !tbaa !5
  %1358 = getelementptr inbounds %struct.thermo, ptr %1357, i32 0, i32 37
  %1359 = load i32, ptr %1358, align 4, !tbaa !49
  %1360 = load ptr, ptr %7, align 8, !tbaa !5
  %1361 = getelementptr inbounds %struct.thermo, ptr %1360, i32 0, i32 40
  %1362 = load i32, ptr %1361, align 8, !tbaa !63
  %1363 = load ptr, ptr %7, align 8, !tbaa !5
  %1364 = getelementptr inbounds %struct.thermo, ptr %1363, i32 0, i32 39
  %1365 = load i32, ptr %1364, align 4, !tbaa !50
  %1366 = load ptr, ptr %7, align 8, !tbaa !5
  %1367 = getelementptr inbounds %struct.thermo, ptr %1366, i32 0, i32 93
  %1368 = getelementptr inbounds [2048 x i8], ptr %1367, i64 0, i64 0
  %1369 = call i32 @array_derive_spline_table_line_to_line(ptr noundef %1347, i32 noundef %1350, ptr noundef %1353, i32 noundef %1356, i32 noundef %1359, i32 noundef %1362, i32 noundef %1365, ptr noundef %1368)
  %1370 = icmp eq i32 %1369, 1
  br i1 %1370, label %1371, label %1380

1371:                                             ; preds = %1346
  call void @llvm.lifetime.start.p0(i64 2048, ptr %94) #6
  %1372 = getelementptr inbounds [2048 x i8], ptr %94, i64 0, i64 0
  %1373 = load ptr, ptr %7, align 8, !tbaa !5
  %1374 = getelementptr inbounds %struct.thermo, ptr %1373, i32 0, i32 93
  %1375 = getelementptr inbounds [2048 x i8], ptr %1374, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1372, ptr noundef @.str, ptr noundef @.str.56, ptr noundef %1375)
  %1376 = load ptr, ptr %7, align 8, !tbaa !5
  %1377 = getelementptr inbounds %struct.thermo, ptr %1376, i32 0, i32 93
  %1378 = getelementptr inbounds [2048 x i8], ptr %1377, i64 0, i64 0
  %1379 = getelementptr inbounds [2048 x i8], ptr %94, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1378, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 702, ptr noundef %1379)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %94) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1380:                                             ; preds = %1346
  %1381 = load ptr, ptr %12, align 8, !tbaa !5
  %1382 = load ptr, ptr %7, align 8, !tbaa !5
  %1383 = getelementptr inbounds %struct.thermo, ptr %1382, i32 0, i32 62
  %1384 = load i32, ptr %1383, align 8, !tbaa !38
  %1385 = load ptr, ptr %7, align 8, !tbaa !5
  %1386 = getelementptr inbounds %struct.thermo, ptr %1385, i32 0, i32 64
  %1387 = load ptr, ptr %1386, align 8, !tbaa !47
  %1388 = load ptr, ptr %7, align 8, !tbaa !5
  %1389 = getelementptr inbounds %struct.thermo, ptr %1388, i32 0, i32 61
  %1390 = load i32, ptr %1389, align 4, !tbaa !48
  %1391 = load ptr, ptr %7, align 8, !tbaa !5
  %1392 = getelementptr inbounds %struct.thermo, ptr %1391, i32 0, i32 37
  %1393 = load i32, ptr %1392, align 4, !tbaa !49
  %1394 = load ptr, ptr %7, align 8, !tbaa !5
  %1395 = getelementptr inbounds %struct.thermo, ptr %1394, i32 0, i32 40
  %1396 = load i32, ptr %1395, align 8, !tbaa !63
  %1397 = load ptr, ptr %7, align 8, !tbaa !5
  %1398 = getelementptr inbounds %struct.thermo, ptr %1397, i32 0, i32 42
  %1399 = load i32, ptr %1398, align 8, !tbaa !70
  %1400 = load ptr, ptr %7, align 8, !tbaa !5
  %1401 = getelementptr inbounds %struct.thermo, ptr %1400, i32 0, i32 93
  %1402 = getelementptr inbounds [2048 x i8], ptr %1401, i64 0, i64 0
  %1403 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef %1381, i32 noundef %1384, ptr noundef %1387, i32 noundef %1390, i32 noundef %1393, i32 noundef %1396, i32 noundef %1399, ptr noundef %1402)
  %1404 = icmp eq i32 %1403, 1
  br i1 %1404, label %1405, label %1414

1405:                                             ; preds = %1380
  call void @llvm.lifetime.start.p0(i64 2048, ptr %95) #6
  %1406 = getelementptr inbounds [2048 x i8], ptr %95, i64 0, i64 0
  %1407 = load ptr, ptr %7, align 8, !tbaa !5
  %1408 = getelementptr inbounds %struct.thermo, ptr %1407, i32 0, i32 93
  %1409 = getelementptr inbounds [2048 x i8], ptr %1408, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1406, ptr noundef @.str, ptr noundef @.str.57, ptr noundef %1409)
  %1410 = load ptr, ptr %7, align 8, !tbaa !5
  %1411 = getelementptr inbounds %struct.thermo, ptr %1410, i32 0, i32 93
  %1412 = getelementptr inbounds [2048 x i8], ptr %1411, i64 0, i64 0
  %1413 = getelementptr inbounds [2048 x i8], ptr %95, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1412, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 714, ptr noundef %1413)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %95) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1414:                                             ; preds = %1380
  %1415 = load ptr, ptr %7, align 8, !tbaa !5
  %1416 = getelementptr inbounds %struct.thermo, ptr %1415, i32 0, i32 6
  %1417 = load i16, ptr %1416, align 8, !tbaa !73
  %1418 = sext i16 %1417 to i32
  %1419 = icmp eq i32 %1418, 1
  br i1 %1419, label %1420, label %1486

1420:                                             ; preds = %1414
  %1421 = load ptr, ptr %12, align 8, !tbaa !5
  %1422 = load ptr, ptr %7, align 8, !tbaa !5
  %1423 = getelementptr inbounds %struct.thermo, ptr %1422, i32 0, i32 62
  %1424 = load i32, ptr %1423, align 8, !tbaa !38
  %1425 = load ptr, ptr %7, align 8, !tbaa !5
  %1426 = getelementptr inbounds %struct.thermo, ptr %1425, i32 0, i32 64
  %1427 = load ptr, ptr %1426, align 8, !tbaa !47
  %1428 = load ptr, ptr %7, align 8, !tbaa !5
  %1429 = getelementptr inbounds %struct.thermo, ptr %1428, i32 0, i32 61
  %1430 = load i32, ptr %1429, align 4, !tbaa !48
  %1431 = load ptr, ptr %7, align 8, !tbaa !5
  %1432 = getelementptr inbounds %struct.thermo, ptr %1431, i32 0, i32 56
  %1433 = load i32, ptr %1432, align 8, !tbaa !74
  %1434 = load ptr, ptr %7, align 8, !tbaa !5
  %1435 = getelementptr inbounds %struct.thermo, ptr %1434, i32 0, i32 58
  %1436 = load i32, ptr %1435, align 8, !tbaa !75
  %1437 = load ptr, ptr %7, align 8, !tbaa !5
  %1438 = getelementptr inbounds %struct.thermo, ptr %1437, i32 0, i32 93
  %1439 = getelementptr inbounds [2048 x i8], ptr %1438, i64 0, i64 0
  %1440 = call i32 @array_spline_table_line_to_line(ptr noundef %1421, i32 noundef %1424, ptr noundef %1427, i32 noundef %1430, i32 noundef %1433, i32 noundef %1436, i16 noundef signext 1, ptr noundef %1439)
  %1441 = icmp eq i32 %1440, 1
  br i1 %1441, label %1442, label %1451

1442:                                             ; preds = %1420
  call void @llvm.lifetime.start.p0(i64 2048, ptr %96) #6
  %1443 = getelementptr inbounds [2048 x i8], ptr %96, i64 0, i64 0
  %1444 = load ptr, ptr %7, align 8, !tbaa !5
  %1445 = getelementptr inbounds %struct.thermo, ptr %1444, i32 0, i32 93
  %1446 = getelementptr inbounds [2048 x i8], ptr %1445, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1443, ptr noundef @.str, ptr noundef @.str.58, ptr noundef %1446)
  %1447 = load ptr, ptr %7, align 8, !tbaa !5
  %1448 = getelementptr inbounds %struct.thermo, ptr %1447, i32 0, i32 93
  %1449 = getelementptr inbounds [2048 x i8], ptr %1448, i64 0, i64 0
  %1450 = getelementptr inbounds [2048 x i8], ptr %96, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1449, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 729, ptr noundef %1450)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %96) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1451:                                             ; preds = %1420
  %1452 = load ptr, ptr %12, align 8, !tbaa !5
  %1453 = load ptr, ptr %7, align 8, !tbaa !5
  %1454 = getelementptr inbounds %struct.thermo, ptr %1453, i32 0, i32 62
  %1455 = load i32, ptr %1454, align 8, !tbaa !38
  %1456 = load ptr, ptr %7, align 8, !tbaa !5
  %1457 = getelementptr inbounds %struct.thermo, ptr %1456, i32 0, i32 64
  %1458 = load ptr, ptr %1457, align 8, !tbaa !47
  %1459 = load ptr, ptr %7, align 8, !tbaa !5
  %1460 = getelementptr inbounds %struct.thermo, ptr %1459, i32 0, i32 61
  %1461 = load i32, ptr %1460, align 4, !tbaa !48
  %1462 = load ptr, ptr %7, align 8, !tbaa !5
  %1463 = getelementptr inbounds %struct.thermo, ptr %1462, i32 0, i32 56
  %1464 = load i32, ptr %1463, align 8, !tbaa !74
  %1465 = load ptr, ptr %7, align 8, !tbaa !5
  %1466 = getelementptr inbounds %struct.thermo, ptr %1465, i32 0, i32 58
  %1467 = load i32, ptr %1466, align 8, !tbaa !75
  %1468 = load ptr, ptr %7, align 8, !tbaa !5
  %1469 = getelementptr inbounds %struct.thermo, ptr %1468, i32 0, i32 57
  %1470 = load i32, ptr %1469, align 4, !tbaa !76
  %1471 = load ptr, ptr %7, align 8, !tbaa !5
  %1472 = getelementptr inbounds %struct.thermo, ptr %1471, i32 0, i32 93
  %1473 = getelementptr inbounds [2048 x i8], ptr %1472, i64 0, i64 0
  %1474 = call i32 @array_derive_spline_table_line_to_line(ptr noundef %1452, i32 noundef %1455, ptr noundef %1458, i32 noundef %1461, i32 noundef %1464, i32 noundef %1467, i32 noundef %1470, ptr noundef %1473)
  %1475 = icmp eq i32 %1474, 1
  br i1 %1475, label %1476, label %1485

1476:                                             ; preds = %1451
  call void @llvm.lifetime.start.p0(i64 2048, ptr %97) #6
  %1477 = getelementptr inbounds [2048 x i8], ptr %97, i64 0, i64 0
  %1478 = load ptr, ptr %7, align 8, !tbaa !5
  %1479 = getelementptr inbounds %struct.thermo, ptr %1478, i32 0, i32 93
  %1480 = getelementptr inbounds [2048 x i8], ptr %1479, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1477, ptr noundef @.str, ptr noundef @.str.59, ptr noundef %1480)
  %1481 = load ptr, ptr %7, align 8, !tbaa !5
  %1482 = getelementptr inbounds %struct.thermo, ptr %1481, i32 0, i32 93
  %1483 = getelementptr inbounds [2048 x i8], ptr %1482, i64 0, i64 0
  %1484 = getelementptr inbounds [2048 x i8], ptr %97, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1483, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 742, ptr noundef %1484)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %97) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1485:                                             ; preds = %1451
  br label %1486

1486:                                             ; preds = %1485, %1414
  %1487 = load ptr, ptr %7, align 8, !tbaa !5
  %1488 = getelementptr inbounds %struct.thermo, ptr %1487, i32 0, i32 62
  %1489 = load i32, ptr %1488, align 8, !tbaa !38
  %1490 = sub nsw i32 %1489, 1
  store i32 %1490, ptr %8, align 4, !tbaa !32
  br label %1491

1491:                                             ; preds = %1986, %1486
  %1492 = load i32, ptr %8, align 4, !tbaa !32
  %1493 = icmp sge i32 %1492, 0
  br i1 %1493, label %1494, label %1989

1494:                                             ; preds = %1491
  %1495 = load ptr, ptr %7, align 8, !tbaa !5
  %1496 = getelementptr inbounds %struct.thermo, ptr %1495, i32 0, i32 64
  %1497 = load ptr, ptr %1496, align 8, !tbaa !47
  %1498 = load i32, ptr %8, align 4, !tbaa !32
  %1499 = load ptr, ptr %7, align 8, !tbaa !5
  %1500 = getelementptr inbounds %struct.thermo, ptr %1499, i32 0, i32 61
  %1501 = load i32, ptr %1500, align 4, !tbaa !48
  %1502 = mul nsw i32 %1498, %1501
  %1503 = load ptr, ptr %7, align 8, !tbaa !5
  %1504 = getelementptr inbounds %struct.thermo, ptr %1503, i32 0, i32 37
  %1505 = load i32, ptr %1504, align 4, !tbaa !49
  %1506 = add nsw i32 %1502, %1505
  %1507 = sext i32 %1506 to i64
  %1508 = getelementptr inbounds double, ptr %1497, i64 %1507
  %1509 = load double, ptr %1508, align 8, !tbaa !9
  %1510 = load ptr, ptr %7, align 8, !tbaa !5
  %1511 = getelementptr inbounds %struct.thermo, ptr %1510, i32 0, i32 64
  %1512 = load ptr, ptr %1511, align 8, !tbaa !47
  %1513 = load i32, ptr %8, align 4, !tbaa !32
  %1514 = load ptr, ptr %7, align 8, !tbaa !5
  %1515 = getelementptr inbounds %struct.thermo, ptr %1514, i32 0, i32 61
  %1516 = load i32, ptr %1515, align 4, !tbaa !48
  %1517 = mul nsw i32 %1513, %1516
  %1518 = load ptr, ptr %7, align 8, !tbaa !5
  %1519 = getelementptr inbounds %struct.thermo, ptr %1518, i32 0, i32 42
  %1520 = load i32, ptr %1519, align 8, !tbaa !70
  %1521 = add nsw i32 %1517, %1520
  %1522 = sext i32 %1521 to i64
  %1523 = getelementptr inbounds double, ptr %1512, i64 %1522
  %1524 = load double, ptr %1523, align 8, !tbaa !9
  %1525 = call double @exp(double noundef %1524) #6
  %1526 = fmul double %1509, %1525
  store double %1526, ptr %9, align 8, !tbaa !9
  %1527 = load double, ptr %9, align 8, !tbaa !9
  %1528 = fcmp oeq double %1527, 0.000000e+00
  br i1 %1528, label %1529, label %1530

1529:                                             ; preds = %1494
  store double 0x10000000000000, ptr %9, align 8, !tbaa !9
  br label %1530

1530:                                             ; preds = %1529, %1494
  %1531 = load ptr, ptr %7, align 8, !tbaa !5
  %1532 = getelementptr inbounds %struct.thermo, ptr %1531, i32 0, i32 64
  %1533 = load ptr, ptr %1532, align 8, !tbaa !47
  %1534 = load i32, ptr %8, align 4, !tbaa !32
  %1535 = load ptr, ptr %7, align 8, !tbaa !5
  %1536 = getelementptr inbounds %struct.thermo, ptr %1535, i32 0, i32 61
  %1537 = load i32, ptr %1536, align 4, !tbaa !48
  %1538 = mul nsw i32 %1534, %1537
  %1539 = load ptr, ptr %7, align 8, !tbaa !5
  %1540 = getelementptr inbounds %struct.thermo, ptr %1539, i32 0, i32 42
  %1541 = load i32, ptr %1540, align 8, !tbaa !70
  %1542 = add nsw i32 %1538, %1541
  %1543 = sext i32 %1542 to i64
  %1544 = getelementptr inbounds double, ptr %1533, i64 %1543
  %1545 = load double, ptr %1544, align 8, !tbaa !9
  %1546 = call double @exp(double noundef %1545) #6
  %1547 = load ptr, ptr %7, align 8, !tbaa !5
  %1548 = getelementptr inbounds %struct.thermo, ptr %1547, i32 0, i32 64
  %1549 = load ptr, ptr %1548, align 8, !tbaa !47
  %1550 = load i32, ptr %8, align 4, !tbaa !32
  %1551 = load ptr, ptr %7, align 8, !tbaa !5
  %1552 = getelementptr inbounds %struct.thermo, ptr %1551, i32 0, i32 61
  %1553 = load i32, ptr %1552, align 4, !tbaa !48
  %1554 = mul nsw i32 %1550, %1553
  %1555 = load ptr, ptr %7, align 8, !tbaa !5
  %1556 = getelementptr inbounds %struct.thermo, ptr %1555, i32 0, i32 41
  %1557 = load i32, ptr %1556, align 4, !tbaa !77
  %1558 = add nsw i32 %1554, %1557
  %1559 = sext i32 %1558 to i64
  %1560 = getelementptr inbounds double, ptr %1549, i64 %1559
  store double %1546, ptr %1560, align 8, !tbaa !9
  %1561 = load ptr, ptr %7, align 8, !tbaa !5
  %1562 = getelementptr inbounds %struct.thermo, ptr %1561, i32 0, i32 64
  %1563 = load ptr, ptr %1562, align 8, !tbaa !47
  %1564 = load i32, ptr %8, align 4, !tbaa !32
  %1565 = load ptr, ptr %7, align 8, !tbaa !5
  %1566 = getelementptr inbounds %struct.thermo, ptr %1565, i32 0, i32 61
  %1567 = load i32, ptr %1566, align 4, !tbaa !48
  %1568 = mul nsw i32 %1564, %1567
  %1569 = load ptr, ptr %7, align 8, !tbaa !5
  %1570 = getelementptr inbounds %struct.thermo, ptr %1569, i32 0, i32 39
  %1571 = load i32, ptr %1570, align 4, !tbaa !50
  %1572 = add nsw i32 %1568, %1571
  %1573 = sext i32 %1572 to i64
  %1574 = getelementptr inbounds double, ptr %1563, i64 %1573
  %1575 = load double, ptr %1574, align 8, !tbaa !9
  %1576 = load ptr, ptr %7, align 8, !tbaa !5
  %1577 = getelementptr inbounds %struct.thermo, ptr %1576, i32 0, i32 64
  %1578 = load ptr, ptr %1577, align 8, !tbaa !47
  %1579 = load i32, ptr %8, align 4, !tbaa !32
  %1580 = load ptr, ptr %7, align 8, !tbaa !5
  %1581 = getelementptr inbounds %struct.thermo, ptr %1580, i32 0, i32 61
  %1582 = load i32, ptr %1581, align 4, !tbaa !48
  %1583 = mul nsw i32 %1579, %1582
  %1584 = load ptr, ptr %7, align 8, !tbaa !5
  %1585 = getelementptr inbounds %struct.thermo, ptr %1584, i32 0, i32 37
  %1586 = load i32, ptr %1585, align 4, !tbaa !49
  %1587 = add nsw i32 %1583, %1586
  %1588 = sext i32 %1587 to i64
  %1589 = getelementptr inbounds double, ptr %1578, i64 %1588
  %1590 = load double, ptr %1589, align 8, !tbaa !9
  %1591 = load ptr, ptr %7, align 8, !tbaa !5
  %1592 = getelementptr inbounds %struct.thermo, ptr %1591, i32 0, i32 64
  %1593 = load ptr, ptr %1592, align 8, !tbaa !47
  %1594 = load i32, ptr %8, align 4, !tbaa !32
  %1595 = load ptr, ptr %7, align 8, !tbaa !5
  %1596 = getelementptr inbounds %struct.thermo, ptr %1595, i32 0, i32 61
  %1597 = load i32, ptr %1596, align 4, !tbaa !48
  %1598 = mul nsw i32 %1594, %1597
  %1599 = load ptr, ptr %7, align 8, !tbaa !5
  %1600 = getelementptr inbounds %struct.thermo, ptr %1599, i32 0, i32 37
  %1601 = load i32, ptr %1600, align 4, !tbaa !49
  %1602 = add nsw i32 %1598, %1601
  %1603 = sext i32 %1602 to i64
  %1604 = getelementptr inbounds double, ptr %1593, i64 %1603
  %1605 = load double, ptr %1604, align 8, !tbaa !9
  %1606 = call double @llvm.fmuladd.f64(double %1590, double %1605, double %1575)
  %1607 = load ptr, ptr %7, align 8, !tbaa !5
  %1608 = getelementptr inbounds %struct.thermo, ptr %1607, i32 0, i32 64
  %1609 = load ptr, ptr %1608, align 8, !tbaa !47
  %1610 = load i32, ptr %8, align 4, !tbaa !32
  %1611 = load ptr, ptr %7, align 8, !tbaa !5
  %1612 = getelementptr inbounds %struct.thermo, ptr %1611, i32 0, i32 61
  %1613 = load i32, ptr %1612, align 4, !tbaa !48
  %1614 = mul nsw i32 %1610, %1613
  %1615 = load ptr, ptr %7, align 8, !tbaa !5
  %1616 = getelementptr inbounds %struct.thermo, ptr %1615, i32 0, i32 42
  %1617 = load i32, ptr %1616, align 8, !tbaa !70
  %1618 = add nsw i32 %1614, %1617
  %1619 = sext i32 %1618 to i64
  %1620 = getelementptr inbounds double, ptr %1609, i64 %1619
  %1621 = load double, ptr %1620, align 8, !tbaa !9
  %1622 = call double @exp(double noundef %1621) #6
  %1623 = fmul double %1606, %1622
  %1624 = load ptr, ptr %7, align 8, !tbaa !5
  %1625 = getelementptr inbounds %struct.thermo, ptr %1624, i32 0, i32 64
  %1626 = load ptr, ptr %1625, align 8, !tbaa !47
  %1627 = load i32, ptr %8, align 4, !tbaa !32
  %1628 = load ptr, ptr %7, align 8, !tbaa !5
  %1629 = getelementptr inbounds %struct.thermo, ptr %1628, i32 0, i32 61
  %1630 = load i32, ptr %1629, align 4, !tbaa !48
  %1631 = mul nsw i32 %1627, %1630
  %1632 = load ptr, ptr %7, align 8, !tbaa !5
  %1633 = getelementptr inbounds %struct.thermo, ptr %1632, i32 0, i32 43
  %1634 = load i32, ptr %1633, align 4, !tbaa !78
  %1635 = add nsw i32 %1631, %1634
  %1636 = sext i32 %1635 to i64
  %1637 = getelementptr inbounds double, ptr %1626, i64 %1636
  store double %1623, ptr %1637, align 8, !tbaa !9
  %1638 = load ptr, ptr %7, align 8, !tbaa !5
  %1639 = getelementptr inbounds %struct.thermo, ptr %1638, i32 0, i32 64
  %1640 = load ptr, ptr %1639, align 8, !tbaa !47
  %1641 = load i32, ptr %8, align 4, !tbaa !32
  %1642 = load ptr, ptr %7, align 8, !tbaa !5
  %1643 = getelementptr inbounds %struct.thermo, ptr %1642, i32 0, i32 61
  %1644 = load i32, ptr %1643, align 4, !tbaa !48
  %1645 = mul nsw i32 %1641, %1644
  %1646 = load ptr, ptr %7, align 8, !tbaa !5
  %1647 = getelementptr inbounds %struct.thermo, ptr %1646, i32 0, i32 40
  %1648 = load i32, ptr %1647, align 8, !tbaa !63
  %1649 = add nsw i32 %1645, %1648
  %1650 = sext i32 %1649 to i64
  %1651 = getelementptr inbounds double, ptr %1640, i64 %1650
  %1652 = load double, ptr %1651, align 8, !tbaa !9
  %1653 = load ptr, ptr %7, align 8, !tbaa !5
  %1654 = getelementptr inbounds %struct.thermo, ptr %1653, i32 0, i32 64
  %1655 = load ptr, ptr %1654, align 8, !tbaa !47
  %1656 = load i32, ptr %8, align 4, !tbaa !32
  %1657 = load ptr, ptr %7, align 8, !tbaa !5
  %1658 = getelementptr inbounds %struct.thermo, ptr %1657, i32 0, i32 61
  %1659 = load i32, ptr %1658, align 4, !tbaa !48
  %1660 = mul nsw i32 %1656, %1659
  %1661 = load ptr, ptr %7, align 8, !tbaa !5
  %1662 = getelementptr inbounds %struct.thermo, ptr %1661, i32 0, i32 37
  %1663 = load i32, ptr %1662, align 4, !tbaa !49
  %1664 = add nsw i32 %1660, %1663
  %1665 = sext i32 %1664 to i64
  %1666 = getelementptr inbounds double, ptr %1655, i64 %1665
  %1667 = load double, ptr %1666, align 8, !tbaa !9
  %1668 = load ptr, ptr %7, align 8, !tbaa !5
  %1669 = getelementptr inbounds %struct.thermo, ptr %1668, i32 0, i32 64
  %1670 = load ptr, ptr %1669, align 8, !tbaa !47
  %1671 = load i32, ptr %8, align 4, !tbaa !32
  %1672 = load ptr, ptr %7, align 8, !tbaa !5
  %1673 = getelementptr inbounds %struct.thermo, ptr %1672, i32 0, i32 61
  %1674 = load i32, ptr %1673, align 4, !tbaa !48
  %1675 = mul nsw i32 %1671, %1674
  %1676 = load ptr, ptr %7, align 8, !tbaa !5
  %1677 = getelementptr inbounds %struct.thermo, ptr %1676, i32 0, i32 39
  %1678 = load i32, ptr %1677, align 4, !tbaa !50
  %1679 = add nsw i32 %1675, %1678
  %1680 = sext i32 %1679 to i64
  %1681 = getelementptr inbounds double, ptr %1670, i64 %1680
  %1682 = load double, ptr %1681, align 8, !tbaa !9
  %1683 = fmul double %1667, %1682
  %1684 = call double @llvm.fmuladd.f64(double %1683, double 3.000000e+00, double %1652)
  %1685 = load ptr, ptr %7, align 8, !tbaa !5
  %1686 = getelementptr inbounds %struct.thermo, ptr %1685, i32 0, i32 64
  %1687 = load ptr, ptr %1686, align 8, !tbaa !47
  %1688 = load i32, ptr %8, align 4, !tbaa !32
  %1689 = load ptr, ptr %7, align 8, !tbaa !5
  %1690 = getelementptr inbounds %struct.thermo, ptr %1689, i32 0, i32 61
  %1691 = load i32, ptr %1690, align 4, !tbaa !48
  %1692 = mul nsw i32 %1688, %1691
  %1693 = load ptr, ptr %7, align 8, !tbaa !5
  %1694 = getelementptr inbounds %struct.thermo, ptr %1693, i32 0, i32 37
  %1695 = load i32, ptr %1694, align 4, !tbaa !49
  %1696 = add nsw i32 %1692, %1695
  %1697 = sext i32 %1696 to i64
  %1698 = getelementptr inbounds double, ptr %1687, i64 %1697
  %1699 = load double, ptr %1698, align 8, !tbaa !9
  %1700 = load ptr, ptr %7, align 8, !tbaa !5
  %1701 = getelementptr inbounds %struct.thermo, ptr %1700, i32 0, i32 64
  %1702 = load ptr, ptr %1701, align 8, !tbaa !47
  %1703 = load i32, ptr %8, align 4, !tbaa !32
  %1704 = load ptr, ptr %7, align 8, !tbaa !5
  %1705 = getelementptr inbounds %struct.thermo, ptr %1704, i32 0, i32 61
  %1706 = load i32, ptr %1705, align 4, !tbaa !48
  %1707 = mul nsw i32 %1703, %1706
  %1708 = load ptr, ptr %7, align 8, !tbaa !5
  %1709 = getelementptr inbounds %struct.thermo, ptr %1708, i32 0, i32 37
  %1710 = load i32, ptr %1709, align 4, !tbaa !49
  %1711 = add nsw i32 %1707, %1710
  %1712 = sext i32 %1711 to i64
  %1713 = getelementptr inbounds double, ptr %1702, i64 %1712
  %1714 = load double, ptr %1713, align 8, !tbaa !9
  %1715 = fmul double %1699, %1714
  %1716 = load ptr, ptr %7, align 8, !tbaa !5
  %1717 = getelementptr inbounds %struct.thermo, ptr %1716, i32 0, i32 64
  %1718 = load ptr, ptr %1717, align 8, !tbaa !47
  %1719 = load i32, ptr %8, align 4, !tbaa !32
  %1720 = load ptr, ptr %7, align 8, !tbaa !5
  %1721 = getelementptr inbounds %struct.thermo, ptr %1720, i32 0, i32 61
  %1722 = load i32, ptr %1721, align 4, !tbaa !48
  %1723 = mul nsw i32 %1719, %1722
  %1724 = load ptr, ptr %7, align 8, !tbaa !5
  %1725 = getelementptr inbounds %struct.thermo, ptr %1724, i32 0, i32 37
  %1726 = load i32, ptr %1725, align 4, !tbaa !49
  %1727 = add nsw i32 %1723, %1726
  %1728 = sext i32 %1727 to i64
  %1729 = getelementptr inbounds double, ptr %1718, i64 %1728
  %1730 = load double, ptr %1729, align 8, !tbaa !9
  %1731 = call double @llvm.fmuladd.f64(double %1715, double %1730, double %1684)
  %1732 = load ptr, ptr %7, align 8, !tbaa !5
  %1733 = getelementptr inbounds %struct.thermo, ptr %1732, i32 0, i32 64
  %1734 = load ptr, ptr %1733, align 8, !tbaa !47
  %1735 = load i32, ptr %8, align 4, !tbaa !32
  %1736 = load ptr, ptr %7, align 8, !tbaa !5
  %1737 = getelementptr inbounds %struct.thermo, ptr %1736, i32 0, i32 61
  %1738 = load i32, ptr %1737, align 4, !tbaa !48
  %1739 = mul nsw i32 %1735, %1738
  %1740 = load ptr, ptr %7, align 8, !tbaa !5
  %1741 = getelementptr inbounds %struct.thermo, ptr %1740, i32 0, i32 42
  %1742 = load i32, ptr %1741, align 8, !tbaa !70
  %1743 = add nsw i32 %1739, %1742
  %1744 = sext i32 %1743 to i64
  %1745 = getelementptr inbounds double, ptr %1734, i64 %1744
  %1746 = load double, ptr %1745, align 8, !tbaa !9
  %1747 = call double @exp(double noundef %1746) #6
  %1748 = fmul double %1731, %1747
  %1749 = load ptr, ptr %7, align 8, !tbaa !5
  %1750 = getelementptr inbounds %struct.thermo, ptr %1749, i32 0, i32 64
  %1751 = load ptr, ptr %1750, align 8, !tbaa !47
  %1752 = load i32, ptr %8, align 4, !tbaa !32
  %1753 = load ptr, ptr %7, align 8, !tbaa !5
  %1754 = getelementptr inbounds %struct.thermo, ptr %1753, i32 0, i32 61
  %1755 = load i32, ptr %1754, align 4, !tbaa !48
  %1756 = mul nsw i32 %1752, %1755
  %1757 = load ptr, ptr %7, align 8, !tbaa !5
  %1758 = getelementptr inbounds %struct.thermo, ptr %1757, i32 0, i32 44
  %1759 = load i32, ptr %1758, align 8, !tbaa !79
  %1760 = add nsw i32 %1756, %1759
  %1761 = sext i32 %1760 to i64
  %1762 = getelementptr inbounds double, ptr %1751, i64 %1761
  store double %1748, ptr %1762, align 8, !tbaa !9
  %1763 = load double, ptr %9, align 8, !tbaa !9
  %1764 = load ptr, ptr %7, align 8, !tbaa !5
  %1765 = getelementptr inbounds %struct.thermo, ptr %1764, i32 0, i32 64
  %1766 = load ptr, ptr %1765, align 8, !tbaa !47
  %1767 = load i32, ptr %8, align 4, !tbaa !32
  %1768 = load ptr, ptr %7, align 8, !tbaa !5
  %1769 = getelementptr inbounds %struct.thermo, ptr %1768, i32 0, i32 61
  %1770 = load i32, ptr %1769, align 4, !tbaa !48
  %1771 = mul nsw i32 %1767, %1770
  %1772 = load ptr, ptr %7, align 8, !tbaa !5
  %1773 = getelementptr inbounds %struct.thermo, ptr %1772, i32 0, i32 42
  %1774 = load i32, ptr %1773, align 8, !tbaa !70
  %1775 = add nsw i32 %1771, %1774
  %1776 = sext i32 %1775 to i64
  %1777 = getelementptr inbounds double, ptr %1766, i64 %1776
  store double %1763, ptr %1777, align 8, !tbaa !9
  %1778 = load ptr, ptr %7, align 8, !tbaa !5
  %1779 = getelementptr inbounds %struct.thermo, ptr %1778, i32 0, i32 64
  %1780 = load ptr, ptr %1779, align 8, !tbaa !47
  %1781 = load i32, ptr %8, align 4, !tbaa !32
  %1782 = load ptr, ptr %7, align 8, !tbaa !5
  %1783 = getelementptr inbounds %struct.thermo, ptr %1782, i32 0, i32 61
  %1784 = load i32, ptr %1783, align 4, !tbaa !48
  %1785 = mul nsw i32 %1781, %1784
  %1786 = load ptr, ptr %7, align 8, !tbaa !5
  %1787 = getelementptr inbounds %struct.thermo, ptr %1786, i32 0, i32 37
  %1788 = load i32, ptr %1787, align 4, !tbaa !49
  %1789 = add nsw i32 %1785, %1788
  %1790 = sext i32 %1789 to i64
  %1791 = getelementptr inbounds double, ptr %1780, i64 %1790
  %1792 = load double, ptr %1791, align 8, !tbaa !9
  %1793 = fcmp oeq double %1792, 0.000000e+00
  br i1 %1793, label %1794, label %1802

1794:                                             ; preds = %1530
  call void @llvm.lifetime.start.p0(i64 2048, ptr %98) #6
  %1795 = getelementptr inbounds [2048 x i8], ptr %98, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1795, ptr noundef @.str.60)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %99) #6
  %1796 = getelementptr inbounds [2048 x i8], ptr %99, i64 0, i64 0
  %1797 = getelementptr inbounds [2048 x i8], ptr %98, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1796, ptr noundef @.str.10, ptr noundef @.str.61, ptr noundef %1797)
  %1798 = load ptr, ptr %7, align 8, !tbaa !5
  %1799 = getelementptr inbounds %struct.thermo, ptr %1798, i32 0, i32 93
  %1800 = getelementptr inbounds [2048 x i8], ptr %1799, i64 0, i64 0
  %1801 = getelementptr inbounds [2048 x i8], ptr %99, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1800, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 784, ptr noundef %1801)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %99) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %98) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

1802:                                             ; preds = %1530
  %1803 = load ptr, ptr %7, align 8, !tbaa !5
  %1804 = getelementptr inbounds %struct.thermo, ptr %1803, i32 0, i32 64
  %1805 = load ptr, ptr %1804, align 8, !tbaa !47
  %1806 = load i32, ptr %8, align 4, !tbaa !32
  %1807 = load ptr, ptr %7, align 8, !tbaa !5
  %1808 = getelementptr inbounds %struct.thermo, ptr %1807, i32 0, i32 61
  %1809 = load i32, ptr %1808, align 4, !tbaa !48
  %1810 = mul nsw i32 %1806, %1809
  %1811 = load ptr, ptr %7, align 8, !tbaa !5
  %1812 = getelementptr inbounds %struct.thermo, ptr %1811, i32 0, i32 37
  %1813 = load i32, ptr %1812, align 4, !tbaa !49
  %1814 = add nsw i32 %1810, %1813
  %1815 = sext i32 %1814 to i64
  %1816 = getelementptr inbounds double, ptr %1805, i64 %1815
  %1817 = load double, ptr %1816, align 8, !tbaa !9
  %1818 = call double @pow(double noundef %1817, double noundef 2.000000e+00) #6
  %1819 = load ptr, ptr %7, align 8, !tbaa !5
  %1820 = getelementptr inbounds %struct.thermo, ptr %1819, i32 0, i32 64
  %1821 = load ptr, ptr %1820, align 8, !tbaa !47
  %1822 = load i32, ptr %8, align 4, !tbaa !32
  %1823 = load ptr, ptr %7, align 8, !tbaa !5
  %1824 = getelementptr inbounds %struct.thermo, ptr %1823, i32 0, i32 61
  %1825 = load i32, ptr %1824, align 4, !tbaa !48
  %1826 = mul nsw i32 %1822, %1825
  %1827 = load ptr, ptr %7, align 8, !tbaa !5
  %1828 = getelementptr inbounds %struct.thermo, ptr %1827, i32 0, i32 39
  %1829 = load i32, ptr %1828, align 4, !tbaa !50
  %1830 = add nsw i32 %1826, %1829
  %1831 = sext i32 %1830 to i64
  %1832 = getelementptr inbounds double, ptr %1821, i64 %1831
  %1833 = load double, ptr %1832, align 8, !tbaa !9
  %1834 = load ptr, ptr %7, align 8, !tbaa !5
  %1835 = getelementptr inbounds %struct.thermo, ptr %1834, i32 0, i32 64
  %1836 = load ptr, ptr %1835, align 8, !tbaa !47
  %1837 = load i32, ptr %8, align 4, !tbaa !32
  %1838 = load ptr, ptr %7, align 8, !tbaa !5
  %1839 = getelementptr inbounds %struct.thermo, ptr %1838, i32 0, i32 61
  %1840 = load i32, ptr %1839, align 4, !tbaa !48
  %1841 = mul nsw i32 %1837, %1840
  %1842 = load ptr, ptr %7, align 8, !tbaa !5
  %1843 = getelementptr inbounds %struct.thermo, ptr %1842, i32 0, i32 37
  %1844 = load i32, ptr %1843, align 4, !tbaa !49
  %1845 = add nsw i32 %1841, %1844
  %1846 = sext i32 %1845 to i64
  %1847 = getelementptr inbounds double, ptr %1836, i64 %1846
  %1848 = load double, ptr %1847, align 8, !tbaa !9
  %1849 = fdiv double %1833, %1848
  %1850 = call double @pow(double noundef %1849, double noundef 2.000000e+00) #6
  %1851 = fadd double %1818, %1850
  %1852 = load ptr, ptr %7, align 8, !tbaa !5
  %1853 = getelementptr inbounds %struct.thermo, ptr %1852, i32 0, i32 64
  %1854 = load ptr, ptr %1853, align 8, !tbaa !47
  %1855 = load i32, ptr %8, align 4, !tbaa !32
  %1856 = load ptr, ptr %7, align 8, !tbaa !5
  %1857 = getelementptr inbounds %struct.thermo, ptr %1856, i32 0, i32 61
  %1858 = load i32, ptr %1857, align 4, !tbaa !48
  %1859 = mul nsw i32 %1855, %1858
  %1860 = load ptr, ptr %7, align 8, !tbaa !5
  %1861 = getelementptr inbounds %struct.thermo, ptr %1860, i32 0, i32 40
  %1862 = load i32, ptr %1861, align 8, !tbaa !63
  %1863 = add nsw i32 %1859, %1862
  %1864 = sext i32 %1863 to i64
  %1865 = getelementptr inbounds double, ptr %1854, i64 %1864
  %1866 = load double, ptr %1865, align 8, !tbaa !9
  %1867 = load ptr, ptr %7, align 8, !tbaa !5
  %1868 = getelementptr inbounds %struct.thermo, ptr %1867, i32 0, i32 64
  %1869 = load ptr, ptr %1868, align 8, !tbaa !47
  %1870 = load i32, ptr %8, align 4, !tbaa !32
  %1871 = load ptr, ptr %7, align 8, !tbaa !5
  %1872 = getelementptr inbounds %struct.thermo, ptr %1871, i32 0, i32 61
  %1873 = load i32, ptr %1872, align 4, !tbaa !48
  %1874 = mul nsw i32 %1870, %1873
  %1875 = load ptr, ptr %7, align 8, !tbaa !5
  %1876 = getelementptr inbounds %struct.thermo, ptr %1875, i32 0, i32 37
  %1877 = load i32, ptr %1876, align 4, !tbaa !49
  %1878 = add nsw i32 %1874, %1877
  %1879 = sext i32 %1878 to i64
  %1880 = getelementptr inbounds double, ptr %1869, i64 %1879
  %1881 = load double, ptr %1880, align 8, !tbaa !9
  %1882 = fdiv double %1866, %1881
  %1883 = call double @llvm.fabs.f64(double %1882)
  %1884 = fadd double %1851, %1883
  %1885 = call double @sqrt(double noundef %1884) #6
  %1886 = load ptr, ptr %7, align 8, !tbaa !5
  %1887 = getelementptr inbounds %struct.thermo, ptr %1886, i32 0, i32 64
  %1888 = load ptr, ptr %1887, align 8, !tbaa !47
  %1889 = load i32, ptr %8, align 4, !tbaa !32
  %1890 = load ptr, ptr %7, align 8, !tbaa !5
  %1891 = getelementptr inbounds %struct.thermo, ptr %1890, i32 0, i32 61
  %1892 = load i32, ptr %1891, align 4, !tbaa !48
  %1893 = mul nsw i32 %1889, %1892
  %1894 = load ptr, ptr %7, align 8, !tbaa !5
  %1895 = getelementptr inbounds %struct.thermo, ptr %1894, i32 0, i32 59
  %1896 = load i32, ptr %1895, align 4, !tbaa !80
  %1897 = add nsw i32 %1893, %1896
  %1898 = sext i32 %1897 to i64
  %1899 = getelementptr inbounds double, ptr %1888, i64 %1898
  store double %1885, ptr %1899, align 8, !tbaa !9
  %1900 = load ptr, ptr %6, align 8, !tbaa !5
  %1901 = getelementptr inbounds %struct.background, ptr %1900, i32 0, i32 128
  %1902 = load i16, ptr %1901, align 2, !tbaa !23
  %1903 = sext i16 %1902 to i32
  %1904 = icmp eq i32 %1903, 1
  br i1 %1904, label %1905, label %1985

1905:                                             ; preds = %1802
  %1906 = load ptr, ptr %7, align 8, !tbaa !5
  %1907 = getelementptr inbounds %struct.thermo, ptr %1906, i32 0, i32 64
  %1908 = load ptr, ptr %1907, align 8, !tbaa !47
  %1909 = load i32, ptr %8, align 4, !tbaa !32
  %1910 = load ptr, ptr %7, align 8, !tbaa !5
  %1911 = getelementptr inbounds %struct.thermo, ptr %1910, i32 0, i32 61
  %1912 = load i32, ptr %1911, align 4, !tbaa !48
  %1913 = mul nsw i32 %1909, %1912
  %1914 = load ptr, ptr %7, align 8, !tbaa !5
  %1915 = getelementptr inbounds %struct.thermo, ptr %1914, i32 0, i32 49
  %1916 = load i32, ptr %1915, align 4, !tbaa !66
  %1917 = add nsw i32 %1913, %1916
  %1918 = sext i32 %1917 to i64
  %1919 = getelementptr inbounds double, ptr %1908, i64 %1918
  %1920 = load double, ptr %1919, align 8, !tbaa !9
  %1921 = fmul double %1920, -1.000000e+00
  store double %1921, ptr %1919, align 8, !tbaa !9
  %1922 = load ptr, ptr %7, align 8, !tbaa !5
  %1923 = getelementptr inbounds %struct.thermo, ptr %1922, i32 0, i32 64
  %1924 = load ptr, ptr %1923, align 8, !tbaa !47
  %1925 = load i32, ptr %8, align 4, !tbaa !32
  %1926 = load ptr, ptr %7, align 8, !tbaa !5
  %1927 = getelementptr inbounds %struct.thermo, ptr %1926, i32 0, i32 61
  %1928 = load i32, ptr %1927, align 4, !tbaa !48
  %1929 = mul nsw i32 %1925, %1928
  %1930 = load ptr, ptr %7, align 8, !tbaa !5
  %1931 = getelementptr inbounds %struct.thermo, ptr %1930, i32 0, i32 50
  %1932 = load i32, ptr %1931, align 8, !tbaa !67
  %1933 = add nsw i32 %1929, %1932
  %1934 = sext i32 %1933 to i64
  %1935 = getelementptr inbounds double, ptr %1924, i64 %1934
  %1936 = load double, ptr %1935, align 8, !tbaa !9
  %1937 = fmul double %1936, -1.000000e+00
  store double %1937, ptr %1935, align 8, !tbaa !9
  %1938 = load ptr, ptr %7, align 8, !tbaa !5
  %1939 = getelementptr inbounds %struct.thermo, ptr %1938, i32 0, i32 64
  %1940 = load ptr, ptr %1939, align 8, !tbaa !47
  %1941 = load i32, ptr %8, align 4, !tbaa !32
  %1942 = load ptr, ptr %7, align 8, !tbaa !5
  %1943 = getelementptr inbounds %struct.thermo, ptr %1942, i32 0, i32 61
  %1944 = load i32, ptr %1943, align 4, !tbaa !48
  %1945 = mul nsw i32 %1941, %1944
  %1946 = load ptr, ptr %7, align 8, !tbaa !5
  %1947 = getelementptr inbounds %struct.thermo, ptr %1946, i32 0, i32 46
  %1948 = load i32, ptr %1947, align 8, !tbaa !58
  %1949 = add nsw i32 %1945, %1948
  %1950 = sext i32 %1949 to i64
  %1951 = getelementptr inbounds double, ptr %1940, i64 %1950
  %1952 = load double, ptr %1951, align 8, !tbaa !9
  %1953 = load ptr, ptr %7, align 8, !tbaa !5
  %1954 = getelementptr inbounds %struct.thermo, ptr %1953, i32 0, i32 64
  %1955 = load ptr, ptr %1954, align 8, !tbaa !47
  %1956 = load i32, ptr %8, align 4, !tbaa !32
  %1957 = load ptr, ptr %7, align 8, !tbaa !5
  %1958 = getelementptr inbounds %struct.thermo, ptr %1957, i32 0, i32 61
  %1959 = load i32, ptr %1958, align 4, !tbaa !48
  %1960 = mul nsw i32 %1956, %1959
  %1961 = load ptr, ptr %7, align 8, !tbaa !5
  %1962 = getelementptr inbounds %struct.thermo, ptr %1961, i32 0, i32 49
  %1963 = load i32, ptr %1962, align 4, !tbaa !66
  %1964 = add nsw i32 %1960, %1963
  %1965 = sext i32 %1964 to i64
  %1966 = getelementptr inbounds double, ptr %1955, i64 %1965
  %1967 = load double, ptr %1966, align 8, !tbaa !9
  %1968 = fneg double %1967
  %1969 = call double @exp(double noundef %1968) #6
  %1970 = fmul double %1952, %1969
  %1971 = load ptr, ptr %7, align 8, !tbaa !5
  %1972 = getelementptr inbounds %struct.thermo, ptr %1971, i32 0, i32 64
  %1973 = load ptr, ptr %1972, align 8, !tbaa !47
  %1974 = load i32, ptr %8, align 4, !tbaa !32
  %1975 = load ptr, ptr %7, align 8, !tbaa !5
  %1976 = getelementptr inbounds %struct.thermo, ptr %1975, i32 0, i32 61
  %1977 = load i32, ptr %1976, align 4, !tbaa !48
  %1978 = mul nsw i32 %1974, %1977
  %1979 = load ptr, ptr %7, align 8, !tbaa !5
  %1980 = getelementptr inbounds %struct.thermo, ptr %1979, i32 0, i32 51
  %1981 = load i32, ptr %1980, align 4, !tbaa !81
  %1982 = add nsw i32 %1978, %1981
  %1983 = sext i32 %1982 to i64
  %1984 = getelementptr inbounds double, ptr %1973, i64 %1983
  store double %1970, ptr %1984, align 8, !tbaa !9
  br label %1985

1985:                                             ; preds = %1905, %1802
  br label %1986

1986:                                             ; preds = %1985
  %1987 = load i32, ptr %8, align 4, !tbaa !32
  %1988 = add nsw i32 %1987, -1
  store i32 %1988, ptr %8, align 4, !tbaa !32
  br label %1491, !llvm.loop !82

1989:                                             ; preds = %1491
  %1990 = load ptr, ptr %7, align 8, !tbaa !5
  %1991 = getelementptr inbounds %struct.thermo, ptr %1990, i32 0, i32 64
  %1992 = load ptr, ptr %1991, align 8, !tbaa !47
  %1993 = load ptr, ptr %7, align 8, !tbaa !5
  %1994 = getelementptr inbounds %struct.thermo, ptr %1993, i32 0, i32 61
  %1995 = load i32, ptr %1994, align 4, !tbaa !48
  %1996 = load ptr, ptr %7, align 8, !tbaa !5
  %1997 = getelementptr inbounds %struct.thermo, ptr %1996, i32 0, i32 62
  %1998 = load i32, ptr %1997, align 8, !tbaa !38
  %1999 = load ptr, ptr %7, align 8, !tbaa !5
  %2000 = getelementptr inbounds %struct.thermo, ptr %1999, i32 0, i32 59
  %2001 = load i32, ptr %2000, align 4, !tbaa !80
  %2002 = load ptr, ptr %5, align 8, !tbaa !5
  %2003 = getelementptr inbounds %struct.precision, ptr %2002, i32 0, i32 48
  %2004 = load i32, ptr %2003, align 8, !tbaa !83
  %2005 = load ptr, ptr %7, align 8, !tbaa !5
  %2006 = getelementptr inbounds %struct.thermo, ptr %2005, i32 0, i32 93
  %2007 = getelementptr inbounds [2048 x i8], ptr %2006, i64 0, i64 0
  %2008 = call i32 @array_smooth(ptr noundef %1992, i32 noundef %1995, i32 noundef %1998, i32 noundef %2001, i32 noundef %2004, ptr noundef %2007)
  %2009 = icmp eq i32 %2008, 1
  br i1 %2009, label %2010, label %2019

2010:                                             ; preds = %1989
  call void @llvm.lifetime.start.p0(i64 2048, ptr %100) #6
  %2011 = getelementptr inbounds [2048 x i8], ptr %100, i64 0, i64 0
  %2012 = load ptr, ptr %7, align 8, !tbaa !5
  %2013 = getelementptr inbounds %struct.thermo, ptr %2012, i32 0, i32 93
  %2014 = getelementptr inbounds [2048 x i8], ptr %2013, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2011, ptr noundef @.str, ptr noundef @.str.62, ptr noundef %2014)
  %2015 = load ptr, ptr %7, align 8, !tbaa !5
  %2016 = getelementptr inbounds %struct.thermo, ptr %2015, i32 0, i32 93
  %2017 = getelementptr inbounds [2048 x i8], ptr %2016, i64 0, i64 0
  %2018 = getelementptr inbounds [2048 x i8], ptr %100, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2017, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 818, ptr noundef %2018)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %100) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2019:                                             ; preds = %1989
  %2020 = load ptr, ptr %6, align 8, !tbaa !5
  %2021 = getelementptr inbounds %struct.background, ptr %2020, i32 0, i32 128
  %2022 = load i16, ptr %2021, align 2, !tbaa !23
  %2023 = sext i16 %2022 to i32
  %2024 = icmp eq i32 %2023, 1
  br i1 %2024, label %2025, label %2838

2025:                                             ; preds = %2019
  %2026 = load ptr, ptr %12, align 8, !tbaa !5
  %2027 = load ptr, ptr %7, align 8, !tbaa !5
  %2028 = getelementptr inbounds %struct.thermo, ptr %2027, i32 0, i32 62
  %2029 = load i32, ptr %2028, align 8, !tbaa !38
  %2030 = load ptr, ptr %7, align 8, !tbaa !5
  %2031 = getelementptr inbounds %struct.thermo, ptr %2030, i32 0, i32 64
  %2032 = load ptr, ptr %2031, align 8, !tbaa !47
  %2033 = load ptr, ptr %7, align 8, !tbaa !5
  %2034 = getelementptr inbounds %struct.thermo, ptr %2033, i32 0, i32 61
  %2035 = load i32, ptr %2034, align 4, !tbaa !48
  %2036 = load ptr, ptr %7, align 8, !tbaa !5
  %2037 = getelementptr inbounds %struct.thermo, ptr %2036, i32 0, i32 45
  %2038 = load i32, ptr %2037, align 4, !tbaa !55
  %2039 = load ptr, ptr %7, align 8, !tbaa !5
  %2040 = getelementptr inbounds %struct.thermo, ptr %2039, i32 0, i32 47
  %2041 = load i32, ptr %2040, align 4, !tbaa !65
  %2042 = load ptr, ptr %7, align 8, !tbaa !5
  %2043 = getelementptr inbounds %struct.thermo, ptr %2042, i32 0, i32 93
  %2044 = getelementptr inbounds [2048 x i8], ptr %2043, i64 0, i64 0
  %2045 = call i32 @array_spline_table_line_to_line(ptr noundef %2026, i32 noundef %2029, ptr noundef %2032, i32 noundef %2035, i32 noundef %2038, i32 noundef %2041, i16 noundef signext 1, ptr noundef %2044)
  %2046 = icmp eq i32 %2045, 1
  br i1 %2046, label %2047, label %2056

2047:                                             ; preds = %2025
  call void @llvm.lifetime.start.p0(i64 2048, ptr %101) #6
  %2048 = getelementptr inbounds [2048 x i8], ptr %101, i64 0, i64 0
  %2049 = load ptr, ptr %7, align 8, !tbaa !5
  %2050 = getelementptr inbounds %struct.thermo, ptr %2049, i32 0, i32 93
  %2051 = getelementptr inbounds [2048 x i8], ptr %2050, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2048, ptr noundef @.str, ptr noundef @.str.49, ptr noundef %2051)
  %2052 = load ptr, ptr %7, align 8, !tbaa !5
  %2053 = getelementptr inbounds %struct.thermo, ptr %2052, i32 0, i32 93
  %2054 = getelementptr inbounds [2048 x i8], ptr %2053, i64 0, i64 0
  %2055 = getelementptr inbounds [2048 x i8], ptr %101, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2054, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 833, ptr noundef %2055)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %101) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2056:                                             ; preds = %2025
  %2057 = load ptr, ptr %12, align 8, !tbaa !5
  %2058 = load ptr, ptr %7, align 8, !tbaa !5
  %2059 = getelementptr inbounds %struct.thermo, ptr %2058, i32 0, i32 62
  %2060 = load i32, ptr %2059, align 8, !tbaa !38
  %2061 = load ptr, ptr %7, align 8, !tbaa !5
  %2062 = getelementptr inbounds %struct.thermo, ptr %2061, i32 0, i32 64
  %2063 = load ptr, ptr %2062, align 8, !tbaa !47
  %2064 = load ptr, ptr %7, align 8, !tbaa !5
  %2065 = getelementptr inbounds %struct.thermo, ptr %2064, i32 0, i32 61
  %2066 = load i32, ptr %2065, align 4, !tbaa !48
  %2067 = load ptr, ptr %7, align 8, !tbaa !5
  %2068 = getelementptr inbounds %struct.thermo, ptr %2067, i32 0, i32 45
  %2069 = load i32, ptr %2068, align 4, !tbaa !55
  %2070 = load ptr, ptr %7, align 8, !tbaa !5
  %2071 = getelementptr inbounds %struct.thermo, ptr %2070, i32 0, i32 47
  %2072 = load i32, ptr %2071, align 4, !tbaa !65
  %2073 = load ptr, ptr %7, align 8, !tbaa !5
  %2074 = getelementptr inbounds %struct.thermo, ptr %2073, i32 0, i32 46
  %2075 = load i32, ptr %2074, align 8, !tbaa !58
  %2076 = load ptr, ptr %7, align 8, !tbaa !5
  %2077 = getelementptr inbounds %struct.thermo, ptr %2076, i32 0, i32 93
  %2078 = getelementptr inbounds [2048 x i8], ptr %2077, i64 0, i64 0
  %2079 = call i32 @array_derive_spline_table_line_to_line(ptr noundef %2057, i32 noundef %2060, ptr noundef %2063, i32 noundef %2066, i32 noundef %2069, i32 noundef %2072, i32 noundef %2075, ptr noundef %2078)
  %2080 = icmp eq i32 %2079, 1
  br i1 %2080, label %2081, label %2090

2081:                                             ; preds = %2056
  call void @llvm.lifetime.start.p0(i64 2048, ptr %102) #6
  %2082 = getelementptr inbounds [2048 x i8], ptr %102, i64 0, i64 0
  %2083 = load ptr, ptr %7, align 8, !tbaa !5
  %2084 = getelementptr inbounds %struct.thermo, ptr %2083, i32 0, i32 93
  %2085 = getelementptr inbounds [2048 x i8], ptr %2084, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2082, ptr noundef @.str, ptr noundef @.str.63, ptr noundef %2085)
  %2086 = load ptr, ptr %7, align 8, !tbaa !5
  %2087 = getelementptr inbounds %struct.thermo, ptr %2086, i32 0, i32 93
  %2088 = getelementptr inbounds [2048 x i8], ptr %2087, i64 0, i64 0
  %2089 = getelementptr inbounds [2048 x i8], ptr %102, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2088, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 845, ptr noundef %2089)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %102) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2090:                                             ; preds = %2056
  %2091 = load ptr, ptr %7, align 8, !tbaa !5
  %2092 = getelementptr inbounds %struct.thermo, ptr %2091, i32 0, i32 63
  %2093 = load ptr, ptr %2092, align 8, !tbaa !39
  %2094 = load ptr, ptr %7, align 8, !tbaa !5
  %2095 = getelementptr inbounds %struct.thermo, ptr %2094, i32 0, i32 62
  %2096 = load i32, ptr %2095, align 8, !tbaa !38
  %2097 = sub nsw i32 %2096, 1
  %2098 = sext i32 %2097 to i64
  %2099 = getelementptr inbounds double, ptr %2093, i64 %2098
  %2100 = load double, ptr %2099, align 8, !tbaa !9
  store double %2100, ptr %32, align 8, !tbaa !9
  %2101 = load ptr, ptr %6, align 8, !tbaa !5
  %2102 = load double, ptr %32, align 8, !tbaa !9
  %2103 = call i32 @background_tau_of_z(ptr noundef %2101, double noundef %2102, ptr noundef %20)
  %2104 = icmp eq i32 %2103, 1
  br i1 %2104, label %2105, label %2114

2105:                                             ; preds = %2090
  call void @llvm.lifetime.start.p0(i64 2048, ptr %103) #6
  %2106 = getelementptr inbounds [2048 x i8], ptr %103, i64 0, i64 0
  %2107 = load ptr, ptr %6, align 8, !tbaa !5
  %2108 = getelementptr inbounds %struct.background, ptr %2107, i32 0, i32 149
  %2109 = getelementptr inbounds [2048 x i8], ptr %2108, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2106, ptr noundef @.str, ptr noundef @.str.64, ptr noundef %2109)
  %2110 = load ptr, ptr %7, align 8, !tbaa !5
  %2111 = getelementptr inbounds %struct.thermo, ptr %2110, i32 0, i32 93
  %2112 = getelementptr inbounds [2048 x i8], ptr %2111, i64 0, i64 0
  %2113 = getelementptr inbounds [2048 x i8], ptr %103, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2112, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 855, ptr noundef %2113)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %103) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2114:                                             ; preds = %2090
  %2115 = load ptr, ptr %6, align 8, !tbaa !5
  %2116 = load double, ptr %20, align 8, !tbaa !9
  %2117 = load ptr, ptr %6, align 8, !tbaa !5
  %2118 = getelementptr inbounds %struct.background, ptr %2117, i32 0, i32 141
  %2119 = load i16, ptr %2118, align 8, !tbaa !84
  %2120 = load ptr, ptr %6, align 8, !tbaa !5
  %2121 = getelementptr inbounds %struct.background, ptr %2120, i32 0, i32 144
  %2122 = load i16, ptr %2121, align 2, !tbaa !85
  %2123 = load ptr, ptr %10, align 8, !tbaa !5
  %2124 = call i32 @background_at_tau(ptr noundef %2115, double noundef %2116, i16 noundef signext %2119, i16 noundef signext %2122, ptr noundef %11, ptr noundef %2123)
  %2125 = icmp eq i32 %2124, 1
  br i1 %2125, label %2126, label %2135

2126:                                             ; preds = %2114
  call void @llvm.lifetime.start.p0(i64 2048, ptr %104) #6
  %2127 = getelementptr inbounds [2048 x i8], ptr %104, i64 0, i64 0
  %2128 = load ptr, ptr %6, align 8, !tbaa !5
  %2129 = getelementptr inbounds %struct.background, ptr %2128, i32 0, i32 149
  %2130 = getelementptr inbounds [2048 x i8], ptr %2129, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2127, ptr noundef @.str, ptr noundef @.str.65, ptr noundef %2130)
  %2131 = load ptr, ptr %7, align 8, !tbaa !5
  %2132 = getelementptr inbounds %struct.thermo, ptr %2131, i32 0, i32 93
  %2133 = getelementptr inbounds [2048 x i8], ptr %2132, i64 0, i64 0
  %2134 = getelementptr inbounds [2048 x i8], ptr %104, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2133, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 859, ptr noundef %2134)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %104) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2135:                                             ; preds = %2114
  %2136 = load ptr, ptr %6, align 8, !tbaa !5
  %2137 = getelementptr inbounds %struct.background, ptr %2136, i32 0, i32 15
  %2138 = load double, ptr %2137, align 8, !tbaa !60
  %2139 = fmul double 2.000000e+00, %2138
  %2140 = load ptr, ptr %6, align 8, !tbaa !5
  %2141 = getelementptr inbounds %struct.background, ptr %2140, i32 0, i32 42
  %2142 = load double, ptr %2141, align 8, !tbaa !54
  %2143 = call double @pow(double noundef %2142, double noundef 2.000000e+00) #6
  %2144 = fmul double %2139, %2143
  %2145 = load ptr, ptr %7, align 8, !tbaa !5
  %2146 = getelementptr inbounds %struct.thermo, ptr %2145, i32 0, i32 32
  %2147 = load double, ptr %2146, align 8, !tbaa !51
  %2148 = fmul double %2144, %2147
  %2149 = load double, ptr %32, align 8, !tbaa !9
  %2150 = fadd double 1.000000e+00, %2149
  %2151 = load ptr, ptr %7, align 8, !tbaa !5
  %2152 = getelementptr inbounds %struct.thermo, ptr %2151, i32 0, i32 34
  %2153 = load double, ptr %2152, align 8, !tbaa !52
  %2154 = fadd double %2153, 1.000000e+00
  %2155 = call double @pow(double noundef %2150, double noundef %2154) #6
  %2156 = fmul double %2148, %2155
  %2157 = load ptr, ptr %7, align 8, !tbaa !5
  %2158 = getelementptr inbounds %struct.thermo, ptr %2157, i32 0, i32 34
  %2159 = load double, ptr %2158, align 8, !tbaa !52
  %2160 = call double @pow(double noundef 1.000000e+07, double noundef %2159) #6
  %2161 = fdiv double %2156, %2160
  store double %2161, ptr %29, align 8, !tbaa !9
  %2162 = load double, ptr %29, align 8, !tbaa !9
  %2163 = load ptr, ptr %10, align 8, !tbaa !5
  %2164 = load ptr, ptr %6, align 8, !tbaa !5
  %2165 = getelementptr inbounds %struct.background, ptr %2164, i32 0, i32 59
  %2166 = load i32, ptr %2165, align 8, !tbaa !86
  %2167 = sext i32 %2166 to i64
  %2168 = getelementptr inbounds double, ptr %2163, i64 %2167
  %2169 = load double, ptr %2168, align 8, !tbaa !9
  %2170 = fmul double 1.000000e-03, %2169
  %2171 = load ptr, ptr %10, align 8, !tbaa !5
  %2172 = load ptr, ptr %6, align 8, !tbaa !5
  %2173 = getelementptr inbounds %struct.background, ptr %2172, i32 0, i32 60
  %2174 = load i32, ptr %2173, align 4, !tbaa !87
  %2175 = sext i32 %2174 to i64
  %2176 = getelementptr inbounds double, ptr %2171, i64 %2175
  %2177 = load double, ptr %2176, align 8, !tbaa !9
  %2178 = fmul double %2170, %2177
  %2179 = fcmp ogt double %2162, %2178
  br i1 %2179, label %2180, label %2190

2180:                                             ; preds = %2135
  %2181 = load ptr, ptr %6, align 8, !tbaa !5
  %2182 = getelementptr inbounds %struct.background, ptr %2181, i32 0, i32 16
  %2183 = load double, ptr %2182, align 8, !tbaa !88
  %2184 = load double, ptr %32, align 8, !tbaa !9
  %2185 = fadd double 1.000000e+00, %2184
  %2186 = fmul double %2183, %2185
  store double %2186, ptr %31, align 8, !tbaa !9
  %2187 = load ptr, ptr %6, align 8, !tbaa !5
  %2188 = getelementptr inbounds %struct.background, ptr %2187, i32 0, i32 16
  %2189 = load double, ptr %2188, align 8, !tbaa !88
  store double %2189, ptr %30, align 8, !tbaa !9
  br label %2251

2190:                                             ; preds = %2135
  %2191 = load ptr, ptr %6, align 8, !tbaa !5
  %2192 = getelementptr inbounds %struct.background, ptr %2191, i32 0, i32 16
  %2193 = load double, ptr %2192, align 8, !tbaa !88
  %2194 = load double, ptr %32, align 8, !tbaa !9
  %2195 = fadd double 1.000000e+00, %2194
  %2196 = fmul double %2193, %2195
  store double %2196, ptr %33, align 8, !tbaa !9
  %2197 = load double, ptr %29, align 8, !tbaa !9
  %2198 = load ptr, ptr %10, align 8, !tbaa !5
  %2199 = load ptr, ptr %6, align 8, !tbaa !5
  %2200 = getelementptr inbounds %struct.background, ptr %2199, i32 0, i32 59
  %2201 = load i32, ptr %2200, align 8, !tbaa !86
  %2202 = sext i32 %2201 to i64
  %2203 = getelementptr inbounds double, ptr %2198, i64 %2202
  %2204 = load double, ptr %2203, align 8, !tbaa !9
  %2205 = load ptr, ptr %10, align 8, !tbaa !5
  %2206 = load ptr, ptr %6, align 8, !tbaa !5
  %2207 = getelementptr inbounds %struct.background, ptr %2206, i32 0, i32 60
  %2208 = load i32, ptr %2207, align 4, !tbaa !87
  %2209 = sext i32 %2208 to i64
  %2210 = getelementptr inbounds double, ptr %2205, i64 %2209
  %2211 = load double, ptr %2210, align 8, !tbaa !9
  %2212 = fmul double %2204, %2211
  %2213 = fdiv double %2197, %2212
  %2214 = load double, ptr %29, align 8, !tbaa !9
  %2215 = load ptr, ptr %10, align 8, !tbaa !5
  %2216 = load ptr, ptr %6, align 8, !tbaa !5
  %2217 = getelementptr inbounds %struct.background, ptr %2216, i32 0, i32 59
  %2218 = load i32, ptr %2217, align 8, !tbaa !86
  %2219 = sext i32 %2218 to i64
  %2220 = getelementptr inbounds double, ptr %2215, i64 %2219
  %2221 = load double, ptr %2220, align 8, !tbaa !9
  %2222 = load ptr, ptr %10, align 8, !tbaa !5
  %2223 = load ptr, ptr %6, align 8, !tbaa !5
  %2224 = getelementptr inbounds %struct.background, ptr %2223, i32 0, i32 60
  %2225 = load i32, ptr %2224, align 4, !tbaa !87
  %2226 = sext i32 %2225 to i64
  %2227 = getelementptr inbounds double, ptr %2222, i64 %2226
  %2228 = load double, ptr %2227, align 8, !tbaa !9
  %2229 = fmul double %2221, %2228
  %2230 = fdiv double %2214, %2229
  %2231 = fadd double 1.000000e+00, %2230
  %2232 = fdiv double %2213, %2231
  %2233 = load double, ptr %33, align 8, !tbaa !9
  %2234 = fmul double %2232, %2233
  store double %2234, ptr %31, align 8, !tbaa !9
  %2235 = load double, ptr %31, align 8, !tbaa !9
  %2236 = load double, ptr %29, align 8, !tbaa !9
  %2237 = load ptr, ptr %10, align 8, !tbaa !5
  %2238 = load ptr, ptr %6, align 8, !tbaa !5
  %2239 = getelementptr inbounds %struct.background, ptr %2238, i32 0, i32 60
  %2240 = load i32, ptr %2239, align 4, !tbaa !87
  %2241 = sext i32 %2240 to i64
  %2242 = getelementptr inbounds double, ptr %2237, i64 %2241
  %2243 = load double, ptr %2242, align 8, !tbaa !9
  %2244 = fdiv double %2236, %2243
  %2245 = load double, ptr %33, align 8, !tbaa !9
  %2246 = load double, ptr %31, align 8, !tbaa !9
  %2247 = fsub double %2245, %2246
  %2248 = fmul double %2244, %2247
  %2249 = fneg double %2248
  %2250 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %2235, double %2249)
  store double %2250, ptr %30, align 8, !tbaa !9
  br label %2251

2251:                                             ; preds = %2190, %2180
  %2252 = load double, ptr %31, align 8, !tbaa !9
  %2253 = load ptr, ptr %7, align 8, !tbaa !5
  %2254 = getelementptr inbounds %struct.thermo, ptr %2253, i32 0, i32 64
  %2255 = load ptr, ptr %2254, align 8, !tbaa !47
  %2256 = load ptr, ptr %7, align 8, !tbaa !5
  %2257 = getelementptr inbounds %struct.thermo, ptr %2256, i32 0, i32 62
  %2258 = load i32, ptr %2257, align 8, !tbaa !38
  %2259 = sub nsw i32 %2258, 1
  %2260 = load ptr, ptr %7, align 8, !tbaa !5
  %2261 = getelementptr inbounds %struct.thermo, ptr %2260, i32 0, i32 61
  %2262 = load i32, ptr %2261, align 4, !tbaa !48
  %2263 = mul nsw i32 %2259, %2262
  %2264 = load ptr, ptr %7, align 8, !tbaa !5
  %2265 = getelementptr inbounds %struct.thermo, ptr %2264, i32 0, i32 53
  %2266 = load i32, ptr %2265, align 4, !tbaa !89
  %2267 = add nsw i32 %2263, %2266
  %2268 = sext i32 %2267 to i64
  %2269 = getelementptr inbounds double, ptr %2255, i64 %2268
  store double %2252, ptr %2269, align 8, !tbaa !9
  %2270 = load double, ptr %31, align 8, !tbaa !9
  %2271 = fmul double 0x3B30B0E7F1528C6D, %2270
  %2272 = fdiv double %2271, 0x3C07A4DA04A6DAF5
  %2273 = load ptr, ptr %7, align 8, !tbaa !5
  %2274 = getelementptr inbounds %struct.thermo, ptr %2273, i32 0, i32 35
  %2275 = load double, ptr %2274, align 8, !tbaa !90
  %2276 = fdiv double %2272, %2275
  %2277 = load double, ptr %30, align 8, !tbaa !9
  %2278 = fdiv double %2277, 3.000000e+00
  %2279 = load double, ptr %31, align 8, !tbaa !9
  %2280 = fdiv double %2278, %2279
  %2281 = fadd double 1.000000e+00, %2280
  %2282 = fmul double %2276, %2281
  %2283 = load ptr, ptr %7, align 8, !tbaa !5
  %2284 = getelementptr inbounds %struct.thermo, ptr %2283, i32 0, i32 64
  %2285 = load ptr, ptr %2284, align 8, !tbaa !47
  %2286 = load ptr, ptr %7, align 8, !tbaa !5
  %2287 = getelementptr inbounds %struct.thermo, ptr %2286, i32 0, i32 62
  %2288 = load i32, ptr %2287, align 8, !tbaa !38
  %2289 = sub nsw i32 %2288, 1
  %2290 = load ptr, ptr %7, align 8, !tbaa !5
  %2291 = getelementptr inbounds %struct.thermo, ptr %2290, i32 0, i32 61
  %2292 = load i32, ptr %2291, align 4, !tbaa !48
  %2293 = mul nsw i32 %2289, %2292
  %2294 = load ptr, ptr %7, align 8, !tbaa !5
  %2295 = getelementptr inbounds %struct.thermo, ptr %2294, i32 0, i32 52
  %2296 = load i32, ptr %2295, align 8, !tbaa !91
  %2297 = add nsw i32 %2293, %2296
  %2298 = sext i32 %2297 to i64
  %2299 = getelementptr inbounds double, ptr %2285, i64 %2298
  store double %2282, ptr %2299, align 8, !tbaa !9
  %2300 = load double, ptr %31, align 8, !tbaa !9
  store double %2300, ptr %35, align 8, !tbaa !9
  %2301 = load double, ptr %32, align 8, !tbaa !9
  store double %2301, ptr %36, align 8, !tbaa !9
  %2302 = load ptr, ptr %7, align 8, !tbaa !5
  %2303 = getelementptr inbounds %struct.thermo, ptr %2302, i32 0, i32 62
  %2304 = load i32, ptr %2303, align 8, !tbaa !38
  %2305 = sub nsw i32 %2304, 2
  store i32 %2305, ptr %8, align 4, !tbaa !32
  br label %2306

2306:                                             ; preds = %2834, %2251
  %2307 = load i32, ptr %8, align 4, !tbaa !32
  %2308 = icmp sge i32 %2307, 0
  br i1 %2308, label %2309, label %2837

2309:                                             ; preds = %2306
  %2310 = load double, ptr %29, align 8, !tbaa !9
  %2311 = load ptr, ptr %10, align 8, !tbaa !5
  %2312 = load ptr, ptr %6, align 8, !tbaa !5
  %2313 = getelementptr inbounds %struct.background, ptr %2312, i32 0, i32 59
  %2314 = load i32, ptr %2313, align 8, !tbaa !86
  %2315 = sext i32 %2314 to i64
  %2316 = getelementptr inbounds double, ptr %2311, i64 %2315
  %2317 = load double, ptr %2316, align 8, !tbaa !9
  %2318 = fmul double 1.000000e+03, %2317
  %2319 = load ptr, ptr %10, align 8, !tbaa !5
  %2320 = load ptr, ptr %6, align 8, !tbaa !5
  %2321 = getelementptr inbounds %struct.background, ptr %2320, i32 0, i32 60
  %2322 = load i32, ptr %2321, align 4, !tbaa !87
  %2323 = sext i32 %2322 to i64
  %2324 = getelementptr inbounds double, ptr %2319, i64 %2323
  %2325 = load double, ptr %2324, align 8, !tbaa !9
  %2326 = fmul double %2318, %2325
  %2327 = fcmp ogt double %2310, %2326
  br i1 %2327, label %2328, label %2407

2328:                                             ; preds = %2309
  %2329 = load ptr, ptr %7, align 8, !tbaa !5
  %2330 = getelementptr inbounds %struct.thermo, ptr %2329, i32 0, i32 63
  %2331 = load ptr, ptr %2330, align 8, !tbaa !39
  %2332 = load i32, ptr %8, align 4, !tbaa !32
  %2333 = sext i32 %2332 to i64
  %2334 = getelementptr inbounds double, ptr %2331, i64 %2333
  %2335 = load double, ptr %2334, align 8, !tbaa !9
  store double %2335, ptr %32, align 8, !tbaa !9
  %2336 = load ptr, ptr %6, align 8, !tbaa !5
  %2337 = getelementptr inbounds %struct.background, ptr %2336, i32 0, i32 16
  %2338 = load double, ptr %2337, align 8, !tbaa !88
  %2339 = load double, ptr %32, align 8, !tbaa !9
  %2340 = fadd double 1.000000e+00, %2339
  %2341 = fmul double %2338, %2340
  store double %2341, ptr %33, align 8, !tbaa !9
  %2342 = load double, ptr %33, align 8, !tbaa !9
  store double %2342, ptr %31, align 8, !tbaa !9
  %2343 = load ptr, ptr %6, align 8, !tbaa !5
  %2344 = getelementptr inbounds %struct.background, ptr %2343, i32 0, i32 15
  %2345 = load double, ptr %2344, align 8, !tbaa !60
  %2346 = fmul double 2.000000e+00, %2345
  %2347 = load ptr, ptr %6, align 8, !tbaa !5
  %2348 = getelementptr inbounds %struct.background, ptr %2347, i32 0, i32 42
  %2349 = load double, ptr %2348, align 8, !tbaa !54
  %2350 = call double @pow(double noundef %2349, double noundef 2.000000e+00) #6
  %2351 = fmul double %2346, %2350
  %2352 = load ptr, ptr %7, align 8, !tbaa !5
  %2353 = getelementptr inbounds %struct.thermo, ptr %2352, i32 0, i32 32
  %2354 = load double, ptr %2353, align 8, !tbaa !51
  %2355 = fmul double %2351, %2354
  %2356 = load double, ptr %32, align 8, !tbaa !9
  %2357 = fadd double 1.000000e+00, %2356
  %2358 = load ptr, ptr %7, align 8, !tbaa !5
  %2359 = getelementptr inbounds %struct.thermo, ptr %2358, i32 0, i32 34
  %2360 = load double, ptr %2359, align 8, !tbaa !52
  %2361 = fadd double %2360, 1.000000e+00
  %2362 = call double @pow(double noundef %2357, double noundef %2361) #6
  %2363 = fmul double %2355, %2362
  %2364 = load ptr, ptr %7, align 8, !tbaa !5
  %2365 = getelementptr inbounds %struct.thermo, ptr %2364, i32 0, i32 34
  %2366 = load double, ptr %2365, align 8, !tbaa !52
  %2367 = call double @pow(double noundef 1.000000e+07, double noundef %2366) #6
  %2368 = fdiv double %2363, %2367
  store double %2368, ptr %29, align 8, !tbaa !9
  %2369 = load ptr, ptr %6, align 8, !tbaa !5
  %2370 = load double, ptr %32, align 8, !tbaa !9
  %2371 = call i32 @background_tau_of_z(ptr noundef %2369, double noundef %2370, ptr noundef %20)
  %2372 = icmp eq i32 %2371, 1
  br i1 %2372, label %2373, label %2382

2373:                                             ; preds = %2328
  call void @llvm.lifetime.start.p0(i64 2048, ptr %105) #6
  %2374 = getelementptr inbounds [2048 x i8], ptr %105, i64 0, i64 0
  %2375 = load ptr, ptr %6, align 8, !tbaa !5
  %2376 = getelementptr inbounds %struct.background, ptr %2375, i32 0, i32 149
  %2377 = getelementptr inbounds [2048 x i8], ptr %2376, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2374, ptr noundef @.str, ptr noundef @.str.64, ptr noundef %2377)
  %2378 = load ptr, ptr %7, align 8, !tbaa !5
  %2379 = getelementptr inbounds %struct.thermo, ptr %2378, i32 0, i32 93
  %2380 = getelementptr inbounds [2048 x i8], ptr %2379, i64 0, i64 0
  %2381 = getelementptr inbounds [2048 x i8], ptr %105, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2380, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 905, ptr noundef %2381)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %105) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2382:                                             ; preds = %2328
  %2383 = load ptr, ptr %6, align 8, !tbaa !5
  %2384 = load double, ptr %20, align 8, !tbaa !9
  %2385 = load ptr, ptr %6, align 8, !tbaa !5
  %2386 = getelementptr inbounds %struct.background, ptr %2385, i32 0, i32 141
  %2387 = load i16, ptr %2386, align 8, !tbaa !84
  %2388 = load ptr, ptr %6, align 8, !tbaa !5
  %2389 = getelementptr inbounds %struct.background, ptr %2388, i32 0, i32 144
  %2390 = load i16, ptr %2389, align 2, !tbaa !85
  %2391 = load ptr, ptr %10, align 8, !tbaa !5
  %2392 = call i32 @background_at_tau(ptr noundef %2383, double noundef %2384, i16 noundef signext %2387, i16 noundef signext %2390, ptr noundef %11, ptr noundef %2391)
  %2393 = icmp eq i32 %2392, 1
  br i1 %2393, label %2394, label %2403

2394:                                             ; preds = %2382
  call void @llvm.lifetime.start.p0(i64 2048, ptr %106) #6
  %2395 = getelementptr inbounds [2048 x i8], ptr %106, i64 0, i64 0
  %2396 = load ptr, ptr %6, align 8, !tbaa !5
  %2397 = getelementptr inbounds %struct.background, ptr %2396, i32 0, i32 149
  %2398 = getelementptr inbounds [2048 x i8], ptr %2397, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2395, ptr noundef @.str, ptr noundef @.str.65, ptr noundef %2398)
  %2399 = load ptr, ptr %7, align 8, !tbaa !5
  %2400 = getelementptr inbounds %struct.thermo, ptr %2399, i32 0, i32 93
  %2401 = getelementptr inbounds [2048 x i8], ptr %2400, i64 0, i64 0
  %2402 = getelementptr inbounds [2048 x i8], ptr %106, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2401, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 908, ptr noundef %2402)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %106) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2403:                                             ; preds = %2382
  %2404 = load ptr, ptr %6, align 8, !tbaa !5
  %2405 = getelementptr inbounds %struct.background, ptr %2404, i32 0, i32 16
  %2406 = load double, ptr %2405, align 8, !tbaa !88
  store double %2406, ptr %30, align 8, !tbaa !9
  br label %2791

2407:                                             ; preds = %2309
  %2408 = load double, ptr %29, align 8, !tbaa !9
  %2409 = load ptr, ptr %10, align 8, !tbaa !5
  %2410 = load ptr, ptr %6, align 8, !tbaa !5
  %2411 = getelementptr inbounds %struct.background, ptr %2410, i32 0, i32 59
  %2412 = load i32, ptr %2411, align 8, !tbaa !86
  %2413 = sext i32 %2412 to i64
  %2414 = getelementptr inbounds double, ptr %2409, i64 %2413
  %2415 = load double, ptr %2414, align 8, !tbaa !9
  %2416 = fmul double 1.000000e-03, %2415
  %2417 = load ptr, ptr %10, align 8, !tbaa !5
  %2418 = load ptr, ptr %6, align 8, !tbaa !5
  %2419 = getelementptr inbounds %struct.background, ptr %2418, i32 0, i32 60
  %2420 = load i32, ptr %2419, align 4, !tbaa !87
  %2421 = sext i32 %2420 to i64
  %2422 = getelementptr inbounds double, ptr %2417, i64 %2421
  %2423 = load double, ptr %2422, align 8, !tbaa !9
  %2424 = fmul double %2416, %2423
  %2425 = fcmp ogt double %2408, %2424
  br i1 %2425, label %2426, label %2702

2426:                                             ; preds = %2407
  %2427 = load ptr, ptr %7, align 8, !tbaa !5
  %2428 = getelementptr inbounds %struct.thermo, ptr %2427, i32 0, i32 63
  %2429 = load ptr, ptr %2428, align 8, !tbaa !39
  %2430 = load i32, ptr %8, align 4, !tbaa !32
  %2431 = add nsw i32 %2430, 1
  %2432 = sext i32 %2431 to i64
  %2433 = getelementptr inbounds double, ptr %2429, i64 %2432
  %2434 = load double, ptr %2433, align 8, !tbaa !9
  %2435 = load ptr, ptr %7, align 8, !tbaa !5
  %2436 = getelementptr inbounds %struct.thermo, ptr %2435, i32 0, i32 63
  %2437 = load ptr, ptr %2436, align 8, !tbaa !39
  %2438 = load i32, ptr %8, align 4, !tbaa !32
  %2439 = sext i32 %2438 to i64
  %2440 = getelementptr inbounds double, ptr %2437, i64 %2439
  %2441 = load double, ptr %2440, align 8, !tbaa !9
  %2442 = fsub double %2434, %2441
  store double %2442, ptr %34, align 8, !tbaa !9
  %2443 = load double, ptr %34, align 8, !tbaa !9
  %2444 = load ptr, ptr %10, align 8, !tbaa !5
  %2445 = load ptr, ptr %6, align 8, !tbaa !5
  %2446 = getelementptr inbounds %struct.background, ptr %2445, i32 0, i32 60
  %2447 = load i32, ptr %2446, align 4, !tbaa !87
  %2448 = sext i32 %2447 to i64
  %2449 = getelementptr inbounds double, ptr %2444, i64 %2448
  %2450 = load double, ptr %2449, align 8, !tbaa !9
  %2451 = load double, ptr %29, align 8, !tbaa !9
  %2452 = fdiv double %2450, %2451
  %2453 = fdiv double %2452, 1.000000e+01
  %2454 = fcmp olt double %2443, %2453
  br i1 %2454, label %2455, label %2559

2455:                                             ; preds = %2426
  %2456 = load ptr, ptr %7, align 8, !tbaa !5
  %2457 = getelementptr inbounds %struct.thermo, ptr %2456, i32 0, i32 63
  %2458 = load ptr, ptr %2457, align 8, !tbaa !39
  %2459 = load i32, ptr %8, align 4, !tbaa !32
  %2460 = sext i32 %2459 to i64
  %2461 = getelementptr inbounds double, ptr %2458, i64 %2460
  %2462 = load double, ptr %2461, align 8, !tbaa !9
  store double %2462, ptr %32, align 8, !tbaa !9
  %2463 = load ptr, ptr %6, align 8, !tbaa !5
  %2464 = getelementptr inbounds %struct.background, ptr %2463, i32 0, i32 16
  %2465 = load double, ptr %2464, align 8, !tbaa !88
  %2466 = load double, ptr %32, align 8, !tbaa !9
  %2467 = fadd double 1.000000e+00, %2466
  %2468 = fmul double %2465, %2467
  store double %2468, ptr %33, align 8, !tbaa !9
  %2469 = load double, ptr %30, align 8, !tbaa !9
  %2470 = load double, ptr %34, align 8, !tbaa !9
  %2471 = load double, ptr %31, align 8, !tbaa !9
  %2472 = fneg double %2469
  %2473 = call double @llvm.fmuladd.f64(double %2472, double %2470, double %2471)
  store double %2473, ptr %31, align 8, !tbaa !9
  %2474 = load ptr, ptr %6, align 8, !tbaa !5
  %2475 = getelementptr inbounds %struct.background, ptr %2474, i32 0, i32 15
  %2476 = load double, ptr %2475, align 8, !tbaa !60
  %2477 = fmul double 2.000000e+00, %2476
  %2478 = load ptr, ptr %6, align 8, !tbaa !5
  %2479 = getelementptr inbounds %struct.background, ptr %2478, i32 0, i32 42
  %2480 = load double, ptr %2479, align 8, !tbaa !54
  %2481 = call double @pow(double noundef %2480, double noundef 2.000000e+00) #6
  %2482 = fmul double %2477, %2481
  %2483 = load ptr, ptr %7, align 8, !tbaa !5
  %2484 = getelementptr inbounds %struct.thermo, ptr %2483, i32 0, i32 32
  %2485 = load double, ptr %2484, align 8, !tbaa !51
  %2486 = fmul double %2482, %2485
  %2487 = load double, ptr %32, align 8, !tbaa !9
  %2488 = fadd double 1.000000e+00, %2487
  %2489 = load ptr, ptr %7, align 8, !tbaa !5
  %2490 = getelementptr inbounds %struct.thermo, ptr %2489, i32 0, i32 34
  %2491 = load double, ptr %2490, align 8, !tbaa !52
  %2492 = fadd double %2491, 1.000000e+00
  %2493 = call double @pow(double noundef %2488, double noundef %2492) #6
  %2494 = fmul double %2486, %2493
  %2495 = load ptr, ptr %7, align 8, !tbaa !5
  %2496 = getelementptr inbounds %struct.thermo, ptr %2495, i32 0, i32 34
  %2497 = load double, ptr %2496, align 8, !tbaa !52
  %2498 = call double @pow(double noundef 1.000000e+07, double noundef %2497) #6
  %2499 = fdiv double %2494, %2498
  store double %2499, ptr %29, align 8, !tbaa !9
  %2500 = load ptr, ptr %6, align 8, !tbaa !5
  %2501 = load double, ptr %32, align 8, !tbaa !9
  %2502 = call i32 @background_tau_of_z(ptr noundef %2500, double noundef %2501, ptr noundef %20)
  %2503 = icmp eq i32 %2502, 1
  br i1 %2503, label %2504, label %2513

2504:                                             ; preds = %2455
  call void @llvm.lifetime.start.p0(i64 2048, ptr %107) #6
  %2505 = getelementptr inbounds [2048 x i8], ptr %107, i64 0, i64 0
  %2506 = load ptr, ptr %6, align 8, !tbaa !5
  %2507 = getelementptr inbounds %struct.background, ptr %2506, i32 0, i32 149
  %2508 = getelementptr inbounds [2048 x i8], ptr %2507, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2505, ptr noundef @.str, ptr noundef @.str.64, ptr noundef %2508)
  %2509 = load ptr, ptr %7, align 8, !tbaa !5
  %2510 = getelementptr inbounds %struct.thermo, ptr %2509, i32 0, i32 93
  %2511 = getelementptr inbounds [2048 x i8], ptr %2510, i64 0, i64 0
  %2512 = getelementptr inbounds [2048 x i8], ptr %107, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2511, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 925, ptr noundef %2512)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %107) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2513:                                             ; preds = %2455
  %2514 = load ptr, ptr %6, align 8, !tbaa !5
  %2515 = load double, ptr %20, align 8, !tbaa !9
  %2516 = load ptr, ptr %6, align 8, !tbaa !5
  %2517 = getelementptr inbounds %struct.background, ptr %2516, i32 0, i32 141
  %2518 = load i16, ptr %2517, align 8, !tbaa !84
  %2519 = load ptr, ptr %6, align 8, !tbaa !5
  %2520 = getelementptr inbounds %struct.background, ptr %2519, i32 0, i32 144
  %2521 = load i16, ptr %2520, align 2, !tbaa !85
  %2522 = load ptr, ptr %10, align 8, !tbaa !5
  %2523 = call i32 @background_at_tau(ptr noundef %2514, double noundef %2515, i16 noundef signext %2518, i16 noundef signext %2521, ptr noundef %11, ptr noundef %2522)
  %2524 = icmp eq i32 %2523, 1
  br i1 %2524, label %2525, label %2534

2525:                                             ; preds = %2513
  call void @llvm.lifetime.start.p0(i64 2048, ptr %108) #6
  %2526 = getelementptr inbounds [2048 x i8], ptr %108, i64 0, i64 0
  %2527 = load ptr, ptr %6, align 8, !tbaa !5
  %2528 = getelementptr inbounds %struct.background, ptr %2527, i32 0, i32 149
  %2529 = getelementptr inbounds [2048 x i8], ptr %2528, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2526, ptr noundef @.str, ptr noundef @.str.65, ptr noundef %2529)
  %2530 = load ptr, ptr %7, align 8, !tbaa !5
  %2531 = getelementptr inbounds %struct.thermo, ptr %2530, i32 0, i32 93
  %2532 = getelementptr inbounds [2048 x i8], ptr %2531, i64 0, i64 0
  %2533 = getelementptr inbounds [2048 x i8], ptr %108, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2532, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 928, ptr noundef %2533)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %108) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2534:                                             ; preds = %2513
  %2535 = load ptr, ptr %10, align 8, !tbaa !5
  %2536 = load ptr, ptr %6, align 8, !tbaa !5
  %2537 = getelementptr inbounds %struct.background, ptr %2536, i32 0, i32 59
  %2538 = load i32, ptr %2537, align 8, !tbaa !86
  %2539 = sext i32 %2538 to i64
  %2540 = getelementptr inbounds double, ptr %2535, i64 %2539
  %2541 = load double, ptr %2540, align 8, !tbaa !9
  %2542 = fmul double 2.000000e+00, %2541
  %2543 = load double, ptr %31, align 8, !tbaa !9
  %2544 = load double, ptr %29, align 8, !tbaa !9
  %2545 = load ptr, ptr %10, align 8, !tbaa !5
  %2546 = load ptr, ptr %6, align 8, !tbaa !5
  %2547 = getelementptr inbounds %struct.background, ptr %2546, i32 0, i32 60
  %2548 = load i32, ptr %2547, align 4, !tbaa !87
  %2549 = sext i32 %2548 to i64
  %2550 = getelementptr inbounds double, ptr %2545, i64 %2549
  %2551 = load double, ptr %2550, align 8, !tbaa !9
  %2552 = fdiv double %2544, %2551
  %2553 = load double, ptr %33, align 8, !tbaa !9
  %2554 = load double, ptr %31, align 8, !tbaa !9
  %2555 = fsub double %2553, %2554
  %2556 = fmul double %2552, %2555
  %2557 = fneg double %2556
  %2558 = call double @llvm.fmuladd.f64(double %2542, double %2543, double %2557)
  store double %2558, ptr %30, align 8, !tbaa !9
  br label %2699

2559:                                             ; preds = %2426
  %2560 = load double, ptr %34, align 8, !tbaa !9
  %2561 = load ptr, ptr %10, align 8, !tbaa !5
  %2562 = load ptr, ptr %6, align 8, !tbaa !5
  %2563 = getelementptr inbounds %struct.background, ptr %2562, i32 0, i32 60
  %2564 = load i32, ptr %2563, align 4, !tbaa !87
  %2565 = sext i32 %2564 to i64
  %2566 = getelementptr inbounds double, ptr %2561, i64 %2565
  %2567 = load double, ptr %2566, align 8, !tbaa !9
  %2568 = load double, ptr %29, align 8, !tbaa !9
  %2569 = fdiv double %2567, %2568
  %2570 = fdiv double %2569, 1.000000e+01
  %2571 = fdiv double %2560, %2570
  %2572 = fptosi double %2571 to i32
  %2573 = add nsw i32 %2572, 1
  store i32 %2573, ptr %40, align 4, !tbaa !32
  %2574 = load double, ptr %34, align 8, !tbaa !9
  %2575 = load i32, ptr %40, align 4, !tbaa !32
  %2576 = sitofp i32 %2575 to double
  %2577 = fdiv double %2574, %2576
  store double %2577, ptr %41, align 8, !tbaa !9
  store i32 0, ptr %39, align 4, !tbaa !32
  br label %2578

2578:                                             ; preds = %2695, %2559
  %2579 = load i32, ptr %39, align 4, !tbaa !32
  %2580 = load i32, ptr %40, align 4, !tbaa !32
  %2581 = icmp slt i32 %2579, %2580
  br i1 %2581, label %2582, label %2698

2582:                                             ; preds = %2578
  %2583 = load double, ptr %41, align 8, !tbaa !9
  %2584 = load double, ptr %32, align 8, !tbaa !9
  %2585 = fsub double %2584, %2583
  store double %2585, ptr %32, align 8, !tbaa !9
  %2586 = load i32, ptr %39, align 4, !tbaa !32
  %2587 = load i32, ptr %40, align 4, !tbaa !32
  %2588 = sub nsw i32 %2587, 1
  %2589 = icmp eq i32 %2586, %2588
  br i1 %2589, label %2590, label %2598

2590:                                             ; preds = %2582
  %2591 = load ptr, ptr %7, align 8, !tbaa !5
  %2592 = getelementptr inbounds %struct.thermo, ptr %2591, i32 0, i32 63
  %2593 = load ptr, ptr %2592, align 8, !tbaa !39
  %2594 = load i32, ptr %8, align 4, !tbaa !32
  %2595 = sext i32 %2594 to i64
  %2596 = getelementptr inbounds double, ptr %2593, i64 %2595
  %2597 = load double, ptr %2596, align 8, !tbaa !9
  store double %2597, ptr %32, align 8, !tbaa !9
  br label %2598

2598:                                             ; preds = %2590, %2582
  %2599 = load ptr, ptr %6, align 8, !tbaa !5
  %2600 = getelementptr inbounds %struct.background, ptr %2599, i32 0, i32 16
  %2601 = load double, ptr %2600, align 8, !tbaa !88
  %2602 = load double, ptr %32, align 8, !tbaa !9
  %2603 = fadd double 1.000000e+00, %2602
  %2604 = fmul double %2601, %2603
  store double %2604, ptr %33, align 8, !tbaa !9
  %2605 = load double, ptr %30, align 8, !tbaa !9
  %2606 = load double, ptr %41, align 8, !tbaa !9
  %2607 = load double, ptr %31, align 8, !tbaa !9
  %2608 = fneg double %2605
  %2609 = call double @llvm.fmuladd.f64(double %2608, double %2606, double %2607)
  store double %2609, ptr %31, align 8, !tbaa !9
  %2610 = load ptr, ptr %6, align 8, !tbaa !5
  %2611 = getelementptr inbounds %struct.background, ptr %2610, i32 0, i32 15
  %2612 = load double, ptr %2611, align 8, !tbaa !60
  %2613 = fmul double 2.000000e+00, %2612
  %2614 = load ptr, ptr %6, align 8, !tbaa !5
  %2615 = getelementptr inbounds %struct.background, ptr %2614, i32 0, i32 42
  %2616 = load double, ptr %2615, align 8, !tbaa !54
  %2617 = call double @pow(double noundef %2616, double noundef 2.000000e+00) #6
  %2618 = fmul double %2613, %2617
  %2619 = load ptr, ptr %7, align 8, !tbaa !5
  %2620 = getelementptr inbounds %struct.thermo, ptr %2619, i32 0, i32 32
  %2621 = load double, ptr %2620, align 8, !tbaa !51
  %2622 = fmul double %2618, %2621
  %2623 = load double, ptr %32, align 8, !tbaa !9
  %2624 = fadd double 1.000000e+00, %2623
  %2625 = load ptr, ptr %7, align 8, !tbaa !5
  %2626 = getelementptr inbounds %struct.thermo, ptr %2625, i32 0, i32 34
  %2627 = load double, ptr %2626, align 8, !tbaa !52
  %2628 = fadd double %2627, 1.000000e+00
  %2629 = call double @pow(double noundef %2624, double noundef %2628) #6
  %2630 = fmul double %2622, %2629
  %2631 = load ptr, ptr %7, align 8, !tbaa !5
  %2632 = getelementptr inbounds %struct.thermo, ptr %2631, i32 0, i32 34
  %2633 = load double, ptr %2632, align 8, !tbaa !52
  %2634 = call double @pow(double noundef 1.000000e+07, double noundef %2633) #6
  %2635 = fdiv double %2630, %2634
  store double %2635, ptr %29, align 8, !tbaa !9
  %2636 = load ptr, ptr %6, align 8, !tbaa !5
  %2637 = load double, ptr %32, align 8, !tbaa !9
  %2638 = call i32 @background_tau_of_z(ptr noundef %2636, double noundef %2637, ptr noundef %20)
  %2639 = icmp eq i32 %2638, 1
  br i1 %2639, label %2640, label %2649

2640:                                             ; preds = %2598
  call void @llvm.lifetime.start.p0(i64 2048, ptr %109) #6
  %2641 = getelementptr inbounds [2048 x i8], ptr %109, i64 0, i64 0
  %2642 = load ptr, ptr %6, align 8, !tbaa !5
  %2643 = getelementptr inbounds %struct.background, ptr %2642, i32 0, i32 149
  %2644 = getelementptr inbounds [2048 x i8], ptr %2643, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2641, ptr noundef @.str, ptr noundef @.str.64, ptr noundef %2644)
  %2645 = load ptr, ptr %7, align 8, !tbaa !5
  %2646 = getelementptr inbounds %struct.thermo, ptr %2645, i32 0, i32 93
  %2647 = getelementptr inbounds [2048 x i8], ptr %2646, i64 0, i64 0
  %2648 = getelementptr inbounds [2048 x i8], ptr %109, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2647, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 955, ptr noundef %2648)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %109) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2649:                                             ; preds = %2598
  %2650 = load ptr, ptr %6, align 8, !tbaa !5
  %2651 = load double, ptr %20, align 8, !tbaa !9
  %2652 = load ptr, ptr %6, align 8, !tbaa !5
  %2653 = getelementptr inbounds %struct.background, ptr %2652, i32 0, i32 141
  %2654 = load i16, ptr %2653, align 8, !tbaa !84
  %2655 = load ptr, ptr %6, align 8, !tbaa !5
  %2656 = getelementptr inbounds %struct.background, ptr %2655, i32 0, i32 144
  %2657 = load i16, ptr %2656, align 2, !tbaa !85
  %2658 = load ptr, ptr %10, align 8, !tbaa !5
  %2659 = call i32 @background_at_tau(ptr noundef %2650, double noundef %2651, i16 noundef signext %2654, i16 noundef signext %2657, ptr noundef %11, ptr noundef %2658)
  %2660 = icmp eq i32 %2659, 1
  br i1 %2660, label %2661, label %2670

2661:                                             ; preds = %2649
  call void @llvm.lifetime.start.p0(i64 2048, ptr %110) #6
  %2662 = getelementptr inbounds [2048 x i8], ptr %110, i64 0, i64 0
  %2663 = load ptr, ptr %6, align 8, !tbaa !5
  %2664 = getelementptr inbounds %struct.background, ptr %2663, i32 0, i32 149
  %2665 = getelementptr inbounds [2048 x i8], ptr %2664, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2662, ptr noundef @.str, ptr noundef @.str.65, ptr noundef %2665)
  %2666 = load ptr, ptr %7, align 8, !tbaa !5
  %2667 = getelementptr inbounds %struct.thermo, ptr %2666, i32 0, i32 93
  %2668 = getelementptr inbounds [2048 x i8], ptr %2667, i64 0, i64 0
  %2669 = getelementptr inbounds [2048 x i8], ptr %110, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2668, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 958, ptr noundef %2669)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %110) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2670:                                             ; preds = %2649
  %2671 = load ptr, ptr %10, align 8, !tbaa !5
  %2672 = load ptr, ptr %6, align 8, !tbaa !5
  %2673 = getelementptr inbounds %struct.background, ptr %2672, i32 0, i32 59
  %2674 = load i32, ptr %2673, align 8, !tbaa !86
  %2675 = sext i32 %2674 to i64
  %2676 = getelementptr inbounds double, ptr %2671, i64 %2675
  %2677 = load double, ptr %2676, align 8, !tbaa !9
  %2678 = fmul double 2.000000e+00, %2677
  %2679 = load double, ptr %31, align 8, !tbaa !9
  %2680 = load double, ptr %29, align 8, !tbaa !9
  %2681 = load ptr, ptr %10, align 8, !tbaa !5
  %2682 = load ptr, ptr %6, align 8, !tbaa !5
  %2683 = getelementptr inbounds %struct.background, ptr %2682, i32 0, i32 60
  %2684 = load i32, ptr %2683, align 4, !tbaa !87
  %2685 = sext i32 %2684 to i64
  %2686 = getelementptr inbounds double, ptr %2681, i64 %2685
  %2687 = load double, ptr %2686, align 8, !tbaa !9
  %2688 = fdiv double %2680, %2687
  %2689 = load double, ptr %33, align 8, !tbaa !9
  %2690 = load double, ptr %31, align 8, !tbaa !9
  %2691 = fsub double %2689, %2690
  %2692 = fmul double %2688, %2691
  %2693 = fneg double %2692
  %2694 = call double @llvm.fmuladd.f64(double %2678, double %2679, double %2693)
  store double %2694, ptr %30, align 8, !tbaa !9
  br label %2695

2695:                                             ; preds = %2670
  %2696 = load i32, ptr %39, align 4, !tbaa !32
  %2697 = add nsw i32 %2696, 1
  store i32 %2697, ptr %39, align 4, !tbaa !32
  br label %2578, !llvm.loop !92

2698:                                             ; preds = %2578
  br label %2699

2699:                                             ; preds = %2698, %2534
  %2700 = load double, ptr %31, align 8, !tbaa !9
  store double %2700, ptr %35, align 8, !tbaa !9
  %2701 = load double, ptr %32, align 8, !tbaa !9
  store double %2701, ptr %36, align 8, !tbaa !9
  br label %2790

2702:                                             ; preds = %2407
  %2703 = load ptr, ptr %7, align 8, !tbaa !5
  %2704 = getelementptr inbounds %struct.thermo, ptr %2703, i32 0, i32 63
  %2705 = load ptr, ptr %2704, align 8, !tbaa !39
  %2706 = load i32, ptr %8, align 4, !tbaa !32
  %2707 = sext i32 %2706 to i64
  %2708 = getelementptr inbounds double, ptr %2705, i64 %2707
  %2709 = load double, ptr %2708, align 8, !tbaa !9
  store double %2709, ptr %32, align 8, !tbaa !9
  %2710 = load ptr, ptr %6, align 8, !tbaa !5
  %2711 = getelementptr inbounds %struct.background, ptr %2710, i32 0, i32 16
  %2712 = load double, ptr %2711, align 8, !tbaa !88
  %2713 = load double, ptr %32, align 8, !tbaa !9
  %2714 = fadd double 1.000000e+00, %2713
  %2715 = fmul double %2712, %2714
  store double %2715, ptr %33, align 8, !tbaa !9
  %2716 = load double, ptr %35, align 8, !tbaa !9
  %2717 = load double, ptr %32, align 8, !tbaa !9
  %2718 = fadd double 1.000000e+00, %2717
  %2719 = load double, ptr %36, align 8, !tbaa !9
  %2720 = fadd double 1.000000e+00, %2719
  %2721 = fdiv double %2718, %2720
  %2722 = call double @pow(double noundef %2721, double noundef 2.000000e+00) #6
  %2723 = fmul double %2716, %2722
  store double %2723, ptr %31, align 8, !tbaa !9
  %2724 = load ptr, ptr %6, align 8, !tbaa !5
  %2725 = getelementptr inbounds %struct.background, ptr %2724, i32 0, i32 15
  %2726 = load double, ptr %2725, align 8, !tbaa !60
  %2727 = fmul double 2.000000e+00, %2726
  %2728 = load ptr, ptr %6, align 8, !tbaa !5
  %2729 = getelementptr inbounds %struct.background, ptr %2728, i32 0, i32 42
  %2730 = load double, ptr %2729, align 8, !tbaa !54
  %2731 = call double @pow(double noundef %2730, double noundef 2.000000e+00) #6
  %2732 = fmul double %2727, %2731
  %2733 = load ptr, ptr %7, align 8, !tbaa !5
  %2734 = getelementptr inbounds %struct.thermo, ptr %2733, i32 0, i32 32
  %2735 = load double, ptr %2734, align 8, !tbaa !51
  %2736 = fmul double %2732, %2735
  %2737 = load double, ptr %32, align 8, !tbaa !9
  %2738 = fadd double 1.000000e+00, %2737
  %2739 = load ptr, ptr %7, align 8, !tbaa !5
  %2740 = getelementptr inbounds %struct.thermo, ptr %2739, i32 0, i32 34
  %2741 = load double, ptr %2740, align 8, !tbaa !52
  %2742 = fadd double %2741, 1.000000e+00
  %2743 = call double @pow(double noundef %2738, double noundef %2742) #6
  %2744 = fmul double %2736, %2743
  %2745 = load ptr, ptr %7, align 8, !tbaa !5
  %2746 = getelementptr inbounds %struct.thermo, ptr %2745, i32 0, i32 34
  %2747 = load double, ptr %2746, align 8, !tbaa !52
  %2748 = call double @pow(double noundef 1.000000e+07, double noundef %2747) #6
  %2749 = fdiv double %2744, %2748
  store double %2749, ptr %29, align 8, !tbaa !9
  %2750 = load ptr, ptr %6, align 8, !tbaa !5
  %2751 = load double, ptr %32, align 8, !tbaa !9
  %2752 = call i32 @background_tau_of_z(ptr noundef %2750, double noundef %2751, ptr noundef %20)
  %2753 = icmp eq i32 %2752, 1
  br i1 %2753, label %2754, label %2763

2754:                                             ; preds = %2702
  call void @llvm.lifetime.start.p0(i64 2048, ptr %111) #6
  %2755 = getelementptr inbounds [2048 x i8], ptr %111, i64 0, i64 0
  %2756 = load ptr, ptr %6, align 8, !tbaa !5
  %2757 = getelementptr inbounds %struct.background, ptr %2756, i32 0, i32 149
  %2758 = getelementptr inbounds [2048 x i8], ptr %2757, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2755, ptr noundef @.str, ptr noundef @.str.64, ptr noundef %2758)
  %2759 = load ptr, ptr %7, align 8, !tbaa !5
  %2760 = getelementptr inbounds %struct.thermo, ptr %2759, i32 0, i32 93
  %2761 = getelementptr inbounds [2048 x i8], ptr %2760, i64 0, i64 0
  %2762 = getelementptr inbounds [2048 x i8], ptr %111, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2761, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 976, ptr noundef %2762)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %111) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2763:                                             ; preds = %2702
  %2764 = load ptr, ptr %6, align 8, !tbaa !5
  %2765 = load double, ptr %20, align 8, !tbaa !9
  %2766 = load ptr, ptr %6, align 8, !tbaa !5
  %2767 = getelementptr inbounds %struct.background, ptr %2766, i32 0, i32 141
  %2768 = load i16, ptr %2767, align 8, !tbaa !84
  %2769 = load ptr, ptr %6, align 8, !tbaa !5
  %2770 = getelementptr inbounds %struct.background, ptr %2769, i32 0, i32 144
  %2771 = load i16, ptr %2770, align 2, !tbaa !85
  %2772 = load ptr, ptr %10, align 8, !tbaa !5
  %2773 = call i32 @background_at_tau(ptr noundef %2764, double noundef %2765, i16 noundef signext %2768, i16 noundef signext %2771, ptr noundef %11, ptr noundef %2772)
  %2774 = icmp eq i32 %2773, 1
  br i1 %2774, label %2775, label %2784

2775:                                             ; preds = %2763
  call void @llvm.lifetime.start.p0(i64 2048, ptr %112) #6
  %2776 = getelementptr inbounds [2048 x i8], ptr %112, i64 0, i64 0
  %2777 = load ptr, ptr %6, align 8, !tbaa !5
  %2778 = getelementptr inbounds %struct.background, ptr %2777, i32 0, i32 149
  %2779 = getelementptr inbounds [2048 x i8], ptr %2778, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2776, ptr noundef @.str, ptr noundef @.str.65, ptr noundef %2779)
  %2780 = load ptr, ptr %7, align 8, !tbaa !5
  %2781 = getelementptr inbounds %struct.thermo, ptr %2780, i32 0, i32 93
  %2782 = getelementptr inbounds [2048 x i8], ptr %2781, i64 0, i64 0
  %2783 = getelementptr inbounds [2048 x i8], ptr %112, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2782, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 979, ptr noundef %2783)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %112) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2784:                                             ; preds = %2763
  %2785 = load double, ptr %32, align 8, !tbaa !9
  %2786 = fadd double 1.000000e+00, %2785
  %2787 = fdiv double 2.000000e+00, %2786
  %2788 = load double, ptr %31, align 8, !tbaa !9
  %2789 = fmul double %2787, %2788
  store double %2789, ptr %30, align 8, !tbaa !9
  br label %2790

2790:                                             ; preds = %2784, %2699
  br label %2791

2791:                                             ; preds = %2790, %2403
  %2792 = load double, ptr %31, align 8, !tbaa !9
  %2793 = load ptr, ptr %7, align 8, !tbaa !5
  %2794 = getelementptr inbounds %struct.thermo, ptr %2793, i32 0, i32 64
  %2795 = load ptr, ptr %2794, align 8, !tbaa !47
  %2796 = load i32, ptr %8, align 4, !tbaa !32
  %2797 = load ptr, ptr %7, align 8, !tbaa !5
  %2798 = getelementptr inbounds %struct.thermo, ptr %2797, i32 0, i32 61
  %2799 = load i32, ptr %2798, align 4, !tbaa !48
  %2800 = mul nsw i32 %2796, %2799
  %2801 = load ptr, ptr %7, align 8, !tbaa !5
  %2802 = getelementptr inbounds %struct.thermo, ptr %2801, i32 0, i32 53
  %2803 = load i32, ptr %2802, align 4, !tbaa !89
  %2804 = add nsw i32 %2800, %2803
  %2805 = sext i32 %2804 to i64
  %2806 = getelementptr inbounds double, ptr %2795, i64 %2805
  store double %2792, ptr %2806, align 8, !tbaa !9
  %2807 = load double, ptr %31, align 8, !tbaa !9
  %2808 = fmul double 0x3B30B0E7F1528C6D, %2807
  %2809 = fdiv double %2808, 0x3C07A4DA04A6DAF5
  %2810 = load ptr, ptr %7, align 8, !tbaa !5
  %2811 = getelementptr inbounds %struct.thermo, ptr %2810, i32 0, i32 35
  %2812 = load double, ptr %2811, align 8, !tbaa !90
  %2813 = fdiv double %2809, %2812
  %2814 = load double, ptr %30, align 8, !tbaa !9
  %2815 = fdiv double %2814, 3.000000e+00
  %2816 = load double, ptr %31, align 8, !tbaa !9
  %2817 = fdiv double %2815, %2816
  %2818 = fadd double 1.000000e+00, %2817
  %2819 = fmul double %2813, %2818
  %2820 = load ptr, ptr %7, align 8, !tbaa !5
  %2821 = getelementptr inbounds %struct.thermo, ptr %2820, i32 0, i32 64
  %2822 = load ptr, ptr %2821, align 8, !tbaa !47
  %2823 = load i32, ptr %8, align 4, !tbaa !32
  %2824 = load ptr, ptr %7, align 8, !tbaa !5
  %2825 = getelementptr inbounds %struct.thermo, ptr %2824, i32 0, i32 61
  %2826 = load i32, ptr %2825, align 4, !tbaa !48
  %2827 = mul nsw i32 %2823, %2826
  %2828 = load ptr, ptr %7, align 8, !tbaa !5
  %2829 = getelementptr inbounds %struct.thermo, ptr %2828, i32 0, i32 52
  %2830 = load i32, ptr %2829, align 8, !tbaa !91
  %2831 = add nsw i32 %2827, %2830
  %2832 = sext i32 %2831 to i64
  %2833 = getelementptr inbounds double, ptr %2822, i64 %2832
  store double %2819, ptr %2833, align 8, !tbaa !9
  br label %2834

2834:                                             ; preds = %2791
  %2835 = load i32, ptr %8, align 4, !tbaa !32
  %2836 = add nsw i32 %2835, -1
  store i32 %2836, ptr %8, align 4, !tbaa !32
  br label %2306, !llvm.loop !93

2837:                                             ; preds = %2306
  br label %2838

2838:                                             ; preds = %2837, %2019
  %2839 = load ptr, ptr %12, align 8, !tbaa !5
  call void @free(ptr noundef %2839) #6
  %2840 = load ptr, ptr %7, align 8, !tbaa !5
  %2841 = getelementptr inbounds %struct.thermo, ptr %2840, i32 0, i32 63
  %2842 = load ptr, ptr %2841, align 8, !tbaa !39
  %2843 = load ptr, ptr %7, align 8, !tbaa !5
  %2844 = getelementptr inbounds %struct.thermo, ptr %2843, i32 0, i32 62
  %2845 = load i32, ptr %2844, align 8, !tbaa !38
  %2846 = load ptr, ptr %7, align 8, !tbaa !5
  %2847 = getelementptr inbounds %struct.thermo, ptr %2846, i32 0, i32 64
  %2848 = load ptr, ptr %2847, align 8, !tbaa !47
  %2849 = load ptr, ptr %7, align 8, !tbaa !5
  %2850 = getelementptr inbounds %struct.thermo, ptr %2849, i32 0, i32 61
  %2851 = load i32, ptr %2850, align 4, !tbaa !48
  %2852 = load ptr, ptr %7, align 8, !tbaa !5
  %2853 = getelementptr inbounds %struct.thermo, ptr %2852, i32 0, i32 65
  %2854 = load ptr, ptr %2853, align 8, !tbaa !94
  %2855 = load ptr, ptr %7, align 8, !tbaa !5
  %2856 = getelementptr inbounds %struct.thermo, ptr %2855, i32 0, i32 93
  %2857 = getelementptr inbounds [2048 x i8], ptr %2856, i64 0, i64 0
  %2858 = call i32 @array_spline_table_lines(ptr noundef %2842, i32 noundef %2845, ptr noundef %2848, i32 noundef %2851, ptr noundef %2854, i16 noundef signext 1, ptr noundef %2857)
  %2859 = icmp eq i32 %2858, 1
  br i1 %2859, label %2860, label %2869

2860:                                             ; preds = %2838
  call void @llvm.lifetime.start.p0(i64 2048, ptr %113) #6
  %2861 = getelementptr inbounds [2048 x i8], ptr %113, i64 0, i64 0
  %2862 = load ptr, ptr %7, align 8, !tbaa !5
  %2863 = getelementptr inbounds %struct.thermo, ptr %2862, i32 0, i32 93
  %2864 = getelementptr inbounds [2048 x i8], ptr %2863, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2861, ptr noundef @.str, ptr noundef @.str.66, ptr noundef %2864)
  %2865 = load ptr, ptr %7, align 8, !tbaa !5
  %2866 = getelementptr inbounds %struct.thermo, ptr %2865, i32 0, i32 93
  %2867 = getelementptr inbounds [2048 x i8], ptr %2866, i64 0, i64 0
  %2868 = getelementptr inbounds [2048 x i8], ptr %113, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2867, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1000, ptr noundef %2868)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %113) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2869:                                             ; preds = %2838
  %2870 = load ptr, ptr %7, align 8, !tbaa !5
  %2871 = getelementptr inbounds %struct.thermo, ptr %2870, i32 0, i32 62
  %2872 = load i32, ptr %2871, align 8, !tbaa !38
  %2873 = sub nsw i32 %2872, 1
  store i32 %2873, ptr %8, align 4, !tbaa !32
  br label %2874

2874:                                             ; preds = %2883, %2869
  %2875 = load ptr, ptr %7, align 8, !tbaa !5
  %2876 = getelementptr inbounds %struct.thermo, ptr %2875, i32 0, i32 63
  %2877 = load ptr, ptr %2876, align 8, !tbaa !39
  %2878 = load i32, ptr %8, align 4, !tbaa !32
  %2879 = sext i32 %2878 to i64
  %2880 = getelementptr inbounds double, ptr %2877, i64 %2879
  %2881 = load double, ptr %2880, align 8, !tbaa !9
  %2882 = fcmp ogt double %2881, 2.000000e+03
  br i1 %2882, label %2883, label %2886

2883:                                             ; preds = %2874
  %2884 = load i32, ptr %8, align 4, !tbaa !32
  %2885 = add nsw i32 %2884, -1
  store i32 %2885, ptr %8, align 4, !tbaa !32
  br label %2874, !llvm.loop !95

2886:                                             ; preds = %2874
  %2887 = load ptr, ptr %7, align 8, !tbaa !5
  %2888 = getelementptr inbounds %struct.thermo, ptr %2887, i32 0, i32 64
  %2889 = load ptr, ptr %2888, align 8, !tbaa !47
  %2890 = load i32, ptr %8, align 4, !tbaa !32
  %2891 = add nsw i32 %2890, 1
  %2892 = load ptr, ptr %7, align 8, !tbaa !5
  %2893 = getelementptr inbounds %struct.thermo, ptr %2892, i32 0, i32 61
  %2894 = load i32, ptr %2893, align 4, !tbaa !48
  %2895 = mul nsw i32 %2891, %2894
  %2896 = load ptr, ptr %7, align 8, !tbaa !5
  %2897 = getelementptr inbounds %struct.thermo, ptr %2896, i32 0, i32 42
  %2898 = load i32, ptr %2897, align 8, !tbaa !70
  %2899 = add nsw i32 %2895, %2898
  %2900 = sext i32 %2899 to i64
  %2901 = getelementptr inbounds double, ptr %2889, i64 %2900
  %2902 = load double, ptr %2901, align 8, !tbaa !9
  %2903 = load ptr, ptr %7, align 8, !tbaa !5
  %2904 = getelementptr inbounds %struct.thermo, ptr %2903, i32 0, i32 64
  %2905 = load ptr, ptr %2904, align 8, !tbaa !47
  %2906 = load i32, ptr %8, align 4, !tbaa !32
  %2907 = load ptr, ptr %7, align 8, !tbaa !5
  %2908 = getelementptr inbounds %struct.thermo, ptr %2907, i32 0, i32 61
  %2909 = load i32, ptr %2908, align 4, !tbaa !48
  %2910 = mul nsw i32 %2906, %2909
  %2911 = load ptr, ptr %7, align 8, !tbaa !5
  %2912 = getelementptr inbounds %struct.thermo, ptr %2911, i32 0, i32 42
  %2913 = load i32, ptr %2912, align 8, !tbaa !70
  %2914 = add nsw i32 %2910, %2913
  %2915 = sext i32 %2914 to i64
  %2916 = getelementptr inbounds double, ptr %2905, i64 %2915
  %2917 = load double, ptr %2916, align 8, !tbaa !9
  %2918 = fcmp ogt double %2902, %2917
  br i1 %2918, label %2919, label %2927

2919:                                             ; preds = %2886
  call void @llvm.lifetime.start.p0(i64 2048, ptr %114) #6
  %2920 = getelementptr inbounds [2048 x i8], ptr %114, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2920, ptr noundef @.str.67, double noundef 2.000000e+03)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %115) #6
  %2921 = getelementptr inbounds [2048 x i8], ptr %115, i64 0, i64 0
  %2922 = getelementptr inbounds [2048 x i8], ptr %114, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2921, ptr noundef @.str.10, ptr noundef @.str.68, ptr noundef %2922)
  %2923 = load ptr, ptr %7, align 8, !tbaa !5
  %2924 = getelementptr inbounds %struct.thermo, ptr %2923, i32 0, i32 93
  %2925 = getelementptr inbounds [2048 x i8], ptr %2924, i64 0, i64 0
  %2926 = getelementptr inbounds [2048 x i8], ptr %115, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %2925, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1012, ptr noundef %2926)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %115) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %114) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

2927:                                             ; preds = %2886
  br label %2928

2928:                                             ; preds = %2961, %2927
  %2929 = load ptr, ptr %7, align 8, !tbaa !5
  %2930 = getelementptr inbounds %struct.thermo, ptr %2929, i32 0, i32 64
  %2931 = load ptr, ptr %2930, align 8, !tbaa !47
  %2932 = load i32, ptr %8, align 4, !tbaa !32
  %2933 = add nsw i32 %2932, 1
  %2934 = load ptr, ptr %7, align 8, !tbaa !5
  %2935 = getelementptr inbounds %struct.thermo, ptr %2934, i32 0, i32 61
  %2936 = load i32, ptr %2935, align 4, !tbaa !48
  %2937 = mul nsw i32 %2933, %2936
  %2938 = load ptr, ptr %7, align 8, !tbaa !5
  %2939 = getelementptr inbounds %struct.thermo, ptr %2938, i32 0, i32 42
  %2940 = load i32, ptr %2939, align 8, !tbaa !70
  %2941 = add nsw i32 %2937, %2940
  %2942 = sext i32 %2941 to i64
  %2943 = getelementptr inbounds double, ptr %2931, i64 %2942
  %2944 = load double, ptr %2943, align 8, !tbaa !9
  %2945 = load ptr, ptr %7, align 8, !tbaa !5
  %2946 = getelementptr inbounds %struct.thermo, ptr %2945, i32 0, i32 64
  %2947 = load ptr, ptr %2946, align 8, !tbaa !47
  %2948 = load i32, ptr %8, align 4, !tbaa !32
  %2949 = load ptr, ptr %7, align 8, !tbaa !5
  %2950 = getelementptr inbounds %struct.thermo, ptr %2949, i32 0, i32 61
  %2951 = load i32, ptr %2950, align 4, !tbaa !48
  %2952 = mul nsw i32 %2948, %2951
  %2953 = load ptr, ptr %7, align 8, !tbaa !5
  %2954 = getelementptr inbounds %struct.thermo, ptr %2953, i32 0, i32 42
  %2955 = load i32, ptr %2954, align 8, !tbaa !70
  %2956 = add nsw i32 %2952, %2955
  %2957 = sext i32 %2956 to i64
  %2958 = getelementptr inbounds double, ptr %2947, i64 %2957
  %2959 = load double, ptr %2958, align 8, !tbaa !9
  %2960 = fcmp ole double %2944, %2959
  br i1 %2960, label %2961, label %2964

2961:                                             ; preds = %2928
  %2962 = load i32, ptr %8, align 4, !tbaa !32
  %2963 = add nsw i32 %2962, -1
  store i32 %2963, ptr %8, align 4, !tbaa !32
  br label %2928, !llvm.loop !96

2964:                                             ; preds = %2928
  %2965 = load ptr, ptr %7, align 8, !tbaa !5
  %2966 = getelementptr inbounds %struct.thermo, ptr %2965, i32 0, i32 64
  %2967 = load ptr, ptr %2966, align 8, !tbaa !47
  %2968 = load i32, ptr %8, align 4, !tbaa !32
  %2969 = load ptr, ptr %7, align 8, !tbaa !5
  %2970 = getelementptr inbounds %struct.thermo, ptr %2969, i32 0, i32 61
  %2971 = load i32, ptr %2970, align 4, !tbaa !48
  %2972 = mul nsw i32 %2968, %2971
  %2973 = load ptr, ptr %7, align 8, !tbaa !5
  %2974 = getelementptr inbounds %struct.thermo, ptr %2973, i32 0, i32 42
  %2975 = load i32, ptr %2974, align 8, !tbaa !70
  %2976 = add nsw i32 %2972, %2975
  %2977 = sext i32 %2976 to i64
  %2978 = getelementptr inbounds double, ptr %2967, i64 %2977
  %2979 = load double, ptr %2978, align 8, !tbaa !9
  store double %2979, ptr %22, align 8, !tbaa !9
  %2980 = load i32, ptr %8, align 4, !tbaa !32
  store i32 %2980, ptr %23, align 4, !tbaa !32
  %2981 = load ptr, ptr %7, align 8, !tbaa !5
  %2982 = getelementptr inbounds %struct.thermo, ptr %2981, i32 0, i32 63
  %2983 = load ptr, ptr %2982, align 8, !tbaa !39
  %2984 = load i32, ptr %8, align 4, !tbaa !32
  %2985 = add nsw i32 %2984, 1
  %2986 = sext i32 %2985 to i64
  %2987 = getelementptr inbounds double, ptr %2983, i64 %2986
  %2988 = load double, ptr %2987, align 8, !tbaa !9
  %2989 = load ptr, ptr %7, align 8, !tbaa !5
  %2990 = getelementptr inbounds %struct.thermo, ptr %2989, i32 0, i32 63
  %2991 = load ptr, ptr %2990, align 8, !tbaa !39
  %2992 = load i32, ptr %8, align 4, !tbaa !32
  %2993 = add nsw i32 %2992, 1
  %2994 = sext i32 %2993 to i64
  %2995 = getelementptr inbounds double, ptr %2991, i64 %2994
  %2996 = load double, ptr %2995, align 8, !tbaa !9
  %2997 = load ptr, ptr %7, align 8, !tbaa !5
  %2998 = getelementptr inbounds %struct.thermo, ptr %2997, i32 0, i32 63
  %2999 = load ptr, ptr %2998, align 8, !tbaa !39
  %3000 = load i32, ptr %8, align 4, !tbaa !32
  %3001 = sext i32 %3000 to i64
  %3002 = getelementptr inbounds double, ptr %2999, i64 %3001
  %3003 = load double, ptr %3002, align 8, !tbaa !9
  %3004 = fsub double %2996, %3003
  %3005 = fmul double 5.000000e-01, %3004
  %3006 = load ptr, ptr %7, align 8, !tbaa !5
  %3007 = getelementptr inbounds %struct.thermo, ptr %3006, i32 0, i32 64
  %3008 = load ptr, ptr %3007, align 8, !tbaa !47
  %3009 = load i32, ptr %8, align 4, !tbaa !32
  %3010 = load ptr, ptr %7, align 8, !tbaa !5
  %3011 = getelementptr inbounds %struct.thermo, ptr %3010, i32 0, i32 61
  %3012 = load i32, ptr %3011, align 4, !tbaa !48
  %3013 = mul nsw i32 %3009, %3012
  %3014 = load ptr, ptr %7, align 8, !tbaa !5
  %3015 = getelementptr inbounds %struct.thermo, ptr %3014, i32 0, i32 42
  %3016 = load i32, ptr %3015, align 8, !tbaa !70
  %3017 = add nsw i32 %3013, %3016
  %3018 = sext i32 %3017 to i64
  %3019 = getelementptr inbounds double, ptr %3008, i64 %3018
  %3020 = load double, ptr %3019, align 8, !tbaa !9
  %3021 = load ptr, ptr %7, align 8, !tbaa !5
  %3022 = getelementptr inbounds %struct.thermo, ptr %3021, i32 0, i32 64
  %3023 = load ptr, ptr %3022, align 8, !tbaa !47
  %3024 = load i32, ptr %8, align 4, !tbaa !32
  %3025 = add nsw i32 %3024, 2
  %3026 = load ptr, ptr %7, align 8, !tbaa !5
  %3027 = getelementptr inbounds %struct.thermo, ptr %3026, i32 0, i32 61
  %3028 = load i32, ptr %3027, align 4, !tbaa !48
  %3029 = mul nsw i32 %3025, %3028
  %3030 = load ptr, ptr %7, align 8, !tbaa !5
  %3031 = getelementptr inbounds %struct.thermo, ptr %3030, i32 0, i32 42
  %3032 = load i32, ptr %3031, align 8, !tbaa !70
  %3033 = add nsw i32 %3029, %3032
  %3034 = sext i32 %3033 to i64
  %3035 = getelementptr inbounds double, ptr %3023, i64 %3034
  %3036 = load double, ptr %3035, align 8, !tbaa !9
  %3037 = fsub double %3020, %3036
  %3038 = fmul double %3005, %3037
  %3039 = load ptr, ptr %7, align 8, !tbaa !5
  %3040 = getelementptr inbounds %struct.thermo, ptr %3039, i32 0, i32 64
  %3041 = load ptr, ptr %3040, align 8, !tbaa !47
  %3042 = load i32, ptr %8, align 4, !tbaa !32
  %3043 = load ptr, ptr %7, align 8, !tbaa !5
  %3044 = getelementptr inbounds %struct.thermo, ptr %3043, i32 0, i32 61
  %3045 = load i32, ptr %3044, align 4, !tbaa !48
  %3046 = mul nsw i32 %3042, %3045
  %3047 = load ptr, ptr %7, align 8, !tbaa !5
  %3048 = getelementptr inbounds %struct.thermo, ptr %3047, i32 0, i32 42
  %3049 = load i32, ptr %3048, align 8, !tbaa !70
  %3050 = add nsw i32 %3046, %3049
  %3051 = sext i32 %3050 to i64
  %3052 = getelementptr inbounds double, ptr %3041, i64 %3051
  %3053 = load double, ptr %3052, align 8, !tbaa !9
  %3054 = load ptr, ptr %7, align 8, !tbaa !5
  %3055 = getelementptr inbounds %struct.thermo, ptr %3054, i32 0, i32 64
  %3056 = load ptr, ptr %3055, align 8, !tbaa !47
  %3057 = load i32, ptr %8, align 4, !tbaa !32
  %3058 = add nsw i32 %3057, 1
  %3059 = load ptr, ptr %7, align 8, !tbaa !5
  %3060 = getelementptr inbounds %struct.thermo, ptr %3059, i32 0, i32 61
  %3061 = load i32, ptr %3060, align 4, !tbaa !48
  %3062 = mul nsw i32 %3058, %3061
  %3063 = load ptr, ptr %7, align 8, !tbaa !5
  %3064 = getelementptr inbounds %struct.thermo, ptr %3063, i32 0, i32 42
  %3065 = load i32, ptr %3064, align 8, !tbaa !70
  %3066 = add nsw i32 %3062, %3065
  %3067 = sext i32 %3066 to i64
  %3068 = getelementptr inbounds double, ptr %3056, i64 %3067
  %3069 = load double, ptr %3068, align 8, !tbaa !9
  %3070 = call double @llvm.fmuladd.f64(double -2.000000e+00, double %3069, double %3053)
  %3071 = load ptr, ptr %7, align 8, !tbaa !5
  %3072 = getelementptr inbounds %struct.thermo, ptr %3071, i32 0, i32 64
  %3073 = load ptr, ptr %3072, align 8, !tbaa !47
  %3074 = load i32, ptr %8, align 4, !tbaa !32
  %3075 = add nsw i32 %3074, 2
  %3076 = load ptr, ptr %7, align 8, !tbaa !5
  %3077 = getelementptr inbounds %struct.thermo, ptr %3076, i32 0, i32 61
  %3078 = load i32, ptr %3077, align 4, !tbaa !48
  %3079 = mul nsw i32 %3075, %3078
  %3080 = load ptr, ptr %7, align 8, !tbaa !5
  %3081 = getelementptr inbounds %struct.thermo, ptr %3080, i32 0, i32 42
  %3082 = load i32, ptr %3081, align 8, !tbaa !70
  %3083 = add nsw i32 %3079, %3082
  %3084 = sext i32 %3083 to i64
  %3085 = getelementptr inbounds double, ptr %3073, i64 %3084
  %3086 = load double, ptr %3085, align 8, !tbaa !9
  %3087 = fadd double %3070, %3086
  %3088 = fdiv double %3038, %3087
  %3089 = fadd double %2988, %3088
  %3090 = load ptr, ptr %7, align 8, !tbaa !5
  %3091 = getelementptr inbounds %struct.thermo, ptr %3090, i32 0, i32 66
  store double %3089, ptr %3091, align 8, !tbaa !97
  %3092 = load ptr, ptr %7, align 8, !tbaa !5
  %3093 = getelementptr inbounds %struct.thermo, ptr %3092, i32 0, i32 66
  %3094 = load double, ptr %3093, align 8, !tbaa !97
  %3095 = load ptr, ptr %5, align 8, !tbaa !5
  %3096 = getelementptr inbounds %struct.precision, ptr %3095, i32 0, i32 175
  %3097 = load double, ptr %3096, align 8, !tbaa !98
  %3098 = fadd double %3094, %3097
  %3099 = fcmp oge double %3098, 2.000000e+03
  br i1 %3099, label %3100, label %3108

3100:                                             ; preds = %2964
  call void @llvm.lifetime.start.p0(i64 2048, ptr %116) #6
  %3101 = getelementptr inbounds [2048 x i8], ptr %116, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3101, ptr noundef @.str.67, double noundef 2.000000e+03)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %117) #6
  %3102 = getelementptr inbounds [2048 x i8], ptr %117, i64 0, i64 0
  %3103 = getelementptr inbounds [2048 x i8], ptr %116, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3102, ptr noundef @.str.10, ptr noundef @.str.69, ptr noundef %3103)
  %3104 = load ptr, ptr %7, align 8, !tbaa !5
  %3105 = getelementptr inbounds %struct.thermo, ptr %3104, i32 0, i32 93
  %3106 = getelementptr inbounds [2048 x i8], ptr %3105, i64 0, i64 0
  %3107 = getelementptr inbounds [2048 x i8], ptr %117, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3106, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1027, ptr noundef %3107)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %117) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %116) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3108:                                             ; preds = %2964
  %3109 = load ptr, ptr %7, align 8, !tbaa !5
  %3110 = getelementptr inbounds %struct.thermo, ptr %3109, i32 0, i32 66
  %3111 = load double, ptr %3110, align 8, !tbaa !97
  %3112 = load ptr, ptr %5, align 8, !tbaa !5
  %3113 = getelementptr inbounds %struct.precision, ptr %3112, i32 0, i32 175
  %3114 = load double, ptr %3113, align 8, !tbaa !98
  %3115 = fsub double %3111, %3114
  %3116 = fcmp ole double %3115, 5.000000e+02
  br i1 %3116, label %3117, label %3125

3117:                                             ; preds = %3108
  call void @llvm.lifetime.start.p0(i64 2048, ptr %118) #6
  %3118 = getelementptr inbounds [2048 x i8], ptr %118, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3118, ptr noundef @.str.70, double noundef 5.000000e+02)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %119) #6
  %3119 = getelementptr inbounds [2048 x i8], ptr %119, i64 0, i64 0
  %3120 = getelementptr inbounds [2048 x i8], ptr %118, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3119, ptr noundef @.str.10, ptr noundef @.str.71, ptr noundef %3120)
  %3121 = load ptr, ptr %7, align 8, !tbaa !5
  %3122 = getelementptr inbounds %struct.thermo, ptr %3121, i32 0, i32 93
  %3123 = getelementptr inbounds [2048 x i8], ptr %3122, i64 0, i64 0
  %3124 = getelementptr inbounds [2048 x i8], ptr %119, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3123, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1031, ptr noundef %3124)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %119) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %118) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3125:                                             ; preds = %3108
  %3126 = load ptr, ptr %6, align 8, !tbaa !5
  %3127 = load ptr, ptr %7, align 8, !tbaa !5
  %3128 = getelementptr inbounds %struct.thermo, ptr %3127, i32 0, i32 66
  %3129 = load double, ptr %3128, align 8, !tbaa !97
  %3130 = load ptr, ptr %7, align 8, !tbaa !5
  %3131 = getelementptr inbounds %struct.thermo, ptr %3130, i32 0, i32 67
  %3132 = call i32 @background_tau_of_z(ptr noundef %3126, double noundef %3129, ptr noundef %3131)
  %3133 = icmp eq i32 %3132, 1
  br i1 %3133, label %3134, label %3143

3134:                                             ; preds = %3125
  call void @llvm.lifetime.start.p0(i64 2048, ptr %120) #6
  %3135 = getelementptr inbounds [2048 x i8], ptr %120, i64 0, i64 0
  %3136 = load ptr, ptr %6, align 8, !tbaa !5
  %3137 = getelementptr inbounds %struct.background, ptr %3136, i32 0, i32 149
  %3138 = getelementptr inbounds [2048 x i8], ptr %3137, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3135, ptr noundef @.str, ptr noundef @.str.72, ptr noundef %3138)
  %3139 = load ptr, ptr %7, align 8, !tbaa !5
  %3140 = getelementptr inbounds %struct.thermo, ptr %3139, i32 0, i32 93
  %3141 = getelementptr inbounds [2048 x i8], ptr %3140, i64 0, i64 0
  %3142 = getelementptr inbounds [2048 x i8], ptr %120, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3141, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1037, ptr noundef %3142)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %120) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3143:                                             ; preds = %3125
  %3144 = load ptr, ptr %6, align 8, !tbaa !5
  %3145 = load ptr, ptr %7, align 8, !tbaa !5
  %3146 = getelementptr inbounds %struct.thermo, ptr %3145, i32 0, i32 67
  %3147 = load double, ptr %3146, align 8, !tbaa !99
  %3148 = load ptr, ptr %6, align 8, !tbaa !5
  %3149 = getelementptr inbounds %struct.background, ptr %3148, i32 0, i32 143
  %3150 = load i16, ptr %3149, align 4, !tbaa !100
  %3151 = load ptr, ptr %6, align 8, !tbaa !5
  %3152 = getelementptr inbounds %struct.background, ptr %3151, i32 0, i32 144
  %3153 = load i16, ptr %3152, align 2, !tbaa !85
  %3154 = load ptr, ptr %10, align 8, !tbaa !5
  %3155 = call i32 @background_at_tau(ptr noundef %3144, double noundef %3147, i16 noundef signext %3150, i16 noundef signext %3153, ptr noundef %11, ptr noundef %3154)
  %3156 = icmp eq i32 %3155, 1
  br i1 %3156, label %3157, label %3166

3157:                                             ; preds = %3143
  call void @llvm.lifetime.start.p0(i64 2048, ptr %121) #6
  %3158 = getelementptr inbounds [2048 x i8], ptr %121, i64 0, i64 0
  %3159 = load ptr, ptr %6, align 8, !tbaa !5
  %3160 = getelementptr inbounds %struct.background, ptr %3159, i32 0, i32 149
  %3161 = getelementptr inbounds [2048 x i8], ptr %3160, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3158, ptr noundef @.str, ptr noundef @.str.73, ptr noundef %3161)
  %3162 = load ptr, ptr %7, align 8, !tbaa !5
  %3163 = getelementptr inbounds %struct.thermo, ptr %3162, i32 0, i32 93
  %3164 = getelementptr inbounds [2048 x i8], ptr %3163, i64 0, i64 0
  %3165 = getelementptr inbounds [2048 x i8], ptr %121, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3164, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1041, ptr noundef %3165)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %121) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3166:                                             ; preds = %3143
  %3167 = load ptr, ptr %10, align 8, !tbaa !5
  %3168 = load ptr, ptr %6, align 8, !tbaa !5
  %3169 = getelementptr inbounds %struct.background, ptr %3168, i32 0, i32 94
  %3170 = load i32, ptr %3169, align 4, !tbaa !101
  %3171 = sext i32 %3170 to i64
  %3172 = getelementptr inbounds double, ptr %3167, i64 %3171
  %3173 = load double, ptr %3172, align 8, !tbaa !9
  %3174 = load ptr, ptr %7, align 8, !tbaa !5
  %3175 = getelementptr inbounds %struct.thermo, ptr %3174, i32 0, i32 68
  store double %3173, ptr %3175, align 8, !tbaa !102
  %3176 = load ptr, ptr %7, align 8, !tbaa !5
  %3177 = getelementptr inbounds %struct.thermo, ptr %3176, i32 0, i32 68
  %3178 = load double, ptr %3177, align 8, !tbaa !102
  %3179 = load ptr, ptr %6, align 8, !tbaa !5
  %3180 = getelementptr inbounds %struct.background, ptr %3179, i32 0, i32 58
  %3181 = load double, ptr %3180, align 8, !tbaa !103
  %3182 = fmul double %3178, %3181
  %3183 = load ptr, ptr %7, align 8, !tbaa !5
  %3184 = getelementptr inbounds %struct.thermo, ptr %3183, i32 0, i32 66
  %3185 = load double, ptr %3184, align 8, !tbaa !97
  %3186 = fadd double 1.000000e+00, %3185
  %3187 = fdiv double %3182, %3186
  %3188 = load ptr, ptr %7, align 8, !tbaa !5
  %3189 = getelementptr inbounds %struct.thermo, ptr %3188, i32 0, i32 69
  store double %3187, ptr %3189, align 8, !tbaa !104
  %3190 = load ptr, ptr %10, align 8, !tbaa !5
  %3191 = load ptr, ptr %6, align 8, !tbaa !5
  %3192 = getelementptr inbounds %struct.background, ptr %3191, i32 0, i32 91
  %3193 = load i32, ptr %3192, align 8, !tbaa !105
  %3194 = sext i32 %3193 to i64
  %3195 = getelementptr inbounds double, ptr %3190, i64 %3194
  %3196 = load double, ptr %3195, align 8, !tbaa !9
  %3197 = load ptr, ptr %7, align 8, !tbaa !5
  %3198 = getelementptr inbounds %struct.thermo, ptr %3197, i32 0, i32 71
  store double %3196, ptr %3198, align 8, !tbaa !106
  %3199 = load ptr, ptr %7, align 8, !tbaa !5
  %3200 = getelementptr inbounds %struct.thermo, ptr %3199, i32 0, i32 71
  %3201 = load double, ptr %3200, align 8, !tbaa !106
  %3202 = load ptr, ptr %7, align 8, !tbaa !5
  %3203 = getelementptr inbounds %struct.thermo, ptr %3202, i32 0, i32 66
  %3204 = load double, ptr %3203, align 8, !tbaa !97
  %3205 = fadd double 1.000000e+00, %3204
  %3206 = fmul double %3201, %3205
  %3207 = load ptr, ptr %6, align 8, !tbaa !5
  %3208 = getelementptr inbounds %struct.background, ptr %3207, i32 0, i32 58
  %3209 = load double, ptr %3208, align 8, !tbaa !103
  %3210 = fdiv double %3206, %3209
  %3211 = load ptr, ptr %7, align 8, !tbaa !5
  %3212 = getelementptr inbounds %struct.thermo, ptr %3211, i32 0, i32 70
  store double %3210, ptr %3212, align 8, !tbaa !107
  %3213 = load ptr, ptr %7, align 8, !tbaa !5
  %3214 = getelementptr inbounds %struct.thermo, ptr %3213, i32 0, i32 70
  %3215 = load double, ptr %3214, align 8, !tbaa !107
  %3216 = load ptr, ptr %6, align 8, !tbaa !5
  %3217 = getelementptr inbounds %struct.background, ptr %3216, i32 0, i32 44
  %3218 = load double, ptr %3217, align 8, !tbaa !108
  %3219 = load ptr, ptr %7, align 8, !tbaa !5
  %3220 = getelementptr inbounds %struct.thermo, ptr %3219, i32 0, i32 67
  %3221 = load double, ptr %3220, align 8, !tbaa !99
  %3222 = fsub double %3218, %3221
  %3223 = fdiv double %3215, %3222
  %3224 = load ptr, ptr %7, align 8, !tbaa !5
  %3225 = getelementptr inbounds %struct.thermo, ptr %3224, i32 0, i32 85
  store double %3223, ptr %3225, align 8, !tbaa !109
  %3226 = load ptr, ptr %7, align 8, !tbaa !5
  %3227 = getelementptr inbounds %struct.thermo, ptr %3226, i32 0, i32 7
  %3228 = load i16, ptr %3227, align 2, !tbaa !68
  %3229 = sext i16 %3228 to i32
  %3230 = icmp eq i32 %3229, 1
  br i1 %3230, label %3231, label %3324

3231:                                             ; preds = %3166
  %3232 = load ptr, ptr %7, align 8, !tbaa !5
  %3233 = getelementptr inbounds %struct.thermo, ptr %3232, i32 0, i32 63
  %3234 = load ptr, ptr %3233, align 8, !tbaa !39
  %3235 = load i32, ptr %8, align 4, !tbaa !32
  %3236 = add nsw i32 %3235, 1
  %3237 = sext i32 %3236 to i64
  %3238 = getelementptr inbounds double, ptr %3234, i64 %3237
  %3239 = load double, ptr %3238, align 8, !tbaa !9
  %3240 = load ptr, ptr %7, align 8, !tbaa !5
  %3241 = getelementptr inbounds %struct.thermo, ptr %3240, i32 0, i32 66
  %3242 = load double, ptr %3241, align 8, !tbaa !97
  %3243 = fsub double %3239, %3242
  %3244 = load ptr, ptr %7, align 8, !tbaa !5
  %3245 = getelementptr inbounds %struct.thermo, ptr %3244, i32 0, i32 63
  %3246 = load ptr, ptr %3245, align 8, !tbaa !39
  %3247 = load i32, ptr %8, align 4, !tbaa !32
  %3248 = add nsw i32 %3247, 1
  %3249 = sext i32 %3248 to i64
  %3250 = getelementptr inbounds double, ptr %3246, i64 %3249
  %3251 = load double, ptr %3250, align 8, !tbaa !9
  %3252 = load ptr, ptr %7, align 8, !tbaa !5
  %3253 = getelementptr inbounds %struct.thermo, ptr %3252, i32 0, i32 63
  %3254 = load ptr, ptr %3253, align 8, !tbaa !39
  %3255 = load i32, ptr %8, align 4, !tbaa !32
  %3256 = sext i32 %3255 to i64
  %3257 = getelementptr inbounds double, ptr %3254, i64 %3256
  %3258 = load double, ptr %3257, align 8, !tbaa !9
  %3259 = fsub double %3251, %3258
  %3260 = fdiv double %3243, %3259
  %3261 = load ptr, ptr %7, align 8, !tbaa !5
  %3262 = getelementptr inbounds %struct.thermo, ptr %3261, i32 0, i32 64
  %3263 = load ptr, ptr %3262, align 8, !tbaa !47
  %3264 = load i32, ptr %8, align 4, !tbaa !32
  %3265 = load ptr, ptr %7, align 8, !tbaa !5
  %3266 = getelementptr inbounds %struct.thermo, ptr %3265, i32 0, i32 61
  %3267 = load i32, ptr %3266, align 4, !tbaa !48
  %3268 = mul nsw i32 %3264, %3267
  %3269 = load ptr, ptr %7, align 8, !tbaa !5
  %3270 = getelementptr inbounds %struct.thermo, ptr %3269, i32 0, i32 60
  %3271 = load i32, ptr %3270, align 8, !tbaa !71
  %3272 = add nsw i32 %3268, %3271
  %3273 = sext i32 %3272 to i64
  %3274 = getelementptr inbounds double, ptr %3263, i64 %3273
  %3275 = load double, ptr %3274, align 8, !tbaa !9
  %3276 = load ptr, ptr %7, align 8, !tbaa !5
  %3277 = getelementptr inbounds %struct.thermo, ptr %3276, i32 0, i32 66
  %3278 = load double, ptr %3277, align 8, !tbaa !97
  %3279 = load ptr, ptr %7, align 8, !tbaa !5
  %3280 = getelementptr inbounds %struct.thermo, ptr %3279, i32 0, i32 63
  %3281 = load ptr, ptr %3280, align 8, !tbaa !39
  %3282 = load i32, ptr %8, align 4, !tbaa !32
  %3283 = sext i32 %3282 to i64
  %3284 = getelementptr inbounds double, ptr %3281, i64 %3283
  %3285 = load double, ptr %3284, align 8, !tbaa !9
  %3286 = fsub double %3278, %3285
  %3287 = load ptr, ptr %7, align 8, !tbaa !5
  %3288 = getelementptr inbounds %struct.thermo, ptr %3287, i32 0, i32 63
  %3289 = load ptr, ptr %3288, align 8, !tbaa !39
  %3290 = load i32, ptr %8, align 4, !tbaa !32
  %3291 = add nsw i32 %3290, 1
  %3292 = sext i32 %3291 to i64
  %3293 = getelementptr inbounds double, ptr %3289, i64 %3292
  %3294 = load double, ptr %3293, align 8, !tbaa !9
  %3295 = load ptr, ptr %7, align 8, !tbaa !5
  %3296 = getelementptr inbounds %struct.thermo, ptr %3295, i32 0, i32 63
  %3297 = load ptr, ptr %3296, align 8, !tbaa !39
  %3298 = load i32, ptr %8, align 4, !tbaa !32
  %3299 = sext i32 %3298 to i64
  %3300 = getelementptr inbounds double, ptr %3297, i64 %3299
  %3301 = load double, ptr %3300, align 8, !tbaa !9
  %3302 = fsub double %3294, %3301
  %3303 = fdiv double %3286, %3302
  %3304 = load ptr, ptr %7, align 8, !tbaa !5
  %3305 = getelementptr inbounds %struct.thermo, ptr %3304, i32 0, i32 64
  %3306 = load ptr, ptr %3305, align 8, !tbaa !47
  %3307 = load i32, ptr %8, align 4, !tbaa !32
  %3308 = add nsw i32 %3307, 1
  %3309 = load ptr, ptr %7, align 8, !tbaa !5
  %3310 = getelementptr inbounds %struct.thermo, ptr %3309, i32 0, i32 61
  %3311 = load i32, ptr %3310, align 4, !tbaa !48
  %3312 = mul nsw i32 %3308, %3311
  %3313 = load ptr, ptr %7, align 8, !tbaa !5
  %3314 = getelementptr inbounds %struct.thermo, ptr %3313, i32 0, i32 60
  %3315 = load i32, ptr %3314, align 8, !tbaa !71
  %3316 = add nsw i32 %3312, %3315
  %3317 = sext i32 %3316 to i64
  %3318 = getelementptr inbounds double, ptr %3306, i64 %3317
  %3319 = load double, ptr %3318, align 8, !tbaa !9
  %3320 = fmul double %3303, %3319
  %3321 = call double @llvm.fmuladd.f64(double %3260, double %3275, double %3320)
  %3322 = load ptr, ptr %7, align 8, !tbaa !5
  %3323 = getelementptr inbounds %struct.thermo, ptr %3322, i32 0, i32 72
  store double %3321, ptr %3323, align 8, !tbaa !110
  br label %3324

3324:                                             ; preds = %3231, %3166
  %3325 = load ptr, ptr %6, align 8, !tbaa !5
  %3326 = load ptr, ptr %7, align 8, !tbaa !5
  %3327 = getelementptr inbounds %struct.thermo, ptr %3326, i32 0, i32 63
  %3328 = load ptr, ptr %3327, align 8, !tbaa !39
  %3329 = load i32, ptr %8, align 4, !tbaa !32
  %3330 = sext i32 %3329 to i64
  %3331 = getelementptr inbounds double, ptr %3328, i64 %3330
  %3332 = load double, ptr %3331, align 8, !tbaa !9
  %3333 = call i32 @background_tau_of_z(ptr noundef %3325, double noundef %3332, ptr noundef %20)
  %3334 = icmp eq i32 %3333, 1
  br i1 %3334, label %3335, label %3344

3335:                                             ; preds = %3324
  call void @llvm.lifetime.start.p0(i64 2048, ptr %122) #6
  %3336 = getelementptr inbounds [2048 x i8], ptr %122, i64 0, i64 0
  %3337 = load ptr, ptr %6, align 8, !tbaa !5
  %3338 = getelementptr inbounds %struct.background, ptr %3337, i32 0, i32 149
  %3339 = getelementptr inbounds [2048 x i8], ptr %3338, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3336, ptr noundef @.str, ptr noundef @.str.74, ptr noundef %3339)
  %3340 = load ptr, ptr %7, align 8, !tbaa !5
  %3341 = getelementptr inbounds %struct.thermo, ptr %3340, i32 0, i32 93
  %3342 = getelementptr inbounds [2048 x i8], ptr %3341, i64 0, i64 0
  %3343 = getelementptr inbounds [2048 x i8], ptr %122, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3342, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1063, ptr noundef %3343)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %122) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3344:                                             ; preds = %3324
  br label %3345

3345:                                             ; preds = %3395, %3344
  %3346 = load ptr, ptr %7, align 8, !tbaa !5
  %3347 = getelementptr inbounds %struct.thermo, ptr %3346, i32 0, i32 64
  %3348 = load ptr, ptr %3347, align 8, !tbaa !47
  %3349 = load i32, ptr %8, align 4, !tbaa !32
  %3350 = load ptr, ptr %7, align 8, !tbaa !5
  %3351 = getelementptr inbounds %struct.thermo, ptr %3350, i32 0, i32 61
  %3352 = load i32, ptr %3351, align 4, !tbaa !48
  %3353 = mul nsw i32 %3349, %3352
  %3354 = load ptr, ptr %7, align 8, !tbaa !5
  %3355 = getelementptr inbounds %struct.thermo, ptr %3354, i32 0, i32 37
  %3356 = load i32, ptr %3355, align 4, !tbaa !49
  %3357 = add nsw i32 %3353, %3356
  %3358 = sext i32 %3357 to i64
  %3359 = getelementptr inbounds double, ptr %3348, i64 %3358
  %3360 = load double, ptr %3359, align 8, !tbaa !9
  %3361 = fdiv double 1.000000e+00, %3360
  %3362 = load double, ptr %20, align 8, !tbaa !9
  %3363 = fdiv double %3361, %3362
  %3364 = load ptr, ptr %5, align 8, !tbaa !5
  %3365 = getelementptr inbounds %struct.precision, ptr %3364, i32 0, i32 89
  %3366 = load double, ptr %3365, align 8, !tbaa !111
  %3367 = fcmp olt double %3363, %3366
  br i1 %3367, label %3368, label %3371

3368:                                             ; preds = %3345
  %3369 = load i32, ptr %8, align 4, !tbaa !32
  %3370 = icmp sgt i32 %3369, 0
  br label %3371

3371:                                             ; preds = %3368, %3345
  %3372 = phi i1 [ false, %3345 ], [ %3370, %3368 ]
  br i1 %3372, label %3373, label %3396

3373:                                             ; preds = %3371
  %3374 = load i32, ptr %8, align 4, !tbaa !32
  %3375 = add nsw i32 %3374, -1
  store i32 %3375, ptr %8, align 4, !tbaa !32
  %3376 = load ptr, ptr %6, align 8, !tbaa !5
  %3377 = load ptr, ptr %7, align 8, !tbaa !5
  %3378 = getelementptr inbounds %struct.thermo, ptr %3377, i32 0, i32 63
  %3379 = load ptr, ptr %3378, align 8, !tbaa !39
  %3380 = load i32, ptr %8, align 4, !tbaa !32
  %3381 = sext i32 %3380 to i64
  %3382 = getelementptr inbounds double, ptr %3379, i64 %3381
  %3383 = load double, ptr %3382, align 8, !tbaa !9
  %3384 = call i32 @background_tau_of_z(ptr noundef %3376, double noundef %3383, ptr noundef %20)
  %3385 = icmp eq i32 %3384, 1
  br i1 %3385, label %3386, label %3395

3386:                                             ; preds = %3373
  call void @llvm.lifetime.start.p0(i64 2048, ptr %123) #6
  %3387 = getelementptr inbounds [2048 x i8], ptr %123, i64 0, i64 0
  %3388 = load ptr, ptr %6, align 8, !tbaa !5
  %3389 = getelementptr inbounds %struct.background, ptr %3388, i32 0, i32 149
  %3390 = getelementptr inbounds [2048 x i8], ptr %3389, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3387, ptr noundef @.str, ptr noundef @.str.74, ptr noundef %3390)
  %3391 = load ptr, ptr %7, align 8, !tbaa !5
  %3392 = getelementptr inbounds %struct.thermo, ptr %3391, i32 0, i32 93
  %3393 = getelementptr inbounds [2048 x i8], ptr %3392, i64 0, i64 0
  %3394 = getelementptr inbounds [2048 x i8], ptr %123, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3393, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1072, ptr noundef %3394)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %123) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3395:                                             ; preds = %3373
  br label %3345, !llvm.loop !112

3396:                                             ; preds = %3371
  %3397 = load double, ptr %20, align 8, !tbaa !9
  %3398 = load ptr, ptr %7, align 8, !tbaa !5
  %3399 = getelementptr inbounds %struct.thermo, ptr %3398, i32 0, i32 86
  store double %3397, ptr %3399, align 8, !tbaa !113
  %3400 = load i32, ptr %8, align 4, !tbaa !32
  store i32 %3400, ptr %38, align 4, !tbaa !32
  %3401 = load ptr, ptr %6, align 8, !tbaa !5
  %3402 = getelementptr inbounds %struct.background, ptr %3401, i32 0, i32 127
  %3403 = load i16, ptr %3402, align 4, !tbaa !114
  %3404 = sext i16 %3403 to i32
  %3405 = icmp eq i32 %3404, 1
  br i1 %3405, label %3406, label %3556

3406:                                             ; preds = %3396
  %3407 = load ptr, ptr %6, align 8, !tbaa !5
  %3408 = getelementptr inbounds %struct.background, ptr %3407, i32 0, i32 128
  %3409 = load i16, ptr %3408, align 2, !tbaa !23
  %3410 = sext i16 %3409 to i32
  %3411 = icmp eq i32 %3410, 1
  br i1 %3411, label %3412, label %3528

3412:                                             ; preds = %3406
  %3413 = load ptr, ptr %7, align 8, !tbaa !5
  %3414 = getelementptr inbounds %struct.thermo, ptr %3413, i32 0, i32 34
  %3415 = load double, ptr %3414, align 8, !tbaa !52
  %3416 = fcmp oge double %3415, 2.000000e+00
  br i1 %3416, label %3417, label %3420

3417:                                             ; preds = %3412
  %3418 = load i32, ptr %38, align 4, !tbaa !32
  %3419 = sub nsw i32 %3418, 1
  store i32 %3419, ptr %8, align 4, !tbaa !32
  br label %3421

3420:                                             ; preds = %3412
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %3421

3421:                                             ; preds = %3420, %3417
  %3422 = load ptr, ptr %6, align 8, !tbaa !5
  %3423 = load ptr, ptr %7, align 8, !tbaa !5
  %3424 = getelementptr inbounds %struct.thermo, ptr %3423, i32 0, i32 63
  %3425 = load ptr, ptr %3424, align 8, !tbaa !39
  %3426 = load i32, ptr %8, align 4, !tbaa !32
  %3427 = sext i32 %3426 to i64
  %3428 = getelementptr inbounds double, ptr %3425, i64 %3427
  %3429 = load double, ptr %3428, align 8, !tbaa !9
  %3430 = call i32 @background_tau_of_z(ptr noundef %3422, double noundef %3429, ptr noundef %20)
  %3431 = icmp eq i32 %3430, 1
  br i1 %3431, label %3432, label %3441

3432:                                             ; preds = %3421
  call void @llvm.lifetime.start.p0(i64 2048, ptr %124) #6
  %3433 = getelementptr inbounds [2048 x i8], ptr %124, i64 0, i64 0
  %3434 = load ptr, ptr %6, align 8, !tbaa !5
  %3435 = getelementptr inbounds %struct.background, ptr %3434, i32 0, i32 149
  %3436 = getelementptr inbounds [2048 x i8], ptr %3435, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3433, ptr noundef @.str, ptr noundef @.str.74, ptr noundef %3436)
  %3437 = load ptr, ptr %7, align 8, !tbaa !5
  %3438 = getelementptr inbounds %struct.thermo, ptr %3437, i32 0, i32 93
  %3439 = getelementptr inbounds [2048 x i8], ptr %3438, i64 0, i64 0
  %3440 = getelementptr inbounds [2048 x i8], ptr %124, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3439, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1095, ptr noundef %3440)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %124) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3441:                                             ; preds = %3421
  br label %3442

3442:                                             ; preds = %3522, %3441
  %3443 = load ptr, ptr %7, align 8, !tbaa !5
  %3444 = getelementptr inbounds %struct.thermo, ptr %3443, i32 0, i32 64
  %3445 = load ptr, ptr %3444, align 8, !tbaa !47
  %3446 = load i32, ptr %8, align 4, !tbaa !32
  %3447 = load ptr, ptr %7, align 8, !tbaa !5
  %3448 = getelementptr inbounds %struct.thermo, ptr %3447, i32 0, i32 61
  %3449 = load i32, ptr %3448, align 4, !tbaa !48
  %3450 = mul nsw i32 %3446, %3449
  %3451 = load ptr, ptr %7, align 8, !tbaa !5
  %3452 = getelementptr inbounds %struct.thermo, ptr %3451, i32 0, i32 45
  %3453 = load i32, ptr %3452, align 4, !tbaa !55
  %3454 = add nsw i32 %3450, %3453
  %3455 = sext i32 %3454 to i64
  %3456 = getelementptr inbounds double, ptr %3445, i64 %3455
  %3457 = load double, ptr %3456, align 8, !tbaa !9
  %3458 = fdiv double 1.000000e+00, %3457
  %3459 = load double, ptr %20, align 8, !tbaa !9
  %3460 = fdiv double %3458, %3459
  %3461 = load ptr, ptr %5, align 8, !tbaa !5
  %3462 = getelementptr inbounds %struct.precision, ptr %3461, i32 0, i32 92
  %3463 = load double, ptr %3462, align 8, !tbaa !115
  %3464 = fcmp olt double %3460, %3463
  br i1 %3464, label %3465, label %3489

3465:                                             ; preds = %3442
  %3466 = load ptr, ptr %7, align 8, !tbaa !5
  %3467 = getelementptr inbounds %struct.thermo, ptr %3466, i32 0, i32 34
  %3468 = load double, ptr %3467, align 8, !tbaa !52
  %3469 = fcmp oge double %3468, 2.000000e+00
  br i1 %3469, label %3470, label %3473

3470:                                             ; preds = %3465
  %3471 = load i32, ptr %8, align 4, !tbaa !32
  %3472 = icmp sgt i32 %3471, 0
  br i1 %3472, label %3487, label %3473

3473:                                             ; preds = %3470, %3465
  %3474 = load ptr, ptr %7, align 8, !tbaa !5
  %3475 = getelementptr inbounds %struct.thermo, ptr %3474, i32 0, i32 34
  %3476 = load double, ptr %3475, align 8, !tbaa !52
  %3477 = fcmp olt double %3476, 2.000000e+00
  br i1 %3477, label %3478, label %3485

3478:                                             ; preds = %3473
  %3479 = load i32, ptr %8, align 4, !tbaa !32
  %3480 = load ptr, ptr %7, align 8, !tbaa !5
  %3481 = getelementptr inbounds %struct.thermo, ptr %3480, i32 0, i32 62
  %3482 = load i32, ptr %3481, align 8, !tbaa !38
  %3483 = sub nsw i32 %3482, 1
  %3484 = icmp slt i32 %3479, %3483
  br label %3485

3485:                                             ; preds = %3478, %3473
  %3486 = phi i1 [ false, %3473 ], [ %3484, %3478 ]
  br label %3487

3487:                                             ; preds = %3485, %3470
  %3488 = phi i1 [ true, %3470 ], [ %3486, %3485 ]
  br label %3489

3489:                                             ; preds = %3487, %3442
  %3490 = phi i1 [ false, %3442 ], [ %3488, %3487 ]
  br i1 %3490, label %3491, label %3523

3491:                                             ; preds = %3489
  %3492 = load ptr, ptr %7, align 8, !tbaa !5
  %3493 = getelementptr inbounds %struct.thermo, ptr %3492, i32 0, i32 34
  %3494 = load double, ptr %3493, align 8, !tbaa !52
  %3495 = fcmp oge double %3494, 2.000000e+00
  br i1 %3495, label %3496, label %3499

3496:                                             ; preds = %3491
  %3497 = load i32, ptr %8, align 4, !tbaa !32
  %3498 = add nsw i32 %3497, -1
  store i32 %3498, ptr %8, align 4, !tbaa !32
  br label %3502

3499:                                             ; preds = %3491
  %3500 = load i32, ptr %8, align 4, !tbaa !32
  %3501 = add nsw i32 %3500, 1
  store i32 %3501, ptr %8, align 4, !tbaa !32
  br label %3502

3502:                                             ; preds = %3499, %3496
  %3503 = load ptr, ptr %6, align 8, !tbaa !5
  %3504 = load ptr, ptr %7, align 8, !tbaa !5
  %3505 = getelementptr inbounds %struct.thermo, ptr %3504, i32 0, i32 63
  %3506 = load ptr, ptr %3505, align 8, !tbaa !39
  %3507 = load i32, ptr %8, align 4, !tbaa !32
  %3508 = sext i32 %3507 to i64
  %3509 = getelementptr inbounds double, ptr %3506, i64 %3508
  %3510 = load double, ptr %3509, align 8, !tbaa !9
  %3511 = call i32 @background_tau_of_z(ptr noundef %3503, double noundef %3510, ptr noundef %20)
  %3512 = icmp eq i32 %3511, 1
  br i1 %3512, label %3513, label %3522

3513:                                             ; preds = %3502
  call void @llvm.lifetime.start.p0(i64 2048, ptr %125) #6
  %3514 = getelementptr inbounds [2048 x i8], ptr %125, i64 0, i64 0
  %3515 = load ptr, ptr %6, align 8, !tbaa !5
  %3516 = getelementptr inbounds %struct.background, ptr %3515, i32 0, i32 149
  %3517 = getelementptr inbounds [2048 x i8], ptr %3516, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3514, ptr noundef @.str, ptr noundef @.str.74, ptr noundef %3517)
  %3518 = load ptr, ptr %7, align 8, !tbaa !5
  %3519 = getelementptr inbounds %struct.thermo, ptr %3518, i32 0, i32 93
  %3520 = getelementptr inbounds [2048 x i8], ptr %3519, i64 0, i64 0
  %3521 = getelementptr inbounds [2048 x i8], ptr %125, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3520, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1111, ptr noundef %3521)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %125) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3522:                                             ; preds = %3502
  br label %3442, !llvm.loop !116

3523:                                             ; preds = %3489
  %3524 = load double, ptr %20, align 8, !tbaa !9
  store double %3524, ptr %37, align 8, !tbaa !9
  %3525 = load double, ptr %20, align 8, !tbaa !9
  %3526 = load ptr, ptr %7, align 8, !tbaa !5
  %3527 = getelementptr inbounds %struct.thermo, ptr %3526, i32 0, i32 87
  store double %3525, ptr %3527, align 8, !tbaa !117
  br label %3555

3528:                                             ; preds = %3406
  %3529 = load i32, ptr %38, align 4, !tbaa !32
  %3530 = sub nsw i32 %3529, 1
  store i32 %3530, ptr %8, align 4, !tbaa !32
  %3531 = load ptr, ptr %6, align 8, !tbaa !5
  %3532 = load ptr, ptr %7, align 8, !tbaa !5
  %3533 = getelementptr inbounds %struct.thermo, ptr %3532, i32 0, i32 63
  %3534 = load ptr, ptr %3533, align 8, !tbaa !39
  %3535 = load i32, ptr %8, align 4, !tbaa !32
  %3536 = sext i32 %3535 to i64
  %3537 = getelementptr inbounds double, ptr %3534, i64 %3536
  %3538 = load double, ptr %3537, align 8, !tbaa !9
  %3539 = call i32 @background_tau_of_z(ptr noundef %3531, double noundef %3538, ptr noundef %20)
  %3540 = icmp eq i32 %3539, 1
  br i1 %3540, label %3541, label %3550

3541:                                             ; preds = %3528
  call void @llvm.lifetime.start.p0(i64 2048, ptr %126) #6
  %3542 = getelementptr inbounds [2048 x i8], ptr %126, i64 0, i64 0
  %3543 = load ptr, ptr %6, align 8, !tbaa !5
  %3544 = getelementptr inbounds %struct.background, ptr %3543, i32 0, i32 149
  %3545 = getelementptr inbounds [2048 x i8], ptr %3544, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3542, ptr noundef @.str, ptr noundef @.str.74, ptr noundef %3545)
  %3546 = load ptr, ptr %7, align 8, !tbaa !5
  %3547 = getelementptr inbounds %struct.thermo, ptr %3546, i32 0, i32 93
  %3548 = getelementptr inbounds [2048 x i8], ptr %3547, i64 0, i64 0
  %3549 = getelementptr inbounds [2048 x i8], ptr %126, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3548, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1124, ptr noundef %3549)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %126) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3550:                                             ; preds = %3528
  %3551 = load double, ptr %20, align 8, !tbaa !9
  store double %3551, ptr %37, align 8, !tbaa !9
  %3552 = load double, ptr %20, align 8, !tbaa !9
  %3553 = load ptr, ptr %7, align 8, !tbaa !5
  %3554 = getelementptr inbounds %struct.thermo, ptr %3553, i32 0, i32 87
  store double %3552, ptr %3554, align 8, !tbaa !117
  br label %3555

3555:                                             ; preds = %3550, %3523
  br label %3556

3556:                                             ; preds = %3555, %3396
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %3557

3557:                                             ; preds = %3582, %3556
  %3558 = load ptr, ptr %7, align 8, !tbaa !5
  %3559 = getelementptr inbounds %struct.thermo, ptr %3558, i32 0, i32 64
  %3560 = load ptr, ptr %3559, align 8, !tbaa !47
  %3561 = load i32, ptr %8, align 4, !tbaa !32
  %3562 = load ptr, ptr %7, align 8, !tbaa !5
  %3563 = getelementptr inbounds %struct.thermo, ptr %3562, i32 0, i32 61
  %3564 = load i32, ptr %3563, align 4, !tbaa !48
  %3565 = mul nsw i32 %3561, %3564
  %3566 = load ptr, ptr %7, align 8, !tbaa !5
  %3567 = getelementptr inbounds %struct.thermo, ptr %3566, i32 0, i32 41
  %3568 = load i32, ptr %3567, align 4, !tbaa !77
  %3569 = add nsw i32 %3565, %3568
  %3570 = sext i32 %3569 to i64
  %3571 = getelementptr inbounds double, ptr %3560, i64 %3570
  %3572 = load double, ptr %3571, align 8, !tbaa !9
  %3573 = fcmp ogt double %3572, 0x3FD78B56362CEF38
  br i1 %3573, label %3574, label %3580

3574:                                             ; preds = %3557
  %3575 = load i32, ptr %8, align 4, !tbaa !32
  %3576 = load ptr, ptr %7, align 8, !tbaa !5
  %3577 = getelementptr inbounds %struct.thermo, ptr %3576, i32 0, i32 62
  %3578 = load i32, ptr %3577, align 8, !tbaa !38
  %3579 = icmp slt i32 %3575, %3578
  br label %3580

3580:                                             ; preds = %3574, %3557
  %3581 = phi i1 [ false, %3557 ], [ %3579, %3574 ]
  br i1 %3581, label %3582, label %3585

3582:                                             ; preds = %3580
  %3583 = load i32, ptr %8, align 4, !tbaa !32
  %3584 = add nsw i32 %3583, 1
  store i32 %3584, ptr %8, align 4, !tbaa !32
  br label %3557, !llvm.loop !118

3585:                                             ; preds = %3580
  %3586 = load ptr, ptr %7, align 8, !tbaa !5
  %3587 = getelementptr inbounds %struct.thermo, ptr %3586, i32 0, i32 63
  %3588 = load ptr, ptr %3587, align 8, !tbaa !39
  %3589 = load i32, ptr %8, align 4, !tbaa !32
  %3590 = sub nsw i32 %3589, 1
  %3591 = sext i32 %3590 to i64
  %3592 = getelementptr inbounds double, ptr %3588, i64 %3591
  %3593 = load double, ptr %3592, align 8, !tbaa !9
  %3594 = load ptr, ptr %7, align 8, !tbaa !5
  %3595 = getelementptr inbounds %struct.thermo, ptr %3594, i32 0, i32 64
  %3596 = load ptr, ptr %3595, align 8, !tbaa !47
  %3597 = load i32, ptr %8, align 4, !tbaa !32
  %3598 = sub nsw i32 %3597, 1
  %3599 = load ptr, ptr %7, align 8, !tbaa !5
  %3600 = getelementptr inbounds %struct.thermo, ptr %3599, i32 0, i32 61
  %3601 = load i32, ptr %3600, align 4, !tbaa !48
  %3602 = mul nsw i32 %3598, %3601
  %3603 = load ptr, ptr %7, align 8, !tbaa !5
  %3604 = getelementptr inbounds %struct.thermo, ptr %3603, i32 0, i32 41
  %3605 = load i32, ptr %3604, align 4, !tbaa !77
  %3606 = add nsw i32 %3602, %3605
  %3607 = sext i32 %3606 to i64
  %3608 = getelementptr inbounds double, ptr %3596, i64 %3607
  %3609 = load double, ptr %3608, align 8, !tbaa !9
  %3610 = fsub double 0x3FD78B56362CEF38, %3609
  %3611 = load ptr, ptr %7, align 8, !tbaa !5
  %3612 = getelementptr inbounds %struct.thermo, ptr %3611, i32 0, i32 64
  %3613 = load ptr, ptr %3612, align 8, !tbaa !47
  %3614 = load i32, ptr %8, align 4, !tbaa !32
  %3615 = load ptr, ptr %7, align 8, !tbaa !5
  %3616 = getelementptr inbounds %struct.thermo, ptr %3615, i32 0, i32 61
  %3617 = load i32, ptr %3616, align 4, !tbaa !48
  %3618 = mul nsw i32 %3614, %3617
  %3619 = load ptr, ptr %7, align 8, !tbaa !5
  %3620 = getelementptr inbounds %struct.thermo, ptr %3619, i32 0, i32 41
  %3621 = load i32, ptr %3620, align 4, !tbaa !77
  %3622 = add nsw i32 %3618, %3621
  %3623 = sext i32 %3622 to i64
  %3624 = getelementptr inbounds double, ptr %3613, i64 %3623
  %3625 = load double, ptr %3624, align 8, !tbaa !9
  %3626 = load ptr, ptr %7, align 8, !tbaa !5
  %3627 = getelementptr inbounds %struct.thermo, ptr %3626, i32 0, i32 64
  %3628 = load ptr, ptr %3627, align 8, !tbaa !47
  %3629 = load i32, ptr %8, align 4, !tbaa !32
  %3630 = sub nsw i32 %3629, 1
  %3631 = load ptr, ptr %7, align 8, !tbaa !5
  %3632 = getelementptr inbounds %struct.thermo, ptr %3631, i32 0, i32 61
  %3633 = load i32, ptr %3632, align 4, !tbaa !48
  %3634 = mul nsw i32 %3630, %3633
  %3635 = load ptr, ptr %7, align 8, !tbaa !5
  %3636 = getelementptr inbounds %struct.thermo, ptr %3635, i32 0, i32 41
  %3637 = load i32, ptr %3636, align 4, !tbaa !77
  %3638 = add nsw i32 %3634, %3637
  %3639 = sext i32 %3638 to i64
  %3640 = getelementptr inbounds double, ptr %3628, i64 %3639
  %3641 = load double, ptr %3640, align 8, !tbaa !9
  %3642 = fsub double %3625, %3641
  %3643 = fdiv double %3610, %3642
  %3644 = load ptr, ptr %7, align 8, !tbaa !5
  %3645 = getelementptr inbounds %struct.thermo, ptr %3644, i32 0, i32 63
  %3646 = load ptr, ptr %3645, align 8, !tbaa !39
  %3647 = load i32, ptr %8, align 4, !tbaa !32
  %3648 = sext i32 %3647 to i64
  %3649 = getelementptr inbounds double, ptr %3646, i64 %3648
  %3650 = load double, ptr %3649, align 8, !tbaa !9
  %3651 = load ptr, ptr %7, align 8, !tbaa !5
  %3652 = getelementptr inbounds %struct.thermo, ptr %3651, i32 0, i32 63
  %3653 = load ptr, ptr %3652, align 8, !tbaa !39
  %3654 = load i32, ptr %8, align 4, !tbaa !32
  %3655 = sub nsw i32 %3654, 1
  %3656 = sext i32 %3655 to i64
  %3657 = getelementptr inbounds double, ptr %3653, i64 %3656
  %3658 = load double, ptr %3657, align 8, !tbaa !9
  %3659 = fsub double %3650, %3658
  %3660 = call double @llvm.fmuladd.f64(double %3643, double %3659, double %3593)
  %3661 = load ptr, ptr %7, align 8, !tbaa !5
  %3662 = getelementptr inbounds %struct.thermo, ptr %3661, i32 0, i32 73
  store double %3660, ptr %3662, align 8, !tbaa !119
  %3663 = load ptr, ptr %6, align 8, !tbaa !5
  %3664 = load ptr, ptr %7, align 8, !tbaa !5
  %3665 = getelementptr inbounds %struct.thermo, ptr %3664, i32 0, i32 73
  %3666 = load double, ptr %3665, align 8, !tbaa !119
  %3667 = load ptr, ptr %7, align 8, !tbaa !5
  %3668 = getelementptr inbounds %struct.thermo, ptr %3667, i32 0, i32 74
  %3669 = call i32 @background_tau_of_z(ptr noundef %3663, double noundef %3666, ptr noundef %3668)
  %3670 = icmp eq i32 %3669, 1
  br i1 %3670, label %3671, label %3680

3671:                                             ; preds = %3585
  call void @llvm.lifetime.start.p0(i64 2048, ptr %127) #6
  %3672 = getelementptr inbounds [2048 x i8], ptr %127, i64 0, i64 0
  %3673 = load ptr, ptr %6, align 8, !tbaa !5
  %3674 = getelementptr inbounds %struct.background, ptr %3673, i32 0, i32 149
  %3675 = getelementptr inbounds [2048 x i8], ptr %3674, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3672, ptr noundef @.str, ptr noundef @.str.75, ptr noundef %3675)
  %3676 = load ptr, ptr %7, align 8, !tbaa !5
  %3677 = getelementptr inbounds %struct.thermo, ptr %3676, i32 0, i32 93
  %3678 = getelementptr inbounds [2048 x i8], ptr %3677, i64 0, i64 0
  %3679 = getelementptr inbounds [2048 x i8], ptr %127, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3678, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1144, ptr noundef %3679)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %127) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3680:                                             ; preds = %3585
  %3681 = load ptr, ptr %6, align 8, !tbaa !5
  %3682 = load ptr, ptr %7, align 8, !tbaa !5
  %3683 = getelementptr inbounds %struct.thermo, ptr %3682, i32 0, i32 74
  %3684 = load double, ptr %3683, align 8, !tbaa !120
  %3685 = load ptr, ptr %6, align 8, !tbaa !5
  %3686 = getelementptr inbounds %struct.background, ptr %3685, i32 0, i32 143
  %3687 = load i16, ptr %3686, align 4, !tbaa !100
  %3688 = load ptr, ptr %6, align 8, !tbaa !5
  %3689 = getelementptr inbounds %struct.background, ptr %3688, i32 0, i32 144
  %3690 = load i16, ptr %3689, align 2, !tbaa !85
  %3691 = load ptr, ptr %10, align 8, !tbaa !5
  %3692 = call i32 @background_at_tau(ptr noundef %3681, double noundef %3684, i16 noundef signext %3687, i16 noundef signext %3690, ptr noundef %11, ptr noundef %3691)
  %3693 = icmp eq i32 %3692, 1
  br i1 %3693, label %3694, label %3703

3694:                                             ; preds = %3680
  call void @llvm.lifetime.start.p0(i64 2048, ptr %128) #6
  %3695 = getelementptr inbounds [2048 x i8], ptr %128, i64 0, i64 0
  %3696 = load ptr, ptr %6, align 8, !tbaa !5
  %3697 = getelementptr inbounds %struct.background, ptr %3696, i32 0, i32 149
  %3698 = getelementptr inbounds [2048 x i8], ptr %3697, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3695, ptr noundef @.str, ptr noundef @.str.76, ptr noundef %3698)
  %3699 = load ptr, ptr %7, align 8, !tbaa !5
  %3700 = getelementptr inbounds %struct.thermo, ptr %3699, i32 0, i32 93
  %3701 = getelementptr inbounds [2048 x i8], ptr %3700, i64 0, i64 0
  %3702 = getelementptr inbounds [2048 x i8], ptr %128, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3701, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1148, ptr noundef %3702)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %128) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3703:                                             ; preds = %3680
  %3704 = load ptr, ptr %10, align 8, !tbaa !5
  %3705 = load ptr, ptr %6, align 8, !tbaa !5
  %3706 = getelementptr inbounds %struct.background, ptr %3705, i32 0, i32 94
  %3707 = load i32, ptr %3706, align 4, !tbaa !101
  %3708 = sext i32 %3707 to i64
  %3709 = getelementptr inbounds double, ptr %3704, i64 %3708
  %3710 = load double, ptr %3709, align 8, !tbaa !9
  %3711 = load ptr, ptr %7, align 8, !tbaa !5
  %3712 = getelementptr inbounds %struct.thermo, ptr %3711, i32 0, i32 75
  store double %3710, ptr %3712, align 8, !tbaa !121
  %3713 = load ptr, ptr %7, align 8, !tbaa !5
  %3714 = getelementptr inbounds %struct.thermo, ptr %3713, i32 0, i32 75
  %3715 = load double, ptr %3714, align 8, !tbaa !121
  %3716 = load ptr, ptr %6, align 8, !tbaa !5
  %3717 = getelementptr inbounds %struct.background, ptr %3716, i32 0, i32 58
  %3718 = load double, ptr %3717, align 8, !tbaa !103
  %3719 = fmul double %3715, %3718
  %3720 = load ptr, ptr %7, align 8, !tbaa !5
  %3721 = getelementptr inbounds %struct.thermo, ptr %3720, i32 0, i32 73
  %3722 = load double, ptr %3721, align 8, !tbaa !119
  %3723 = fadd double 1.000000e+00, %3722
  %3724 = fdiv double %3719, %3723
  %3725 = load ptr, ptr %7, align 8, !tbaa !5
  %3726 = getelementptr inbounds %struct.thermo, ptr %3725, i32 0, i32 76
  store double %3724, ptr %3726, align 8, !tbaa !122
  %3727 = load ptr, ptr %10, align 8, !tbaa !5
  %3728 = load ptr, ptr %6, align 8, !tbaa !5
  %3729 = getelementptr inbounds %struct.background, ptr %3728, i32 0, i32 91
  %3730 = load i32, ptr %3729, align 8, !tbaa !105
  %3731 = sext i32 %3730 to i64
  %3732 = getelementptr inbounds double, ptr %3727, i64 %3731
  %3733 = load double, ptr %3732, align 8, !tbaa !9
  %3734 = load ptr, ptr %7, align 8, !tbaa !5
  %3735 = getelementptr inbounds %struct.thermo, ptr %3734, i32 0, i32 78
  store double %3733, ptr %3735, align 8, !tbaa !123
  %3736 = load ptr, ptr %7, align 8, !tbaa !5
  %3737 = getelementptr inbounds %struct.thermo, ptr %3736, i32 0, i32 78
  %3738 = load double, ptr %3737, align 8, !tbaa !123
  %3739 = load ptr, ptr %7, align 8, !tbaa !5
  %3740 = getelementptr inbounds %struct.thermo, ptr %3739, i32 0, i32 73
  %3741 = load double, ptr %3740, align 8, !tbaa !119
  %3742 = fadd double 1.000000e+00, %3741
  %3743 = fmul double %3738, %3742
  %3744 = load ptr, ptr %6, align 8, !tbaa !5
  %3745 = getelementptr inbounds %struct.background, ptr %3744, i32 0, i32 58
  %3746 = load double, ptr %3745, align 8, !tbaa !103
  %3747 = fdiv double %3743, %3746
  %3748 = load ptr, ptr %7, align 8, !tbaa !5
  %3749 = getelementptr inbounds %struct.thermo, ptr %3748, i32 0, i32 77
  store double %3747, ptr %3749, align 8, !tbaa !124
  %3750 = load ptr, ptr %7, align 8, !tbaa !5
  %3751 = getelementptr inbounds %struct.thermo, ptr %3750, i32 0, i32 7
  %3752 = load i16, ptr %3751, align 2, !tbaa !68
  %3753 = sext i16 %3752 to i32
  %3754 = icmp eq i32 %3753, 1
  br i1 %3754, label %3755, label %3848

3755:                                             ; preds = %3703
  %3756 = load ptr, ptr %7, align 8, !tbaa !5
  %3757 = getelementptr inbounds %struct.thermo, ptr %3756, i32 0, i32 63
  %3758 = load ptr, ptr %3757, align 8, !tbaa !39
  %3759 = load i32, ptr %8, align 4, !tbaa !32
  %3760 = add nsw i32 %3759, 1
  %3761 = sext i32 %3760 to i64
  %3762 = getelementptr inbounds double, ptr %3758, i64 %3761
  %3763 = load double, ptr %3762, align 8, !tbaa !9
  %3764 = load ptr, ptr %7, align 8, !tbaa !5
  %3765 = getelementptr inbounds %struct.thermo, ptr %3764, i32 0, i32 73
  %3766 = load double, ptr %3765, align 8, !tbaa !119
  %3767 = fsub double %3763, %3766
  %3768 = load ptr, ptr %7, align 8, !tbaa !5
  %3769 = getelementptr inbounds %struct.thermo, ptr %3768, i32 0, i32 63
  %3770 = load ptr, ptr %3769, align 8, !tbaa !39
  %3771 = load i32, ptr %8, align 4, !tbaa !32
  %3772 = add nsw i32 %3771, 1
  %3773 = sext i32 %3772 to i64
  %3774 = getelementptr inbounds double, ptr %3770, i64 %3773
  %3775 = load double, ptr %3774, align 8, !tbaa !9
  %3776 = load ptr, ptr %7, align 8, !tbaa !5
  %3777 = getelementptr inbounds %struct.thermo, ptr %3776, i32 0, i32 63
  %3778 = load ptr, ptr %3777, align 8, !tbaa !39
  %3779 = load i32, ptr %8, align 4, !tbaa !32
  %3780 = sext i32 %3779 to i64
  %3781 = getelementptr inbounds double, ptr %3778, i64 %3780
  %3782 = load double, ptr %3781, align 8, !tbaa !9
  %3783 = fsub double %3775, %3782
  %3784 = fdiv double %3767, %3783
  %3785 = load ptr, ptr %7, align 8, !tbaa !5
  %3786 = getelementptr inbounds %struct.thermo, ptr %3785, i32 0, i32 64
  %3787 = load ptr, ptr %3786, align 8, !tbaa !47
  %3788 = load i32, ptr %8, align 4, !tbaa !32
  %3789 = load ptr, ptr %7, align 8, !tbaa !5
  %3790 = getelementptr inbounds %struct.thermo, ptr %3789, i32 0, i32 61
  %3791 = load i32, ptr %3790, align 4, !tbaa !48
  %3792 = mul nsw i32 %3788, %3791
  %3793 = load ptr, ptr %7, align 8, !tbaa !5
  %3794 = getelementptr inbounds %struct.thermo, ptr %3793, i32 0, i32 60
  %3795 = load i32, ptr %3794, align 8, !tbaa !71
  %3796 = add nsw i32 %3792, %3795
  %3797 = sext i32 %3796 to i64
  %3798 = getelementptr inbounds double, ptr %3787, i64 %3797
  %3799 = load double, ptr %3798, align 8, !tbaa !9
  %3800 = load ptr, ptr %7, align 8, !tbaa !5
  %3801 = getelementptr inbounds %struct.thermo, ptr %3800, i32 0, i32 73
  %3802 = load double, ptr %3801, align 8, !tbaa !119
  %3803 = load ptr, ptr %7, align 8, !tbaa !5
  %3804 = getelementptr inbounds %struct.thermo, ptr %3803, i32 0, i32 63
  %3805 = load ptr, ptr %3804, align 8, !tbaa !39
  %3806 = load i32, ptr %8, align 4, !tbaa !32
  %3807 = sext i32 %3806 to i64
  %3808 = getelementptr inbounds double, ptr %3805, i64 %3807
  %3809 = load double, ptr %3808, align 8, !tbaa !9
  %3810 = fsub double %3802, %3809
  %3811 = load ptr, ptr %7, align 8, !tbaa !5
  %3812 = getelementptr inbounds %struct.thermo, ptr %3811, i32 0, i32 63
  %3813 = load ptr, ptr %3812, align 8, !tbaa !39
  %3814 = load i32, ptr %8, align 4, !tbaa !32
  %3815 = add nsw i32 %3814, 1
  %3816 = sext i32 %3815 to i64
  %3817 = getelementptr inbounds double, ptr %3813, i64 %3816
  %3818 = load double, ptr %3817, align 8, !tbaa !9
  %3819 = load ptr, ptr %7, align 8, !tbaa !5
  %3820 = getelementptr inbounds %struct.thermo, ptr %3819, i32 0, i32 63
  %3821 = load ptr, ptr %3820, align 8, !tbaa !39
  %3822 = load i32, ptr %8, align 4, !tbaa !32
  %3823 = sext i32 %3822 to i64
  %3824 = getelementptr inbounds double, ptr %3821, i64 %3823
  %3825 = load double, ptr %3824, align 8, !tbaa !9
  %3826 = fsub double %3818, %3825
  %3827 = fdiv double %3810, %3826
  %3828 = load ptr, ptr %7, align 8, !tbaa !5
  %3829 = getelementptr inbounds %struct.thermo, ptr %3828, i32 0, i32 64
  %3830 = load ptr, ptr %3829, align 8, !tbaa !47
  %3831 = load i32, ptr %8, align 4, !tbaa !32
  %3832 = add nsw i32 %3831, 1
  %3833 = load ptr, ptr %7, align 8, !tbaa !5
  %3834 = getelementptr inbounds %struct.thermo, ptr %3833, i32 0, i32 61
  %3835 = load i32, ptr %3834, align 4, !tbaa !48
  %3836 = mul nsw i32 %3832, %3835
  %3837 = load ptr, ptr %7, align 8, !tbaa !5
  %3838 = getelementptr inbounds %struct.thermo, ptr %3837, i32 0, i32 60
  %3839 = load i32, ptr %3838, align 8, !tbaa !71
  %3840 = add nsw i32 %3836, %3839
  %3841 = sext i32 %3840 to i64
  %3842 = getelementptr inbounds double, ptr %3830, i64 %3841
  %3843 = load double, ptr %3842, align 8, !tbaa !9
  %3844 = fmul double %3827, %3843
  %3845 = call double @llvm.fmuladd.f64(double %3784, double %3799, double %3844)
  %3846 = load ptr, ptr %7, align 8, !tbaa !5
  %3847 = getelementptr inbounds %struct.thermo, ptr %3846, i32 0, i32 79
  store double %3845, ptr %3847, align 8, !tbaa !125
  br label %3848

3848:                                             ; preds = %3755, %3703
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %3849

3849:                                             ; preds = %3874, %3848
  %3850 = load ptr, ptr %7, align 8, !tbaa !5
  %3851 = getelementptr inbounds %struct.thermo, ptr %3850, i32 0, i32 64
  %3852 = load ptr, ptr %3851, align 8, !tbaa !47
  %3853 = load i32, ptr %8, align 4, !tbaa !32
  %3854 = load ptr, ptr %7, align 8, !tbaa !5
  %3855 = getelementptr inbounds %struct.thermo, ptr %3854, i32 0, i32 61
  %3856 = load i32, ptr %3855, align 4, !tbaa !48
  %3857 = mul nsw i32 %3853, %3856
  %3858 = load ptr, ptr %7, align 8, !tbaa !5
  %3859 = getelementptr inbounds %struct.thermo, ptr %3858, i32 0, i32 38
  %3860 = load i32, ptr %3859, align 8, !tbaa !64
  %3861 = add nsw i32 %3857, %3860
  %3862 = sext i32 %3861 to i64
  %3863 = getelementptr inbounds double, ptr %3852, i64 %3862
  %3864 = load double, ptr %3863, align 8, !tbaa !9
  %3865 = fcmp olt double %3864, 1.000000e+00
  br i1 %3865, label %3866, label %3872

3866:                                             ; preds = %3849
  %3867 = load i32, ptr %8, align 4, !tbaa !32
  %3868 = load ptr, ptr %7, align 8, !tbaa !5
  %3869 = getelementptr inbounds %struct.thermo, ptr %3868, i32 0, i32 62
  %3870 = load i32, ptr %3869, align 8, !tbaa !38
  %3871 = icmp slt i32 %3867, %3870
  br label %3872

3872:                                             ; preds = %3866, %3849
  %3873 = phi i1 [ false, %3849 ], [ %3871, %3866 ]
  br i1 %3873, label %3874, label %3877

3874:                                             ; preds = %3872
  %3875 = load i32, ptr %8, align 4, !tbaa !32
  %3876 = add nsw i32 %3875, 1
  store i32 %3876, ptr %8, align 4, !tbaa !32
  br label %3849, !llvm.loop !126

3877:                                             ; preds = %3872
  %3878 = load ptr, ptr %7, align 8, !tbaa !5
  %3879 = getelementptr inbounds %struct.thermo, ptr %3878, i32 0, i32 63
  %3880 = load ptr, ptr %3879, align 8, !tbaa !39
  %3881 = load i32, ptr %8, align 4, !tbaa !32
  %3882 = sub nsw i32 %3881, 1
  %3883 = sext i32 %3882 to i64
  %3884 = getelementptr inbounds double, ptr %3880, i64 %3883
  %3885 = load double, ptr %3884, align 8, !tbaa !9
  %3886 = load ptr, ptr %7, align 8, !tbaa !5
  %3887 = getelementptr inbounds %struct.thermo, ptr %3886, i32 0, i32 64
  %3888 = load ptr, ptr %3887, align 8, !tbaa !47
  %3889 = load i32, ptr %8, align 4, !tbaa !32
  %3890 = sub nsw i32 %3889, 1
  %3891 = load ptr, ptr %7, align 8, !tbaa !5
  %3892 = getelementptr inbounds %struct.thermo, ptr %3891, i32 0, i32 61
  %3893 = load i32, ptr %3892, align 4, !tbaa !48
  %3894 = mul nsw i32 %3890, %3893
  %3895 = load ptr, ptr %7, align 8, !tbaa !5
  %3896 = getelementptr inbounds %struct.thermo, ptr %3895, i32 0, i32 38
  %3897 = load i32, ptr %3896, align 8, !tbaa !64
  %3898 = add nsw i32 %3894, %3897
  %3899 = sext i32 %3898 to i64
  %3900 = getelementptr inbounds double, ptr %3888, i64 %3899
  %3901 = load double, ptr %3900, align 8, !tbaa !9
  %3902 = fsub double 1.000000e+00, %3901
  %3903 = load ptr, ptr %7, align 8, !tbaa !5
  %3904 = getelementptr inbounds %struct.thermo, ptr %3903, i32 0, i32 64
  %3905 = load ptr, ptr %3904, align 8, !tbaa !47
  %3906 = load i32, ptr %8, align 4, !tbaa !32
  %3907 = load ptr, ptr %7, align 8, !tbaa !5
  %3908 = getelementptr inbounds %struct.thermo, ptr %3907, i32 0, i32 61
  %3909 = load i32, ptr %3908, align 4, !tbaa !48
  %3910 = mul nsw i32 %3906, %3909
  %3911 = load ptr, ptr %7, align 8, !tbaa !5
  %3912 = getelementptr inbounds %struct.thermo, ptr %3911, i32 0, i32 38
  %3913 = load i32, ptr %3912, align 8, !tbaa !64
  %3914 = add nsw i32 %3910, %3913
  %3915 = sext i32 %3914 to i64
  %3916 = getelementptr inbounds double, ptr %3905, i64 %3915
  %3917 = load double, ptr %3916, align 8, !tbaa !9
  %3918 = load ptr, ptr %7, align 8, !tbaa !5
  %3919 = getelementptr inbounds %struct.thermo, ptr %3918, i32 0, i32 64
  %3920 = load ptr, ptr %3919, align 8, !tbaa !47
  %3921 = load i32, ptr %8, align 4, !tbaa !32
  %3922 = sub nsw i32 %3921, 1
  %3923 = load ptr, ptr %7, align 8, !tbaa !5
  %3924 = getelementptr inbounds %struct.thermo, ptr %3923, i32 0, i32 61
  %3925 = load i32, ptr %3924, align 4, !tbaa !48
  %3926 = mul nsw i32 %3922, %3925
  %3927 = load ptr, ptr %7, align 8, !tbaa !5
  %3928 = getelementptr inbounds %struct.thermo, ptr %3927, i32 0, i32 38
  %3929 = load i32, ptr %3928, align 8, !tbaa !64
  %3930 = add nsw i32 %3926, %3929
  %3931 = sext i32 %3930 to i64
  %3932 = getelementptr inbounds double, ptr %3920, i64 %3931
  %3933 = load double, ptr %3932, align 8, !tbaa !9
  %3934 = fsub double %3917, %3933
  %3935 = fdiv double %3902, %3934
  %3936 = load ptr, ptr %7, align 8, !tbaa !5
  %3937 = getelementptr inbounds %struct.thermo, ptr %3936, i32 0, i32 63
  %3938 = load ptr, ptr %3937, align 8, !tbaa !39
  %3939 = load i32, ptr %8, align 4, !tbaa !32
  %3940 = sext i32 %3939 to i64
  %3941 = getelementptr inbounds double, ptr %3938, i64 %3940
  %3942 = load double, ptr %3941, align 8, !tbaa !9
  %3943 = load ptr, ptr %7, align 8, !tbaa !5
  %3944 = getelementptr inbounds %struct.thermo, ptr %3943, i32 0, i32 63
  %3945 = load ptr, ptr %3944, align 8, !tbaa !39
  %3946 = load i32, ptr %8, align 4, !tbaa !32
  %3947 = sub nsw i32 %3946, 1
  %3948 = sext i32 %3947 to i64
  %3949 = getelementptr inbounds double, ptr %3945, i64 %3948
  %3950 = load double, ptr %3949, align 8, !tbaa !9
  %3951 = fsub double %3942, %3950
  %3952 = call double @llvm.fmuladd.f64(double %3935, double %3951, double %3885)
  %3953 = load ptr, ptr %7, align 8, !tbaa !5
  %3954 = getelementptr inbounds %struct.thermo, ptr %3953, i32 0, i32 80
  store double %3952, ptr %3954, align 8, !tbaa !127
  %3955 = load ptr, ptr %6, align 8, !tbaa !5
  %3956 = load ptr, ptr %7, align 8, !tbaa !5
  %3957 = getelementptr inbounds %struct.thermo, ptr %3956, i32 0, i32 80
  %3958 = load double, ptr %3957, align 8, !tbaa !127
  %3959 = load ptr, ptr %7, align 8, !tbaa !5
  %3960 = getelementptr inbounds %struct.thermo, ptr %3959, i32 0, i32 81
  %3961 = call i32 @background_tau_of_z(ptr noundef %3955, double noundef %3958, ptr noundef %3960)
  %3962 = icmp eq i32 %3961, 1
  br i1 %3962, label %3963, label %3972

3963:                                             ; preds = %3877
  call void @llvm.lifetime.start.p0(i64 2048, ptr %129) #6
  %3964 = getelementptr inbounds [2048 x i8], ptr %129, i64 0, i64 0
  %3965 = load ptr, ptr %6, align 8, !tbaa !5
  %3966 = getelementptr inbounds %struct.background, ptr %3965, i32 0, i32 149
  %3967 = getelementptr inbounds [2048 x i8], ptr %3966, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3964, ptr noundef @.str, ptr noundef @.str.77, ptr noundef %3967)
  %3968 = load ptr, ptr %7, align 8, !tbaa !5
  %3969 = getelementptr inbounds %struct.thermo, ptr %3968, i32 0, i32 93
  %3970 = getelementptr inbounds [2048 x i8], ptr %3969, i64 0, i64 0
  %3971 = getelementptr inbounds [2048 x i8], ptr %129, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3970, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1176, ptr noundef %3971)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %129) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3972:                                             ; preds = %3877
  %3973 = load ptr, ptr %6, align 8, !tbaa !5
  %3974 = load ptr, ptr %7, align 8, !tbaa !5
  %3975 = getelementptr inbounds %struct.thermo, ptr %3974, i32 0, i32 81
  %3976 = load double, ptr %3975, align 8, !tbaa !128
  %3977 = load ptr, ptr %6, align 8, !tbaa !5
  %3978 = getelementptr inbounds %struct.background, ptr %3977, i32 0, i32 143
  %3979 = load i16, ptr %3978, align 4, !tbaa !100
  %3980 = load ptr, ptr %6, align 8, !tbaa !5
  %3981 = getelementptr inbounds %struct.background, ptr %3980, i32 0, i32 144
  %3982 = load i16, ptr %3981, align 2, !tbaa !85
  %3983 = load ptr, ptr %10, align 8, !tbaa !5
  %3984 = call i32 @background_at_tau(ptr noundef %3973, double noundef %3976, i16 noundef signext %3979, i16 noundef signext %3982, ptr noundef %11, ptr noundef %3983)
  %3985 = icmp eq i32 %3984, 1
  br i1 %3985, label %3986, label %3995

3986:                                             ; preds = %3972
  call void @llvm.lifetime.start.p0(i64 2048, ptr %130) #6
  %3987 = getelementptr inbounds [2048 x i8], ptr %130, i64 0, i64 0
  %3988 = load ptr, ptr %6, align 8, !tbaa !5
  %3989 = getelementptr inbounds %struct.background, ptr %3988, i32 0, i32 149
  %3990 = getelementptr inbounds [2048 x i8], ptr %3989, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3987, ptr noundef @.str, ptr noundef @.str.78, ptr noundef %3990)
  %3991 = load ptr, ptr %7, align 8, !tbaa !5
  %3992 = getelementptr inbounds %struct.thermo, ptr %3991, i32 0, i32 93
  %3993 = getelementptr inbounds [2048 x i8], ptr %3992, i64 0, i64 0
  %3994 = getelementptr inbounds [2048 x i8], ptr %130, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %3993, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1180, ptr noundef %3994)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %130) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

3995:                                             ; preds = %3972
  %3996 = load ptr, ptr %10, align 8, !tbaa !5
  %3997 = load ptr, ptr %6, align 8, !tbaa !5
  %3998 = getelementptr inbounds %struct.background, ptr %3997, i32 0, i32 94
  %3999 = load i32, ptr %3998, align 4, !tbaa !101
  %4000 = sext i32 %3999 to i64
  %4001 = getelementptr inbounds double, ptr %3996, i64 %4000
  %4002 = load double, ptr %4001, align 8, !tbaa !9
  %4003 = load ptr, ptr %7, align 8, !tbaa !5
  %4004 = getelementptr inbounds %struct.thermo, ptr %4003, i32 0, i32 83
  store double %4002, ptr %4004, align 8, !tbaa !129
  %4005 = load ptr, ptr %7, align 8, !tbaa !5
  %4006 = getelementptr inbounds %struct.thermo, ptr %4005, i32 0, i32 83
  %4007 = load double, ptr %4006, align 8, !tbaa !129
  %4008 = load ptr, ptr %6, align 8, !tbaa !5
  %4009 = getelementptr inbounds %struct.background, ptr %4008, i32 0, i32 58
  %4010 = load double, ptr %4009, align 8, !tbaa !103
  %4011 = fmul double %4007, %4010
  %4012 = load ptr, ptr %7, align 8, !tbaa !5
  %4013 = getelementptr inbounds %struct.thermo, ptr %4012, i32 0, i32 80
  %4014 = load double, ptr %4013, align 8, !tbaa !127
  %4015 = fadd double 1.000000e+00, %4014
  %4016 = fdiv double %4011, %4015
  %4017 = load ptr, ptr %7, align 8, !tbaa !5
  %4018 = getelementptr inbounds %struct.thermo, ptr %4017, i32 0, i32 82
  store double %4016, ptr %4018, align 8, !tbaa !130
  %4019 = load ptr, ptr %6, align 8, !tbaa !5
  %4020 = getelementptr inbounds %struct.background, ptr %4019, i32 0, i32 128
  %4021 = load i16, ptr %4020, align 2, !tbaa !23
  %4022 = sext i16 %4021 to i32
  %4023 = icmp eq i32 %4022, 1
  br i1 %4023, label %4024, label %4304

4024:                                             ; preds = %3995
  %4025 = load ptr, ptr %7, align 8, !tbaa !5
  %4026 = getelementptr inbounds %struct.thermo, ptr %4025, i32 0, i32 64
  %4027 = load ptr, ptr %4026, align 8, !tbaa !47
  %4028 = load ptr, ptr %7, align 8, !tbaa !5
  %4029 = getelementptr inbounds %struct.thermo, ptr %4028, i32 0, i32 62
  %4030 = load i32, ptr %4029, align 8, !tbaa !38
  %4031 = sub nsw i32 %4030, 1
  %4032 = load ptr, ptr %7, align 8, !tbaa !5
  %4033 = getelementptr inbounds %struct.thermo, ptr %4032, i32 0, i32 61
  %4034 = load i32, ptr %4033, align 4, !tbaa !48
  %4035 = mul nsw i32 %4031, %4034
  %4036 = load ptr, ptr %7, align 8, !tbaa !5
  %4037 = getelementptr inbounds %struct.thermo, ptr %4036, i32 0, i32 49
  %4038 = load i32, ptr %4037, align 4, !tbaa !66
  %4039 = add nsw i32 %4035, %4038
  %4040 = sext i32 %4039 to i64
  %4041 = getelementptr inbounds double, ptr %4027, i64 %4040
  %4042 = load double, ptr %4041, align 8, !tbaa !9
  %4043 = fcmp ogt double %4042, 1.000000e+00
  br i1 %4043, label %4044, label %4303

4044:                                             ; preds = %4024
  %4045 = load ptr, ptr %7, align 8, !tbaa !5
  %4046 = getelementptr inbounds %struct.thermo, ptr %4045, i32 0, i32 64
  %4047 = load ptr, ptr %4046, align 8, !tbaa !47
  %4048 = load ptr, ptr %7, align 8, !tbaa !5
  %4049 = getelementptr inbounds %struct.thermo, ptr %4048, i32 0, i32 62
  %4050 = load i32, ptr %4049, align 8, !tbaa !38
  %4051 = sub nsw i32 %4050, 1
  %4052 = load ptr, ptr %7, align 8, !tbaa !5
  %4053 = getelementptr inbounds %struct.thermo, ptr %4052, i32 0, i32 61
  %4054 = load i32, ptr %4053, align 4, !tbaa !48
  %4055 = mul nsw i32 %4051, %4054
  %4056 = load ptr, ptr %7, align 8, !tbaa !5
  %4057 = getelementptr inbounds %struct.thermo, ptr %4056, i32 0, i32 50
  %4058 = load i32, ptr %4057, align 8, !tbaa !67
  %4059 = add nsw i32 %4055, %4058
  %4060 = sext i32 %4059 to i64
  %4061 = getelementptr inbounds double, ptr %4047, i64 %4060
  %4062 = load double, ptr %4061, align 8, !tbaa !9
  %4063 = fcmp ogt double %4062, 1.000000e+00
  br i1 %4063, label %4064, label %4303

4064:                                             ; preds = %4044
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %4065

4065:                                             ; preds = %4091, %4064
  %4066 = load ptr, ptr %7, align 8, !tbaa !5
  %4067 = getelementptr inbounds %struct.thermo, ptr %4066, i32 0, i32 64
  %4068 = load ptr, ptr %4067, align 8, !tbaa !47
  %4069 = load i32, ptr %8, align 4, !tbaa !32
  %4070 = load ptr, ptr %7, align 8, !tbaa !5
  %4071 = getelementptr inbounds %struct.thermo, ptr %4070, i32 0, i32 61
  %4072 = load i32, ptr %4071, align 4, !tbaa !48
  %4073 = mul nsw i32 %4069, %4072
  %4074 = load ptr, ptr %7, align 8, !tbaa !5
  %4075 = getelementptr inbounds %struct.thermo, ptr %4074, i32 0, i32 49
  %4076 = load i32, ptr %4075, align 4, !tbaa !66
  %4077 = add nsw i32 %4073, %4076
  %4078 = sext i32 %4077 to i64
  %4079 = getelementptr inbounds double, ptr %4068, i64 %4078
  %4080 = load double, ptr %4079, align 8, !tbaa !9
  %4081 = fcmp olt double %4080, 1.000000e+00
  br i1 %4081, label %4082, label %4089

4082:                                             ; preds = %4065
  %4083 = load i32, ptr %8, align 4, !tbaa !32
  %4084 = load ptr, ptr %7, align 8, !tbaa !5
  %4085 = getelementptr inbounds %struct.thermo, ptr %4084, i32 0, i32 62
  %4086 = load i32, ptr %4085, align 8, !tbaa !38
  %4087 = sub nsw i32 %4086, 1
  %4088 = icmp slt i32 %4083, %4087
  br label %4089

4089:                                             ; preds = %4082, %4065
  %4090 = phi i1 [ false, %4065 ], [ %4088, %4082 ]
  br i1 %4090, label %4091, label %4094

4091:                                             ; preds = %4089
  %4092 = load i32, ptr %8, align 4, !tbaa !32
  %4093 = add nsw i32 %4092, 1
  store i32 %4093, ptr %8, align 4, !tbaa !32
  br label %4065, !llvm.loop !131

4094:                                             ; preds = %4089
  %4095 = load ptr, ptr %7, align 8, !tbaa !5
  %4096 = getelementptr inbounds %struct.thermo, ptr %4095, i32 0, i32 63
  %4097 = load ptr, ptr %4096, align 8, !tbaa !39
  %4098 = load i32, ptr %8, align 4, !tbaa !32
  %4099 = sub nsw i32 %4098, 1
  %4100 = sext i32 %4099 to i64
  %4101 = getelementptr inbounds double, ptr %4097, i64 %4100
  %4102 = load double, ptr %4101, align 8, !tbaa !9
  %4103 = load ptr, ptr %7, align 8, !tbaa !5
  %4104 = getelementptr inbounds %struct.thermo, ptr %4103, i32 0, i32 64
  %4105 = load ptr, ptr %4104, align 8, !tbaa !47
  %4106 = load i32, ptr %8, align 4, !tbaa !32
  %4107 = sub nsw i32 %4106, 1
  %4108 = load ptr, ptr %7, align 8, !tbaa !5
  %4109 = getelementptr inbounds %struct.thermo, ptr %4108, i32 0, i32 61
  %4110 = load i32, ptr %4109, align 4, !tbaa !48
  %4111 = mul nsw i32 %4107, %4110
  %4112 = load ptr, ptr %7, align 8, !tbaa !5
  %4113 = getelementptr inbounds %struct.thermo, ptr %4112, i32 0, i32 49
  %4114 = load i32, ptr %4113, align 4, !tbaa !66
  %4115 = add nsw i32 %4111, %4114
  %4116 = sext i32 %4115 to i64
  %4117 = getelementptr inbounds double, ptr %4105, i64 %4116
  %4118 = load double, ptr %4117, align 8, !tbaa !9
  %4119 = fsub double 1.000000e+00, %4118
  %4120 = load ptr, ptr %7, align 8, !tbaa !5
  %4121 = getelementptr inbounds %struct.thermo, ptr %4120, i32 0, i32 64
  %4122 = load ptr, ptr %4121, align 8, !tbaa !47
  %4123 = load i32, ptr %8, align 4, !tbaa !32
  %4124 = load ptr, ptr %7, align 8, !tbaa !5
  %4125 = getelementptr inbounds %struct.thermo, ptr %4124, i32 0, i32 61
  %4126 = load i32, ptr %4125, align 4, !tbaa !48
  %4127 = mul nsw i32 %4123, %4126
  %4128 = load ptr, ptr %7, align 8, !tbaa !5
  %4129 = getelementptr inbounds %struct.thermo, ptr %4128, i32 0, i32 49
  %4130 = load i32, ptr %4129, align 4, !tbaa !66
  %4131 = add nsw i32 %4127, %4130
  %4132 = sext i32 %4131 to i64
  %4133 = getelementptr inbounds double, ptr %4122, i64 %4132
  %4134 = load double, ptr %4133, align 8, !tbaa !9
  %4135 = load ptr, ptr %7, align 8, !tbaa !5
  %4136 = getelementptr inbounds %struct.thermo, ptr %4135, i32 0, i32 64
  %4137 = load ptr, ptr %4136, align 8, !tbaa !47
  %4138 = load i32, ptr %8, align 4, !tbaa !32
  %4139 = sub nsw i32 %4138, 1
  %4140 = load ptr, ptr %7, align 8, !tbaa !5
  %4141 = getelementptr inbounds %struct.thermo, ptr %4140, i32 0, i32 61
  %4142 = load i32, ptr %4141, align 4, !tbaa !48
  %4143 = mul nsw i32 %4139, %4142
  %4144 = load ptr, ptr %7, align 8, !tbaa !5
  %4145 = getelementptr inbounds %struct.thermo, ptr %4144, i32 0, i32 49
  %4146 = load i32, ptr %4145, align 4, !tbaa !66
  %4147 = add nsw i32 %4143, %4146
  %4148 = sext i32 %4147 to i64
  %4149 = getelementptr inbounds double, ptr %4137, i64 %4148
  %4150 = load double, ptr %4149, align 8, !tbaa !9
  %4151 = fsub double %4134, %4150
  %4152 = fdiv double %4119, %4151
  %4153 = load ptr, ptr %7, align 8, !tbaa !5
  %4154 = getelementptr inbounds %struct.thermo, ptr %4153, i32 0, i32 63
  %4155 = load ptr, ptr %4154, align 8, !tbaa !39
  %4156 = load i32, ptr %8, align 4, !tbaa !32
  %4157 = sext i32 %4156 to i64
  %4158 = getelementptr inbounds double, ptr %4155, i64 %4157
  %4159 = load double, ptr %4158, align 8, !tbaa !9
  %4160 = load ptr, ptr %7, align 8, !tbaa !5
  %4161 = getelementptr inbounds %struct.thermo, ptr %4160, i32 0, i32 63
  %4162 = load ptr, ptr %4161, align 8, !tbaa !39
  %4163 = load i32, ptr %8, align 4, !tbaa !32
  %4164 = sub nsw i32 %4163, 1
  %4165 = sext i32 %4164 to i64
  %4166 = getelementptr inbounds double, ptr %4162, i64 %4165
  %4167 = load double, ptr %4166, align 8, !tbaa !9
  %4168 = fsub double %4159, %4167
  %4169 = call double @llvm.fmuladd.f64(double %4152, double %4168, double %4102)
  store double %4169, ptr %25, align 8, !tbaa !9
  %4170 = load ptr, ptr %6, align 8, !tbaa !5
  %4171 = load double, ptr %25, align 8, !tbaa !9
  %4172 = call i32 @background_tau_of_z(ptr noundef %4170, double noundef %4171, ptr noundef %27)
  %4173 = icmp eq i32 %4172, 1
  br i1 %4173, label %4174, label %4183

4174:                                             ; preds = %4094
  call void @llvm.lifetime.start.p0(i64 2048, ptr %131) #6
  %4175 = getelementptr inbounds [2048 x i8], ptr %131, i64 0, i64 0
  %4176 = load ptr, ptr %6, align 8, !tbaa !5
  %4177 = getelementptr inbounds %struct.background, ptr %4176, i32 0, i32 149
  %4178 = getelementptr inbounds [2048 x i8], ptr %4177, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4175, ptr noundef @.str, ptr noundef @.str.79, ptr noundef %4178)
  %4179 = load ptr, ptr %7, align 8, !tbaa !5
  %4180 = getelementptr inbounds %struct.thermo, ptr %4179, i32 0, i32 93
  %4181 = getelementptr inbounds [2048 x i8], ptr %4180, i64 0, i64 0
  %4182 = getelementptr inbounds [2048 x i8], ptr %131, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4181, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1200, ptr noundef %4182)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %131) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

4183:                                             ; preds = %4094
  store i32 0, ptr %8, align 4, !tbaa !32
  br label %4184

4184:                                             ; preds = %4210, %4183
  %4185 = load ptr, ptr %7, align 8, !tbaa !5
  %4186 = getelementptr inbounds %struct.thermo, ptr %4185, i32 0, i32 64
  %4187 = load ptr, ptr %4186, align 8, !tbaa !47
  %4188 = load i32, ptr %8, align 4, !tbaa !32
  %4189 = load ptr, ptr %7, align 8, !tbaa !5
  %4190 = getelementptr inbounds %struct.thermo, ptr %4189, i32 0, i32 61
  %4191 = load i32, ptr %4190, align 4, !tbaa !48
  %4192 = mul nsw i32 %4188, %4191
  %4193 = load ptr, ptr %7, align 8, !tbaa !5
  %4194 = getelementptr inbounds %struct.thermo, ptr %4193, i32 0, i32 50
  %4195 = load i32, ptr %4194, align 8, !tbaa !67
  %4196 = add nsw i32 %4192, %4195
  %4197 = sext i32 %4196 to i64
  %4198 = getelementptr inbounds double, ptr %4187, i64 %4197
  %4199 = load double, ptr %4198, align 8, !tbaa !9
  %4200 = fcmp olt double %4199, 1.000000e+00
  br i1 %4200, label %4201, label %4208

4201:                                             ; preds = %4184
  %4202 = load i32, ptr %8, align 4, !tbaa !32
  %4203 = load ptr, ptr %7, align 8, !tbaa !5
  %4204 = getelementptr inbounds %struct.thermo, ptr %4203, i32 0, i32 62
  %4205 = load i32, ptr %4204, align 8, !tbaa !38
  %4206 = sub nsw i32 %4205, 1
  %4207 = icmp slt i32 %4202, %4206
  br label %4208

4208:                                             ; preds = %4201, %4184
  %4209 = phi i1 [ false, %4184 ], [ %4207, %4201 ]
  br i1 %4209, label %4210, label %4213

4210:                                             ; preds = %4208
  %4211 = load i32, ptr %8, align 4, !tbaa !32
  %4212 = add nsw i32 %4211, 1
  store i32 %4212, ptr %8, align 4, !tbaa !32
  br label %4184, !llvm.loop !132

4213:                                             ; preds = %4208
  %4214 = load ptr, ptr %7, align 8, !tbaa !5
  %4215 = getelementptr inbounds %struct.thermo, ptr %4214, i32 0, i32 63
  %4216 = load ptr, ptr %4215, align 8, !tbaa !39
  %4217 = load i32, ptr %8, align 4, !tbaa !32
  %4218 = sub nsw i32 %4217, 1
  %4219 = sext i32 %4218 to i64
  %4220 = getelementptr inbounds double, ptr %4216, i64 %4219
  %4221 = load double, ptr %4220, align 8, !tbaa !9
  %4222 = load ptr, ptr %7, align 8, !tbaa !5
  %4223 = getelementptr inbounds %struct.thermo, ptr %4222, i32 0, i32 64
  %4224 = load ptr, ptr %4223, align 8, !tbaa !47
  %4225 = load i32, ptr %8, align 4, !tbaa !32
  %4226 = sub nsw i32 %4225, 1
  %4227 = load ptr, ptr %7, align 8, !tbaa !5
  %4228 = getelementptr inbounds %struct.thermo, ptr %4227, i32 0, i32 61
  %4229 = load i32, ptr %4228, align 4, !tbaa !48
  %4230 = mul nsw i32 %4226, %4229
  %4231 = load ptr, ptr %7, align 8, !tbaa !5
  %4232 = getelementptr inbounds %struct.thermo, ptr %4231, i32 0, i32 50
  %4233 = load i32, ptr %4232, align 8, !tbaa !67
  %4234 = add nsw i32 %4230, %4233
  %4235 = sext i32 %4234 to i64
  %4236 = getelementptr inbounds double, ptr %4224, i64 %4235
  %4237 = load double, ptr %4236, align 8, !tbaa !9
  %4238 = fsub double 1.000000e+00, %4237
  %4239 = load ptr, ptr %7, align 8, !tbaa !5
  %4240 = getelementptr inbounds %struct.thermo, ptr %4239, i32 0, i32 64
  %4241 = load ptr, ptr %4240, align 8, !tbaa !47
  %4242 = load i32, ptr %8, align 4, !tbaa !32
  %4243 = load ptr, ptr %7, align 8, !tbaa !5
  %4244 = getelementptr inbounds %struct.thermo, ptr %4243, i32 0, i32 61
  %4245 = load i32, ptr %4244, align 4, !tbaa !48
  %4246 = mul nsw i32 %4242, %4245
  %4247 = load ptr, ptr %7, align 8, !tbaa !5
  %4248 = getelementptr inbounds %struct.thermo, ptr %4247, i32 0, i32 50
  %4249 = load i32, ptr %4248, align 8, !tbaa !67
  %4250 = add nsw i32 %4246, %4249
  %4251 = sext i32 %4250 to i64
  %4252 = getelementptr inbounds double, ptr %4241, i64 %4251
  %4253 = load double, ptr %4252, align 8, !tbaa !9
  %4254 = load ptr, ptr %7, align 8, !tbaa !5
  %4255 = getelementptr inbounds %struct.thermo, ptr %4254, i32 0, i32 64
  %4256 = load ptr, ptr %4255, align 8, !tbaa !47
  %4257 = load i32, ptr %8, align 4, !tbaa !32
  %4258 = sub nsw i32 %4257, 1
  %4259 = load ptr, ptr %7, align 8, !tbaa !5
  %4260 = getelementptr inbounds %struct.thermo, ptr %4259, i32 0, i32 61
  %4261 = load i32, ptr %4260, align 4, !tbaa !48
  %4262 = mul nsw i32 %4258, %4261
  %4263 = load ptr, ptr %7, align 8, !tbaa !5
  %4264 = getelementptr inbounds %struct.thermo, ptr %4263, i32 0, i32 50
  %4265 = load i32, ptr %4264, align 8, !tbaa !67
  %4266 = add nsw i32 %4262, %4265
  %4267 = sext i32 %4266 to i64
  %4268 = getelementptr inbounds double, ptr %4256, i64 %4267
  %4269 = load double, ptr %4268, align 8, !tbaa !9
  %4270 = fsub double %4253, %4269
  %4271 = fdiv double %4238, %4270
  %4272 = load ptr, ptr %7, align 8, !tbaa !5
  %4273 = getelementptr inbounds %struct.thermo, ptr %4272, i32 0, i32 63
  %4274 = load ptr, ptr %4273, align 8, !tbaa !39
  %4275 = load i32, ptr %8, align 4, !tbaa !32
  %4276 = sext i32 %4275 to i64
  %4277 = getelementptr inbounds double, ptr %4274, i64 %4276
  %4278 = load double, ptr %4277, align 8, !tbaa !9
  %4279 = load ptr, ptr %7, align 8, !tbaa !5
  %4280 = getelementptr inbounds %struct.thermo, ptr %4279, i32 0, i32 63
  %4281 = load ptr, ptr %4280, align 8, !tbaa !39
  %4282 = load i32, ptr %8, align 4, !tbaa !32
  %4283 = sub nsw i32 %4282, 1
  %4284 = sext i32 %4283 to i64
  %4285 = getelementptr inbounds double, ptr %4281, i64 %4284
  %4286 = load double, ptr %4285, align 8, !tbaa !9
  %4287 = fsub double %4278, %4286
  %4288 = call double @llvm.fmuladd.f64(double %4271, double %4287, double %4221)
  store double %4288, ptr %26, align 8, !tbaa !9
  %4289 = load ptr, ptr %6, align 8, !tbaa !5
  %4290 = load double, ptr %26, align 8, !tbaa !9
  %4291 = call i32 @background_tau_of_z(ptr noundef %4289, double noundef %4290, ptr noundef %28)
  %4292 = icmp eq i32 %4291, 1
  br i1 %4292, label %4293, label %4302

4293:                                             ; preds = %4213
  call void @llvm.lifetime.start.p0(i64 2048, ptr %132) #6
  %4294 = getelementptr inbounds [2048 x i8], ptr %132, i64 0, i64 0
  %4295 = load ptr, ptr %6, align 8, !tbaa !5
  %4296 = getelementptr inbounds %struct.background, ptr %4295, i32 0, i32 149
  %4297 = getelementptr inbounds [2048 x i8], ptr %4296, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4294, ptr noundef @.str, ptr noundef @.str.80, ptr noundef %4297)
  %4298 = load ptr, ptr %7, align 8, !tbaa !5
  %4299 = getelementptr inbounds %struct.thermo, ptr %4298, i32 0, i32 93
  %4300 = getelementptr inbounds [2048 x i8], ptr %4299, i64 0, i64 0
  %4301 = getelementptr inbounds [2048 x i8], ptr %132, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4300, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1214, ptr noundef %4301)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %132) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

4302:                                             ; preds = %4213
  br label %4303

4303:                                             ; preds = %4302, %4044, %4024
  br label %4304

4304:                                             ; preds = %4303, %3995
  %4305 = load i32, ptr %23, align 4, !tbaa !32
  store i32 %4305, ptr %8, align 4, !tbaa !32
  br label %4306

4306:                                             ; preds = %4333, %4304
  %4307 = load ptr, ptr %7, align 8, !tbaa !5
  %4308 = getelementptr inbounds %struct.thermo, ptr %4307, i32 0, i32 64
  %4309 = load ptr, ptr %4308, align 8, !tbaa !47
  %4310 = load i32, ptr %8, align 4, !tbaa !32
  %4311 = load ptr, ptr %7, align 8, !tbaa !5
  %4312 = getelementptr inbounds %struct.thermo, ptr %4311, i32 0, i32 61
  %4313 = load i32, ptr %4312, align 4, !tbaa !48
  %4314 = mul nsw i32 %4310, %4313
  %4315 = load ptr, ptr %7, align 8, !tbaa !5
  %4316 = getelementptr inbounds %struct.thermo, ptr %4315, i32 0, i32 42
  %4317 = load i32, ptr %4316, align 8, !tbaa !70
  %4318 = add nsw i32 %4314, %4317
  %4319 = sext i32 %4318 to i64
  %4320 = getelementptr inbounds double, ptr %4309, i64 %4319
  %4321 = load double, ptr %4320, align 8, !tbaa !9
  %4322 = load double, ptr %22, align 8, !tbaa !9
  %4323 = load ptr, ptr %5, align 8, !tbaa !5
  %4324 = getelementptr inbounds %struct.precision, ptr %4323, i32 0, i32 97
  %4325 = load double, ptr %4324, align 8, !tbaa !133
  %4326 = fmul double %4322, %4325
  %4327 = fcmp ogt double %4321, %4326
  br i1 %4327, label %4328, label %4331

4328:                                             ; preds = %4306
  %4329 = load i32, ptr %8, align 4, !tbaa !32
  %4330 = icmp sgt i32 %4329, 0
  br label %4331

4331:                                             ; preds = %4328, %4306
  %4332 = phi i1 [ false, %4306 ], [ %4330, %4328 ]
  br i1 %4332, label %4333, label %4336

4333:                                             ; preds = %4331
  %4334 = load i32, ptr %8, align 4, !tbaa !32
  %4335 = add nsw i32 %4334, -1
  store i32 %4335, ptr %8, align 4, !tbaa !32
  br label %4306, !llvm.loop !134

4336:                                             ; preds = %4331
  %4337 = load ptr, ptr %6, align 8, !tbaa !5
  %4338 = load ptr, ptr %7, align 8, !tbaa !5
  %4339 = getelementptr inbounds %struct.thermo, ptr %4338, i32 0, i32 63
  %4340 = load ptr, ptr %4339, align 8, !tbaa !39
  %4341 = load i32, ptr %8, align 4, !tbaa !32
  %4342 = sext i32 %4341 to i64
  %4343 = getelementptr inbounds double, ptr %4340, i64 %4342
  %4344 = load double, ptr %4343, align 8, !tbaa !9
  %4345 = load ptr, ptr %7, align 8, !tbaa !5
  %4346 = getelementptr inbounds %struct.thermo, ptr %4345, i32 0, i32 84
  %4347 = call i32 @background_tau_of_z(ptr noundef %4337, double noundef %4344, ptr noundef %4346)
  %4348 = icmp eq i32 %4347, 1
  br i1 %4348, label %4349, label %4358

4349:                                             ; preds = %4336
  call void @llvm.lifetime.start.p0(i64 2048, ptr %133) #6
  %4350 = getelementptr inbounds [2048 x i8], ptr %133, i64 0, i64 0
  %4351 = load ptr, ptr %6, align 8, !tbaa !5
  %4352 = getelementptr inbounds %struct.background, ptr %4351, i32 0, i32 149
  %4353 = getelementptr inbounds [2048 x i8], ptr %4352, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4350, ptr noundef @.str, ptr noundef @.str.81, ptr noundef %4353)
  %4354 = load ptr, ptr %7, align 8, !tbaa !5
  %4355 = getelementptr inbounds %struct.thermo, ptr %4354, i32 0, i32 93
  %4356 = getelementptr inbounds [2048 x i8], ptr %4355, i64 0, i64 0
  %4357 = getelementptr inbounds [2048 x i8], ptr %133, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4356, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1228, ptr noundef %4357)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %133) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

4358:                                             ; preds = %4336
  %4359 = load ptr, ptr %7, align 8, !tbaa !5
  %4360 = getelementptr inbounds %struct.thermo, ptr %4359, i32 0, i32 92
  %4361 = load i16, ptr %4360, align 4, !tbaa !11
  %4362 = sext i16 %4361 to i32
  %4363 = icmp sgt i32 %4362, 0
  br i1 %4363, label %4364, label %4590

4364:                                             ; preds = %4358
  %4365 = load ptr, ptr %6, align 8, !tbaa !5
  %4366 = getelementptr inbounds %struct.background, ptr %4365, i32 0, i32 128
  %4367 = load i16, ptr %4366, align 2, !tbaa !23
  %4368 = sext i16 %4367 to i32
  %4369 = icmp eq i32 %4368, 1
  br i1 %4369, label %4370, label %4418

4370:                                             ; preds = %4364
  %4371 = load ptr, ptr %7, align 8, !tbaa !5
  %4372 = getelementptr inbounds %struct.thermo, ptr %4371, i32 0, i32 64
  %4373 = load ptr, ptr %4372, align 8, !tbaa !47
  %4374 = load ptr, ptr %7, align 8, !tbaa !5
  %4375 = getelementptr inbounds %struct.thermo, ptr %4374, i32 0, i32 62
  %4376 = load i32, ptr %4375, align 8, !tbaa !38
  %4377 = sub nsw i32 %4376, 1
  %4378 = load ptr, ptr %7, align 8, !tbaa !5
  %4379 = getelementptr inbounds %struct.thermo, ptr %4378, i32 0, i32 61
  %4380 = load i32, ptr %4379, align 4, !tbaa !48
  %4381 = mul nsw i32 %4377, %4380
  %4382 = load ptr, ptr %7, align 8, !tbaa !5
  %4383 = getelementptr inbounds %struct.thermo, ptr %4382, i32 0, i32 49
  %4384 = load i32, ptr %4383, align 4, !tbaa !66
  %4385 = add nsw i32 %4381, %4384
  %4386 = sext i32 %4385 to i64
  %4387 = getelementptr inbounds double, ptr %4373, i64 %4386
  %4388 = load double, ptr %4387, align 8, !tbaa !9
  %4389 = fcmp ogt double %4388, 1.000000e+00
  br i1 %4389, label %4390, label %4415

4390:                                             ; preds = %4370
  %4391 = load ptr, ptr %7, align 8, !tbaa !5
  %4392 = getelementptr inbounds %struct.thermo, ptr %4391, i32 0, i32 64
  %4393 = load ptr, ptr %4392, align 8, !tbaa !47
  %4394 = load ptr, ptr %7, align 8, !tbaa !5
  %4395 = getelementptr inbounds %struct.thermo, ptr %4394, i32 0, i32 62
  %4396 = load i32, ptr %4395, align 8, !tbaa !38
  %4397 = sub nsw i32 %4396, 1
  %4398 = load ptr, ptr %7, align 8, !tbaa !5
  %4399 = getelementptr inbounds %struct.thermo, ptr %4398, i32 0, i32 61
  %4400 = load i32, ptr %4399, align 4, !tbaa !48
  %4401 = mul nsw i32 %4397, %4400
  %4402 = load ptr, ptr %7, align 8, !tbaa !5
  %4403 = getelementptr inbounds %struct.thermo, ptr %4402, i32 0, i32 50
  %4404 = load i32, ptr %4403, align 8, !tbaa !67
  %4405 = add nsw i32 %4401, %4404
  %4406 = sext i32 %4405 to i64
  %4407 = getelementptr inbounds double, ptr %4393, i64 %4406
  %4408 = load double, ptr %4407, align 8, !tbaa !9
  %4409 = fcmp ogt double %4408, 1.000000e+00
  br i1 %4409, label %4410, label %4415

4410:                                             ; preds = %4390
  %4411 = load double, ptr %28, align 8, !tbaa !9
  %4412 = call i32 (ptr, ...) @printf(ptr noundef @.str.82, double noundef %4411)
  %4413 = load double, ptr %27, align 8, !tbaa !9
  %4414 = call i32 (ptr, ...) @printf(ptr noundef @.str.83, double noundef %4413)
  br label %4417

4415:                                             ; preds = %4390, %4370
  %4416 = call i32 (ptr, ...) @printf(ptr noundef @.str.84)
  br label %4417

4417:                                             ; preds = %4415, %4410
  br label %4418

4418:                                             ; preds = %4417, %4364
  %4419 = load ptr, ptr %7, align 8, !tbaa !5
  %4420 = getelementptr inbounds %struct.thermo, ptr %4419, i32 0, i32 66
  %4421 = load double, ptr %4420, align 8, !tbaa !97
  %4422 = call i32 (ptr, ...) @printf(ptr noundef @.str.85, double noundef %4421)
  %4423 = load ptr, ptr %7, align 8, !tbaa !5
  %4424 = getelementptr inbounds %struct.thermo, ptr %4423, i32 0, i32 67
  %4425 = load double, ptr %4424, align 8, !tbaa !99
  %4426 = call i32 (ptr, ...) @printf(ptr noundef @.str.86, double noundef %4425)
  %4427 = load ptr, ptr %7, align 8, !tbaa !5
  %4428 = getelementptr inbounds %struct.thermo, ptr %4427, i32 0, i32 68
  %4429 = load double, ptr %4428, align 8, !tbaa !102
  %4430 = call i32 (ptr, ...) @printf(ptr noundef @.str.87, double noundef %4429)
  %4431 = load ptr, ptr %7, align 8, !tbaa !5
  %4432 = getelementptr inbounds %struct.thermo, ptr %4431, i32 0, i32 71
  %4433 = load double, ptr %4432, align 8, !tbaa !106
  %4434 = call i32 (ptr, ...) @printf(ptr noundef @.str.88, double noundef %4433)
  %4435 = load ptr, ptr %7, align 8, !tbaa !5
  %4436 = getelementptr inbounds %struct.thermo, ptr %4435, i32 0, i32 68
  %4437 = load double, ptr %4436, align 8, !tbaa !102
  %4438 = fmul double 1.000000e+02, %4437
  %4439 = load ptr, ptr %7, align 8, !tbaa !5
  %4440 = getelementptr inbounds %struct.thermo, ptr %4439, i32 0, i32 70
  %4441 = load double, ptr %4440, align 8, !tbaa !107
  %4442 = fdiv double %4438, %4441
  %4443 = call i32 (ptr, ...) @printf(ptr noundef @.str.89, double noundef %4442)
  %4444 = load ptr, ptr %7, align 8, !tbaa !5
  %4445 = getelementptr inbounds %struct.thermo, ptr %4444, i32 0, i32 7
  %4446 = load i16, ptr %4445, align 2, !tbaa !68
  %4447 = sext i16 %4446 to i32
  %4448 = icmp eq i32 %4447, 1
  br i1 %4448, label %4449, label %4459

4449:                                             ; preds = %4418
  %4450 = load ptr, ptr %7, align 8, !tbaa !5
  %4451 = getelementptr inbounds %struct.thermo, ptr %4450, i32 0, i32 72
  %4452 = load double, ptr %4451, align 8, !tbaa !110
  %4453 = call i32 (ptr, ...) @printf(ptr noundef @.str.90, double noundef %4452)
  %4454 = load ptr, ptr %7, align 8, !tbaa !5
  %4455 = getelementptr inbounds %struct.thermo, ptr %4454, i32 0, i32 72
  %4456 = load double, ptr %4455, align 8, !tbaa !110
  %4457 = fdiv double 0x401921FB54442D18, %4456
  %4458 = call i32 (ptr, ...) @printf(ptr noundef @.str.91, double noundef %4457)
  br label %4459

4459:                                             ; preds = %4449, %4418
  %4460 = load ptr, ptr %7, align 8, !tbaa !5
  %4461 = getelementptr inbounds %struct.thermo, ptr %4460, i32 0, i32 73
  %4462 = load double, ptr %4461, align 8, !tbaa !119
  %4463 = call i32 (ptr, ...) @printf(ptr noundef @.str.92, double noundef %4462)
  %4464 = load ptr, ptr %7, align 8, !tbaa !5
  %4465 = getelementptr inbounds %struct.thermo, ptr %4464, i32 0, i32 75
  %4466 = load double, ptr %4465, align 8, !tbaa !121
  %4467 = fmul double 1.000000e+02, %4466
  %4468 = load ptr, ptr %7, align 8, !tbaa !5
  %4469 = getelementptr inbounds %struct.thermo, ptr %4468, i32 0, i32 77
  %4470 = load double, ptr %4469, align 8, !tbaa !124
  %4471 = fdiv double %4467, %4470
  %4472 = call i32 (ptr, ...) @printf(ptr noundef @.str.93, double noundef %4471)
  %4473 = load ptr, ptr %7, align 8, !tbaa !5
  %4474 = getelementptr inbounds %struct.thermo, ptr %4473, i32 0, i32 80
  %4475 = load double, ptr %4474, align 8, !tbaa !127
  %4476 = call i32 (ptr, ...) @printf(ptr noundef @.str.94, double noundef %4475)
  %4477 = load ptr, ptr %7, align 8, !tbaa !5
  %4478 = getelementptr inbounds %struct.thermo, ptr %4477, i32 0, i32 81
  %4479 = load double, ptr %4478, align 8, !tbaa !128
  %4480 = call i32 (ptr, ...) @printf(ptr noundef @.str.86, double noundef %4479)
  %4481 = load ptr, ptr %7, align 8, !tbaa !5
  %4482 = getelementptr inbounds %struct.thermo, ptr %4481, i32 0, i32 83
  %4483 = load double, ptr %4482, align 8, !tbaa !129
  %4484 = call i32 (ptr, ...) @printf(ptr noundef @.str.95, double noundef %4483)
  %4485 = load ptr, ptr %7, align 8, !tbaa !5
  %4486 = getelementptr inbounds %struct.thermo, ptr %4485, i32 0, i32 2
  %4487 = load i32, ptr %4486, align 4, !tbaa !27
  %4488 = icmp eq i32 %4487, 1
  br i1 %4488, label %4494, label %4489

4489:                                             ; preds = %4459
  %4490 = load ptr, ptr %7, align 8, !tbaa !5
  %4491 = getelementptr inbounds %struct.thermo, ptr %4490, i32 0, i32 2
  %4492 = load i32, ptr %4491, align 4, !tbaa !27
  %4493 = icmp eq i32 %4492, 3
  br i1 %4493, label %4494, label %4533

4494:                                             ; preds = %4489, %4459
  %4495 = load ptr, ptr %7, align 8, !tbaa !5
  %4496 = getelementptr inbounds %struct.thermo, ptr %4495, i32 0, i32 3
  %4497 = load i32, ptr %4496, align 8, !tbaa !135
  %4498 = icmp eq i32 %4497, 1
  br i1 %4498, label %4499, label %4504

4499:                                             ; preds = %4494
  %4500 = load ptr, ptr %7, align 8, !tbaa !5
  %4501 = getelementptr inbounds %struct.thermo, ptr %4500, i32 0, i32 5
  %4502 = load double, ptr %4501, align 8, !tbaa !136
  %4503 = call i32 (ptr, ...) @printf(ptr noundef @.str.96, double noundef %4502)
  br label %4504

4504:                                             ; preds = %4499, %4494
  %4505 = load ptr, ptr %7, align 8, !tbaa !5
  %4506 = getelementptr inbounds %struct.thermo, ptr %4505, i32 0, i32 3
  %4507 = load i32, ptr %4506, align 8, !tbaa !135
  %4508 = icmp eq i32 %4507, 0
  br i1 %4508, label %4509, label %4514

4509:                                             ; preds = %4504
  %4510 = load ptr, ptr %7, align 8, !tbaa !5
  %4511 = getelementptr inbounds %struct.thermo, ptr %4510, i32 0, i32 4
  %4512 = load double, ptr %4511, align 8, !tbaa !137
  %4513 = call i32 (ptr, ...) @printf(ptr noundef @.str.97, double noundef %4512)
  br label %4514

4514:                                             ; preds = %4509, %4504
  %4515 = load ptr, ptr %6, align 8, !tbaa !5
  %4516 = load ptr, ptr %7, align 8, !tbaa !5
  %4517 = getelementptr inbounds %struct.thermo, ptr %4516, i32 0, i32 5
  %4518 = load double, ptr %4517, align 8, !tbaa !136
  %4519 = call i32 @background_tau_of_z(ptr noundef %4515, double noundef %4518, ptr noundef %14)
  %4520 = icmp eq i32 %4519, 1
  br i1 %4520, label %4521, label %4530

4521:                                             ; preds = %4514
  call void @llvm.lifetime.start.p0(i64 2048, ptr %134) #6
  %4522 = getelementptr inbounds [2048 x i8], ptr %134, i64 0, i64 0
  %4523 = load ptr, ptr %6, align 8, !tbaa !5
  %4524 = getelementptr inbounds %struct.background, ptr %4523, i32 0, i32 149
  %4525 = getelementptr inbounds [2048 x i8], ptr %4524, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4522, ptr noundef @.str, ptr noundef @.str.98, ptr noundef %4525)
  %4526 = load ptr, ptr %7, align 8, !tbaa !5
  %4527 = getelementptr inbounds %struct.thermo, ptr %4526, i32 0, i32 93
  %4528 = getelementptr inbounds [2048 x i8], ptr %4527, i64 0, i64 0
  %4529 = getelementptr inbounds [2048 x i8], ptr %134, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %4528, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_init, i32 noundef 1264, ptr noundef %4529)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %134) #6
  store i32 1, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

4530:                                             ; preds = %4514
  %4531 = load double, ptr %14, align 8, !tbaa !9
  %4532 = call i32 (ptr, ...) @printf(ptr noundef @.str.86, double noundef %4531)
  br label %4533

4533:                                             ; preds = %4530, %4489
  %4534 = load ptr, ptr %7, align 8, !tbaa !5
  %4535 = getelementptr inbounds %struct.thermo, ptr %4534, i32 0, i32 2
  %4536 = load i32, ptr %4535, align 4, !tbaa !27
  %4537 = icmp eq i32 %4536, 2
  br i1 %4537, label %4538, label %4543

4538:                                             ; preds = %4533
  %4539 = load ptr, ptr %7, align 8, !tbaa !5
  %4540 = getelementptr inbounds %struct.thermo, ptr %4539, i32 0, i32 4
  %4541 = load double, ptr %4540, align 8, !tbaa !137
  %4542 = call i32 (ptr, ...) @printf(ptr noundef @.str.99, double noundef %4541)
  br label %4543

4543:                                             ; preds = %4538, %4533
  %4544 = load ptr, ptr %7, align 8, !tbaa !5
  %4545 = getelementptr inbounds %struct.thermo, ptr %4544, i32 0, i32 2
  %4546 = load i32, ptr %4545, align 4, !tbaa !27
  %4547 = icmp eq i32 %4546, 4
  br i1 %4547, label %4548, label %4553

4548:                                             ; preds = %4543
  %4549 = load ptr, ptr %7, align 8, !tbaa !5
  %4550 = getelementptr inbounds %struct.thermo, ptr %4549, i32 0, i32 4
  %4551 = load double, ptr %4550, align 8, !tbaa !137
  %4552 = call i32 (ptr, ...) @printf(ptr noundef @.str.100, double noundef %4551)
  br label %4553

4553:                                             ; preds = %4548, %4543
  %4554 = load ptr, ptr %7, align 8, !tbaa !5
  %4555 = getelementptr inbounds %struct.thermo, ptr %4554, i32 0, i32 2
  %4556 = load i32, ptr %4555, align 4, !tbaa !27
  %4557 = icmp eq i32 %4556, 5
  br i1 %4557, label %4558, label %4563

4558:                                             ; preds = %4553
  %4559 = load ptr, ptr %7, align 8, !tbaa !5
  %4560 = getelementptr inbounds %struct.thermo, ptr %4559, i32 0, i32 4
  %4561 = load double, ptr %4560, align 8, !tbaa !137
  %4562 = call i32 (ptr, ...) @printf(ptr noundef @.str.101, double noundef %4561)
  br label %4563

4563:                                             ; preds = %4558, %4553
  %4564 = load ptr, ptr %7, align 8, !tbaa !5
  %4565 = getelementptr inbounds %struct.thermo, ptr %4564, i32 0, i32 92
  %4566 = load i16, ptr %4565, align 4, !tbaa !11
  %4567 = sext i16 %4566 to i32
  %4568 = icmp sgt i32 %4567, 1
  br i1 %4568, label %4569, label %4574

4569:                                             ; preds = %4563
  %4570 = load ptr, ptr %7, align 8, !tbaa !5
  %4571 = getelementptr inbounds %struct.thermo, ptr %4570, i32 0, i32 86
  %4572 = load double, ptr %4571, align 8, !tbaa !113
  %4573 = call i32 (ptr, ...) @printf(ptr noundef @.str.102, double noundef %4572)
  br label %4574

4574:                                             ; preds = %4569, %4563
  %4575 = load ptr, ptr %6, align 8, !tbaa !5
  %4576 = getelementptr inbounds %struct.background, ptr %4575, i32 0, i32 127
  %4577 = load i16, ptr %4576, align 4, !tbaa !114
  %4578 = sext i16 %4577 to i32
  %4579 = icmp ne i32 %4578, 0
  br i1 %4579, label %4580, label %4589

4580:                                             ; preds = %4574
  %4581 = load ptr, ptr %7, align 8, !tbaa !5
  %4582 = getelementptr inbounds %struct.thermo, ptr %4581, i32 0, i32 92
  %4583 = load i16, ptr %4582, align 4, !tbaa !11
  %4584 = sext i16 %4583 to i32
  %4585 = icmp sgt i32 %4584, 1
  br i1 %4585, label %4586, label %4589

4586:                                             ; preds = %4580
  %4587 = load double, ptr %37, align 8, !tbaa !9
  %4588 = call i32 (ptr, ...) @printf(ptr noundef @.str.103, double noundef %4587)
  br label %4589

4589:                                             ; preds = %4586, %4580, %4574
  br label %4590

4590:                                             ; preds = %4589, %4358
  %4591 = load ptr, ptr %10, align 8, !tbaa !5
  call void @free(ptr noundef %4591) #6
  store i32 0, ptr %4, align 4
  store i32 1, ptr %43, align 4
  br label %4592

4592:                                             ; preds = %4590, %4521, %4349, %4293, %4174, %3986, %3963, %3694, %3671, %3541, %3513, %3432, %3386, %3335, %3157, %3134, %3117, %3100, %2919, %2860, %2775, %2754, %2661, %2640, %2525, %2504, %2394, %2373, %2126, %2105, %2081, %2047, %2010, %1794, %1476, %1442, %1405, %1371, %1337, %1226, %1192, %1095, %1045, %1020, %986, %955, %921, %884, %850, %634, %584, %549, %531, %504, %480, %459, %441, %426, %413, %388, %346, %333, %320, %302, %277, %264, %251, %238, %222, %209, %193, %153
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 128, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 264, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #6
  %4593 = load i32, ptr %4, align 4
  ret i32 %4593
}

declare i32 @printf(ptr noundef, ...) #3

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_helium_from_bbn(ptr noundef, ptr noundef, ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_indices(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

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

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_recombination(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

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

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_reionization(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_merge_reco_and_reio(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #4

declare i32 @background_tau_of_z(ptr noundef, double noundef, ptr noundef) #3

declare i32 @background_at_tau(ptr noundef, double noundef, i16 noundef signext, i16 noundef signext, ptr noundef, ptr noundef) #3

declare i32 @array_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i16 noundef signext, ptr noundef) #3

declare i32 @array_integrate_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) #3

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

declare i32 @array_derive_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) #3

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

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

declare i32 @array_smooth(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) #3

declare i32 @array_spline_table_lines(ptr noundef, i32 noundef, ptr noundef, i32 noundef, ptr noundef, i16 noundef signext, ptr noundef) #3

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12, !14, i64 604}
!12 = !{!"thermo", !10, i64 0, !13, i64 8, !13, i64 12, !13, i64 16, !10, i64 24, !10, i64 32, !14, i64 40, !14, i64 42, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !13, i64 80, !6, i64 88, !6, i64 96, !10, i64 104, !13, i64 112, !6, i64 120, !6, i64 128, !10, i64 136, !13, i64 144, !6, i64 152, !6, i64 160, !10, i64 168, !14, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !13, i64 272, !13, i64 276, !13, i64 280, !13, i64 284, !13, i64 288, !13, i64 292, !13, i64 296, !13, i64 300, !13, i64 304, !13, i64 308, !13, i64 312, !13, i64 316, !13, i64 320, !13, i64 324, !13, i64 328, !13, i64 332, !13, i64 336, !13, i64 340, !13, i64 344, !13, i64 348, !13, i64 352, !13, i64 356, !13, i64 360, !13, i64 364, !13, i64 368, !13, i64 372, !13, i64 376, !6, i64 384, !6, i64 392, !6, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !10, i64 456, !10, i64 464, !10, i64 472, !10, i64 480, !10, i64 488, !10, i64 496, !10, i64 504, !10, i64 512, !10, i64 520, !10, i64 528, !10, i64 536, !10, i64 544, !10, i64 552, !10, i64 560, !10, i64 568, !10, i64 576, !10, i64 584, !10, i64 592, !14, i64 600, !14, i64 602, !14, i64 604, !7, i64 606}
!13 = !{!"int", !7, i64 0}
!14 = !{!"short", !7, i64 0}
!15 = !{!12, !10, i64 0}
!16 = !{!12, !10, i64 168}
!17 = !{!12, !10, i64 192}
!18 = !{!12, !10, i64 200}
!19 = !{!12, !10, i64 216}
!20 = !{!12, !10, i64 208}
!21 = !{!22, !14, i64 724}
!22 = !{!"background", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !13, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !14, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !14, i64 176, !10, i64 184, !10, i64 192, !6, i64 200, !13, i64 208, !13, i64 212, !10, i64 216, !13, i64 224, !6, i64 232, !6, i64 240, !10, i64 248, !6, i64 256, !10, i64 264, !6, i64 272, !10, i64 280, !6, i64 288, !10, i64 296, !6, i64 304, !6, i64 312, !6, i64 320, !10, i64 328, !10, i64 336, !10, i64 344, !10, i64 352, !13, i64 360, !6, i64 368, !10, i64 376, !10, i64 384, !10, i64 392, !10, i64 400, !10, i64 408, !10, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !10, i64 456, !13, i64 464, !13, i64 468, !13, i64 472, !13, i64 476, !13, i64 480, !13, i64 484, !13, i64 488, !13, i64 492, !13, i64 496, !13, i64 500, !13, i64 504, !13, i64 508, !13, i64 512, !13, i64 516, !13, i64 520, !13, i64 524, !13, i64 528, !13, i64 532, !13, i64 536, !13, i64 540, !13, i64 544, !13, i64 548, !13, i64 552, !13, i64 556, !13, i64 560, !13, i64 564, !13, i64 568, !13, i64 572, !13, i64 576, !13, i64 580, !13, i64 584, !13, i64 588, !13, i64 592, !13, i64 596, !13, i64 600, !13, i64 604, !13, i64 608, !13, i64 612, !13, i64 616, !13, i64 620, !13, i64 624, !13, i64 628, !6, i64 632, !6, i64 640, !6, i64 648, !6, i64 656, !6, i64 664, !13, i64 672, !13, i64 676, !13, i64 680, !13, i64 684, !13, i64 688, !13, i64 692, !13, i64 696, !13, i64 700, !13, i64 704, !13, i64 708, !13, i64 712, !13, i64 716, !13, i64 720, !14, i64 724, !14, i64 726, !14, i64 728, !14, i64 730, !14, i64 732, !14, i64 734, !14, i64 736, !14, i64 738, !14, i64 740, !14, i64 742, !14, i64 744, !6, i64 752, !6, i64 760, !6, i64 768, !6, i64 776, !6, i64 784, !6, i64 792, !6, i64 800, !6, i64 808, !6, i64 816, !6, i64 824, !6, i64 832, !14, i64 840, !14, i64 842, !14, i64 844, !14, i64 846, !14, i64 848, !14, i64 850, !7, i64 852, !14, i64 2900, !7, i64 2902}
!23 = !{!22, !14, i64 742}
!24 = !{!12, !10, i64 224}
!25 = !{!12, !13, i64 8}
!26 = !{!12, !10, i64 232}
!27 = !{!12, !13, i64 12}
!28 = !{!29, !13, i64 400}
!29 = !{!"precision", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !7, i64 104, !10, i64 360, !13, i64 368, !10, i64 376, !13, i64 384, !13, i64 388, !10, i64 392, !13, i64 400, !10, i64 408, !13, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !10, i64 448, !10, i64 456, !10, i64 464, !10, i64 472, !10, i64 480, !10, i64 488, !10, i64 496, !10, i64 504, !10, i64 512, !10, i64 520, !10, i64 528, !10, i64 536, !10, i64 544, !10, i64 552, !10, i64 560, !10, i64 568, !10, i64 576, !10, i64 584, !10, i64 592, !10, i64 600, !10, i64 608, !10, i64 616, !13, i64 624, !7, i64 628, !7, i64 884, !7, i64 1140, !10, i64 1400, !10, i64 1408, !10, i64 1416, !10, i64 1424, !10, i64 1432, !10, i64 1440, !10, i64 1448, !10, i64 1456, !10, i64 1464, !10, i64 1472, !10, i64 1480, !10, i64 1488, !10, i64 1496, !10, i64 1504, !10, i64 1512, !10, i64 1520, !13, i64 1528, !10, i64 1536, !10, i64 1544, !13, i64 1552, !13, i64 1556, !13, i64 1560, !13, i64 1564, !13, i64 1568, !13, i64 1572, !13, i64 1576, !13, i64 1580, !10, i64 1584, !10, i64 1592, !10, i64 1600, !10, i64 1608, !10, i64 1616, !10, i64 1624, !10, i64 1632, !10, i64 1640, !13, i64 1648, !10, i64 1656, !10, i64 1664, !13, i64 1672, !10, i64 1680, !10, i64 1688, !13, i64 1696, !10, i64 1704, !13, i64 1712, !10, i64 1720, !10, i64 1728, !13, i64 1736, !10, i64 1744, !10, i64 1752, !10, i64 1760, !13, i64 1768, !10, i64 1776, !10, i64 1784, !10, i64 1792, !10, i64 1800, !10, i64 1808, !13, i64 1816, !10, i64 1824, !10, i64 1832, !10, i64 1840, !10, i64 1848, !10, i64 1856, !10, i64 1864, !10, i64 1872, !13, i64 1880, !10, i64 1888, !10, i64 1896, !10, i64 1904, !10, i64 1912, !10, i64 1920, !10, i64 1928, !10, i64 1936, !10, i64 1944, !10, i64 1952, !10, i64 1960, !10, i64 1968, !10, i64 1976, !10, i64 1984, !10, i64 1992, !10, i64 2000, !10, i64 2008, !10, i64 2016, !10, i64 2024, !10, i64 2032, !10, i64 2040, !10, i64 2048, !10, i64 2056, !10, i64 2064, !10, i64 2072, !10, i64 2080, !10, i64 2088, !10, i64 2096, !10, i64 2104, !10, i64 2112, !10, i64 2120, !10, i64 2128, !10, i64 2136, !10, i64 2144, !10, i64 2152, !10, i64 2160, !10, i64 2168, !10, i64 2176, !10, i64 2184, !10, i64 2192, !10, i64 2200, !10, i64 2208, !10, i64 2216, !10, i64 2224, !10, i64 2232, !10, i64 2240, !10, i64 2248, !13, i64 2256, !10, i64 2264, !10, i64 2272, !10, i64 2280, !10, i64 2288, !13, i64 2296, !10, i64 2304, !10, i64 2312, !13, i64 2320, !13, i64 2324, !13, i64 2328, !10, i64 2336, !10, i64 2344, !7, i64 2352}
!30 = !{!12, !10, i64 184}
!31 = !{!22, !13, i64 624}
!32 = !{!13, !13, i64 0}
!33 = !{!34, !6, i64 32}
!34 = !{!"recombination", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !6, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !14, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256}
!35 = !{!36, !13, i64 36}
!36 = !{!"reionization", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !6, i64 40, !10, i64 48, !13, i64 56, !13, i64 60, !13, i64 64, !13, i64 68, !13, i64 72, !13, i64 76, !13, i64 80, !13, i64 84, !13, i64 88, !13, i64 92, !13, i64 96, !13, i64 100, !13, i64 104, !6, i64 112, !13, i64 120, !13, i64 124}
!37 = !{!36, !13, i64 124}
!38 = !{!12, !13, i64 376}
!39 = !{!12, !6, i64 384}
!40 = distinct !{!40, !41}
!41 = !{!"llvm.loop.mustprogress"}
!42 = !{!12, !10, i64 584}
!43 = !{!22, !14, i64 842}
!44 = !{!22, !14, i64 848}
!45 = !{!22, !13, i64 480}
!46 = !{!22, !13, i64 476}
!47 = !{!12, !6, i64 392}
!48 = !{!12, !13, i64 372}
!49 = !{!12, !13, i64 276}
!50 = !{!12, !13, i64 284}
!51 = !{!12, !10, i64 240}
!52 = !{!12, !10, i64 256}
!53 = !{!22, !10, i64 136}
!54 = !{!22, !10, i64 328}
!55 = !{!12, !13, i64 308}
!56 = !{!22, !13, i64 508}
!57 = !{!22, !13, i64 504}
!58 = !{!12, !13, i64 312}
!59 = !{!12, !10, i64 248}
!60 = !{!22, !10, i64 120}
!61 = !{!12, !13, i64 320}
!62 = distinct !{!62, !41}
!63 = !{!12, !13, i64 288}
!64 = !{!12, !13, i64 280}
!65 = !{!12, !13, i64 316}
!66 = !{!12, !13, i64 324}
!67 = !{!12, !13, i64 328}
!68 = !{!12, !14, i64 42}
!69 = distinct !{!69, !41}
!70 = !{!12, !13, i64 296}
!71 = !{!12, !13, i64 368}
!72 = distinct !{!72, !41}
!73 = !{!12, !14, i64 40}
!74 = !{!12, !13, i64 352}
!75 = !{!12, !13, i64 360}
!76 = !{!12, !13, i64 356}
!77 = !{!12, !13, i64 292}
!78 = !{!12, !13, i64 300}
!79 = !{!12, !13, i64 304}
!80 = !{!12, !13, i64 364}
!81 = !{!12, !13, i64 332}
!82 = distinct !{!82, !41}
!83 = !{!29, !13, i64 624}
!84 = !{!22, !14, i64 840}
!85 = !{!22, !14, i64 846}
!86 = !{!22, !13, i64 464}
!87 = !{!22, !13, i64 468}
!88 = !{!22, !10, i64 128}
!89 = !{!12, !13, i64 340}
!90 = !{!12, !10, i64 264}
!91 = !{!12, !13, i64 336}
!92 = distinct !{!92, !41}
!93 = distinct !{!93, !41}
!94 = !{!12, !6, i64 400}
!95 = distinct !{!95, !41}
!96 = distinct !{!96, !41}
!97 = !{!12, !10, i64 408}
!98 = !{!29, !10, i64 2344}
!99 = !{!12, !10, i64 416}
!100 = !{!22, !14, i64 844}
!101 = !{!22, !13, i64 604}
!102 = !{!12, !10, i64 424}
!103 = !{!22, !10, i64 456}
!104 = !{!12, !10, i64 432}
!105 = !{!22, !13, i64 592}
!106 = !{!12, !10, i64 448}
!107 = !{!12, !10, i64 440}
!108 = !{!22, !10, i64 344}
!109 = !{!12, !10, i64 560}
!110 = !{!12, !10, i64 456}
!111 = !{!29, !10, i64 1664}
!112 = distinct !{!112, !41}
!113 = !{!12, !10, i64 568}
!114 = !{!22, !14, i64 740}
!115 = !{!29, !10, i64 1688}
!116 = distinct !{!116, !41}
!117 = !{!12, !10, i64 576}
!118 = distinct !{!118, !41}
!119 = !{!12, !10, i64 464}
!120 = !{!12, !10, i64 472}
!121 = !{!12, !10, i64 480}
!122 = !{!12, !10, i64 488}
!123 = !{!12, !10, i64 504}
!124 = !{!12, !10, i64 496}
!125 = !{!12, !10, i64 512}
!126 = distinct !{!126, !41}
!127 = !{!12, !10, i64 520}
!128 = !{!12, !10, i64 528}
!129 = !{!12, !10, i64 544}
!130 = !{!12, !10, i64 536}
!131 = distinct !{!131, !41}
!132 = distinct !{!132, !41}
!133 = !{!29, !10, i64 1728}
!134 = distinct !{!134, !41}
!135 = !{!12, !13, i64 16}
!136 = !{!12, !10, i64 32}
!137 = !{!12, !10, i64 24}


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

%struct.recombination = type { i32, i32, i32, i32, i32, i32, i32, i32, ptr, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i16, double, double, double, double, double, double, double }
%struct.reionization = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, i32, i32 }

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [25 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [44 x i8], align 1
@__func__.thermodynamics_init = external hidden unnamed_addr constant [20 x i8], align 1
@.str.7 = external hidden unnamed_addr constant [17 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [102 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [81 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [32 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [56 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.21 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [61 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [79 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [296 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [256 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [15 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [9 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.41 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.42 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.43 = external hidden unnamed_addr constant [71 x i8], align 1
@.str.44 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.45 = external hidden unnamed_addr constant [168 x i8], align 1
@.str.46 = external hidden unnamed_addr constant [196 x i8], align 1
@.str.47 = external hidden unnamed_addr constant [176 x i8], align 1
@.str.48 = external hidden unnamed_addr constant [209 x i8], align 1
@.str.49 = external hidden unnamed_addr constant [175 x i8], align 1
@.str.50 = external hidden unnamed_addr constant [205 x i8], align 1
@.str.51 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.52 = external hidden unnamed_addr constant [119 x i8], align 1
@.str.53 = external hidden unnamed_addr constant [176 x i8], align 1
@.str.54 = external hidden unnamed_addr constant [200 x i8], align 1
@.str.55 = external hidden unnamed_addr constant [167 x i8], align 1
@.str.56 = external hidden unnamed_addr constant [194 x i8], align 1
@.str.57 = external hidden unnamed_addr constant [191 x i8], align 1
@.str.58 = external hidden unnamed_addr constant [161 x i8], align 1
@.str.59 = external hidden unnamed_addr constant [185 x i8], align 1
@.str.60 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.61 = external hidden unnamed_addr constant [77 x i8], align 1
@.str.62 = external hidden unnamed_addr constant [143 x i8], align 1
@.str.63 = external hidden unnamed_addr constant [206 x i8], align 1
@.str.64 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.65 = external hidden unnamed_addr constant [91 x i8], align 1
@.str.66 = external hidden unnamed_addr constant [150 x i8], align 1
@.str.67 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.68 = external hidden unnamed_addr constant [138 x i8], align 1
@.str.69 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.70 = external hidden unnamed_addr constant [111 x i8], align 1
@.str.71 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.72 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.73 = external hidden unnamed_addr constant [99 x i8], align 1
@.str.74 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.75 = external hidden unnamed_addr constant [54 x i8], align 1
@.str.76 = external hidden unnamed_addr constant [100 x i8], align 1
@.str.77 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.78 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.79 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.80 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.81 = external hidden unnamed_addr constant [65 x i8], align 1
@.str.82 = external hidden unnamed_addr constant [39 x i8], align 1
@.str.83 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.84 = external hidden unnamed_addr constant [97 x i8], align 1
@.str.85 = external hidden unnamed_addr constant [58 x i8], align 1
@.str.86 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.87 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.88 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.89 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.90 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.91 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.92 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.93 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.94 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.95 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.96 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.97 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.98 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.99 = external hidden unnamed_addr constant [50 x i8], align 1
@.str.100 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.101 = external hidden unnamed_addr constant [64 x i8], align 1
@.str.102 = external hidden unnamed_addr constant [73 x i8], align 1
@.str.103 = external hidden unnamed_addr constant [78 x i8], align 1

; 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

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

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

; Function Attrs: nounwind uwtable
define dso_local noundef i32 @thermodynamics_init(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #4 {
  %4 = alloca i32, align 4
  %5 = alloca double, align 8
  %6 = alloca %struct.recombination, align 8
  %7 = alloca %struct.reionization, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca [2048 x i8], align 16
  %12 = alloca [2048 x i8], align 16
  %13 = alloca [2048 x i8], align 16
  %14 = alloca [2048 x i8], align 16
  %15 = alloca [2048 x i8], align 16
  %16 = alloca [2048 x i8], align 16
  %17 = alloca [2048 x i8], align 16
  %18 = alloca [2048 x i8], align 16
  %19 = alloca [2048 x i8], align 16
  %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
  %24 = alloca [2048 x i8], align 16
  %25 = alloca [2048 x i8], align 16
  %26 = alloca [2048 x i8], align 16
  %27 = alloca [2048 x i8], align 16
  %28 = alloca [2048 x i8], align 16
  %29 = alloca [2048 x i8], align 16
  %30 = alloca [2048 x i8], align 16
  %31 = alloca [2048 x i8], align 16
  %32 = alloca [2048 x i8], align 16
  %33 = alloca [2048 x i8], align 16
  %34 = alloca [2048 x i8], align 16
  %35 = alloca [2048 x i8], align 16
  %36 = alloca [2048 x i8], align 16
  %37 = alloca [2048 x i8], align 16
  %38 = alloca [2048 x i8], align 16
  %39 = alloca [2048 x i8], align 16
  %40 = alloca [2048 x i8], align 16
  %41 = alloca [2048 x i8], align 16
  %42 = alloca [2048 x i8], align 16
  %43 = alloca [2048 x i8], align 16
  %44 = alloca [2048 x i8], align 16
  %45 = alloca [2048 x i8], align 16
  %46 = alloca [2048 x i8], align 16
  %47 = alloca [2048 x i8], align 16
  %48 = alloca [2048 x i8], align 16
  %49 = alloca [2048 x i8], align 16
  %50 = alloca [2048 x i8], align 16
  %51 = alloca [2048 x i8], align 16
  %52 = alloca [2048 x i8], align 16
  %53 = alloca [2048 x i8], align 16
  %54 = alloca [2048 x i8], align 16
  %55 = alloca [2048 x i8], align 16
  %56 = alloca [2048 x i8], align 16
  %57 = alloca [2048 x i8], align 16
  %58 = alloca [2048 x i8], align 16
  %59 = alloca [2048 x i8], align 16
  %60 = alloca [2048 x i8], align 16
  %61 = alloca [2048 x i8], align 16
  %62 = alloca [2048 x i8], align 16
  %63 = alloca [2048 x i8], align 16
  %64 = alloca [2048 x i8], align 16
  %65 = alloca [2048 x i8], align 16
  %66 = alloca [2048 x i8], align 16
  %67 = alloca [2048 x i8], align 16
  %68 = alloca [2048 x i8], align 16
  %69 = alloca [2048 x i8], align 16
  %70 = alloca [2048 x i8], align 16
  %71 = alloca [2048 x i8], align 16
  %72 = alloca [2048 x i8], align 16
  %73 = alloca [2048 x i8], align 16
  %74 = alloca [2048 x i8], align 16
  %75 = alloca [2048 x i8], align 16
  %76 = alloca [2048 x i8], align 16
  %77 = alloca [2048 x i8], align 16
  %78 = alloca [2048 x i8], align 16
  %79 = alloca [2048 x i8], align 16
  %80 = alloca [2048 x i8], align 16
  %81 = alloca [2048 x i8], align 16
  %82 = alloca [2048 x i8], align 16
  %83 = alloca [2048 x i8], align 16
  %84 = alloca [2048 x i8], align 16
  %85 = alloca [2048 x i8], align 16
  %86 = alloca [2048 x i8], align 16
  %87 = alloca [2048 x i8], align 16
  %88 = alloca [2048 x i8], align 16
  %89 = alloca [2048 x i8], align 16
  %90 = alloca [2048 x i8], align 16
  %91 = alloca [2048 x i8], align 16
  %92 = alloca [2048 x i8], align 16
  %93 = alloca [2048 x i8], align 16
  %94 = alloca [2048 x i8], align 16
  %95 = alloca [2048 x i8], align 16
  %96 = alloca [2048 x i8], align 16
  %97 = alloca [2048 x i8], align 16
  %98 = alloca [2048 x i8], align 16
  %99 = alloca [2048 x i8], align 16
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %4) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #9
  call void @llvm.lifetime.start.p0(i64 264, ptr nonnull %6) #9
  call void @llvm.lifetime.start.p0(i64 128, ptr nonnull %7) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #9
  %100 = getelementptr inbounds i8, ptr %2, i64 604
  %101 = load i16, ptr %100, align 4, !tbaa !5
  %102 = icmp sgt i16 %101, 0
  br i1 %102, label %103, label %105

103:                                              ; preds = %3
  %104 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5)
  br label %105

105:                                              ; preds = %103, %3
  %106 = load double, ptr %2, align 8, !tbaa !13
  %107 = fcmp oeq double %106, -1.000000e+00
  br i1 %107, label %108, label %119

108:                                              ; preds = %105
  %109 = tail call i32 @thermodynamics_helium_from_bbn(ptr noundef %0, ptr noundef %1, ptr noundef nonnull %2)
  %110 = icmp eq i32 %109, 1
  br i1 %110, label %111, label %113

111:                                              ; preds = %108
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %11) #9
  %112 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %11, ptr noundef nonnull @.str, ptr noundef nonnull @.str.6, ptr noundef nonnull %112) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %112, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 341, ptr noundef nonnull %11) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %11) #9
  br label %1873

113:                                              ; preds = %108
  %114 = load i16, ptr %100, align 4, !tbaa !5
  %115 = icmp sgt i16 %114, 0
  br i1 %115, label %116, label %124

116:                                              ; preds = %113
  %117 = load double, ptr %2, align 8, !tbaa !13
  %118 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.7, double noundef %117)
  br label %124

119:                                              ; preds = %105
  %120 = load i16, ptr %100, align 4, !tbaa !5
  %121 = icmp sgt i16 %120, 0
  br i1 %121, label %122, label %124

122:                                              ; preds = %119
  %123 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.8)
  br label %124

124:                                              ; preds = %119, %122, %113, %116
  %125 = load double, ptr %2, align 8, !tbaa !13
  %126 = fcmp olt double %125, 1.000000e-02
  %127 = fcmp ogt double %125, 5.000000e-01
  %or.cond1221 = or i1 %126, %127
  br i1 %or.cond1221, label %128, label %130

128:                                              ; preds = %124
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %12) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %12, ptr noundef nonnull @.str.9, double noundef %125, double noundef 1.000000e-02, double noundef 5.000000e-01) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %13) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %13, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.11, ptr noundef nonnull %12) #9
  %129 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %129, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 352, ptr noundef nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %13) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %12) #9
  br label %1873

130:                                              ; preds = %124
  %131 = getelementptr inbounds i8, ptr %2, i64 168
  %132 = load double, ptr %131, align 8, !tbaa !14
  %133 = fcmp olt double %132, 0.000000e+00
  br i1 %133, label %134, label %136

134:                                              ; preds = %130
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %14) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %14, ptr noundef nonnull @.str.12) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %15) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %15, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.13, ptr noundef nonnull %14) #9
  %135 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %135, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 358, ptr noundef nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %15) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %14) #9
  br label %1873

136:                                              ; preds = %130
  %137 = fcmp ogt double %132, 1.000000e-04
  br i1 %137, label %138, label %140

138:                                              ; preds = %136
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %16) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %16, ptr noundef nonnull @.str.14, double noundef %132) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %17) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %17, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.15, ptr noundef nonnull %16) #9
  %139 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %139, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 363, ptr noundef nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %17) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %16) #9
  br label %1873

140:                                              ; preds = %136
  %141 = getelementptr inbounds i8, ptr %2, i64 192
  %142 = load double, ptr %141, align 8, !tbaa !15
  %143 = fcmp ogt double %142, 0.000000e+00
  br i1 %143, label %144, label %146

144:                                              ; preds = %140
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %18) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %18, ptr noundef nonnull @.str.16) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %19) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %19, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.17, ptr noundef nonnull %18) #9
  %145 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %145, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 367, ptr noundef nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %19) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %18) #9
  br label %1873

146:                                              ; preds = %140
  %147 = getelementptr inbounds i8, ptr %2, i64 200
  %148 = load double, ptr %147, align 8, !tbaa !16
  %149 = fcmp olt double %148, 0.000000e+00
  br i1 %149, label %150, label %152

150:                                              ; preds = %146
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %20) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %20, ptr noundef nonnull @.str.18) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %21) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %21, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.19, ptr noundef nonnull %20) #9
  %151 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %151, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 371, ptr noundef nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %21) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %20) #9
  br label %1873

152:                                              ; preds = %146
  %153 = getelementptr inbounds i8, ptr %2, i64 216
  %154 = load double, ptr %153, align 8, !tbaa !17
  %155 = fcmp olt double %154, 0.000000e+00
  br i1 %155, label %156, label %158

156:                                              ; preds = %152
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %22) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %22, ptr noundef nonnull @.str.18) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %23) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %23, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.20, ptr noundef nonnull %22) #9
  %157 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %157, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 375, ptr noundef nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %23) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %22) #9
  br label %1873

158:                                              ; preds = %152
  %159 = getelementptr inbounds i8, ptr %2, i64 208
  %160 = load double, ptr %159, align 8, !tbaa !18
  %161 = fcmp olt double %160, 0.000000e+00
  br i1 %161, label %162, label %164

162:                                              ; preds = %158
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %24) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %24, ptr noundef nonnull @.str.18) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %25) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %25, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.21, ptr noundef nonnull %24) #9
  %163 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %163, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 379, ptr noundef nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %25) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %24) #9
  br label %1873

164:                                              ; preds = %158
  %165 = fcmp ule double %132, 0.000000e+00
  br i1 %165, label %176, label %166

166:                                              ; preds = %164
  %167 = getelementptr inbounds i8, ptr %1, i64 724
  %168 = load i16, ptr %167, align 4, !tbaa !19
  %169 = icmp eq i16 %168, 0
  br i1 %169, label %170, label %176

170:                                              ; preds = %166
  %171 = getelementptr inbounds i8, ptr %1, i64 742
  %172 = load i16, ptr %171, align 2, !tbaa !21
  %173 = icmp eq i16 %172, 0
  br i1 %173, label %174, label %176

174:                                              ; preds = %170
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %26) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %26, ptr noundef nonnull @.str.22) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %27) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %27, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.23, ptr noundef nonnull %26) #9
  %175 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %175, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 383, ptr noundef nonnull %27) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %27) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %26) #9
  br label %1873

176:                                              ; preds = %170, %166, %164
  %177 = getelementptr inbounds i8, ptr %2, i64 224
  %178 = load double, ptr %177, align 8, !tbaa !22
  %179 = fcmp ogt double %178, 0.000000e+00
  br i1 %179, label %180, label %186

180:                                              ; preds = %176
  %181 = getelementptr inbounds i8, ptr %2, i64 8
  %182 = load i32, ptr %181, align 8, !tbaa !23
  %183 = icmp eq i32 %182, 0
  br i1 %183, label %184, label %186

184:                                              ; preds = %180
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %28) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %28, ptr noundef nonnull @.str.24) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %29) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %29, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.25, ptr noundef nonnull %28) #9
  %185 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %185, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 387, ptr noundef nonnull %29) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %29) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %28) #9
  br label %1873

186:                                              ; preds = %180, %176
  %187 = fcmp olt double %178, 0.000000e+00
  br i1 %187, label %188, label %190

188:                                              ; preds = %186
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %30) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %30, ptr noundef nonnull @.str.26) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %31) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %31, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.27, ptr noundef nonnull %30) #9
  %189 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %189, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 391, ptr noundef nonnull %31) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %31) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %30) #9
  br label %1873

190:                                              ; preds = %186
  %191 = getelementptr inbounds i8, ptr %2, i64 232
  %192 = load double, ptr %191, align 8, !tbaa !24
  %193 = fcmp olt double %192, 0.000000e+00
  br i1 %193, label %194, label %196

194:                                              ; preds = %190
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %32) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %32, ptr noundef nonnull @.str.26) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %33) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %33, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.28, ptr noundef nonnull %32) #9
  %195 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %195, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 395, ptr noundef nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %33) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %32) #9
  br label %1873

196:                                              ; preds = %190
  %197 = load i16, ptr %100, align 4, !tbaa !5
  %198 = icmp slt i16 %197, 1
  %brmerge = or i1 %165, %198
  br i1 %brmerge, label %213, label %199

199:                                              ; preds = %196
  %200 = getelementptr inbounds i8, ptr %2, i64 12
  %201 = load i32, ptr %200, align 4, !tbaa !25
  %202 = icmp eq i32 %201, 0
  br i1 %202, label %203, label %213

203:                                              ; preds = %199
  %204 = getelementptr inbounds i8, ptr %0, i64 400
  %205 = load i32, ptr %204, align 8, !tbaa !26
  %206 = icmp sgt i32 %205, 2
  br i1 %206, label %207, label %213

207:                                              ; preds = %203
  %208 = getelementptr inbounds i8, ptr %2, i64 8
  %209 = load i32, ptr %208, align 8, !tbaa !23
  %210 = icmp eq i32 %209, 0
  br i1 %210, label %211, label %213

211:                                              ; preds = %207
  %212 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.29)
  br label %213

213:                                              ; preds = %196, %199, %203, %207, %211
  %214 = getelementptr inbounds i8, ptr %2, i64 184
  %215 = load double, ptr %214, align 8, !tbaa !28
  %216 = fcmp olt double %215, 0.000000e+00
  br i1 %216, label %217, label %219

217:                                              ; preds = %213
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %34) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %34, ptr noundef nonnull @.str.30) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %35) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %35, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.31, ptr noundef nonnull %34) #9
  %218 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %218, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 403, ptr noundef nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %35) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %34) #9
  br label %1873

219:                                              ; preds = %213
  %220 = fcmp ogt double %215, 0.000000e+00
  br i1 %220, label %221, label %231

221:                                              ; preds = %219
  %222 = getelementptr inbounds i8, ptr %1, i64 724
  %223 = load i16, ptr %222, align 4, !tbaa !19
  %224 = icmp eq i16 %223, 0
  br i1 %224, label %225, label %231

225:                                              ; preds = %221
  %226 = getelementptr inbounds i8, ptr %1, i64 742
  %227 = load i16, ptr %226, align 2, !tbaa !21
  %228 = icmp eq i16 %227, 0
  br i1 %228, label %229, label %231

229:                                              ; preds = %225
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %36) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %36, ptr noundef nonnull @.str.32) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %37) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %37, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.33, ptr noundef nonnull %36) #9
  %230 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %230, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 407, ptr noundef nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %37) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %36) #9
  br label %1873

231:                                              ; preds = %225, %221, %219
  %232 = load double, ptr %2, align 8, !tbaa !13
  %233 = fcmp oeq double %232, 1.000000e+00
  br i1 %233, label %234, label %236

234:                                              ; preds = %231
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %38) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %38, ptr noundef nonnull @.str.34) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %39) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %39, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.35, ptr noundef nonnull %38) #9
  %235 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %235, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 415, ptr noundef nonnull %39) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %39) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %38) #9
  br label %1873

236:                                              ; preds = %231
  %237 = call i32 @thermodynamics_indices(ptr noundef %1, ptr noundef nonnull %2, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %238 = icmp eq i32 %237, 1
  br i1 %238, label %239, label %241

239:                                              ; preds = %236
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %40) #9
  %240 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %40, ptr noundef nonnull @.str, ptr noundef nonnull @.str.36, ptr noundef nonnull %240) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %240, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 426, ptr noundef nonnull %40) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %40) #9
  br label %1873

241:                                              ; preds = %236
  %242 = getelementptr inbounds i8, ptr %1, i64 624
  %243 = load i32, ptr %242, align 8, !tbaa !29
  %244 = sext i32 %243 to i64
  %245 = shl nsw i64 %244, 3
  %246 = call noalias ptr @malloc(i64 noundef %245) #10
  %247 = icmp eq ptr %246, null
  br i1 %247, label %248, label %251

248:                                              ; preds = %241
  %249 = shl i32 %243, 3
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %41) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %41, ptr noundef nonnull @.str.37, ptr noundef nonnull @.str.38, i32 noundef %249) #9
  %250 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %250, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 430, ptr noundef nonnull %41) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %41) #9
  br label %1873

251:                                              ; preds = %241
  %252 = call i32 @thermodynamics_recombination(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, ptr noundef nonnull %6, ptr noundef nonnull %246)
  %253 = icmp eq i32 %252, 1
  br i1 %253, label %254, label %256

254:                                              ; preds = %251
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %42) #9
  %255 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %42, ptr noundef nonnull @.str, ptr noundef nonnull @.str.39, ptr noundef nonnull %255) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %255, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 437, ptr noundef nonnull %42) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %42) #9
  call void @free(ptr noundef nonnull %246) #9
  br label %1873

256:                                              ; preds = %251
  %257 = getelementptr inbounds i8, ptr %2, i64 12
  %258 = load i32, ptr %257, align 4, !tbaa !25
  %.not = icmp eq i32 %258, 0
  br i1 %.not, label %266, label %259

259:                                              ; preds = %256
  %260 = call i32 @thermodynamics_reionization(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, ptr noundef nonnull %6, ptr noundef nonnull %7, ptr noundef nonnull %246)
  %261 = icmp eq i32 %260, 1
  br i1 %261, label %262, label %269

262:                                              ; preds = %259
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %43) #9
  %263 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %43, ptr noundef nonnull @.str, ptr noundef nonnull @.str.40, ptr noundef nonnull %263) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %263, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 445, ptr noundef nonnull %43) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %43) #9
  %264 = getelementptr inbounds i8, ptr %6, i64 32
  %265 = load ptr, ptr %264, align 8, !tbaa !30
  call void @free(ptr noundef %265) #9
  call void @free(ptr noundef nonnull %246) #9
  br label %1873

266:                                              ; preds = %256
  %267 = getelementptr inbounds i8, ptr %7, i64 36
  store i32 0, ptr %267, align 4, !tbaa !32
  %268 = getelementptr inbounds i8, ptr %7, i64 124
  store i32 -1, ptr %268, align 4, !tbaa !34
  br label %269

269:                                              ; preds = %259, %266
  %270 = call i32 @thermodynamics_merge_reco_and_reio(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %2, ptr noundef nonnull %6, ptr noundef nonnull %7)
  %271 = icmp eq i32 %270, 1
  br i1 %271, label %272, label %274

272:                                              ; preds = %269
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %44) #9
  %273 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %44, ptr noundef nonnull @.str, ptr noundef nonnull @.str.41, ptr noundef nonnull %273) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %273, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 457, ptr noundef nonnull %44) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %44) #9
  br label %1873

274:                                              ; preds = %269
  %275 = getelementptr inbounds i8, ptr %2, i64 376
  %276 = load i32, ptr %275, align 8, !tbaa !35
  %277 = sext i32 %276 to i64
  %278 = shl nsw i64 %277, 3
  %279 = call noalias ptr @malloc(i64 noundef %278) #10
  %280 = icmp eq ptr %279, null
  br i1 %280, label %289, label %.preheader1234

.preheader1234:                                   ; preds = %274
  %281 = icmp sgt i32 %276, 0
  br i1 %281, label %.lr.ph, label %._crit_edge.thread

._crit_edge.thread:                               ; preds = %.preheader1234
  %282 = getelementptr double, ptr %279, i64 %277
  %283 = getelementptr i8, ptr %282, i64 -8
  %284 = load double, ptr %283, align 8, !tbaa !36
  %285 = getelementptr inbounds i8, ptr %2, i64 584
  store double %284, ptr %285, align 8, !tbaa !37
  %286 = load i32, ptr %242, align 8, !tbaa !29
  %287 = add nsw i32 %286, -1
  store i32 %287, ptr %4, align 4, !tbaa !38
  br label %._crit_edge.._crit_edge1274_crit_edge

.lr.ph:                                           ; preds = %.preheader1234
  %288 = getelementptr inbounds i8, ptr %2, i64 384
  br label %296

289:                                              ; preds = %274
  %290 = shl i32 %276, 3
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %45) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %45, ptr noundef nonnull @.str.37, ptr noundef nonnull @.str.42, i32 noundef %290) #9
  %291 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %291, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 461, ptr noundef nonnull %45) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %45) #9
  br label %1873

292:                                              ; preds = %296
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %293 = load i32, ptr %275, align 8, !tbaa !35
  %294 = sext i32 %293 to i64
  %295 = icmp slt i64 %indvars.iv.next, %294
  br i1 %295, label %296, label %._crit_edge, !llvm.loop !39

296:                                              ; preds = %.lr.ph, %292
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %292 ]
  %297 = load ptr, ptr %288, align 8, !tbaa !41
  %298 = getelementptr inbounds double, ptr %297, i64 %indvars.iv
  %299 = load double, ptr %298, align 8, !tbaa !36
  %300 = getelementptr inbounds double, ptr %279, i64 %indvars.iv
  %301 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %299, ptr noundef nonnull %300) #9
  %302 = icmp eq i32 %301, 1
  br i1 %302, label %303, label %292

303:                                              ; preds = %296
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %46) #9
  %304 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %46, ptr noundef nonnull @.str, ptr noundef nonnull @.str.43, ptr noundef nonnull %304) #9
  %305 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %305, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 468, ptr noundef nonnull %46) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %46) #9
  br label %1873

._crit_edge:                                      ; preds = %292
  %306 = getelementptr double, ptr %279, i64 %294
  %307 = getelementptr i8, ptr %306, i64 -8
  %308 = load double, ptr %307, align 8, !tbaa !36
  %309 = getelementptr inbounds i8, ptr %2, i64 584
  store double %308, ptr %309, align 8, !tbaa !37
  %310 = load i32, ptr %242, align 8, !tbaa !29
  %311 = add nsw i32 %310, -1
  store i32 %311, ptr %4, align 4, !tbaa !38
  %312 = icmp sgt i32 %293, 0
  br i1 %312, label %.lr.ph1273, label %._crit_edge.._crit_edge1274_crit_edge

._crit_edge.._crit_edge1274_crit_edge:            ; preds = %._crit_edge.thread, %._crit_edge
  %313 = phi i32 [ %276, %._crit_edge.thread ], [ %293, %._crit_edge ]
  %.phi.trans.insert = getelementptr inbounds i8, ptr %2, i64 392
  %.pre = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !42
  %.phi.trans.insert1421 = getelementptr inbounds i8, ptr %2, i64 372
  %.pre1422 = load i32, ptr %.phi.trans.insert1421, align 4, !tbaa !43
  br label %._crit_edge1274

.lr.ph1273:                                       ; preds = %._crit_edge
  %314 = getelementptr inbounds i8, ptr %1, i64 842
  %315 = getelementptr inbounds i8, ptr %1, i64 848
  %316 = getelementptr inbounds i8, ptr %1, i64 480
  %317 = getelementptr inbounds i8, ptr %1, i64 476
  %318 = getelementptr inbounds i8, ptr %2, i64 392
  %319 = getelementptr inbounds i8, ptr %2, i64 372
  %320 = getelementptr inbounds i8, ptr %2, i64 276
  %321 = getelementptr inbounds i8, ptr %2, i64 284
  %322 = getelementptr inbounds i8, ptr %1, i64 742
  %323 = getelementptr inbounds i8, ptr %2, i64 240
  %324 = getelementptr inbounds i8, ptr %2, i64 384
  %325 = getelementptr inbounds i8, ptr %2, i64 256
  %326 = getelementptr inbounds i8, ptr %1, i64 136
  %327 = getelementptr inbounds i8, ptr %1, i64 328
  %328 = getelementptr inbounds i8, ptr %2, i64 308
  %329 = getelementptr inbounds i8, ptr %1, i64 508
  %330 = getelementptr inbounds i8, ptr %1, i64 504
  %331 = getelementptr inbounds i8, ptr %2, i64 312
  %332 = getelementptr inbounds i8, ptr %2, i64 248
  %333 = getelementptr inbounds i8, ptr %1, i64 120
  %334 = getelementptr inbounds i8, ptr %2, i64 320
  br label %335

335:                                              ; preds = %.lr.ph1273, %429
  %indvars.iv1371 = phi i64 [ 0, %.lr.ph1273 ], [ %indvars.iv.next1372, %429 ]
  %336 = getelementptr inbounds double, ptr %279, i64 %indvars.iv1371
  %337 = load double, ptr %336, align 8, !tbaa !36
  %338 = load i16, ptr %314, align 2, !tbaa !44
  %339 = load i16, ptr %315, align 8, !tbaa !45
  %340 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %337, i16 noundef signext %338, i16 noundef signext %339, ptr noundef nonnull %4, ptr noundef %246) #9
  %341 = icmp eq i32 %340, 1
  br i1 %341, label %342, label %345

342:                                              ; preds = %335
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %47) #9
  %343 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %47, ptr noundef nonnull @.str, ptr noundef nonnull @.str.44, ptr noundef nonnull %343) #9
  %344 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %344, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 490, ptr noundef nonnull %47) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %47) #9
  br label %1873

345:                                              ; preds = %335
  %346 = load i32, ptr %316, align 8, !tbaa !46
  %347 = sext i32 %346 to i64
  %348 = getelementptr inbounds double, ptr %246, i64 %347
  %349 = load double, ptr %348, align 8, !tbaa !36
  %350 = fmul double %349, 7.500000e-01
  %351 = load i32, ptr %317, align 4, !tbaa !47
  %352 = sext i32 %351 to i64
  %353 = getelementptr inbounds double, ptr %246, i64 %352
  %354 = load double, ptr %353, align 8, !tbaa !36
  %355 = fdiv double %350, %354
  %356 = fdiv double -1.000000e+00, %355
  %357 = load ptr, ptr %318, align 8, !tbaa !42
  %358 = load i32, ptr %319, align 4, !tbaa !43
  %359 = trunc nuw nsw i64 %indvars.iv1371 to i32
  %360 = mul nsw i32 %358, %359
  %361 = load i32, ptr %320, align 4, !tbaa !48
  %362 = add nsw i32 %360, %361
  %363 = sext i32 %362 to i64
  %364 = getelementptr inbounds double, ptr %357, i64 %363
  %365 = load double, ptr %364, align 8, !tbaa !36
  %366 = fmul double %356, %365
  %367 = load i32, ptr %321, align 4, !tbaa !49
  %368 = add nsw i32 %367, %360
  %369 = sext i32 %368 to i64
  %370 = getelementptr inbounds double, ptr %357, i64 %369
  store double %366, ptr %370, align 8, !tbaa !36
  %371 = load i16, ptr %322, align 2, !tbaa !21
  %372 = icmp eq i16 %371, 1
  br i1 %372, label %373, label %429

373:                                              ; preds = %345
  %374 = load double, ptr %323, align 8, !tbaa !50
  %375 = load ptr, ptr %324, align 8, !tbaa !41
  %376 = getelementptr inbounds double, ptr %375, i64 %indvars.iv1371
  %377 = load double, ptr %376, align 8, !tbaa !36
  %378 = fadd double %377, 1.000000e+00
  %379 = fdiv double %378, 1.000000e+07
  %380 = load double, ptr %325, align 8, !tbaa !51
  %381 = call double @pow(double noundef %379, double noundef %380) #9
  %382 = fmul double %374, %381
  %383 = load double, ptr %326, align 8, !tbaa !52
  %384 = fmul double %382, %383
  %385 = load double, ptr %327, align 8, !tbaa !53
  %square1219 = fmul double %385, %385
  %386 = fmul double %384, %square1219
  %387 = load ptr, ptr %318, align 8, !tbaa !42
  %388 = load i32, ptr %319, align 4, !tbaa !43
  %389 = mul nsw i32 %388, %359
  %390 = load i32, ptr %328, align 4, !tbaa !54
  %391 = add nsw i32 %389, %390
  %392 = sext i32 %391 to i64
  %393 = getelementptr inbounds double, ptr %387, i64 %392
  store double %386, ptr %393, align 8, !tbaa !36
  %394 = load i32, ptr %329, align 4, !tbaa !55
  %395 = sext i32 %394 to i64
  %396 = getelementptr inbounds double, ptr %246, i64 %395
  %397 = load double, ptr %396, align 8, !tbaa !36
  %398 = fmul double %397, 0x3FF5555555555555
  %399 = load i32, ptr %330, align 8, !tbaa !56
  %400 = sext i32 %399 to i64
  %401 = getelementptr inbounds double, ptr %246, i64 %400
  %402 = load double, ptr %401, align 8, !tbaa !36
  %403 = fdiv double %398, %402
  %404 = fmul double %386, %403
  %405 = load i32, ptr %331, align 8, !tbaa !57
  %406 = add nsw i32 %405, %389
  %407 = sext i32 %406 to i64
  %408 = getelementptr inbounds double, ptr %387, i64 %407
  store double %404, ptr %408, align 8, !tbaa !36
  %409 = load double, ptr %332, align 8, !tbaa !58
  %410 = load ptr, ptr %324, align 8, !tbaa !41
  %411 = getelementptr inbounds double, ptr %410, i64 %indvars.iv1371
  %412 = load double, ptr %411, align 8, !tbaa !36
  %413 = fadd double %412, 1.000000e+00
  %414 = fdiv double %413, 1.000000e+07
  %415 = load double, ptr %325, align 8, !tbaa !51
  %416 = call double @pow(double noundef %414, double noundef %415) #9
  %417 = fmul double %409, %416
  %418 = load double, ptr %333, align 8, !tbaa !59
  %419 = fmul double %417, %418
  %420 = load double, ptr %327, align 8, !tbaa !53
  %square1220 = fmul double %420, %420
  %421 = fmul double %419, %square1220
  %422 = load ptr, ptr %318, align 8, !tbaa !42
  %423 = load i32, ptr %319, align 4, !tbaa !43
  %424 = mul nsw i32 %423, %359
  %425 = load i32, ptr %334, align 8, !tbaa !60
  %426 = add nsw i32 %424, %425
  %427 = sext i32 %426 to i64
  %428 = getelementptr inbounds double, ptr %422, i64 %427
  store double %421, ptr %428, align 8, !tbaa !36
  br label %429

429:                                              ; preds = %345, %373
  %430 = phi i32 [ %358, %345 ], [ %423, %373 ]
  %431 = phi ptr [ %357, %345 ], [ %422, %373 ]
  %indvars.iv.next1372 = add nuw nsw i64 %indvars.iv1371, 1
  %432 = load i32, ptr %275, align 8, !tbaa !35
  %433 = sext i32 %432 to i64
  %434 = icmp slt i64 %indvars.iv.next1372, %433
  br i1 %434, label %335, label %._crit_edge1274, !llvm.loop !61

._crit_edge1274:                                  ; preds = %429, %._crit_edge.._crit_edge1274_crit_edge
  %435 = phi i32 [ %.pre1422, %._crit_edge.._crit_edge1274_crit_edge ], [ %430, %429 ]
  %436 = phi ptr [ %.pre, %._crit_edge.._crit_edge1274_crit_edge ], [ %431, %429 ]
  %.lcssa1266 = phi i32 [ %313, %._crit_edge.._crit_edge1274_crit_edge ], [ %432, %429 ]
  %437 = getelementptr inbounds i8, ptr %2, i64 392
  %438 = getelementptr inbounds i8, ptr %2, i64 372
  %439 = getelementptr inbounds i8, ptr %2, i64 284
  %440 = load i32, ptr %439, align 4, !tbaa !49
  %441 = getelementptr inbounds i8, ptr %2, i64 288
  %442 = load i32, ptr %441, align 8, !tbaa !62
  %443 = getelementptr inbounds i8, ptr %2, i64 606
  %444 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %.lcssa1266, ptr noundef %436, i32 noundef %435, i32 noundef %440, i32 noundef %442, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %445 = icmp eq i32 %444, 1
  br i1 %445, label %446, label %447

446:                                              ; preds = %._crit_edge1274
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %48) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %48, ptr noundef nonnull @.str, ptr noundef nonnull @.str.45, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 527, ptr noundef nonnull %48) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %48) #9
  br label %1873

447:                                              ; preds = %._crit_edge1274
  %448 = load i32, ptr %275, align 8, !tbaa !35
  %449 = load ptr, ptr %437, align 8, !tbaa !42
  %450 = load i32, ptr %438, align 4, !tbaa !43
  %451 = load i32, ptr %439, align 4, !tbaa !49
  %452 = load i32, ptr %441, align 8, !tbaa !62
  %453 = getelementptr inbounds i8, ptr %2, i64 280
  %454 = load i32, ptr %453, align 8, !tbaa !63
  %455 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %448, ptr noundef %449, i32 noundef %450, i32 noundef %451, i32 noundef %452, i32 noundef %454, ptr noundef nonnull %443) #9
  %456 = icmp eq i32 %455, 1
  br i1 %456, label %457, label %458

457:                                              ; preds = %447
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %49) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %49, ptr noundef nonnull @.str, ptr noundef nonnull @.str.46, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 539, ptr noundef nonnull %49) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %49) #9
  br label %1873

458:                                              ; preds = %447
  %459 = getelementptr inbounds i8, ptr %1, i64 742
  %460 = load i16, ptr %459, align 2, !tbaa !21
  %461 = icmp eq i16 %460, 1
  br i1 %461, label %462, label %505

462:                                              ; preds = %458
  %463 = load i32, ptr %275, align 8, !tbaa !35
  %464 = load ptr, ptr %437, align 8, !tbaa !42
  %465 = load i32, ptr %438, align 4, !tbaa !43
  %466 = getelementptr inbounds i8, ptr %2, i64 312
  %467 = load i32, ptr %466, align 8, !tbaa !57
  %468 = getelementptr inbounds i8, ptr %2, i64 316
  %469 = load i32, ptr %468, align 4, !tbaa !64
  %470 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %463, ptr noundef %464, i32 noundef %465, i32 noundef %467, i32 noundef %469, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %471 = icmp eq i32 %470, 1
  br i1 %471, label %472, label %473

472:                                              ; preds = %462
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %50) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %50, ptr noundef nonnull @.str, ptr noundef nonnull @.str.47, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 557, ptr noundef nonnull %50) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %50) #9
  br label %1873

473:                                              ; preds = %462
  %474 = load i32, ptr %275, align 8, !tbaa !35
  %475 = load ptr, ptr %437, align 8, !tbaa !42
  %476 = load i32, ptr %438, align 4, !tbaa !43
  %477 = load i32, ptr %466, align 8, !tbaa !57
  %478 = load i32, ptr %468, align 4, !tbaa !64
  %479 = getelementptr inbounds i8, ptr %2, i64 324
  %480 = load i32, ptr %479, align 4, !tbaa !65
  %481 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %474, ptr noundef %475, i32 noundef %476, i32 noundef %477, i32 noundef %478, i32 noundef %480, ptr noundef nonnull %443) #9
  %482 = icmp eq i32 %481, 1
  br i1 %482, label %483, label %484

483:                                              ; preds = %473
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %51) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %51, ptr noundef nonnull @.str, ptr noundef nonnull @.str.48, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 570, ptr noundef nonnull %51) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %51) #9
  br label %1873

484:                                              ; preds = %473
  %485 = load i32, ptr %275, align 8, !tbaa !35
  %486 = load ptr, ptr %437, align 8, !tbaa !42
  %487 = load i32, ptr %438, align 4, !tbaa !43
  %488 = getelementptr inbounds i8, ptr %2, i64 308
  %489 = load i32, ptr %488, align 4, !tbaa !54
  %490 = load i32, ptr %468, align 4, !tbaa !64
  %491 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %485, ptr noundef %486, i32 noundef %487, i32 noundef %489, i32 noundef %490, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %492 = icmp eq i32 %491, 1
  br i1 %492, label %493, label %494

493:                                              ; preds = %484
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %52) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %52, ptr noundef nonnull @.str, ptr noundef nonnull @.str.49, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 583, ptr noundef nonnull %52) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %52) #9
  br label %1873

494:                                              ; preds = %484
  %495 = load i32, ptr %275, align 8, !tbaa !35
  %496 = load ptr, ptr %437, align 8, !tbaa !42
  %497 = load i32, ptr %438, align 4, !tbaa !43
  %498 = load i32, ptr %488, align 4, !tbaa !54
  %499 = load i32, ptr %468, align 4, !tbaa !64
  %500 = getelementptr inbounds i8, ptr %2, i64 328
  %501 = load i32, ptr %500, align 8, !tbaa !66
  %502 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %495, ptr noundef %496, i32 noundef %497, i32 noundef %498, i32 noundef %499, i32 noundef %501, ptr noundef nonnull %443) #9
  %503 = icmp eq i32 %502, 1
  br i1 %503, label %504, label %505

504:                                              ; preds = %494
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %53) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %53, ptr noundef nonnull @.str, ptr noundef nonnull @.str.50, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 596, ptr noundef nonnull %53) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %53) #9
  br label %1873

505:                                              ; preds = %494, %458
  %506 = getelementptr inbounds i8, ptr %2, i64 42
  %507 = load i16, ptr %506, align 2, !tbaa !67
  %508 = icmp eq i16 %507, 1
  %.pre1426 = load i32, ptr %275, align 8, !tbaa !35
  br i1 %508, label %509, label %..loopexit1232_crit_edge

..loopexit1232_crit_edge:                         ; preds = %505
  %.pre1427 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1429 = load i32, ptr %438, align 4, !tbaa !43
  br label %.loopexit1232

509:                                              ; preds = %505
  %510 = sext i32 %.pre1426 to i64
  %511 = shl nsw i64 %510, 3
  %512 = call noalias ptr @malloc(i64 noundef %511) #10
  %513 = icmp eq ptr %512, null
  br i1 %513, label %520, label %.preheader1233

.preheader1233:                                   ; preds = %509
  %514 = icmp sgt i32 %.pre1426, 0
  br i1 %514, label %.lr.ph1277, label %.preheader1233.._crit_edge1278_crit_edge

.preheader1233.._crit_edge1278_crit_edge:         ; preds = %.preheader1233
  %.pre1423 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1424 = load i32, ptr %438, align 4, !tbaa !43
  %.pre1425 = load i32, ptr %439, align 4, !tbaa !49
  br label %._crit_edge1278

.lr.ph1277:                                       ; preds = %.preheader1233
  %515 = getelementptr inbounds i8, ptr %1, i64 842
  %516 = getelementptr inbounds i8, ptr %1, i64 848
  %517 = getelementptr inbounds i8, ptr %1, i64 480
  %518 = getelementptr inbounds i8, ptr %1, i64 476
  %519 = getelementptr inbounds i8, ptr %2, i64 276
  br label %522

520:                                              ; preds = %509
  %521 = shl i32 %.pre1426, 3
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %54) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %54, ptr noundef nonnull @.str.37, ptr noundef nonnull @.str.51, i32 noundef %521) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 610, ptr noundef nonnull %54) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %54) #9
  br label %1873

522:                                              ; preds = %.lr.ph1277, %537
  %indvars.iv1374 = phi i64 [ 0, %.lr.ph1277 ], [ %indvars.iv.next1375, %537 ]
  %523 = phi i32 [ %.pre1426, %.lr.ph1277 ], [ %549, %537 ]
  %524 = trunc nuw nsw i64 %indvars.iv1374 to i32
  %525 = xor i32 %524, -1
  %526 = add i32 %523, %525
  %527 = sext i32 %526 to i64
  %528 = getelementptr inbounds double, ptr %279, i64 %527
  %529 = load double, ptr %528, align 8, !tbaa !36
  %530 = getelementptr inbounds double, ptr %512, i64 %indvars.iv1374
  store double %529, ptr %530, align 8, !tbaa !36
  %531 = load i16, ptr %515, align 2, !tbaa !44
  %532 = load i16, ptr %516, align 8, !tbaa !45
  %533 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %529, i16 noundef signext %531, i16 noundef signext %532, ptr noundef nonnull %4, ptr noundef %246) #9
  %534 = icmp eq i32 %533, 1
  br i1 %534, label %535, label %537

535:                                              ; preds = %522
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %55) #9
  %536 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %55, ptr noundef nonnull @.str, ptr noundef nonnull @.str.52, ptr noundef nonnull %536) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 624, ptr noundef nonnull %55) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %55) #9
  br label %1873

537:                                              ; preds = %522
  %538 = load i32, ptr %517, align 8, !tbaa !46
  %539 = sext i32 %538 to i64
  %540 = getelementptr inbounds double, ptr %246, i64 %539
  %541 = load double, ptr %540, align 8, !tbaa !36
  %542 = fmul double %541, 7.500000e-01
  %543 = load i32, ptr %518, align 4, !tbaa !47
  %544 = sext i32 %543 to i64
  %545 = getelementptr inbounds double, ptr %246, i64 %544
  %546 = load double, ptr %545, align 8, !tbaa !36
  %547 = fdiv double %542, %546
  %548 = load ptr, ptr %437, align 8, !tbaa !42
  %549 = load i32, ptr %275, align 8, !tbaa !35
  %550 = add i32 %549, %525
  %551 = load i32, ptr %438, align 4, !tbaa !43
  %552 = mul nsw i32 %550, %551
  %553 = load i32, ptr %519, align 4, !tbaa !48
  %554 = add nsw i32 %552, %553
  %555 = sext i32 %554 to i64
  %556 = getelementptr inbounds double, ptr %548, i64 %555
  %557 = load double, ptr %556, align 8, !tbaa !36
  %558 = fmul double %547, %547
  %559 = fadd double %547, 1.000000e+00
  %560 = insertelement <2 x double> <double poison, double 0x3FC5555555555555>, double %558, i64 0
  %561 = insertelement <2 x double> poison, double %559, i64 0
  %562 = insertelement <2 x double> %561, double %557, i64 1
  %563 = fdiv <2 x double> %560, %562
  %564 = extractelement <2 x double> %563, i64 0
  %565 = fadd double %564, 0x3FF1111111111111
  %566 = extractelement <2 x double> %563, i64 1
  %567 = fmul double %565, %566
  %568 = fdiv double %567, %559
  %569 = mul nsw i32 %551, %524
  %570 = load i32, ptr %439, align 4, !tbaa !49
  %571 = add nsw i32 %570, %569
  %572 = sext i32 %571 to i64
  %573 = getelementptr inbounds double, ptr %548, i64 %572
  store double %568, ptr %573, align 8, !tbaa !36
  %indvars.iv.next1375 = add nuw nsw i64 %indvars.iv1374, 1
  %574 = sext i32 %549 to i64
  %575 = icmp slt i64 %indvars.iv.next1375, %574
  br i1 %575, label %522, label %._crit_edge1278, !llvm.loop !68

._crit_edge1278:                                  ; preds = %537, %.preheader1233.._crit_edge1278_crit_edge
  %576 = phi i32 [ %.pre1425, %.preheader1233.._crit_edge1278_crit_edge ], [ %570, %537 ]
  %577 = phi i32 [ %.pre1424, %.preheader1233.._crit_edge1278_crit_edge ], [ %551, %537 ]
  %578 = phi ptr [ %.pre1423, %.preheader1233.._crit_edge1278_crit_edge ], [ %548, %537 ]
  %.lcssa1264 = phi i32 [ %.pre1426, %.preheader1233.._crit_edge1278_crit_edge ], [ %549, %537 ]
  %579 = load i32, ptr %441, align 8, !tbaa !62
  %580 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %512, i32 noundef %.lcssa1264, ptr noundef %578, i32 noundef %577, i32 noundef %576, i32 noundef %579, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %581 = icmp eq i32 %580, 1
  br i1 %581, label %582, label %583

582:                                              ; preds = %._crit_edge1278
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %56) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %56, ptr noundef nonnull @.str, ptr noundef nonnull @.str.53, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 644, ptr noundef nonnull %56) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %56) #9
  br label %1873

583:                                              ; preds = %._crit_edge1278
  %584 = load i32, ptr %275, align 8, !tbaa !35
  %585 = load ptr, ptr %437, align 8, !tbaa !42
  %586 = load i32, ptr %438, align 4, !tbaa !43
  %587 = load i32, ptr %439, align 4, !tbaa !49
  %588 = load i32, ptr %441, align 8, !tbaa !62
  %589 = getelementptr inbounds i8, ptr %2, i64 296
  %590 = load i32, ptr %589, align 8, !tbaa !69
  %591 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef nonnull %512, i32 noundef %584, ptr noundef %585, i32 noundef %586, i32 noundef %587, i32 noundef %588, i32 noundef %590, ptr noundef nonnull %443) #9
  %592 = icmp eq i32 %591, 1
  br i1 %592, label %593, label %594

593:                                              ; preds = %583
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %57) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %57, ptr noundef nonnull @.str, ptr noundef nonnull @.str.54, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 657, ptr noundef nonnull %57) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %57) #9
  br label %1873

594:                                              ; preds = %583
  call void @free(ptr noundef nonnull %512) #9
  %595 = load i32, ptr %275, align 8, !tbaa !35
  %596 = icmp sgt i32 %595, 0
  %.pre1428 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1430 = load i32, ptr %438, align 4, !tbaa !43
  br i1 %596, label %.lr.ph1282, label %.loopexit1232

.lr.ph1282:                                       ; preds = %594
  %597 = add nsw i32 %595, -1
  %598 = mul nsw i32 %.pre1430, %597
  %599 = getelementptr inbounds i8, ptr %2, i64 276
  %600 = load i32, ptr %599, align 4, !tbaa !48
  %601 = add nsw i32 %598, %600
  %602 = sext i32 %601 to i64
  %603 = getelementptr inbounds double, ptr %.pre1428, i64 %602
  %604 = load double, ptr %603, align 8, !tbaa !36
  %605 = zext nneg i32 %597 to i64
  %606 = getelementptr inbounds double, ptr %279, i64 %605
  %607 = load double, ptr %606, align 8, !tbaa !36
  %608 = fmul double %607, 0x3FAE573AC901E574
  %609 = fdiv double %608, %604
  %610 = getelementptr inbounds i8, ptr %2, i64 368
  br label %611

611:                                              ; preds = %.lr.ph1282, %611
  %612 = phi i32 [ %.pre1430, %.lr.ph1282 ], [ %627, %611 ]
  %613 = phi ptr [ %.pre1428, %.lr.ph1282 ], [ %626, %611 ]
  %614 = phi i32 [ %595, %.lr.ph1282 ], [ %634, %611 ]
  %.31280 = phi i32 [ 0, %.lr.ph1282 ], [ %633, %611 ]
  %615 = xor i32 %.31280, -1
  %616 = add i32 %614, %615
  %617 = mul nsw i32 %612, %616
  %618 = load i32, ptr %589, align 8, !tbaa !69
  %619 = add nsw i32 %617, %618
  %620 = sext i32 %619 to i64
  %621 = getelementptr inbounds double, ptr %613, i64 %620
  %622 = load double, ptr %621, align 8, !tbaa !36
  %623 = fadd double %609, %622
  %624 = call double @sqrt(double noundef %623) #9
  %625 = fmul double %624, 0x401921FB54442D18
  %626 = load ptr, ptr %437, align 8, !tbaa !42
  %627 = load i32, ptr %438, align 4, !tbaa !43
  %628 = mul nsw i32 %627, %.31280
  %629 = load i32, ptr %610, align 8, !tbaa !70
  %630 = add nsw i32 %628, %629
  %631 = sext i32 %630 to i64
  %632 = getelementptr inbounds double, ptr %626, i64 %631
  store double %625, ptr %632, align 8, !tbaa !36
  %633 = add nuw nsw i32 %.31280, 1
  %634 = load i32, ptr %275, align 8, !tbaa !35
  %635 = icmp slt i32 %633, %634
  br i1 %635, label %611, label %.loopexit1232, !llvm.loop !71

.loopexit1232:                                    ; preds = %611, %..loopexit1232_crit_edge, %594
  %636 = phi i32 [ %.pre1430, %594 ], [ %.pre1429, %..loopexit1232_crit_edge ], [ %627, %611 ]
  %637 = phi ptr [ %.pre1428, %594 ], [ %.pre1427, %..loopexit1232_crit_edge ], [ %626, %611 ]
  %638 = phi i32 [ %595, %594 ], [ %.pre1426, %..loopexit1232_crit_edge ], [ %634, %611 ]
  %639 = getelementptr inbounds i8, ptr %2, i64 276
  %640 = load i32, ptr %639, align 4, !tbaa !48
  %641 = load i32, ptr %441, align 8, !tbaa !62
  %642 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %638, ptr noundef %637, i32 noundef %636, i32 noundef %640, i32 noundef %641, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %643 = icmp eq i32 %642, 1
  br i1 %643, label %644, label %645

644:                                              ; preds = %.loopexit1232
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %58) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %58, ptr noundef nonnull @.str, ptr noundef nonnull @.str.55, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 690, ptr noundef nonnull %58) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %58) #9
  br label %1873

645:                                              ; preds = %.loopexit1232
  %646 = load i32, ptr %275, align 8, !tbaa !35
  %647 = load ptr, ptr %437, align 8, !tbaa !42
  %648 = load i32, ptr %438, align 4, !tbaa !43
  %649 = load i32, ptr %639, align 4, !tbaa !48
  %650 = load i32, ptr %441, align 8, !tbaa !62
  %651 = load i32, ptr %439, align 4, !tbaa !49
  %652 = call i32 @array_derive_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %646, ptr noundef %647, i32 noundef %648, i32 noundef %649, i32 noundef %650, i32 noundef %651, ptr noundef nonnull %443) #9
  %653 = icmp eq i32 %652, 1
  br i1 %653, label %654, label %655

654:                                              ; preds = %645
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %59) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %59, ptr noundef nonnull @.str, ptr noundef nonnull @.str.56, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 702, ptr noundef nonnull %59) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %59) #9
  br label %1873

655:                                              ; preds = %645
  %656 = load i32, ptr %275, align 8, !tbaa !35
  %657 = load ptr, ptr %437, align 8, !tbaa !42
  %658 = load i32, ptr %438, align 4, !tbaa !43
  %659 = load i32, ptr %639, align 4, !tbaa !48
  %660 = load i32, ptr %441, align 8, !tbaa !62
  %661 = getelementptr inbounds i8, ptr %2, i64 296
  %662 = load i32, ptr %661, align 8, !tbaa !69
  %663 = call i32 @array_integrate_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %656, ptr noundef %657, i32 noundef %658, i32 noundef %659, i32 noundef %660, i32 noundef %662, ptr noundef nonnull %443) #9
  %664 = icmp eq i32 %663, 1
  br i1 %664, label %665, label %666

665:                                              ; preds = %655
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %60) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %60, ptr noundef nonnull @.str, ptr noundef nonnull @.str.57, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 714, ptr noundef nonnull %60) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %60) #9
  br label %1873

666:                                              ; preds = %655
  %667 = getelementptr inbounds i8, ptr %2, i64 40
  %668 = load i16, ptr %667, align 8, !tbaa !72
  %669 = icmp eq i16 %668, 1
  br i1 %669, label %670, label %692

670:                                              ; preds = %666
  %671 = load i32, ptr %275, align 8, !tbaa !35
  %672 = load ptr, ptr %437, align 8, !tbaa !42
  %673 = load i32, ptr %438, align 4, !tbaa !43
  %674 = getelementptr inbounds i8, ptr %2, i64 352
  %675 = load i32, ptr %674, align 8, !tbaa !73
  %676 = getelementptr inbounds i8, ptr %2, i64 360
  %677 = load i32, ptr %676, align 8, !tbaa !74
  %678 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %671, ptr noundef %672, i32 noundef %673, i32 noundef %675, i32 noundef %677, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %679 = icmp eq i32 %678, 1
  br i1 %679, label %680, label %681

680:                                              ; preds = %670
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %61) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %61, ptr noundef nonnull @.str, ptr noundef nonnull @.str.58, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 729, ptr noundef nonnull %61) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %61) #9
  br label %1873

681:                                              ; preds = %670
  %682 = load i32, ptr %275, align 8, !tbaa !35
  %683 = load ptr, ptr %437, align 8, !tbaa !42
  %684 = load i32, ptr %438, align 4, !tbaa !43
  %685 = load i32, ptr %674, align 8, !tbaa !73
  %686 = load i32, ptr %676, align 8, !tbaa !74
  %687 = getelementptr inbounds i8, ptr %2, i64 356
  %688 = load i32, ptr %687, align 4, !tbaa !75
  %689 = call i32 @array_derive_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %682, ptr noundef %683, i32 noundef %684, i32 noundef %685, i32 noundef %686, i32 noundef %688, ptr noundef nonnull %443) #9
  %690 = icmp eq i32 %689, 1
  br i1 %690, label %691, label %692

691:                                              ; preds = %681
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %62) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %62, ptr noundef nonnull @.str, ptr noundef nonnull @.str.59, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 742, ptr noundef nonnull %62) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %62) #9
  br label %1873

692:                                              ; preds = %681, %666
  %693 = load i32, ptr %275, align 8, !tbaa !35
  %694 = icmp sgt i32 %693, 0
  %.pre1433 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1434 = load i32, ptr %438, align 4, !tbaa !43
  br i1 %694, label %.lr.ph1286, label %._crit_edge1287

.lr.ph1286:                                       ; preds = %692
  %695 = getelementptr inbounds i8, ptr %2, i64 292
  %696 = getelementptr inbounds i8, ptr %2, i64 300
  %697 = getelementptr inbounds i8, ptr %2, i64 304
  %698 = getelementptr inbounds i8, ptr %2, i64 364
  %699 = getelementptr inbounds i8, ptr %2, i64 324
  %700 = getelementptr inbounds i8, ptr %2, i64 328
  %701 = getelementptr inbounds i8, ptr %2, i64 312
  %702 = getelementptr inbounds i8, ptr %2, i64 332
  br label %703

703:                                              ; preds = %.lr.ph1286, %856
  %704 = phi i32 [ %.pre1434, %.lr.ph1286 ], [ %857, %856 ]
  %705 = phi ptr [ %.pre1433, %.lr.ph1286 ], [ %858, %856 ]
  %.41284.in = phi i32 [ %693, %.lr.ph1286 ], [ %.41284, %856 ]
  %.41284 = add nsw i32 %.41284.in, -1
  %706 = mul nsw i32 %704, %.41284
  %707 = load i32, ptr %639, align 4, !tbaa !48
  %708 = add nsw i32 %706, %707
  %709 = sext i32 %708 to i64
  %710 = getelementptr inbounds double, ptr %705, i64 %709
  %711 = load double, ptr %710, align 8, !tbaa !36
  %712 = load i32, ptr %661, align 8, !tbaa !69
  %713 = add nsw i32 %712, %706
  %714 = sext i32 %713 to i64
  %715 = getelementptr inbounds double, ptr %705, i64 %714
  %716 = load double, ptr %715, align 8, !tbaa !36
  %717 = call double @exp(double noundef %716) #9
  %718 = fmul double %711, %717
  %719 = fcmp oeq double %718, 0.000000e+00
  %.01164 = select i1 %719, double 0x10000000000000, double %718
  %720 = load ptr, ptr %437, align 8, !tbaa !42
  %721 = load i32, ptr %438, align 4, !tbaa !43
  %722 = mul nsw i32 %721, %.41284
  %723 = load i32, ptr %661, align 8, !tbaa !69
  %724 = add nsw i32 %722, %723
  %725 = sext i32 %724 to i64
  %726 = getelementptr inbounds double, ptr %720, i64 %725
  %727 = load double, ptr %726, align 8, !tbaa !36
  %728 = call double @exp(double noundef %727) #9
  %729 = load ptr, ptr %437, align 8, !tbaa !42
  %730 = load i32, ptr %438, align 4, !tbaa !43
  %731 = mul nsw i32 %730, %.41284
  %732 = load i32, ptr %695, align 4, !tbaa !76
  %733 = add nsw i32 %731, %732
  %734 = sext i32 %733 to i64
  %735 = getelementptr inbounds double, ptr %729, i64 %734
  store double %728, ptr %735, align 8, !tbaa !36
  %736 = load i32, ptr %439, align 4, !tbaa !49
  %737 = add nsw i32 %736, %731
  %738 = sext i32 %737 to i64
  %739 = getelementptr inbounds double, ptr %729, i64 %738
  %740 = load double, ptr %739, align 8, !tbaa !36
  %741 = load i32, ptr %639, align 4, !tbaa !48
  %742 = add nsw i32 %741, %731
  %743 = sext i32 %742 to i64
  %744 = getelementptr inbounds double, ptr %729, i64 %743
  %745 = load double, ptr %744, align 8, !tbaa !36
  %746 = call double @llvm.fmuladd.f64(double %745, double %745, double %740)
  %747 = load i32, ptr %661, align 8, !tbaa !69
  %748 = add nsw i32 %747, %731
  %749 = sext i32 %748 to i64
  %750 = getelementptr inbounds double, ptr %729, i64 %749
  %751 = load double, ptr %750, align 8, !tbaa !36
  %752 = call double @exp(double noundef %751) #9
  %753 = fmul double %746, %752
  %754 = load ptr, ptr %437, align 8, !tbaa !42
  %755 = load i32, ptr %438, align 4, !tbaa !43
  %756 = mul nsw i32 %755, %.41284
  %757 = load i32, ptr %696, align 4, !tbaa !77
  %758 = add nsw i32 %756, %757
  %759 = sext i32 %758 to i64
  %760 = getelementptr inbounds double, ptr %754, i64 %759
  store double %753, ptr %760, align 8, !tbaa !36
  %761 = load i32, ptr %441, align 8, !tbaa !62
  %762 = add nsw i32 %761, %756
  %763 = sext i32 %762 to i64
  %764 = getelementptr inbounds double, ptr %754, i64 %763
  %765 = load double, ptr %764, align 8, !tbaa !36
  %766 = load i32, ptr %639, align 4, !tbaa !48
  %767 = add nsw i32 %766, %756
  %768 = sext i32 %767 to i64
  %769 = getelementptr inbounds double, ptr %754, i64 %768
  %770 = load double, ptr %769, align 8, !tbaa !36
  %771 = load i32, ptr %439, align 4, !tbaa !49
  %772 = add nsw i32 %771, %756
  %773 = sext i32 %772 to i64
  %774 = getelementptr inbounds double, ptr %754, i64 %773
  %775 = load double, ptr %774, align 8, !tbaa !36
  %776 = fmul double %770, %775
  %777 = call double @llvm.fmuladd.f64(double %776, double 3.000000e+00, double %765)
  %778 = fmul double %770, %770
  %779 = call double @llvm.fmuladd.f64(double %778, double %770, double %777)
  %780 = load i32, ptr %661, align 8, !tbaa !69
  %781 = add nsw i32 %780, %756
  %782 = sext i32 %781 to i64
  %783 = getelementptr inbounds double, ptr %754, i64 %782
  %784 = load double, ptr %783, align 8, !tbaa !36
  %785 = call double @exp(double noundef %784) #9
  %786 = fmul double %779, %785
  %787 = load ptr, ptr %437, align 8, !tbaa !42
  %788 = load i32, ptr %438, align 4, !tbaa !43
  %789 = mul nsw i32 %788, %.41284
  %790 = load i32, ptr %697, align 8, !tbaa !78
  %791 = add nsw i32 %789, %790
  %792 = sext i32 %791 to i64
  %793 = getelementptr inbounds double, ptr %787, i64 %792
  store double %786, ptr %793, align 8, !tbaa !36
  %794 = load i32, ptr %661, align 8, !tbaa !69
  %795 = add nsw i32 %794, %789
  %796 = sext i32 %795 to i64
  %797 = getelementptr inbounds double, ptr %787, i64 %796
  store double %.01164, ptr %797, align 8, !tbaa !36
  %798 = load i32, ptr %639, align 4, !tbaa !48
  %799 = add nsw i32 %798, %789
  %800 = sext i32 %799 to i64
  %801 = getelementptr inbounds double, ptr %787, i64 %800
  %802 = load double, ptr %801, align 8, !tbaa !36
  %803 = fcmp oeq double %802, 0.000000e+00
  br i1 %803, label %804, label %805

804:                                              ; preds = %703
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %63) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %63, ptr noundef nonnull @.str.60) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %64) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %64, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.61, ptr noundef nonnull %63) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 784, ptr noundef nonnull %64) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %64) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %63) #9
  br label %1873

805:                                              ; preds = %703
  %square1217 = fmul double %802, %802
  %806 = load i32, ptr %439, align 4, !tbaa !49
  %807 = add nsw i32 %806, %789
  %808 = sext i32 %807 to i64
  %809 = getelementptr inbounds double, ptr %787, i64 %808
  %810 = load double, ptr %809, align 8, !tbaa !36
  %811 = fdiv double %810, %802
  %square1218 = fmul double %811, %811
  %812 = fadd double %square1217, %square1218
  %813 = load i32, ptr %441, align 8, !tbaa !62
  %814 = add nsw i32 %813, %789
  %815 = sext i32 %814 to i64
  %816 = getelementptr inbounds double, ptr %787, i64 %815
  %817 = load double, ptr %816, align 8, !tbaa !36
  %818 = fdiv double %817, %802
  %819 = call double @llvm.fabs.f64(double %818)
  %820 = fadd double %812, %819
  %sqrt = call double @llvm.sqrt.f64(double %820)
  %821 = load i32, ptr %698, align 4, !tbaa !79
  %822 = add nsw i32 %789, %821
  %823 = sext i32 %822 to i64
  %824 = getelementptr inbounds double, ptr %787, i64 %823
  store double %sqrt, ptr %824, align 8, !tbaa !36
  %825 = load i16, ptr %459, align 2, !tbaa !21
  %826 = icmp eq i16 %825, 1
  br i1 %826, label %827, label %856

827:                                              ; preds = %805
  %828 = load i32, ptr %699, align 4, !tbaa !65
  %829 = add nsw i32 %828, %789
  %830 = sext i32 %829 to i64
  %831 = getelementptr inbounds double, ptr %787, i64 %830
  %832 = load double, ptr %831, align 8, !tbaa !36
  %833 = fneg double %832
  store double %833, ptr %831, align 8, !tbaa !36
  %834 = load i32, ptr %700, align 8, !tbaa !66
  %835 = add nsw i32 %834, %789
  %836 = sext i32 %835 to i64
  %837 = getelementptr inbounds double, ptr %787, i64 %836
  %838 = load double, ptr %837, align 8, !tbaa !36
  %839 = fneg double %838
  store double %839, ptr %837, align 8, !tbaa !36
  %840 = load i32, ptr %701, align 8, !tbaa !57
  %841 = add nsw i32 %840, %789
  %842 = sext i32 %841 to i64
  %843 = getelementptr inbounds double, ptr %787, i64 %842
  %844 = load double, ptr %843, align 8, !tbaa !36
  %845 = load double, ptr %831, align 8, !tbaa !36
  %846 = fneg double %845
  %847 = call double @exp(double noundef %846) #9
  %848 = fmul double %844, %847
  %849 = load ptr, ptr %437, align 8, !tbaa !42
  %850 = load i32, ptr %438, align 4, !tbaa !43
  %851 = mul nsw i32 %850, %.41284
  %852 = load i32, ptr %702, align 4, !tbaa !80
  %853 = add nsw i32 %851, %852
  %854 = sext i32 %853 to i64
  %855 = getelementptr inbounds double, ptr %849, i64 %854
  store double %848, ptr %855, align 8, !tbaa !36
  br label %856

856:                                              ; preds = %805, %827
  %857 = phi i32 [ %788, %805 ], [ %850, %827 ]
  %858 = phi ptr [ %787, %805 ], [ %849, %827 ]
  %859 = icmp ugt i32 %.41284.in, 1
  br i1 %859, label %703, label %._crit_edge1287.loopexit, !llvm.loop !81

._crit_edge1287.loopexit:                         ; preds = %856
  %.pre1435 = load i32, ptr %275, align 8, !tbaa !35
  br label %._crit_edge1287

._crit_edge1287:                                  ; preds = %._crit_edge1287.loopexit, %692
  %860 = phi i32 [ %.pre1435, %._crit_edge1287.loopexit ], [ %693, %692 ]
  %861 = phi i32 [ %857, %._crit_edge1287.loopexit ], [ %.pre1434, %692 ]
  %862 = phi ptr [ %858, %._crit_edge1287.loopexit ], [ %.pre1433, %692 ]
  %863 = getelementptr inbounds i8, ptr %2, i64 364
  %864 = load i32, ptr %863, align 4, !tbaa !79
  %865 = getelementptr inbounds i8, ptr %0, i64 624
  %866 = load i32, ptr %865, align 8, !tbaa !82
  %867 = call i32 @array_smooth(ptr noundef %862, i32 noundef %861, i32 noundef %860, i32 noundef %864, i32 noundef %866, ptr noundef nonnull %443) #9
  %868 = icmp eq i32 %867, 1
  br i1 %868, label %869, label %870

869:                                              ; preds = %._crit_edge1287
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %65) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %65, ptr noundef nonnull @.str, ptr noundef nonnull @.str.62, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 818, ptr noundef nonnull %65) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %65) #9
  br label %1873

870:                                              ; preds = %._crit_edge1287
  %871 = load i16, ptr %459, align 2, !tbaa !21
  %872 = icmp eq i16 %871, 1
  %.pre1437 = load i32, ptr %275, align 8, !tbaa !35
  %.pre1438 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1439 = load i32, ptr %438, align 4, !tbaa !43
  br i1 %872, label %873, label %.loopexit1231

873:                                              ; preds = %870
  %874 = getelementptr inbounds i8, ptr %2, i64 308
  %875 = load i32, ptr %874, align 4, !tbaa !54
  %876 = getelementptr inbounds i8, ptr %2, i64 316
  %877 = load i32, ptr %876, align 4, !tbaa !64
  %878 = call i32 @array_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %.pre1437, ptr noundef %.pre1438, i32 noundef %.pre1439, i32 noundef %875, i32 noundef %877, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %879 = icmp eq i32 %878, 1
  br i1 %879, label %880, label %881

880:                                              ; preds = %873
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %66) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %66, ptr noundef nonnull @.str, ptr noundef nonnull @.str.49, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 833, ptr noundef nonnull %66) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %66) #9
  br label %1873

881:                                              ; preds = %873
  %882 = load i32, ptr %275, align 8, !tbaa !35
  %883 = load ptr, ptr %437, align 8, !tbaa !42
  %884 = load i32, ptr %438, align 4, !tbaa !43
  %885 = load i32, ptr %874, align 4, !tbaa !54
  %886 = load i32, ptr %876, align 4, !tbaa !64
  %887 = getelementptr inbounds i8, ptr %2, i64 312
  %888 = load i32, ptr %887, align 8, !tbaa !57
  %889 = call i32 @array_derive_spline_table_line_to_line(ptr noundef nonnull %279, i32 noundef %882, ptr noundef %883, i32 noundef %884, i32 noundef %885, i32 noundef %886, i32 noundef %888, ptr noundef nonnull %443) #9
  %890 = icmp eq i32 %889, 1
  br i1 %890, label %891, label %892

891:                                              ; preds = %881
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %67) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %67, ptr noundef nonnull @.str, ptr noundef nonnull @.str.63, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 845, ptr noundef nonnull %67) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %67) #9
  br label %1873

892:                                              ; preds = %881
  %893 = getelementptr inbounds i8, ptr %2, i64 384
  %894 = load ptr, ptr %893, align 8, !tbaa !41
  %895 = load i32, ptr %275, align 8, !tbaa !35
  %896 = sext i32 %895 to i64
  %897 = getelementptr double, ptr %894, i64 %896
  %898 = getelementptr i8, ptr %897, i64 -8
  %899 = load double, ptr %898, align 8, !tbaa !36
  %900 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %899, ptr noundef nonnull %8) #9
  %901 = icmp eq i32 %900, 1
  br i1 %901, label %902, label %904

902:                                              ; preds = %892
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %68) #9
  %903 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %68, ptr noundef nonnull @.str, ptr noundef nonnull @.str.64, ptr noundef nonnull %903) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 855, ptr noundef nonnull %68) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %68) #9
  br label %1873

904:                                              ; preds = %892
  %905 = load double, ptr %8, align 8, !tbaa !36
  %906 = getelementptr inbounds i8, ptr %1, i64 840
  %907 = load i16, ptr %906, align 8, !tbaa !83
  %908 = getelementptr inbounds i8, ptr %1, i64 846
  %909 = load i16, ptr %908, align 2, !tbaa !84
  %910 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %905, i16 noundef signext %907, i16 noundef signext %909, ptr noundef nonnull %4, ptr noundef %246) #9
  %911 = icmp eq i32 %910, 1
  br i1 %911, label %912, label %914

912:                                              ; preds = %904
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %69) #9
  %913 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %69, ptr noundef nonnull @.str, ptr noundef nonnull @.str.65, ptr noundef nonnull %913) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 859, ptr noundef nonnull %69) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %69) #9
  br label %1873

914:                                              ; preds = %904
  %915 = getelementptr inbounds i8, ptr %1, i64 120
  %916 = load double, ptr %915, align 8, !tbaa !59
  %917 = fmul double %916, 2.000000e+00
  %918 = getelementptr inbounds i8, ptr %1, i64 328
  %919 = load double, ptr %918, align 8, !tbaa !53
  %square = fmul double %919, %919
  %920 = fmul double %917, %square
  %921 = getelementptr inbounds i8, ptr %2, i64 240
  %922 = load double, ptr %921, align 8, !tbaa !50
  %923 = fmul double %922, %920
  %924 = fadd double %899, 1.000000e+00
  %925 = getelementptr inbounds i8, ptr %2, i64 256
  %926 = load double, ptr %925, align 8, !tbaa !51
  %927 = fadd double %926, 1.000000e+00
  %928 = call double @pow(double noundef %924, double noundef %927) #9
  %929 = fmul double %923, %928
  %930 = load double, ptr %925, align 8, !tbaa !51
  %931 = call double @pow(double noundef 1.000000e+07, double noundef %930) #9
  %932 = fdiv double %929, %931
  %933 = getelementptr inbounds i8, ptr %1, i64 464
  %934 = load i32, ptr %933, align 8, !tbaa !85
  %935 = sext i32 %934 to i64
  %936 = getelementptr inbounds double, ptr %246, i64 %935
  %937 = load double, ptr %936, align 8, !tbaa !36
  %938 = fmul double %937, 1.000000e-03
  %939 = getelementptr inbounds i8, ptr %1, i64 468
  %940 = load i32, ptr %939, align 4, !tbaa !86
  %941 = sext i32 %940 to i64
  %942 = getelementptr inbounds double, ptr %246, i64 %941
  %943 = load double, ptr %942, align 8, !tbaa !36
  %944 = fmul double %938, %943
  %945 = fcmp ogt double %932, %944
  %946 = getelementptr inbounds i8, ptr %1, i64 128
  %947 = load double, ptr %946, align 8, !tbaa !87
  %948 = fmul double %924, %947
  br i1 %945, label %960, label %949

949:                                              ; preds = %914
  %950 = fmul double %937, %943
  %951 = fdiv double %932, %950
  %952 = fadd double %951, 1.000000e+00
  %953 = fdiv double %951, %952
  %954 = fmul double %953, %948
  %955 = fsub double %948, %954
  %956 = fneg double %932
  %957 = fdiv double %956, %943
  %958 = fmul double %957, %955
  %959 = call double @llvm.fmuladd.f64(double %954, double 2.000000e+00, double %958)
  br label %960

960:                                              ; preds = %914, %949
  %.01180 = phi double [ %954, %949 ], [ %948, %914 ]
  %.01170 = phi double [ %959, %949 ], [ %947, %914 ]
  %961 = load ptr, ptr %437, align 8, !tbaa !42
  %962 = load i32, ptr %275, align 8, !tbaa !35
  %963 = add nsw i32 %962, -1
  %964 = load i32, ptr %438, align 4, !tbaa !43
  %965 = mul nsw i32 %963, %964
  %966 = getelementptr inbounds i8, ptr %2, i64 340
  %967 = load i32, ptr %966, align 4, !tbaa !88
  %968 = add nsw i32 %965, %967
  %969 = sext i32 %968 to i64
  %970 = getelementptr inbounds double, ptr %961, i64 %969
  store double %.01180, ptr %970, align 8, !tbaa !36
  %971 = fmul double %.01180, 0x3B30B0E7F1528C6D
  %972 = fdiv double %971, 0x3C07A4DA04A6DAF5
  %973 = getelementptr inbounds i8, ptr %2, i64 264
  %974 = load double, ptr %973, align 8, !tbaa !89
  %975 = fdiv double %972, %974
  %976 = fdiv double %.01170, 3.000000e+00
  %977 = fdiv double %976, %.01180
  %978 = fadd double %977, 1.000000e+00
  %979 = fmul double %978, %975
  %980 = getelementptr inbounds i8, ptr %2, i64 336
  %981 = load i32, ptr %980, align 8, !tbaa !90
  %982 = add nsw i32 %981, %965
  %983 = sext i32 %982 to i64
  %984 = getelementptr inbounds double, ptr %961, i64 %983
  store double %979, ptr %984, align 8, !tbaa !36
  %985 = icmp sgt i32 %962, 1
  br i1 %985, label %.lr.ph1307, label %.loopexit1231

.lr.ph1307:                                       ; preds = %960
  %986 = add nsw i32 %962, -2
  %987 = getelementptr inbounds i8, ptr %1, i64 128
  %988 = zext nneg i32 %986 to i64
  br label %989

989:                                              ; preds = %.lr.ph1307, %.loopexit
  %indvars.iv1377 = phi i64 [ %988, %.lr.ph1307 ], [ %indvars.iv.next1378, %.loopexit ]
  %.011651304 = phi double [ %932, %.lr.ph1307 ], [ %.31168, %.loopexit ]
  %.111711303 = phi double [ %.01170, %.lr.ph1307 ], [ %.41174, %.loopexit ]
  %.011761302 = phi double [ %899, %.lr.ph1307 ], [ %.11177, %.loopexit ]
  %.011781301 = phi double [ %.01180, %.lr.ph1307 ], [ %.11179, %.loopexit ]
  %.111811300 = phi double [ %.01180, %.lr.ph1307 ], [ %.41184, %.loopexit ]
  %.011851299 = phi double [ %899, %.lr.ph1307 ], [ %.41189, %.loopexit ]
  %990 = load i32, ptr %933, align 8, !tbaa !85
  %991 = sext i32 %990 to i64
  %992 = getelementptr inbounds double, ptr %246, i64 %991
  %993 = load double, ptr %992, align 8, !tbaa !36
  %994 = fmul double %993, 1.000000e+03
  %995 = load i32, ptr %939, align 4, !tbaa !86
  %996 = sext i32 %995 to i64
  %997 = getelementptr inbounds double, ptr %246, i64 %996
  %998 = load double, ptr %997, align 8, !tbaa !36
  %999 = fmul double %994, %998
  %1000 = fcmp ogt double %.011651304, %999
  br i1 %1000, label %1001, label %1035

1001:                                             ; preds = %989
  %1002 = load ptr, ptr %893, align 8, !tbaa !41
  %1003 = getelementptr inbounds double, ptr %1002, i64 %indvars.iv1377
  %1004 = load double, ptr %1003, align 8, !tbaa !36
  %1005 = load double, ptr %987, align 8, !tbaa !87
  %1006 = fadd double %1004, 1.000000e+00
  %1007 = fmul double %1005, %1006
  %1008 = load double, ptr %915, align 8, !tbaa !59
  %1009 = fmul double %1008, 2.000000e+00
  %1010 = load double, ptr %918, align 8, !tbaa !53
  %square1216 = fmul double %1010, %1010
  %1011 = fmul double %1009, %square1216
  %1012 = load double, ptr %921, align 8, !tbaa !50
  %1013 = fmul double %1012, %1011
  %1014 = load double, ptr %925, align 8, !tbaa !51
  %1015 = fadd double %1014, 1.000000e+00
  %1016 = call double @pow(double noundef %1006, double noundef %1015) #9
  %1017 = fmul double %1013, %1016
  %1018 = load double, ptr %925, align 8, !tbaa !51
  %1019 = call double @pow(double noundef 1.000000e+07, double noundef %1018) #9
  %1020 = fdiv double %1017, %1019
  %1021 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1004, ptr noundef nonnull %8) #9
  %1022 = icmp eq i32 %1021, 1
  br i1 %1022, label %1023, label %1025

1023:                                             ; preds = %1001
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %70) #9
  %1024 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %70, ptr noundef nonnull @.str, ptr noundef nonnull @.str.64, ptr noundef nonnull %1024) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 905, ptr noundef nonnull %70) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %70) #9
  br label %1873

1025:                                             ; preds = %1001
  %1026 = load double, ptr %8, align 8, !tbaa !36
  %1027 = load i16, ptr %906, align 8, !tbaa !83
  %1028 = load i16, ptr %908, align 2, !tbaa !84
  %1029 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %1026, i16 noundef signext %1027, i16 noundef signext %1028, ptr noundef nonnull %4, ptr noundef nonnull %246) #9
  %1030 = icmp eq i32 %1029, 1
  br i1 %1030, label %1031, label %1033

1031:                                             ; preds = %1025
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %71) #9
  %1032 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %71, ptr noundef nonnull @.str, ptr noundef nonnull @.str.65, ptr noundef nonnull %1032) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 908, ptr noundef nonnull %71) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %71) #9
  br label %1873

1033:                                             ; preds = %1025
  %1034 = load double, ptr %987, align 8, !tbaa !87
  br label %.loopexit

1035:                                             ; preds = %989
  %1036 = fmul double %993, 1.000000e-03
  %1037 = fmul double %1036, %998
  %1038 = fcmp ogt double %.011651304, %1037
  %1039 = load ptr, ptr %893, align 8, !tbaa !41
  %1040 = getelementptr inbounds double, ptr %1039, i64 %indvars.iv1377
  br i1 %1038, label %1041, label %1154

1041:                                             ; preds = %1035
  %1042 = getelementptr inbounds i8, ptr %1040, i64 8
  %1043 = load double, ptr %1042, align 8, !tbaa !36
  %1044 = load double, ptr %1040, align 8, !tbaa !36
  %1045 = fsub double %1043, %1044
  %1046 = fdiv double %998, %.011651304
  %1047 = fdiv double %1046, 1.000000e+01
  %1048 = fcmp olt double %1045, %1047
  br i1 %1048, label %1049, label %1095

1049:                                             ; preds = %1041
  %1050 = load double, ptr %987, align 8, !tbaa !87
  %1051 = fadd double %1044, 1.000000e+00
  %1052 = fmul double %1051, %1050
  %1053 = fneg double %.111711303
  %1054 = call double @llvm.fmuladd.f64(double %1053, double %1045, double %.111811300)
  %1055 = load double, ptr %915, align 8, !tbaa !59
  %1056 = fmul double %1055, 2.000000e+00
  %1057 = load double, ptr %918, align 8, !tbaa !53
  %square1215 = fmul double %1057, %1057
  %1058 = fmul double %1056, %square1215
  %1059 = load double, ptr %921, align 8, !tbaa !50
  %1060 = fmul double %1059, %1058
  %1061 = load double, ptr %925, align 8, !tbaa !51
  %1062 = fadd double %1061, 1.000000e+00
  %1063 = call double @pow(double noundef %1051, double noundef %1062) #9
  %1064 = fmul double %1060, %1063
  %1065 = load double, ptr %925, align 8, !tbaa !51
  %1066 = call double @pow(double noundef 1.000000e+07, double noundef %1065) #9
  %1067 = fdiv double %1064, %1066
  %1068 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1044, ptr noundef nonnull %8) #9
  %1069 = icmp eq i32 %1068, 1
  br i1 %1069, label %1070, label %1072

1070:                                             ; preds = %1049
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %72) #9
  %1071 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %72, ptr noundef nonnull @.str, ptr noundef nonnull @.str.64, ptr noundef nonnull %1071) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 925, ptr noundef nonnull %72) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %72) #9
  br label %1873

1072:                                             ; preds = %1049
  %1073 = load double, ptr %8, align 8, !tbaa !36
  %1074 = load i16, ptr %906, align 8, !tbaa !83
  %1075 = load i16, ptr %908, align 2, !tbaa !84
  %1076 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %1073, i16 noundef signext %1074, i16 noundef signext %1075, ptr noundef nonnull %4, ptr noundef nonnull %246) #9
  %1077 = icmp eq i32 %1076, 1
  br i1 %1077, label %1078, label %1080

1078:                                             ; preds = %1072
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %73) #9
  %1079 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %73, ptr noundef nonnull @.str, ptr noundef nonnull @.str.65, ptr noundef nonnull %1079) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 928, ptr noundef nonnull %73) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %73) #9
  br label %1873

1080:                                             ; preds = %1072
  %1081 = load i32, ptr %933, align 8, !tbaa !85
  %1082 = sext i32 %1081 to i64
  %1083 = getelementptr inbounds double, ptr %246, i64 %1082
  %1084 = load double, ptr %1083, align 8, !tbaa !36
  %1085 = fmul double %1084, 2.000000e+00
  %1086 = load i32, ptr %939, align 4, !tbaa !86
  %1087 = sext i32 %1086 to i64
  %1088 = getelementptr inbounds double, ptr %246, i64 %1087
  %1089 = load double, ptr %1088, align 8, !tbaa !36
  %1090 = fsub double %1052, %1054
  %1091 = fneg double %1067
  %1092 = fdiv double %1091, %1089
  %1093 = fmul double %1090, %1092
  %1094 = call double @llvm.fmuladd.f64(double %1085, double %1054, double %1093)
  br label %.loopexit

1095:                                             ; preds = %1041
  %1096 = fdiv double %1045, %1047
  %1097 = fptosi double %1096 to i32
  %1098 = add i32 %1097, 1
  %1099 = sitofp i32 %1098 to double
  %1100 = fdiv double %1045, %1099
  %.not12131288 = icmp slt i32 %1097, 0
  br i1 %.not12131288, label %.loopexit, label %.lr.ph1294

.lr.ph1294:                                       ; preds = %1095, %1138
  %.011691292 = phi i32 [ %1153, %1138 ], [ 0, %1095 ]
  %.211721291 = phi double [ %1152, %1138 ], [ %.111711303, %1095 ]
  %.211821290 = phi double [ %1112, %1138 ], [ %.111811300, %1095 ]
  %.111861289 = phi double [ %.21187, %1138 ], [ %.011851299, %1095 ]
  %1101 = fsub double %.111861289, %1100
  %1102 = icmp eq i32 %.011691292, %1097
  br i1 %1102, label %1103, label %1107

1103:                                             ; preds = %.lr.ph1294
  %1104 = load ptr, ptr %893, align 8, !tbaa !41
  %1105 = getelementptr inbounds double, ptr %1104, i64 %indvars.iv1377
  %1106 = load double, ptr %1105, align 8, !tbaa !36
  br label %1107

1107:                                             ; preds = %1103, %.lr.ph1294
  %.21187 = phi double [ %1106, %1103 ], [ %1101, %.lr.ph1294 ]
  %1108 = load double, ptr %987, align 8, !tbaa !87
  %1109 = fadd double %.21187, 1.000000e+00
  %1110 = fmul double %1108, %1109
  %1111 = fneg double %.211721291
  %1112 = call double @llvm.fmuladd.f64(double %1111, double %1100, double %.211821290)
  %1113 = load double, ptr %915, align 8, !tbaa !59
  %1114 = fmul double %1113, 2.000000e+00
  %1115 = load double, ptr %918, align 8, !tbaa !53
  %square1214 = fmul double %1115, %1115
  %1116 = fmul double %1114, %square1214
  %1117 = load double, ptr %921, align 8, !tbaa !50
  %1118 = fmul double %1117, %1116
  %1119 = load double, ptr %925, align 8, !tbaa !51
  %1120 = fadd double %1119, 1.000000e+00
  %1121 = call double @pow(double noundef %1109, double noundef %1120) #9
  %1122 = fmul double %1118, %1121
  %1123 = load double, ptr %925, align 8, !tbaa !51
  %1124 = call double @pow(double noundef 1.000000e+07, double noundef %1123) #9
  %1125 = fdiv double %1122, %1124
  %1126 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %.21187, ptr noundef nonnull %8) #9
  %1127 = icmp eq i32 %1126, 1
  br i1 %1127, label %1128, label %1130

1128:                                             ; preds = %1107
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %74) #9
  %1129 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %74, ptr noundef nonnull @.str, ptr noundef nonnull @.str.64, ptr noundef nonnull %1129) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 955, ptr noundef nonnull %74) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %74) #9
  br label %1873

1130:                                             ; preds = %1107
  %1131 = load double, ptr %8, align 8, !tbaa !36
  %1132 = load i16, ptr %906, align 8, !tbaa !83
  %1133 = load i16, ptr %908, align 2, !tbaa !84
  %1134 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %1131, i16 noundef signext %1132, i16 noundef signext %1133, ptr noundef nonnull %4, ptr noundef %246) #9
  %1135 = icmp eq i32 %1134, 1
  br i1 %1135, label %1136, label %1138

1136:                                             ; preds = %1130
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %75) #9
  %1137 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %75, ptr noundef nonnull @.str, ptr noundef nonnull @.str.65, ptr noundef nonnull %1137) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 958, ptr noundef nonnull %75) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %75) #9
  br label %1873

1138:                                             ; preds = %1130
  %1139 = load i32, ptr %933, align 8, !tbaa !85
  %1140 = sext i32 %1139 to i64
  %1141 = getelementptr inbounds double, ptr %246, i64 %1140
  %1142 = load double, ptr %1141, align 8, !tbaa !36
  %1143 = fmul double %1142, 2.000000e+00
  %1144 = load i32, ptr %939, align 4, !tbaa !86
  %1145 = sext i32 %1144 to i64
  %1146 = getelementptr inbounds double, ptr %246, i64 %1145
  %1147 = load double, ptr %1146, align 8, !tbaa !36
  %1148 = fsub double %1110, %1112
  %1149 = fneg double %1125
  %1150 = fdiv double %1149, %1147
  %1151 = fmul double %1148, %1150
  %1152 = call double @llvm.fmuladd.f64(double %1143, double %1112, double %1151)
  %1153 = add nuw i32 %.011691292, 1
  %exitcond.not = icmp eq i32 %.011691292, %1097
  br i1 %exitcond.not, label %.loopexit, label %.lr.ph1294, !llvm.loop !91

1154:                                             ; preds = %1035
  %1155 = load double, ptr %1040, align 8, !tbaa !36
  %1156 = fadd double %1155, 1.000000e+00
  %1157 = fadd double %.011761302, 1.000000e+00
  %1158 = fdiv double %1156, %1157
  %square1211 = fmul double %1158, %1158
  %1159 = fmul double %.011781301, %square1211
  %1160 = load double, ptr %915, align 8, !tbaa !59
  %1161 = fmul double %1160, 2.000000e+00
  %1162 = load double, ptr %918, align 8, !tbaa !53
  %square1212 = fmul double %1162, %1162
  %1163 = fmul double %1161, %square1212
  %1164 = load double, ptr %921, align 8, !tbaa !50
  %1165 = fmul double %1164, %1163
  %1166 = load double, ptr %925, align 8, !tbaa !51
  %1167 = fadd double %1166, 1.000000e+00
  %1168 = call double @pow(double noundef %1156, double noundef %1167) #9
  %1169 = fmul double %1165, %1168
  %1170 = load double, ptr %925, align 8, !tbaa !51
  %1171 = call double @pow(double noundef 1.000000e+07, double noundef %1170) #9
  %1172 = fdiv double %1169, %1171
  %1173 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1155, ptr noundef nonnull %8) #9
  %1174 = icmp eq i32 %1173, 1
  br i1 %1174, label %1175, label %1177

1175:                                             ; preds = %1154
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %76) #9
  %1176 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %76, ptr noundef nonnull @.str, ptr noundef nonnull @.str.64, ptr noundef nonnull %1176) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 976, ptr noundef nonnull %76) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %76) #9
  br label %1873

1177:                                             ; preds = %1154
  %1178 = load double, ptr %8, align 8, !tbaa !36
  %1179 = load i16, ptr %906, align 8, !tbaa !83
  %1180 = load i16, ptr %908, align 2, !tbaa !84
  %1181 = call i32 @background_at_tau(ptr noundef nonnull %1, double noundef %1178, i16 noundef signext %1179, i16 noundef signext %1180, ptr noundef nonnull %4, ptr noundef nonnull %246) #9
  %1182 = icmp eq i32 %1181, 1
  br i1 %1182, label %1183, label %1185

1183:                                             ; preds = %1177
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %77) #9
  %1184 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %77, ptr noundef nonnull @.str, ptr noundef nonnull @.str.65, ptr noundef nonnull %1184) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 979, ptr noundef nonnull %77) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %77) #9
  br label %1873

1185:                                             ; preds = %1177
  %1186 = fdiv double 2.000000e+00, %1156
  %1187 = fmul double %1186, %1159
  br label %.loopexit

.loopexit:                                        ; preds = %1138, %1095, %1080, %1185, %1033
  %.41189 = phi double [ %1004, %1033 ], [ %1155, %1185 ], [ %1044, %1080 ], [ %.011851299, %1095 ], [ %.21187, %1138 ]
  %.41184 = phi double [ %1007, %1033 ], [ %1159, %1185 ], [ %1054, %1080 ], [ %.111811300, %1095 ], [ %1112, %1138 ]
  %.11179 = phi double [ %.011781301, %1033 ], [ %.011781301, %1185 ], [ %1054, %1080 ], [ %.111811300, %1095 ], [ %1112, %1138 ]
  %.11177 = phi double [ %.011761302, %1033 ], [ %.011761302, %1185 ], [ %1044, %1080 ], [ %.011851299, %1095 ], [ %.21187, %1138 ]
  %.41174 = phi double [ %1034, %1033 ], [ %1187, %1185 ], [ %1094, %1080 ], [ %.111711303, %1095 ], [ %1152, %1138 ]
  %.31168 = phi double [ %1020, %1033 ], [ %1172, %1185 ], [ %1067, %1080 ], [ %.011651304, %1095 ], [ %1125, %1138 ]
  %1188 = load ptr, ptr %437, align 8, !tbaa !42
  %1189 = load i32, ptr %438, align 4, !tbaa !43
  %1190 = trunc nuw nsw i64 %indvars.iv1377 to i32
  %1191 = mul nsw i32 %1189, %1190
  %1192 = load i32, ptr %966, align 4, !tbaa !88
  %1193 = add nsw i32 %1191, %1192
  %1194 = sext i32 %1193 to i64
  %1195 = getelementptr inbounds double, ptr %1188, i64 %1194
  store double %.41184, ptr %1195, align 8, !tbaa !36
  %1196 = fmul double %.41184, 0x3B30B0E7F1528C6D
  %1197 = fdiv double %1196, 0x3C07A4DA04A6DAF5
  %1198 = load double, ptr %973, align 8, !tbaa !89
  %1199 = fdiv double %1197, %1198
  %1200 = fdiv double %.41174, 3.000000e+00
  %1201 = fdiv double %1200, %.41184
  %1202 = fadd double %1201, 1.000000e+00
  %1203 = fmul double %1202, %1199
  %1204 = load i32, ptr %980, align 8, !tbaa !90
  %1205 = add nsw i32 %1204, %1191
  %1206 = sext i32 %1205 to i64
  %1207 = getelementptr inbounds double, ptr %1188, i64 %1206
  store double %1203, ptr %1207, align 8, !tbaa !36
  %indvars.iv.next1378 = add nsw i64 %indvars.iv1377, -1
  %1208 = icmp sgt i64 %indvars.iv1377, 0
  br i1 %1208, label %989, label %.loopexit1231.loopexit, !llvm.loop !92

.loopexit1231.loopexit:                           ; preds = %.loopexit
  %.pre1436 = load i32, ptr %275, align 8, !tbaa !35
  br label %.loopexit1231

.loopexit1231:                                    ; preds = %.loopexit1231.loopexit, %960, %870
  %1209 = phi i32 [ %1189, %.loopexit1231.loopexit ], [ %964, %960 ], [ %.pre1439, %870 ]
  %1210 = phi ptr [ %1188, %.loopexit1231.loopexit ], [ %961, %960 ], [ %.pre1438, %870 ]
  %1211 = phi i32 [ %.pre1436, %.loopexit1231.loopexit ], [ %962, %960 ], [ %.pre1437, %870 ]
  call void @free(ptr noundef %279) #9
  %1212 = getelementptr inbounds i8, ptr %2, i64 384
  %1213 = load ptr, ptr %1212, align 8, !tbaa !41
  %1214 = getelementptr inbounds i8, ptr %2, i64 400
  %1215 = load ptr, ptr %1214, align 8, !tbaa !93
  %1216 = call i32 @array_spline_table_lines(ptr noundef %1213, i32 noundef %1211, ptr noundef %1210, i32 noundef %1209, ptr noundef %1215, i16 noundef signext 1, ptr noundef nonnull %443) #9
  %1217 = icmp eq i32 %1216, 1
  br i1 %1217, label %1218, label %1219

1218:                                             ; preds = %.loopexit1231
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %78) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %78, ptr noundef nonnull @.str, ptr noundef nonnull @.str.66, ptr noundef nonnull %443) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1000, ptr noundef nonnull %78) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %78) #9
  br label %1873

1219:                                             ; preds = %.loopexit1231
  %1220 = load i32, ptr %275, align 8, !tbaa !35
  %1221 = load ptr, ptr %1212, align 8, !tbaa !41
  %1222 = sext i32 %1220 to i64
  br label %1223

1223:                                             ; preds = %1223, %1219
  %indvars.iv1388.in = phi i32 [ %indvars.iv1388, %1223 ], [ %1220, %1219 ]
  %indvars.iv1383.in = phi i64 [ %indvars.iv1383, %1223 ], [ %1222, %1219 ]
  %indvars.iv1380 = phi i64 [ %indvars.iv.next1381, %1223 ], [ %1222, %1219 ]
  %indvars.iv1383 = add i64 %indvars.iv1383.in, -1
  %indvars.iv1388 = add i32 %indvars.iv1388.in, -1
  %indvars.iv.next1381 = add nsw i64 %indvars.iv1380, -1
  %1224 = getelementptr inbounds double, ptr %1221, i64 %indvars.iv.next1381
  %1225 = load double, ptr %1224, align 8, !tbaa !36
  %1226 = fcmp ogt double %1225, 2.000000e+03
  br i1 %1226, label %1223, label %1227, !llvm.loop !94

1227:                                             ; preds = %1223
  %1228 = trunc nsw i64 %indvars.iv1380 to i32
  %1229 = trunc nsw i64 %indvars.iv.next1381 to i32
  %1230 = load ptr, ptr %437, align 8, !tbaa !42
  %1231 = load i32, ptr %438, align 4, !tbaa !43
  %1232 = mul nsw i32 %1231, %1228
  %1233 = load i32, ptr %661, align 8, !tbaa !69
  %1234 = add nsw i32 %1232, %1233
  %1235 = sext i32 %1234 to i64
  %1236 = getelementptr inbounds double, ptr %1230, i64 %1235
  %1237 = load double, ptr %1236, align 8, !tbaa !36
  %1238 = mul nsw i32 %1231, %1229
  %1239 = add nsw i32 %1238, %1233
  %1240 = sext i32 %1239 to i64
  %1241 = getelementptr inbounds double, ptr %1230, i64 %1240
  %1242 = load double, ptr %1241, align 8, !tbaa !36
  %1243 = fcmp ogt double %1237, %1242
  br i1 %1243, label %1246, label %.preheader1230.preheader

.preheader1230.preheader:                         ; preds = %1227
  %1244 = sext i32 %1231 to i64
  %1245 = sext i32 %1233 to i64
  %invariant.gep = getelementptr double, ptr %1230, i64 %1245
  %invariant.gep1498 = getelementptr double, ptr %1230, i64 %1245
  br label %.preheader1230

1246:                                             ; preds = %1227
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %79) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %79, ptr noundef nonnull @.str.67, double noundef 2.000000e+03) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %80) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %80, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.68, ptr noundef nonnull %79) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1012, ptr noundef nonnull %80) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %80) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %79) #9
  br label %1873

.preheader1230:                                   ; preds = %.preheader1230.preheader, %.preheader1230
  %indvars.iv1390 = phi i32 [ %indvars.iv1388, %.preheader1230.preheader ], [ %indvars.iv.next1391, %.preheader1230 ]
  %indvars.iv1385 = phi i64 [ %indvars.iv1383, %.preheader1230.preheader ], [ %indvars.iv.next1386, %.preheader1230 ]
  %1247 = add nsw i64 %indvars.iv1385, 1
  %1248 = mul nsw i64 %1247, %1244
  %gep = getelementptr double, ptr %invariant.gep, i64 %1248
  %1249 = load double, ptr %gep, align 8, !tbaa !36
  %1250 = mul nsw i64 %indvars.iv1385, %1244
  %gep1499 = getelementptr double, ptr %invariant.gep1498, i64 %1250
  %1251 = load double, ptr %gep1499, align 8, !tbaa !36
  %1252 = fcmp ugt double %1249, %1251
  %indvars.iv.next1386 = add nsw i64 %indvars.iv1385, -1
  %indvars.iv.next1391 = add i32 %indvars.iv1390, -1
  br i1 %1252, label %1253, label %.preheader1230, !llvm.loop !95

1253:                                             ; preds = %.preheader1230
  %1254 = trunc nsw i64 %indvars.iv1385 to i32
  %1255 = trunc nsw i64 %1247 to i32
  %sext = shl i64 %1247, 32
  %1256 = ashr exact i64 %sext, 32
  %1257 = getelementptr inbounds double, ptr %1221, i64 %1256
  %1258 = load double, ptr %1257, align 8, !tbaa !36
  %sext1450 = shl i64 %indvars.iv1385, 32
  %1259 = ashr exact i64 %sext1450, 32
  %1260 = getelementptr inbounds double, ptr %1221, i64 %1259
  %1261 = load double, ptr %1260, align 8, !tbaa !36
  %1262 = fsub double %1258, %1261
  %1263 = fmul double %1262, 5.000000e-01
  %1264 = add nsw i32 %1254, 2
  %1265 = mul nsw i32 %1264, %1231
  %1266 = add nsw i32 %1265, %1233
  %1267 = sext i32 %1266 to i64
  %1268 = getelementptr inbounds double, ptr %1230, i64 %1267
  %1269 = load double, ptr %1268, align 8, !tbaa !36
  %1270 = fsub double %1251, %1269
  %1271 = fmul double %1263, %1270
  %1272 = call double @llvm.fmuladd.f64(double %1249, double -2.000000e+00, double %1251)
  %1273 = fadd double %1272, %1269
  %1274 = fdiv double %1271, %1273
  %1275 = fadd double %1258, %1274
  %1276 = getelementptr inbounds i8, ptr %2, i64 408
  store double %1275, ptr %1276, align 8, !tbaa !96
  %1277 = getelementptr inbounds i8, ptr %0, i64 2344
  %1278 = load double, ptr %1277, align 8, !tbaa !97
  %1279 = fadd double %1278, %1275
  %1280 = fcmp ult double %1279, 2.000000e+03
  br i1 %1280, label %1282, label %1281

1281:                                             ; preds = %1253
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %81) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %81, ptr noundef nonnull @.str.67, double noundef 2.000000e+03) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %82) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %82, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.69, ptr noundef nonnull %81) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1027, ptr noundef nonnull %82) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %82) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %81) #9
  br label %1873

1282:                                             ; preds = %1253
  %1283 = fsub double %1275, %1278
  %1284 = fcmp ugt double %1283, 5.000000e+02
  br i1 %1284, label %1286, label %1285

1285:                                             ; preds = %1282
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %83) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %83, ptr noundef nonnull @.str.70, double noundef 5.000000e+02) #9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %84) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %84, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.71, ptr noundef nonnull %83) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1031, ptr noundef nonnull %84) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %84) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %83) #9
  br label %1873

1286:                                             ; preds = %1282
  %1287 = getelementptr inbounds i8, ptr %2, i64 416
  %1288 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1275, ptr noundef nonnull %1287) #9
  %1289 = icmp eq i32 %1288, 1
  br i1 %1289, label %1290, label %1292

1290:                                             ; preds = %1286
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %85) #9
  %1291 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %85, ptr noundef nonnull @.str, ptr noundef nonnull @.str.72, ptr noundef nonnull %1291) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1037, ptr noundef nonnull %85) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %85) #9
  br label %1873

1292:                                             ; preds = %1286
  %1293 = load double, ptr %1287, align 8, !tbaa !98
  %1294 = getelementptr inbounds i8, ptr %1, i64 844
  %1295 = load i16, ptr %1294, align 4, !tbaa !99
  %1296 = getelementptr inbounds i8, ptr %1, i64 846
  %1297 = load i16, ptr %1296, align 2, !tbaa !84
  %1298 = call i32 @background_at_tau(ptr noundef %1, double noundef %1293, i16 noundef signext %1295, i16 noundef signext %1297, ptr noundef nonnull %4, ptr noundef %246) #9
  %1299 = icmp eq i32 %1298, 1
  br i1 %1299, label %1300, label %1302

1300:                                             ; preds = %1292
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %86) #9
  %1301 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %86, ptr noundef nonnull @.str, ptr noundef nonnull @.str.73, ptr noundef nonnull %1301) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1041, ptr noundef nonnull %86) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %86) #9
  br label %1873

1302:                                             ; preds = %1292
  %1303 = getelementptr inbounds i8, ptr %1, i64 604
  %1304 = load i32, ptr %1303, align 4, !tbaa !100
  %1305 = sext i32 %1304 to i64
  %1306 = getelementptr inbounds double, ptr %246, i64 %1305
  %1307 = load double, ptr %1306, align 8, !tbaa !36
  %1308 = getelementptr inbounds i8, ptr %2, i64 424
  store double %1307, ptr %1308, align 8, !tbaa !101
  %1309 = getelementptr inbounds i8, ptr %1, i64 456
  %1310 = load double, ptr %1309, align 8, !tbaa !102
  %1311 = load double, ptr %1276, align 8, !tbaa !96
  %1312 = fadd double %1311, 1.000000e+00
  %1313 = getelementptr inbounds i8, ptr %2, i64 432
  %1314 = getelementptr inbounds i8, ptr %1, i64 592
  %1315 = load i32, ptr %1314, align 8, !tbaa !103
  %1316 = sext i32 %1315 to i64
  %1317 = getelementptr inbounds double, ptr %246, i64 %1316
  %1318 = load double, ptr %1317, align 8, !tbaa !36
  %1319 = getelementptr inbounds i8, ptr %2, i64 448
  store double %1318, ptr %1319, align 8, !tbaa !104
  %1320 = getelementptr inbounds i8, ptr %2, i64 440
  %1321 = insertelement <2 x double> poison, double %1307, i64 0
  %1322 = insertelement <2 x double> %1321, double %1312, i64 1
  %1323 = insertelement <2 x double> poison, double %1310, i64 0
  %1324 = insertelement <2 x double> %1323, double %1318, i64 1
  %1325 = fmul <2 x double> %1322, %1324
  %1326 = shufflevector <2 x double> %1322, <2 x double> %1323, <2 x i32> <i32 1, i32 2>
  %1327 = fdiv <2 x double> %1325, %1326
  store <2 x double> %1327, ptr %1313, align 8, !tbaa !36
  %1328 = getelementptr inbounds i8, ptr %1, i64 344
  %1329 = load double, ptr %1328, align 8, !tbaa !105
  %1330 = load double, ptr %1287, align 8, !tbaa !98
  %1331 = fsub double %1329, %1330
  %1332 = extractelement <2 x double> %1327, i64 1
  %1333 = fdiv double %1332, %1331
  %1334 = getelementptr inbounds i8, ptr %2, i64 560
  store double %1333, ptr %1334, align 8, !tbaa !106
  %1335 = load i16, ptr %506, align 2, !tbaa !67
  %1336 = icmp eq i16 %1335, 1
  %.pre1440 = load ptr, ptr %1212, align 8, !tbaa !41
  br i1 %1336, label %1337, label %1364

1337:                                             ; preds = %1302
  %1338 = getelementptr inbounds double, ptr %.pre1440, i64 %1256
  %1339 = load double, ptr %1338, align 8, !tbaa !36
  %1340 = fsub double %1339, %1311
  %1341 = getelementptr inbounds double, ptr %.pre1440, i64 %1259
  %1342 = load double, ptr %1341, align 8, !tbaa !36
  %1343 = fsub double %1339, %1342
  %1344 = fdiv double %1340, %1343
  %1345 = load ptr, ptr %437, align 8, !tbaa !42
  %1346 = load i32, ptr %438, align 4, !tbaa !43
  %1347 = mul nsw i32 %1346, %1254
  %1348 = getelementptr inbounds i8, ptr %2, i64 368
  %1349 = load i32, ptr %1348, align 8, !tbaa !70
  %1350 = add nsw i32 %1347, %1349
  %1351 = sext i32 %1350 to i64
  %1352 = getelementptr inbounds double, ptr %1345, i64 %1351
  %1353 = load double, ptr %1352, align 8, !tbaa !36
  %1354 = fsub double %1311, %1342
  %1355 = fdiv double %1354, %1343
  %1356 = mul nsw i32 %1346, %1255
  %1357 = add nsw i32 %1356, %1349
  %1358 = sext i32 %1357 to i64
  %1359 = getelementptr inbounds double, ptr %1345, i64 %1358
  %1360 = load double, ptr %1359, align 8, !tbaa !36
  %1361 = fmul double %1355, %1360
  %1362 = call double @llvm.fmuladd.f64(double %1344, double %1353, double %1361)
  %1363 = getelementptr inbounds i8, ptr %2, i64 456
  store double %1362, ptr %1363, align 8, !tbaa !107
  br label %1364

1364:                                             ; preds = %1337, %1302
  %1365 = getelementptr inbounds double, ptr %.pre1440, i64 %1259
  %1366 = load double, ptr %1365, align 8, !tbaa !36
  %1367 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1366, ptr noundef nonnull %8) #9
  %1368 = icmp eq i32 %1367, 1
  br i1 %1368, label %1371, label %.preheader1229

.preheader1229:                                   ; preds = %1364
  %1369 = getelementptr inbounds i8, ptr %0, i64 1664
  %1370 = zext i32 %indvars.iv1390 to i64
  br label %1373

1371:                                             ; preds = %1364
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %87) #9
  %1372 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %87, ptr noundef nonnull @.str, ptr noundef nonnull @.str.74, ptr noundef nonnull %1372) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1063, ptr noundef nonnull %87) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %87) #9
  br label %1873

1373:                                             ; preds = %.preheader1229, %1390
  %indvars.iv1392 = phi i64 [ %1370, %.preheader1229 ], [ %1391, %1390 ]
  %1374 = load ptr, ptr %437, align 8, !tbaa !42
  %1375 = load i32, ptr %438, align 4, !tbaa !43
  %1376 = trunc nuw i64 %indvars.iv1392 to i32
  %1377 = mul nsw i32 %1375, %1376
  %1378 = load i32, ptr %639, align 4, !tbaa !48
  %1379 = add nsw i32 %1377, %1378
  %1380 = sext i32 %1379 to i64
  %1381 = getelementptr inbounds double, ptr %1374, i64 %1380
  %1382 = load double, ptr %1381, align 8, !tbaa !36
  %1383 = fdiv double 1.000000e+00, %1382
  %1384 = load double, ptr %8, align 8, !tbaa !36
  %1385 = fdiv double %1383, %1384
  %1386 = load double, ptr %1369, align 8, !tbaa !108
  %1387 = fcmp olt double %1385, %1386
  %1388 = icmp sgt i32 %1376, 0
  %1389 = and i1 %1388, %1387
  br i1 %1389, label %1390, label %1399

1390:                                             ; preds = %1373
  %1391 = add nsw i64 %indvars.iv1392, -1
  %1392 = load ptr, ptr %1212, align 8, !tbaa !41
  %1393 = getelementptr inbounds double, ptr %1392, i64 %1391
  %1394 = load double, ptr %1393, align 8, !tbaa !36
  %1395 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1394, ptr noundef nonnull %8) #9
  %1396 = icmp eq i32 %1395, 1
  br i1 %1396, label %1397, label %1373, !llvm.loop !109

1397:                                             ; preds = %1390
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %88) #9
  %1398 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %88, ptr noundef nonnull @.str, ptr noundef nonnull @.str.74, ptr noundef nonnull %1398) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1072, ptr noundef nonnull %88) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %88) #9
  br label %1873

1399:                                             ; preds = %1373
  %1400 = getelementptr inbounds i8, ptr %2, i64 568
  store double %1384, ptr %1400, align 8, !tbaa !110
  %1401 = getelementptr inbounds i8, ptr %1, i64 740
  %1402 = load i16, ptr %1401, align 4, !tbaa !111
  %1403 = icmp eq i16 %1402, 1
  br i1 %1403, label %1404, label %1469

1404:                                             ; preds = %1399
  %1405 = load i16, ptr %459, align 2, !tbaa !21
  %1406 = icmp eq i16 %1405, 1
  br i1 %1406, label %1407, label %1456

1407:                                             ; preds = %1404
  %1408 = getelementptr inbounds i8, ptr %2, i64 256
  %1409 = load double, ptr %1408, align 8, !tbaa !51
  %1410 = fcmp ult double %1409, 2.000000e+00
  %1411 = add nsw i32 %1376, -1
  %.9 = select i1 %1410, i32 0, i32 %1411
  %1412 = load ptr, ptr %1212, align 8, !tbaa !41
  %1413 = sext i32 %.9 to i64
  %1414 = getelementptr inbounds double, ptr %1412, i64 %1413
  %1415 = load double, ptr %1414, align 8, !tbaa !36
  %1416 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1415, ptr noundef nonnull %8) #9
  %1417 = icmp eq i32 %1416, 1
  br i1 %1417, label %1420, label %.preheader1228

.preheader1228:                                   ; preds = %1407
  %1418 = getelementptr inbounds i8, ptr %2, i64 308
  %1419 = getelementptr inbounds i8, ptr %0, i64 1688
  br label %1422

1420:                                             ; preds = %1407
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %89) #9
  %1421 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %89, ptr noundef nonnull @.str, ptr noundef nonnull @.str.74, ptr noundef nonnull %1421) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1095, ptr noundef nonnull %89) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %89) #9
  br label %1873

1422:                                             ; preds = %.preheader1228, %.critedge3
  %.10 = phi i32 [ %.11, %.critedge3 ], [ %.9, %.preheader1228 ]
  %1423 = load ptr, ptr %437, align 8, !tbaa !42
  %1424 = load i32, ptr %438, align 4, !tbaa !43
  %1425 = mul nsw i32 %1424, %.10
  %1426 = load i32, ptr %1418, align 4, !tbaa !54
  %1427 = add nsw i32 %1425, %1426
  %1428 = sext i32 %1427 to i64
  %1429 = getelementptr inbounds double, ptr %1423, i64 %1428
  %1430 = load double, ptr %1429, align 8, !tbaa !36
  %1431 = fdiv double 1.000000e+00, %1430
  %1432 = load double, ptr %8, align 8, !tbaa !36
  %1433 = fdiv double %1431, %1432
  %1434 = load double, ptr %1419, align 8, !tbaa !112
  %1435 = fcmp olt double %1433, %1434
  br i1 %1435, label %1436, label %.critedge

1436:                                             ; preds = %1422
  %1437 = load double, ptr %1408, align 8, !tbaa !51
  %1438 = fcmp oge double %1437, 2.000000e+00
  %1439 = icmp sgt i32 %.10, 0
  %or.cond = and i1 %1439, %1438
  br i1 %or.cond, label %.critedge3, label %1440

1440:                                             ; preds = %1436
  %1441 = fcmp olt double %1437, 2.000000e+00
  br i1 %1441, label %1442, label %.critedge

1442:                                             ; preds = %1440
  %1443 = load i32, ptr %275, align 8, !tbaa !35
  %1444 = add nsw i32 %1443, -1
  %1445 = icmp slt i32 %.10, %1444
  br i1 %1445, label %.critedge3, label %.critedge

.critedge3:                                       ; preds = %1436, %1442
  %1446 = fcmp ult double %1437, 2.000000e+00
  %.11.v = select i1 %1446, i32 1, i32 -1
  %.11 = add nsw i32 %.11.v, %.10
  %1447 = load ptr, ptr %1212, align 8, !tbaa !41
  %1448 = sext i32 %.11 to i64
  %1449 = getelementptr inbounds double, ptr %1447, i64 %1448
  %1450 = load double, ptr %1449, align 8, !tbaa !36
  %1451 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1450, ptr noundef nonnull %8) #9
  %1452 = icmp eq i32 %1451, 1
  br i1 %1452, label %1453, label %1422, !llvm.loop !113

1453:                                             ; preds = %.critedge3
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %90) #9
  %1454 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %90, ptr noundef nonnull @.str, ptr noundef nonnull @.str.74, ptr noundef nonnull %1454) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1111, ptr noundef nonnull %90) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %90) #9
  br label %1873

.critedge:                                        ; preds = %1422, %1440, %1442
  %1455 = getelementptr inbounds i8, ptr %2, i64 576
  store double %1432, ptr %1455, align 8, !tbaa !114
  br label %1469

1456:                                             ; preds = %1404
  %1457 = load ptr, ptr %1212, align 8, !tbaa !41
  %sext1451 = shl i64 %indvars.iv1392, 32
  %1458 = ashr exact i64 %sext1451, 29
  %1459 = getelementptr i8, ptr %1457, i64 %1458
  %1460 = getelementptr i8, ptr %1459, i64 -8
  %1461 = load double, ptr %1460, align 8, !tbaa !36
  %1462 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1461, ptr noundef nonnull %8) #9
  %1463 = icmp eq i32 %1462, 1
  br i1 %1463, label %1464, label %1466

1464:                                             ; preds = %1456
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %91) #9
  %1465 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %91, ptr noundef nonnull @.str, ptr noundef nonnull @.str.74, ptr noundef nonnull %1465) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1124, ptr noundef nonnull %91) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %91) #9
  br label %1873

1466:                                             ; preds = %1456
  %1467 = load double, ptr %8, align 8, !tbaa !36
  %1468 = getelementptr inbounds i8, ptr %2, i64 576
  store double %1467, ptr %1468, align 8, !tbaa !114
  %.pre1441 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1442 = load i32, ptr %438, align 4, !tbaa !43
  br label %1469

1469:                                             ; preds = %.critedge, %1466, %1399
  %1470 = phi i32 [ %1424, %.critedge ], [ %.pre1442, %1466 ], [ %1375, %1399 ]
  %1471 = phi ptr [ %1423, %.critedge ], [ %.pre1441, %1466 ], [ %1374, %1399 ]
  %.01175 = phi double [ %1432, %.critedge ], [ %1467, %1466 ], [ 0.000000e+00, %1399 ]
  %1472 = getelementptr inbounds i8, ptr %2, i64 292
  %1473 = load i32, ptr %1472, align 4, !tbaa !76
  %1474 = sext i32 %1473 to i64
  %1475 = getelementptr inbounds double, ptr %1471, i64 %1474
  %1476 = load double, ptr %1475, align 8, !tbaa !36
  %1477 = fcmp ogt double %1476, 0x3FD78B56362CEF38
  br i1 %1477, label %.lr.ph1310, label %.critedge5

.lr.ph1310:                                       ; preds = %1469
  %1478 = load i32, ptr %275, align 8, !tbaa !35
  %1479 = sext i32 %1470 to i64
  %smax = call i32 @llvm.smax.i32(i32 %1478, i32 0)
  %wide.trip.count = zext nneg i32 %smax to i64
  %exitcond1398.not1568 = icmp slt i32 %1478, 1
  br i1 %exitcond1398.not1568, label %.critedge5, label %.lr.ph1570

1480:                                             ; preds = %.lr.ph1570
  %exitcond1398.not = icmp eq i64 %indvars.iv.next1396, %wide.trip.count
  br i1 %exitcond1398.not, label %.critedge5, label %.lr.ph1570, !llvm.loop !115

.lr.ph1570:                                       ; preds = %.lr.ph1310, %1480
  %indvars.iv13951569 = phi i64 [ %indvars.iv.next1396, %1480 ], [ 0, %.lr.ph1310 ]
  %indvars.iv.next1396 = add nuw nsw i64 %indvars.iv13951569, 1
  %1481 = mul nsw i64 %indvars.iv.next1396, %1479
  %1482 = add nsw i64 %1481, %1474
  %1483 = getelementptr inbounds double, ptr %1471, i64 %1482
  %1484 = load double, ptr %1483, align 8, !tbaa !36
  %1485 = fcmp ogt double %1484, 0x3FD78B56362CEF38
  br i1 %1485, label %1480, label %.critedge5.loopexit.split.loop.exit, !llvm.loop !115

.critedge5.loopexit.split.loop.exit:              ; preds = %.lr.ph1570
  %indvars.le = trunc i64 %indvars.iv.next1396 to i32
  br label %.critedge5

.critedge5:                                       ; preds = %1480, %.lr.ph1310, %.critedge5.loopexit.split.loop.exit, %1469
  %.12.lcssa = phi i32 [ 0, %1469 ], [ %indvars.le, %.critedge5.loopexit.split.loop.exit ], [ %smax, %.lr.ph1310 ], [ %smax, %1480 ]
  %.lcssa1243 = phi double [ %1476, %1469 ], [ %1484, %.critedge5.loopexit.split.loop.exit ], [ %1476, %.lr.ph1310 ], [ %1484, %1480 ]
  %1486 = load ptr, ptr %1212, align 8, !tbaa !41
  %1487 = add nsw i32 %.12.lcssa, -1
  %1488 = sext i32 %1487 to i64
  %1489 = getelementptr inbounds double, ptr %1486, i64 %1488
  %1490 = load double, ptr %1489, align 8, !tbaa !36
  %1491 = mul nsw i32 %1470, %1487
  %1492 = add nsw i32 %1491, %1473
  %1493 = sext i32 %1492 to i64
  %1494 = getelementptr inbounds double, ptr %1471, i64 %1493
  %1495 = load double, ptr %1494, align 8, !tbaa !36
  %1496 = fsub double 0x3FD78B56362CEF38, %1495
  %1497 = fsub double %.lcssa1243, %1495
  %1498 = fdiv double %1496, %1497
  %1499 = zext nneg i32 %.12.lcssa to i64
  %1500 = getelementptr inbounds double, ptr %1486, i64 %1499
  %1501 = load double, ptr %1500, align 8, !tbaa !36
  %1502 = fsub double %1501, %1490
  %1503 = call double @llvm.fmuladd.f64(double %1498, double %1502, double %1490)
  %1504 = getelementptr inbounds i8, ptr %2, i64 464
  store double %1503, ptr %1504, align 8, !tbaa !116
  %1505 = getelementptr inbounds i8, ptr %2, i64 472
  %1506 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1503, ptr noundef nonnull %1505) #9
  %1507 = icmp eq i32 %1506, 1
  br i1 %1507, label %1508, label %1510

1508:                                             ; preds = %.critedge5
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %92) #9
  %1509 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %92, ptr noundef nonnull @.str, ptr noundef nonnull @.str.75, ptr noundef nonnull %1509) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1144, ptr noundef nonnull %92) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %92) #9
  br label %1873

1510:                                             ; preds = %.critedge5
  %1511 = load double, ptr %1505, align 8, !tbaa !117
  %1512 = load i16, ptr %1294, align 4, !tbaa !99
  %1513 = load i16, ptr %1296, align 2, !tbaa !84
  %1514 = call i32 @background_at_tau(ptr noundef %1, double noundef %1511, i16 noundef signext %1512, i16 noundef signext %1513, ptr noundef nonnull %4, ptr noundef %246) #9
  %1515 = icmp eq i32 %1514, 1
  br i1 %1515, label %1516, label %1518

1516:                                             ; preds = %1510
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %93) #9
  %1517 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %93, ptr noundef nonnull @.str, ptr noundef nonnull @.str.76, ptr noundef nonnull %1517) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1148, ptr noundef nonnull %93) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %93) #9
  br label %1873

1518:                                             ; preds = %1510
  %1519 = load i32, ptr %1303, align 4, !tbaa !100
  %1520 = sext i32 %1519 to i64
  %1521 = getelementptr inbounds double, ptr %246, i64 %1520
  %1522 = load double, ptr %1521, align 8, !tbaa !36
  %1523 = getelementptr inbounds i8, ptr %2, i64 480
  store double %1522, ptr %1523, align 8, !tbaa !118
  %1524 = load double, ptr %1309, align 8, !tbaa !102
  %1525 = load double, ptr %1504, align 8, !tbaa !116
  %1526 = fadd double %1525, 1.000000e+00
  %1527 = getelementptr inbounds i8, ptr %2, i64 488
  %1528 = load i32, ptr %1314, align 8, !tbaa !103
  %1529 = sext i32 %1528 to i64
  %1530 = getelementptr inbounds double, ptr %246, i64 %1529
  %1531 = load double, ptr %1530, align 8, !tbaa !36
  %1532 = getelementptr inbounds i8, ptr %2, i64 504
  store double %1531, ptr %1532, align 8, !tbaa !119
  %1533 = getelementptr inbounds i8, ptr %2, i64 496
  %1534 = insertelement <2 x double> poison, double %1522, i64 0
  %1535 = insertelement <2 x double> %1534, double %1526, i64 1
  %1536 = insertelement <2 x double> poison, double %1524, i64 0
  %1537 = insertelement <2 x double> %1536, double %1531, i64 1
  %1538 = fmul <2 x double> %1535, %1537
  %1539 = shufflevector <2 x double> %1535, <2 x double> %1536, <2 x i32> <i32 1, i32 2>
  %1540 = fdiv <2 x double> %1538, %1539
  store <2 x double> %1540, ptr %1527, align 8, !tbaa !36
  %1541 = load i16, ptr %506, align 2, !tbaa !67
  %1542 = icmp eq i16 %1541, 1
  %.pre1443 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1444 = load i32, ptr %438, align 4, !tbaa !43
  br i1 %1542, label %1543, label %1571

1543:                                             ; preds = %1518
  %1544 = load ptr, ptr %1212, align 8, !tbaa !41
  %1545 = add nuw nsw i32 %.12.lcssa, 1
  %1546 = zext nneg i32 %1545 to i64
  %1547 = getelementptr inbounds double, ptr %1544, i64 %1546
  %1548 = load double, ptr %1547, align 8, !tbaa !36
  %1549 = fsub double %1548, %1525
  %1550 = getelementptr inbounds double, ptr %1544, i64 %1499
  %1551 = load double, ptr %1550, align 8, !tbaa !36
  %1552 = fsub double %1548, %1551
  %1553 = fdiv double %1549, %1552
  %1554 = mul nsw i32 %.pre1444, %.12.lcssa
  %1555 = getelementptr inbounds i8, ptr %2, i64 368
  %1556 = load i32, ptr %1555, align 8, !tbaa !70
  %1557 = add nsw i32 %1554, %1556
  %1558 = sext i32 %1557 to i64
  %1559 = getelementptr inbounds double, ptr %.pre1443, i64 %1558
  %1560 = load double, ptr %1559, align 8, !tbaa !36
  %1561 = fsub double %1525, %1551
  %1562 = fdiv double %1561, %1552
  %1563 = mul nsw i32 %.pre1444, %1545
  %1564 = add nsw i32 %1563, %1556
  %1565 = sext i32 %1564 to i64
  %1566 = getelementptr inbounds double, ptr %.pre1443, i64 %1565
  %1567 = load double, ptr %1566, align 8, !tbaa !36
  %1568 = fmul double %1562, %1567
  %1569 = call double @llvm.fmuladd.f64(double %1553, double %1560, double %1568)
  %1570 = getelementptr inbounds i8, ptr %2, i64 512
  store double %1569, ptr %1570, align 8, !tbaa !120
  br label %1571

1571:                                             ; preds = %1543, %1518
  %1572 = load i32, ptr %453, align 8, !tbaa !63
  %1573 = sext i32 %1572 to i64
  %1574 = getelementptr inbounds double, ptr %.pre1443, i64 %1573
  %1575 = load double, ptr %1574, align 8, !tbaa !36
  %1576 = fcmp olt double %1575, 1.000000e+00
  br i1 %1576, label %.lr.ph1324, label %.critedge7

.lr.ph1324:                                       ; preds = %1571
  %1577 = load i32, ptr %275, align 8, !tbaa !35
  %1578 = sext i32 %.pre1444 to i64
  %smax1401 = call i32 @llvm.smax.i32(i32 %1577, i32 0)
  %wide.trip.count1404 = zext nneg i32 %smax1401 to i64
  %invariant.gep1506 = getelementptr double, ptr %.pre1443, i64 %1573
  %exitcond1405.not1571 = icmp slt i32 %1577, 1
  br i1 %exitcond1405.not1571, label %.critedge7, label %.lr.ph1573

1579:                                             ; preds = %.lr.ph1573
  %exitcond1405.not = icmp eq i64 %indvars.iv.next1400, %wide.trip.count1404
  br i1 %exitcond1405.not, label %.critedge7, label %.lr.ph1573, !llvm.loop !121

.lr.ph1573:                                       ; preds = %.lr.ph1324, %1579
  %indvars.iv13991572 = phi i64 [ %indvars.iv.next1400, %1579 ], [ 0, %.lr.ph1324 ]
  %indvars.iv.next1400 = add nuw nsw i64 %indvars.iv13991572, 1
  %1580 = mul nsw i64 %indvars.iv.next1400, %1578
  %gep1507 = getelementptr double, ptr %invariant.gep1506, i64 %1580
  %1581 = load double, ptr %gep1507, align 8, !tbaa !36
  %1582 = fcmp olt double %1581, 1.000000e+00
  br i1 %1582, label %1579, label %.critedge7.loopexit.split.loop.exit, !llvm.loop !121

.critedge7.loopexit.split.loop.exit:              ; preds = %.lr.ph1573
  %indvars1402.le = trunc i64 %indvars.iv.next1400 to i32
  br label %.critedge7

.critedge7:                                       ; preds = %1579, %.lr.ph1324, %.critedge7.loopexit.split.loop.exit, %1571
  %.13.lcssa = phi i32 [ 0, %1571 ], [ %indvars1402.le, %.critedge7.loopexit.split.loop.exit ], [ %smax1401, %.lr.ph1324 ], [ %smax1401, %1579 ]
  %.lcssa1239 = phi double [ %1575, %1571 ], [ %1581, %.critedge7.loopexit.split.loop.exit ], [ %1575, %.lr.ph1324 ], [ %1581, %1579 ]
  %1583 = load ptr, ptr %1212, align 8, !tbaa !41
  %1584 = add nsw i32 %.13.lcssa, -1
  %1585 = sext i32 %1584 to i64
  %1586 = getelementptr inbounds double, ptr %1583, i64 %1585
  %1587 = load double, ptr %1586, align 8, !tbaa !36
  %1588 = mul nsw i32 %.pre1444, %1584
  %1589 = add nsw i32 %1588, %1572
  %1590 = sext i32 %1589 to i64
  %1591 = getelementptr inbounds double, ptr %.pre1443, i64 %1590
  %1592 = load double, ptr %1591, align 8, !tbaa !36
  %1593 = fsub double 1.000000e+00, %1592
  %1594 = fsub double %.lcssa1239, %1592
  %1595 = fdiv double %1593, %1594
  %1596 = zext nneg i32 %.13.lcssa to i64
  %1597 = getelementptr inbounds double, ptr %1583, i64 %1596
  %1598 = load double, ptr %1597, align 8, !tbaa !36
  %1599 = fsub double %1598, %1587
  %1600 = call double @llvm.fmuladd.f64(double %1595, double %1599, double %1587)
  %1601 = getelementptr inbounds i8, ptr %2, i64 520
  store double %1600, ptr %1601, align 8, !tbaa !122
  %1602 = getelementptr inbounds i8, ptr %2, i64 528
  %1603 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1600, ptr noundef nonnull %1602) #9
  %1604 = icmp eq i32 %1603, 1
  br i1 %1604, label %1605, label %1607

1605:                                             ; preds = %.critedge7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %94) #9
  %1606 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %94, ptr noundef nonnull @.str, ptr noundef nonnull @.str.77, ptr noundef nonnull %1606) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1176, ptr noundef nonnull %94) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %94) #9
  br label %1873

1607:                                             ; preds = %.critedge7
  %1608 = load double, ptr %1602, align 8, !tbaa !123
  %1609 = load i16, ptr %1294, align 4, !tbaa !99
  %1610 = load i16, ptr %1296, align 2, !tbaa !84
  %1611 = call i32 @background_at_tau(ptr noundef %1, double noundef %1608, i16 noundef signext %1609, i16 noundef signext %1610, ptr noundef nonnull %4, ptr noundef %246) #9
  %1612 = icmp eq i32 %1611, 1
  br i1 %1612, label %1613, label %1615

1613:                                             ; preds = %1607
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %95) #9
  %1614 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %95, ptr noundef nonnull @.str, ptr noundef nonnull @.str.78, ptr noundef nonnull %1614) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1180, ptr noundef nonnull %95) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %95) #9
  br label %1873

1615:                                             ; preds = %1607
  %1616 = load i32, ptr %1303, align 4, !tbaa !100
  %1617 = sext i32 %1616 to i64
  %1618 = getelementptr inbounds double, ptr %246, i64 %1617
  %1619 = load double, ptr %1618, align 8, !tbaa !36
  %1620 = getelementptr inbounds i8, ptr %2, i64 544
  store double %1619, ptr %1620, align 8, !tbaa !124
  %1621 = load double, ptr %1309, align 8, !tbaa !102
  %1622 = fmul double %1619, %1621
  %1623 = load double, ptr %1601, align 8, !tbaa !122
  %1624 = fadd double %1623, 1.000000e+00
  %1625 = fdiv double %1622, %1624
  %1626 = getelementptr inbounds i8, ptr %2, i64 536
  store double %1625, ptr %1626, align 8, !tbaa !125
  %1627 = load i16, ptr %459, align 2, !tbaa !21
  %1628 = icmp eq i16 %1627, 1
  %.pre1446 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1448 = load i32, ptr %438, align 4, !tbaa !43
  br i1 %1628, label %1629, label %1714

1629:                                             ; preds = %1615
  %1630 = load i32, ptr %275, align 8, !tbaa !35
  %1631 = add nsw i32 %1630, -1
  %1632 = mul nsw i32 %1631, %.pre1448
  %1633 = getelementptr inbounds i8, ptr %2, i64 324
  %1634 = load i32, ptr %1633, align 4, !tbaa !65
  %1635 = add nsw i32 %1632, %1634
  %1636 = sext i32 %1635 to i64
  %1637 = getelementptr inbounds double, ptr %.pre1446, i64 %1636
  %1638 = load double, ptr %1637, align 8, !tbaa !36
  %1639 = fcmp ogt double %1638, 1.000000e+00
  br i1 %1639, label %1640, label %1714

1640:                                             ; preds = %1629
  %1641 = getelementptr inbounds i8, ptr %2, i64 328
  %1642 = load i32, ptr %1641, align 8, !tbaa !66
  %1643 = add nsw i32 %1642, %1632
  %1644 = sext i32 %1643 to i64
  %1645 = getelementptr inbounds double, ptr %.pre1446, i64 %1644
  %1646 = load double, ptr %1645, align 8, !tbaa !36
  %1647 = fcmp ogt double %1646, 1.000000e+00
  br i1 %1647, label %.preheader1227.preheader, label %1714

.preheader1227.preheader:                         ; preds = %1640
  %1648 = sext i32 %.pre1448 to i64
  %1649 = sext i32 %1634 to i64
  %1650 = sext i32 %1631 to i64
  %invariant.gep1508 = getelementptr double, ptr %.pre1446, i64 %1649
  br label %.preheader1227

.preheader1227:                                   ; preds = %.preheader1227.preheader, %.preheader1227
  %indvars.iv1406 = phi i64 [ 0, %.preheader1227.preheader ], [ %indvars.iv.next1407, %.preheader1227 ]
  %1651 = mul nsw i64 %indvars.iv1406, %1648
  %gep1509 = getelementptr double, ptr %invariant.gep1508, i64 %1651
  %1652 = load double, ptr %gep1509, align 8, !tbaa !36
  %1653 = fcmp olt double %1652, 1.000000e+00
  %1654 = icmp slt i64 %indvars.iv1406, %1650
  %or.cond1226 = and i1 %1654, %1653
  %indvars.iv.next1407 = add nuw nsw i64 %indvars.iv1406, 1
  br i1 %or.cond1226, label %.preheader1227, label %.critedge9, !llvm.loop !126

.critedge9:                                       ; preds = %.preheader1227
  %1655 = trunc nuw nsw i64 %indvars.iv1406 to i32
  %1656 = load ptr, ptr %1212, align 8, !tbaa !41
  %1657 = add nsw i32 %1655, -1
  %1658 = sext i32 %1657 to i64
  %1659 = getelementptr inbounds double, ptr %1656, i64 %1658
  %1660 = load double, ptr %1659, align 8, !tbaa !36
  %1661 = mul nsw i32 %1657, %.pre1448
  %1662 = add nsw i32 %1661, %1634
  %1663 = sext i32 %1662 to i64
  %1664 = getelementptr inbounds double, ptr %.pre1446, i64 %1663
  %1665 = load double, ptr %1664, align 8, !tbaa !36
  %1666 = fsub double 1.000000e+00, %1665
  %1667 = fsub double %1652, %1665
  %1668 = fdiv double %1666, %1667
  %1669 = and i64 %indvars.iv1406, 4294967295
  %1670 = getelementptr inbounds double, ptr %1656, i64 %1669
  %1671 = load double, ptr %1670, align 8, !tbaa !36
  %1672 = fsub double %1671, %1660
  %1673 = call double @llvm.fmuladd.f64(double %1668, double %1672, double %1660)
  %1674 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1673, ptr noundef nonnull %9) #9
  %1675 = icmp eq i32 %1674, 1
  br i1 %1675, label %1686, label %.preheader

.preheader:                                       ; preds = %.critedge9
  %1676 = load ptr, ptr %437, align 8, !tbaa !42
  %1677 = load i32, ptr %438, align 4, !tbaa !43
  %1678 = load i32, ptr %1641, align 8, !tbaa !66
  %1679 = sext i32 %1678 to i64
  %1680 = getelementptr inbounds double, ptr %1676, i64 %1679
  %1681 = load double, ptr %1680, align 8, !tbaa !36
  %1682 = fcmp olt double %1681, 1.000000e+00
  br i1 %1682, label %.lr.ph1337, label %.critedge11

.lr.ph1337:                                       ; preds = %.preheader
  %1683 = load i32, ptr %275, align 8, !tbaa !35
  %1684 = sext i32 %1677 to i64
  %1685 = call i32 @llvm.smax.i32(i32 %1683, i32 1)
  %smax1412 = add nsw i32 %1685, -1
  %wide.trip.count1415 = zext nneg i32 %smax1412 to i64
  %invariant.gep1513 = getelementptr double, ptr %1676, i64 %1679
  %exitcond1416.not1575 = icmp eq i32 %smax1412, 0
  br i1 %exitcond1416.not1575, label %.critedge11, label %.lr.ph1577

1686:                                             ; preds = %.critedge9
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %96) #9
  %1687 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %96, ptr noundef nonnull @.str, ptr noundef nonnull @.str.79, ptr noundef nonnull %1687) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1200, ptr noundef nonnull %96) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %96) #9
  br label %1873

1688:                                             ; preds = %.lr.ph1577
  %exitcond1416.not = icmp eq i64 %indvars.iv.next1411, %wide.trip.count1415
  br i1 %exitcond1416.not, label %.critedge11, label %.lr.ph1577, !llvm.loop !127

.lr.ph1577:                                       ; preds = %.lr.ph1337, %1688
  %indvars.iv14101576 = phi i64 [ %indvars.iv.next1411, %1688 ], [ 0, %.lr.ph1337 ]
  %indvars.iv.next1411 = add nuw nsw i64 %indvars.iv14101576, 1
  %1689 = mul nsw i64 %indvars.iv.next1411, %1684
  %gep1514 = getelementptr double, ptr %invariant.gep1513, i64 %1689
  %1690 = load double, ptr %gep1514, align 8, !tbaa !36
  %1691 = fcmp olt double %1690, 1.000000e+00
  br i1 %1691, label %1688, label %.critedge11.loopexit.split.loop.exit, !llvm.loop !127

.critedge11.loopexit.split.loop.exit:             ; preds = %.lr.ph1577
  %indvars1413.le = trunc i64 %indvars.iv.next1411 to i32
  br label %.critedge11

.critedge11:                                      ; preds = %1688, %.lr.ph1337, %.critedge11.loopexit.split.loop.exit, %.preheader
  %.15.lcssa = phi i32 [ 0, %.preheader ], [ %indvars1413.le, %.critedge11.loopexit.split.loop.exit ], [ %smax1412, %.lr.ph1337 ], [ %smax1412, %1688 ]
  %.lcssa = phi double [ %1681, %.preheader ], [ %1690, %.critedge11.loopexit.split.loop.exit ], [ %1681, %.lr.ph1337 ], [ %1690, %1688 ]
  %1692 = load ptr, ptr %1212, align 8, !tbaa !41
  %1693 = add nsw i32 %.15.lcssa, -1
  %1694 = sext i32 %1693 to i64
  %1695 = getelementptr inbounds double, ptr %1692, i64 %1694
  %1696 = load double, ptr %1695, align 8, !tbaa !36
  %1697 = mul nsw i32 %1677, %1693
  %1698 = add nsw i32 %1697, %1678
  %1699 = sext i32 %1698 to i64
  %1700 = getelementptr inbounds double, ptr %1676, i64 %1699
  %1701 = load double, ptr %1700, align 8, !tbaa !36
  %1702 = fsub double 1.000000e+00, %1701
  %1703 = fsub double %.lcssa, %1701
  %1704 = fdiv double %1702, %1703
  %1705 = zext nneg i32 %.15.lcssa to i64
  %1706 = getelementptr inbounds double, ptr %1692, i64 %1705
  %1707 = load double, ptr %1706, align 8, !tbaa !36
  %1708 = fsub double %1707, %1696
  %1709 = call double @llvm.fmuladd.f64(double %1704, double %1708, double %1696)
  %1710 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1709, ptr noundef nonnull %10) #9
  %1711 = icmp eq i32 %1710, 1
  br i1 %1711, label %1712, label %.critedge11._crit_edge

.critedge11._crit_edge:                           ; preds = %.critedge11
  %.pre1445 = load ptr, ptr %437, align 8, !tbaa !42
  %.pre1447 = load i32, ptr %438, align 4, !tbaa !43
  br label %1714

1712:                                             ; preds = %.critedge11
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %97) #9
  %1713 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %97, ptr noundef nonnull @.str, ptr noundef nonnull @.str.80, ptr noundef nonnull %1713) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1214, ptr noundef nonnull %97) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %97) #9
  br label %1873

1714:                                             ; preds = %.critedge11._crit_edge, %1629, %1640, %1615
  %1715 = phi i32 [ %.pre1447, %.critedge11._crit_edge ], [ %.pre1448, %1629 ], [ %.pre1448, %1640 ], [ %.pre1448, %1615 ]
  %1716 = phi ptr [ %.pre1445, %.critedge11._crit_edge ], [ %.pre1446, %1629 ], [ %.pre1446, %1640 ], [ %.pre1446, %1615 ]
  %1717 = load i32, ptr %661, align 8, !tbaa !69
  %1718 = getelementptr inbounds i8, ptr %0, i64 1728
  %1719 = load double, ptr %1718, align 8, !tbaa !128
  %1720 = fmul double %1251, %1719
  %1721 = sext i32 %1715 to i64
  %1722 = sext i32 %1717 to i64
  br label %1723

1723:                                             ; preds = %1723, %1714
  %indvars.iv1417 = phi i64 [ %indvars.iv.next1418, %1723 ], [ %indvars.iv1385, %1714 ]
  %1724 = mul nsw i64 %indvars.iv1417, %1721
  %1725 = add nsw i64 %1724, %1722
  %1726 = getelementptr inbounds double, ptr %1716, i64 %1725
  %1727 = load double, ptr %1726, align 8, !tbaa !36
  %1728 = fcmp ogt double %1727, %1720
  %1729 = icmp sgt i64 %indvars.iv1417, 0
  %1730 = and i1 %1729, %1728
  %indvars.iv.next1418 = add nsw i64 %indvars.iv1417, -1
  br i1 %1730, label %1723, label %1731, !llvm.loop !129

1731:                                             ; preds = %1723
  %1732 = load ptr, ptr %1212, align 8, !tbaa !41
  %sext1452 = shl i64 %indvars.iv1417, 32
  %1733 = ashr exact i64 %sext1452, 29
  %1734 = getelementptr inbounds i8, ptr %1732, i64 %1733
  %1735 = load double, ptr %1734, align 8, !tbaa !36
  %1736 = getelementptr inbounds i8, ptr %2, i64 552
  %1737 = call i32 @background_tau_of_z(ptr noundef %1, double noundef %1735, ptr noundef nonnull %1736) #9
  %1738 = icmp eq i32 %1737, 1
  br i1 %1738, label %1739, label %1741

1739:                                             ; preds = %1731
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %98) #9
  %1740 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %98, ptr noundef nonnull @.str, ptr noundef nonnull @.str.81, ptr noundef nonnull %1740) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1228, ptr noundef nonnull %98) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %98) #9
  br label %1873

1741:                                             ; preds = %1731
  %1742 = load i16, ptr %100, align 4, !tbaa !5
  %1743 = icmp sgt i16 %1742, 0
  br i1 %1743, label %1744, label %1872

1744:                                             ; preds = %1741
  %1745 = load i16, ptr %459, align 2, !tbaa !21
  %1746 = icmp eq i16 %1745, 1
  br i1 %1746, label %1747, label %1775

1747:                                             ; preds = %1744
  %1748 = load ptr, ptr %437, align 8, !tbaa !42
  %1749 = load i32, ptr %275, align 8, !tbaa !35
  %1750 = add nsw i32 %1749, -1
  %1751 = load i32, ptr %438, align 4, !tbaa !43
  %1752 = mul nsw i32 %1750, %1751
  %1753 = getelementptr inbounds i8, ptr %2, i64 324
  %1754 = load i32, ptr %1753, align 4, !tbaa !65
  %1755 = add nsw i32 %1752, %1754
  %1756 = sext i32 %1755 to i64
  %1757 = getelementptr inbounds double, ptr %1748, i64 %1756
  %1758 = load double, ptr %1757, align 8, !tbaa !36
  %1759 = fcmp ogt double %1758, 1.000000e+00
  br i1 %1759, label %1760, label %1773

1760:                                             ; preds = %1747
  %1761 = getelementptr inbounds i8, ptr %2, i64 328
  %1762 = load i32, ptr %1761, align 8, !tbaa !66
  %1763 = add nsw i32 %1762, %1752
  %1764 = sext i32 %1763 to i64
  %1765 = getelementptr inbounds double, ptr %1748, i64 %1764
  %1766 = load double, ptr %1765, align 8, !tbaa !36
  %1767 = fcmp ogt double %1766, 1.000000e+00
  br i1 %1767, label %1768, label %1773

1768:                                             ; preds = %1760
  %1769 = load double, ptr %10, align 8, !tbaa !36
  %1770 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.82, double noundef %1769)
  %1771 = load double, ptr %9, align 8, !tbaa !36
  %1772 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.83, double noundef %1771)
  br label %1775

1773:                                             ; preds = %1760, %1747
  %1774 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.84)
  br label %1775

1775:                                             ; preds = %1768, %1773, %1744
  %1776 = load double, ptr %1276, align 8, !tbaa !96
  %1777 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.85, double noundef %1776)
  %1778 = load double, ptr %1287, align 8, !tbaa !98
  %1779 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.86, double noundef %1778)
  %1780 = load double, ptr %1308, align 8, !tbaa !101
  %1781 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.87, double noundef %1780)
  %1782 = load double, ptr %1319, align 8, !tbaa !104
  %1783 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.88, double noundef %1782)
  %1784 = load double, ptr %1308, align 8, !tbaa !101
  %1785 = fmul double %1784, 1.000000e+02
  %1786 = load double, ptr %1320, align 8, !tbaa !130
  %1787 = fdiv double %1785, %1786
  %1788 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.89, double noundef %1787)
  %1789 = load i16, ptr %506, align 2, !tbaa !67
  %1790 = icmp eq i16 %1789, 1
  br i1 %1790, label %1791, label %1798

1791:                                             ; preds = %1775
  %1792 = getelementptr inbounds i8, ptr %2, i64 456
  %1793 = load double, ptr %1792, align 8, !tbaa !107
  %1794 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.90, double noundef %1793)
  %1795 = load double, ptr %1792, align 8, !tbaa !107
  %1796 = fdiv double 0x401921FB54442D18, %1795
  %1797 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.91, double noundef %1796)
  br label %1798

1798:                                             ; preds = %1791, %1775
  %1799 = load double, ptr %1504, align 8, !tbaa !116
  %1800 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.92, double noundef %1799)
  %1801 = load double, ptr %1523, align 8, !tbaa !118
  %1802 = fmul double %1801, 1.000000e+02
  %1803 = load double, ptr %1533, align 8, !tbaa !131
  %1804 = fdiv double %1802, %1803
  %1805 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.93, double noundef %1804)
  %1806 = load double, ptr %1601, align 8, !tbaa !122
  %1807 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.94, double noundef %1806)
  %1808 = load double, ptr %1602, align 8, !tbaa !123
  %1809 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.86, double noundef %1808)
  %1810 = load double, ptr %1620, align 8, !tbaa !124
  %1811 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.95, double noundef %1810)
  %1812 = load i32, ptr %257, align 4, !tbaa !25
  switch i32 %1812, label %1838 [
    i32 1, label %1813
    i32 3, label %1813
  ]

1813:                                             ; preds = %1798, %1798
  %1814 = getelementptr inbounds i8, ptr %2, i64 16
  %1815 = load i32, ptr %1814, align 8, !tbaa !132
  %1816 = icmp eq i32 %1815, 1
  br i1 %1816, label %1817, label %1821

1817:                                             ; preds = %1813
  %1818 = getelementptr inbounds i8, ptr %2, i64 32
  %1819 = load double, ptr %1818, align 8, !tbaa !133
  %1820 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.96, double noundef %1819)
  %.pr = load i32, ptr %1814, align 8, !tbaa !132
  br label %1821

1821:                                             ; preds = %1817, %1813
  %1822 = phi i32 [ %.pr, %1817 ], [ %1815, %1813 ]
  %1823 = icmp eq i32 %1822, 0
  br i1 %1823, label %1824, label %1828

1824:                                             ; preds = %1821
  %1825 = getelementptr inbounds i8, ptr %2, i64 24
  %1826 = load double, ptr %1825, align 8, !tbaa !134
  %1827 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.97, double noundef %1826)
  br label %1828

1828:                                             ; preds = %1824, %1821
  %1829 = getelementptr inbounds i8, ptr %2, i64 32
  %1830 = load double, ptr %1829, align 8, !tbaa !133
  %1831 = call i32 @background_tau_of_z(ptr noundef nonnull %1, double noundef %1830, ptr noundef nonnull %5) #9
  %1832 = icmp eq i32 %1831, 1
  br i1 %1832, label %1833, label %1835

1833:                                             ; preds = %1828
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %99) #9
  %1834 = getelementptr inbounds i8, ptr %1, i64 2902
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %99, ptr noundef nonnull @.str, ptr noundef nonnull @.str.98, ptr noundef nonnull %1834) #9
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %443, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_init, i32 noundef 1264, ptr noundef nonnull %99) #9
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %99) #9
  br label %1873

1835:                                             ; preds = %1828
  %1836 = load double, ptr %5, align 8, !tbaa !36
  %1837 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.86, double noundef %1836)
  %.pr1222 = load i32, ptr %257, align 4, !tbaa !25
  br label %1838

1838:                                             ; preds = %1798, %1835
  %1839 = phi i32 [ %1812, %1798 ], [ %.pr1222, %1835 ]
  %1840 = icmp eq i32 %1839, 2
  br i1 %1840, label %1841, label %1845

1841:                                             ; preds = %1838
  %1842 = getelementptr inbounds i8, ptr %2, i64 24
  %1843 = load double, ptr %1842, align 8, !tbaa !134
  %1844 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.99, double noundef %1843)
  %.pre1449 = load i32, ptr %257, align 4, !tbaa !25
  br label %1845

1845:                                             ; preds = %1841, %1838
  %1846 = phi i32 [ %.pre1449, %1841 ], [ %1839, %1838 ]
  %1847 = icmp eq i32 %1846, 4
  br i1 %1847, label %1848, label %1852

1848:                                             ; preds = %1845
  %1849 = getelementptr inbounds i8, ptr %2, i64 24
  %1850 = load double, ptr %1849, align 8, !tbaa !134
  %1851 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.100, double noundef %1850)
  %.pr1223 = load i32, ptr %257, align 4, !tbaa !25
  br label %1852

1852:                                             ; preds = %1848, %1845
  %1853 = phi i32 [ %.pr1223, %1848 ], [ %1846, %1845 ]
  %1854 = icmp eq i32 %1853, 5
  br i1 %1854, label %1855, label %1859

1855:                                             ; preds = %1852
  %1856 = getelementptr inbounds i8, ptr %2, i64 24
  %1857 = load double, ptr %1856, align 8, !tbaa !134
  %1858 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.101, double noundef %1857)
  br label %1859

1859:                                             ; preds = %1855, %1852
  %1860 = load i16, ptr %100, align 4, !tbaa !5
  %1861 = icmp sgt i16 %1860, 1
  br i1 %1861, label %1862, label %1865

1862:                                             ; preds = %1859
  %1863 = load double, ptr %1400, align 8, !tbaa !110
  %1864 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.102, double noundef %1863)
  br label %1865

1865:                                             ; preds = %1862, %1859
  %1866 = load i16, ptr %1401, align 4, !tbaa !111
  %.not1210 = icmp eq i16 %1866, 0
  br i1 %.not1210, label %1872, label %1867

1867:                                             ; preds = %1865
  %1868 = load i16, ptr %100, align 4, !tbaa !5
  %1869 = icmp sgt i16 %1868, 1
  br i1 %1869, label %1870, label %1872

1870:                                             ; preds = %1867
  %1871 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.103, double noundef %.01175)
  br label %1872

1872:                                             ; preds = %1865, %1867, %1870, %1741
  call void @free(ptr noundef %246) #9
  br label %1873

1873:                                             ; preds = %1872, %1833, %1739, %1712, %1686, %1613, %1605, %1516, %1508, %1464, %1453, %1420, %1397, %1371, %1300, %1290, %1285, %1281, %1246, %1218, %1183, %1175, %1136, %1128, %1078, %1070, %1031, %1023, %912, %902, %891, %880, %869, %804, %691, %680, %665, %654, %644, %593, %582, %535, %520, %504, %493, %483, %472, %457, %446, %342, %303, %289, %272, %262, %254, %248, %239, %234, %229, %217, %194, %188, %184, %174, %162, %156, %150, %144, %138, %134, %128, %111
  %.0 = phi i32 [ 1, %111 ], [ 1, %128 ], [ 1, %134 ], [ 1, %138 ], [ 1, %144 ], [ 1, %150 ], [ 1, %156 ], [ 1, %162 ], [ 1, %174 ], [ 1, %184 ], [ 1, %188 ], [ 1, %194 ], [ 1, %217 ], [ 1, %229 ], [ 1, %234 ], [ 1, %239 ], [ 1, %248 ], [ 1, %254 ], [ 1, %262 ], [ 1, %272 ], [ 1, %289 ], [ 1, %303 ], [ 1, %342 ], [ 1, %446 ], [ 1, %457 ], [ 1, %472 ], [ 1, %483 ], [ 1, %493 ], [ 1, %504 ], [ 1, %520 ], [ 1, %535 ], [ 1, %582 ], [ 1, %593 ], [ 1, %644 ], [ 1, %654 ], [ 1, %665 ], [ 1, %680 ], [ 1, %691 ], [ 1, %804 ], [ 1, %869 ], [ 1, %880 ], [ 1, %891 ], [ 1, %902 ], [ 1, %912 ], [ 1, %1023 ], [ 1, %1031 ], [ 1, %1070 ], [ 1, %1078 ], [ 1, %1128 ], [ 1, %1136 ], [ 1, %1175 ], [ 1, %1183 ], [ 1, %1218 ], [ 1, %1246 ], [ 1, %1281 ], [ 1, %1285 ], [ 1, %1290 ], [ 1, %1300 ], [ 1, %1371 ], [ 1, %1397 ], [ 1, %1420 ], [ 1, %1453 ], [ 1, %1508 ], [ 1, %1516 ], [ 1, %1605 ], [ 1, %1613 ], [ 1, %1686 ], [ 1, %1712 ], [ 1, %1739 ], [ 1, %1833 ], [ 0, %1872 ], [ 1, %1464 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #9
  call void @llvm.lifetime.end.p0(i64 128, ptr nonnull %7) #9
  call void @llvm.lifetime.end.p0(i64 264, ptr nonnull %6) #9
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #9
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %4) #9
  ret i32 %.0
}

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #5

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_helium_from_bbn(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_indices(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #6

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_recombination(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr 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 #7

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_reionization(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

; Function Attrs: nounwind uwtable
declare dso_local i32 @thermodynamics_merge_reco_and_reio(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #4

declare i32 @background_tau_of_z(ptr noundef, double noundef, ptr noundef) local_unnamed_addr #3

declare i32 @background_at_tau(ptr noundef, double noundef, i16 noundef signext, i16 noundef signext, ptr noundef, ptr noundef) local_unnamed_addr #3

declare i32 @array_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i16 noundef signext, ptr noundef) local_unnamed_addr #3

declare i32 @array_integrate_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #3

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

declare i32 @array_derive_spline_table_line_to_line(ptr noundef, i32 noundef, ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #3

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

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

declare i32 @array_smooth(ptr noundef, i32 noundef, i32 noundef, i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #3

declare i32 @array_spline_table_lines(ptr noundef, i32 noundef, ptr noundef, i32 noundef, ptr noundef, i16 noundef signext, ptr noundef) local_unnamed_addr #3

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #8

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

!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 604}
!6 = !{!"thermo", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !7, i64 24, !7, i64 32, !11, i64 40, !11, i64 42, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !10, i64 80, !12, i64 88, !12, i64 96, !7, i64 104, !10, i64 112, !12, i64 120, !12, i64 128, !7, i64 136, !10, i64 144, !12, i64 152, !12, i64 160, !7, i64 168, !11, 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, !10, i64 272, !10, i64 276, !10, i64 280, !10, i64 284, !10, i64 288, !10, i64 292, !10, i64 296, !10, i64 300, !10, i64 304, !10, i64 308, !10, i64 312, !10, i64 316, !10, i64 320, !10, i64 324, !10, i64 328, !10, i64 332, !10, i64 336, !10, i64 340, !10, i64 344, !10, i64 348, !10, i64 352, !10, i64 356, !10, i64 360, !10, i64 364, !10, i64 368, !10, i64 372, !10, i64 376, !12, i64 384, !12, i64 392, !12, i64 400, !7, 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, !7, i64 504, !7, i64 512, !7, i64 520, !7, 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, !11, i64 600, !11, i64 602, !11, i64 604, !8, i64 606}
!7 = !{!"double", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!"any pointer", !8, i64 0}
!13 = !{!6, !7, i64 0}
!14 = !{!6, !7, i64 168}
!15 = !{!6, !7, i64 192}
!16 = !{!6, !7, i64 200}
!17 = !{!6, !7, i64 216}
!18 = !{!6, !7, i64 208}
!19 = !{!20, !11, i64 724}
!20 = !{!"background", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !10, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !11, 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, !11, i64 176, !7, i64 184, !7, i64 192, !12, i64 200, !10, i64 208, !10, i64 212, !7, i64 216, !10, i64 224, !12, i64 232, !12, i64 240, !7, i64 248, !12, i64 256, !7, i64 264, !12, i64 272, !7, i64 280, !12, i64 288, !7, i64 296, !12, i64 304, !12, i64 312, !12, i64 320, !7, i64 328, !7, i64 336, !7, i64 344, !7, i64 352, !10, i64 360, !12, i64 368, !7, i64 376, !7, i64 384, !7, i64 392, !7, i64 400, !7, i64 408, !7, i64 416, !7, i64 424, !7, i64 432, !7, i64 440, !7, i64 448, !7, i64 456, !10, i64 464, !10, i64 468, !10, i64 472, !10, i64 476, !10, i64 480, !10, i64 484, !10, i64 488, !10, i64 492, !10, i64 496, !10, i64 500, !10, i64 504, !10, i64 508, !10, i64 512, !10, i64 516, !10, i64 520, !10, i64 524, !10, i64 528, !10, i64 532, !10, i64 536, !10, i64 540, !10, i64 544, !10, i64 548, !10, i64 552, !10, i64 556, !10, i64 560, !10, i64 564, !10, i64 568, !10, i64 572, !10, i64 576, !10, i64 580, !10, i64 584, !10, i64 588, !10, i64 592, !10, i64 596, !10, i64 600, !10, i64 604, !10, i64 608, !10, i64 612, !10, i64 616, !10, i64 620, !10, i64 624, !10, i64 628, !12, i64 632, !12, i64 640, !12, i64 648, !12, i64 656, !12, i64 664, !10, i64 672, !10, i64 676, !10, i64 680, !10, i64 684, !10, i64 688, !10, i64 692, !10, i64 696, !10, i64 700, !10, i64 704, !10, i64 708, !10, i64 712, !10, i64 716, !10, i64 720, !11, i64 724, !11, i64 726, !11, i64 728, !11, i64 730, !11, i64 732, !11, i64 734, !11, i64 736, !11, i64 738, !11, i64 740, !11, i64 742, !11, i64 744, !12, i64 752, !12, i64 760, !12, i64 768, !12, i64 776, !12, i64 784, !12, i64 792, !12, i64 800, !12, i64 808, !12, i64 816, !12, i64 824, !12, i64 832, !11, i64 840, !11, i64 842, !11, i64 844, !11, i64 846, !11, i64 848, !11, i64 850, !8, i64 852, !11, i64 2900, !8, i64 2902}
!21 = !{!20, !11, i64 742}
!22 = !{!6, !7, i64 224}
!23 = !{!6, !10, i64 8}
!24 = !{!6, !7, i64 232}
!25 = !{!6, !10, i64 12}
!26 = !{!27, !10, i64 400}
!27 = !{!"precision", !7, i64 0, !7, 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, !8, i64 104, !7, i64 360, !10, i64 368, !7, i64 376, !10, i64 384, !10, i64 388, !7, i64 392, !10, i64 400, !7, i64 408, !10, 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, !7, i64 504, !7, i64 512, !7, i64 520, !7, 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, !7, i64 616, !10, i64 624, !8, i64 628, !8, i64 884, !8, i64 1140, !7, i64 1400, !7, i64 1408, !7, i64 1416, !7, i64 1424, !7, i64 1432, !7, i64 1440, !7, i64 1448, !7, i64 1456, !7, i64 1464, !7, i64 1472, !7, i64 1480, !7, i64 1488, !7, i64 1496, !7, i64 1504, !7, i64 1512, !7, i64 1520, !10, i64 1528, !7, i64 1536, !7, i64 1544, !10, i64 1552, !10, i64 1556, !10, i64 1560, !10, i64 1564, !10, i64 1568, !10, i64 1572, !10, i64 1576, !10, i64 1580, !7, i64 1584, !7, i64 1592, !7, i64 1600, !7, i64 1608, !7, i64 1616, !7, i64 1624, !7, i64 1632, !7, i64 1640, !10, i64 1648, !7, i64 1656, !7, i64 1664, !10, i64 1672, !7, i64 1680, !7, i64 1688, !10, i64 1696, !7, i64 1704, !10, i64 1712, !7, i64 1720, !7, i64 1728, !10, i64 1736, !7, i64 1744, !7, i64 1752, !7, i64 1760, !10, i64 1768, !7, i64 1776, !7, i64 1784, !7, i64 1792, !7, i64 1800, !7, i64 1808, !10, i64 1816, !7, i64 1824, !7, i64 1832, !7, i64 1840, !7, i64 1848, !7, i64 1856, !7, i64 1864, !7, i64 1872, !10, i64 1880, !7, i64 1888, !7, i64 1896, !7, i64 1904, !7, i64 1912, !7, i64 1920, !7, i64 1928, !7, i64 1936, !7, i64 1944, !7, i64 1952, !7, i64 1960, !7, i64 1968, !7, i64 1976, !7, i64 1984, !7, i64 1992, !7, i64 2000, !7, i64 2008, !7, i64 2016, !7, i64 2024, !7, i64 2032, !7, i64 2040, !7, i64 2048, !7, i64 2056, !7, i64 2064, !7, i64 2072, !7, i64 2080, !7, i64 2088, !7, i64 2096, !7, i64 2104, !7, i64 2112, !7, i64 2120, !7, i64 2128, !7, i64 2136, !7, i64 2144, !7, i64 2152, !7, i64 2160, !7, i64 2168, !7, i64 2176, !7, i64 2184, !7, i64 2192, !7, i64 2200, !7, i64 2208, !7, i64 2216, !7, i64 2224, !7, i64 2232, !7, i64 2240, !7, i64 2248, !10, i64 2256, !7, i64 2264, !7, i64 2272, !7, i64 2280, !7, i64 2288, !10, i64 2296, !7, i64 2304, !7, i64 2312, !10, i64 2320, !10, i64 2324, !10, i64 2328, !7, i64 2336, !7, i64 2344, !8, i64 2352}
!28 = !{!6, !7, i64 184}
!29 = !{!20, !10, i64 624}
!30 = !{!31, !12, i64 32}
!31 = !{!"recombination", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !12, 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, !11, i64 200, !7, i64 208, !7, i64 216, !7, i64 224, !7, i64 232, !7, i64 240, !7, i64 248, !7, i64 256}
!32 = !{!33, !10, i64 36}
!33 = !{!"reionization", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !12, i64 40, !7, i64 48, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !12, i64 112, !10, i64 120, !10, i64 124}
!34 = !{!33, !10, i64 124}
!35 = !{!6, !10, i64 376}
!36 = !{!7, !7, i64 0}
!37 = !{!6, !7, i64 584}
!38 = !{!10, !10, i64 0}
!39 = distinct !{!39, !40}
!40 = !{!"llvm.loop.mustprogress"}
!41 = !{!6, !12, i64 384}
!42 = !{!6, !12, i64 392}
!43 = !{!6, !10, i64 372}
!44 = !{!20, !11, i64 842}
!45 = !{!20, !11, i64 848}
!46 = !{!20, !10, i64 480}
!47 = !{!20, !10, i64 476}
!48 = !{!6, !10, i64 276}
!49 = !{!6, !10, i64 284}
!50 = !{!6, !7, i64 240}
!51 = !{!6, !7, i64 256}
!52 = !{!20, !7, i64 136}
!53 = !{!20, !7, i64 328}
!54 = !{!6, !10, i64 308}
!55 = !{!20, !10, i64 508}
!56 = !{!20, !10, i64 504}
!57 = !{!6, !10, i64 312}
!58 = !{!6, !7, i64 248}
!59 = !{!20, !7, i64 120}
!60 = !{!6, !10, i64 320}
!61 = distinct !{!61, !40}
!62 = !{!6, !10, i64 288}
!63 = !{!6, !10, i64 280}
!64 = !{!6, !10, i64 316}
!65 = !{!6, !10, i64 324}
!66 = !{!6, !10, i64 328}
!67 = !{!6, !11, i64 42}
!68 = distinct !{!68, !40}
!69 = !{!6, !10, i64 296}
!70 = !{!6, !10, i64 368}
!71 = distinct !{!71, !40}
!72 = !{!6, !11, i64 40}
!73 = !{!6, !10, i64 352}
!74 = !{!6, !10, i64 360}
!75 = !{!6, !10, i64 356}
!76 = !{!6, !10, i64 292}
!77 = !{!6, !10, i64 300}
!78 = !{!6, !10, i64 304}
!79 = !{!6, !10, i64 364}
!80 = !{!6, !10, i64 332}
!81 = distinct !{!81, !40}
!82 = !{!27, !10, i64 624}
!83 = !{!20, !11, i64 840}
!84 = !{!20, !11, i64 846}
!85 = !{!20, !10, i64 464}
!86 = !{!20, !10, i64 468}
!87 = !{!20, !7, i64 128}
!88 = !{!6, !10, i64 340}
!89 = !{!6, !7, i64 264}
!90 = !{!6, !10, i64 336}
!91 = distinct !{!91, !40}
!92 = distinct !{!92, !40}
!93 = !{!6, !12, i64 400}
!94 = distinct !{!94, !40}
!95 = distinct !{!95, !40}
!96 = !{!6, !7, i64 408}
!97 = !{!27, !7, i64 2344}
!98 = !{!6, !7, i64 416}
!99 = !{!20, !11, i64 844}
!100 = !{!20, !10, i64 604}
!101 = !{!6, !7, i64 424}
!102 = !{!20, !7, i64 456}
!103 = !{!20, !10, i64 592}
!104 = !{!6, !7, i64 448}
!105 = !{!20, !7, i64 344}
!106 = !{!6, !7, i64 560}
!107 = !{!6, !7, i64 456}
!108 = !{!27, !7, i64 1664}
!109 = distinct !{!109, !40}
!110 = !{!6, !7, i64 568}
!111 = !{!20, !11, i64 740}
!112 = !{!27, !7, i64 1688}
!113 = distinct !{!113, !40}
!114 = !{!6, !7, i64 576}
!115 = distinct !{!115, !40}
!116 = !{!6, !7, i64 464}
!117 = !{!6, !7, i64 472}
!118 = !{!6, !7, i64 480}
!119 = !{!6, !7, i64 504}
!120 = !{!6, !7, i64 512}
!121 = distinct !{!121, !40}
!122 = !{!6, !7, i64 520}
!123 = !{!6, !7, i64 528}
!124 = !{!6, !7, i64 544}
!125 = !{!6, !7, i64 536}
!126 = distinct !{!126, !40}
!127 = distinct !{!127, !40}
!128 = !{!27, !7, i64 1728}
!129 = distinct !{!129, !40}
!130 = !{!6, !7, i64 440}
!131 = !{!6, !7, i64 496}
!132 = !{!6, !10, i64 16}
!133 = !{!6, !7, i64 32}
!134 = !{!6, !7, i64 24}


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