; 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.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.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.10 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.139 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.146 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.148 = external hidden unnamed_addr constant [31 x i8], align 1
@__func__.thermodynamics_reionization = external hidden unnamed_addr constant [28 x i8], align 1
@.str.149 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.150 = external hidden unnamed_addr constant [59 x i8], align 1
@.str.151 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.152 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.153 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.154 = external hidden unnamed_addr constant [180 x i8], align 1
@.str.155 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.156 = external hidden unnamed_addr constant [132 x i8], align 1
@.str.157 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.158 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.159 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.160 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.161 = external hidden unnamed_addr constant [86 x i8], align 1
@.str.162 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.163 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.164 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.165 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.166 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.167 = external hidden unnamed_addr constant [137 x i8], align 1
@.str.168 = external hidden unnamed_addr constant [221 x i8], align 1
@.str.169 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.170 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.171 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.172 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.173 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.174 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.175 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.176 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.177 = external hidden unnamed_addr constant [98 x i8], align 1
@.str.178 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.179 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.180 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.181 = external hidden unnamed_addr constant [98 x i8], align 1
@.str.182 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.183 = external hidden unnamed_addr constant [89 x i8], align 1
@.str.184 = external hidden unnamed_addr constant [34 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: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @thermodynamics_reionization(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5) #5 {
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca double, align 8
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca i32, align 4
  %26 = alloca [2048 x i8], align 16
  %27 = alloca i32, align 4
  %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
  store ptr %0, ptr %8, align 8, !tbaa !5
  store ptr %1, ptr %9, align 8, !tbaa !5
  store ptr %2, ptr %10, align 8, !tbaa !5
  store ptr %3, ptr %11, align 8, !tbaa !5
  store ptr %4, ptr %12, align 8, !tbaa !5
  store ptr %5, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 8, 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 4, ptr %21) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #6
  %86 = load ptr, ptr %12, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.reionization, ptr %86, i32 0, i32 26
  %88 = load i32, ptr %87, align 8, !tbaa !9
  %89 = sext i32 %88 to i64
  %90 = mul i64 %89, 8
  %91 = call noalias ptr @malloc(i64 noundef %90) #7
  %92 = load ptr, ptr %12, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.reionization, ptr %92, i32 0, i32 25
  store ptr %91, ptr %93, align 8, !tbaa !13
  %94 = load ptr, ptr %12, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.reionization, ptr %94, i32 0, i32 25
  %96 = load ptr, ptr %95, align 8, !tbaa !13
  %97 = icmp eq ptr %96, null
  br i1 %97, label %98, label %111

98:                                               ; preds = %6
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %99 = load ptr, ptr %12, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.reionization, ptr %99, i32 0, i32 26
  %101 = load i32, ptr %100, align 8, !tbaa !9
  %102 = sext i32 %101 to i64
  %103 = mul i64 %102, 8
  %104 = trunc i64 %103 to i32
  store i32 %104, ptr %25, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 2048, ptr %26) #6
  %105 = getelementptr inbounds [2048 x i8], ptr %26, i64 0, i64 0
  %106 = load i32, ptr %25, align 4, !tbaa !14
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %105, ptr noundef @.str.37, ptr noundef @.str.148, i32 noundef %106)
  %107 = load ptr, ptr %10, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.thermo, ptr %107, i32 0, i32 93
  %109 = getelementptr inbounds [2048 x i8], ptr %108, i64 0, i64 0
  %110 = getelementptr inbounds [2048 x i8], ptr %26, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %109, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2235, ptr noundef %110)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %26) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  br label %1945

111:                                              ; preds = %6
  %112 = load ptr, ptr %10, align 8, !tbaa !5
  %113 = getelementptr inbounds %struct.thermo, ptr %112, i32 0, i32 2
  %114 = load i32, ptr %113, align 4, !tbaa !15
  %115 = icmp eq i32 %114, 1
  br i1 %115, label %121, label %116

116:                                              ; preds = %111
  %117 = load ptr, ptr %10, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.thermo, ptr %117, i32 0, i32 2
  %119 = load i32, ptr %118, align 4, !tbaa !15
  %120 = icmp eq i32 %119, 3
  br i1 %120, label %121, label %789

121:                                              ; preds = %116, %111
  %122 = load ptr, ptr %10, align 8, !tbaa !5
  %123 = getelementptr inbounds %struct.thermo, ptr %122, i32 0, i32 2
  %124 = load i32, ptr %123, align 4, !tbaa !15
  %125 = icmp eq i32 %124, 1
  br i1 %125, label %126, label %145

126:                                              ; preds = %121
  %127 = load ptr, ptr %10, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.thermo, ptr %127, i32 0, i32 0
  %129 = load double, ptr %128, align 8, !tbaa !18
  %130 = load ptr, ptr %10, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.thermo, ptr %130, i32 0, i32 0
  %132 = load double, ptr %131, align 8, !tbaa !18
  %133 = fsub double 1.000000e+00, %132
  %134 = fmul double 3.971500e+00, %133
  %135 = fdiv double %129, %134
  %136 = fadd double 1.000000e+00, %135
  %137 = load ptr, ptr %12, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.reionization, ptr %137, i32 0, i32 25
  %139 = load ptr, ptr %138, align 8, !tbaa !13
  %140 = load ptr, ptr %12, align 8, !tbaa !5
  %141 = getelementptr inbounds %struct.reionization, ptr %140, i32 0, i32 16
  %142 = load i32, ptr %141, align 8, !tbaa !19
  %143 = sext i32 %142 to i64
  %144 = getelementptr inbounds double, ptr %139, i64 %143
  store double %136, ptr %144, align 8, !tbaa !20
  br label %145

145:                                              ; preds = %126, %121
  %146 = load ptr, ptr %10, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.thermo, ptr %146, i32 0, i32 2
  %148 = load i32, ptr %147, align 4, !tbaa !15
  %149 = icmp eq i32 %148, 3
  br i1 %149, label %150, label %159

150:                                              ; preds = %145
  %151 = load ptr, ptr %12, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.reionization, ptr %151, i32 0, i32 25
  %153 = load ptr, ptr %152, align 8, !tbaa !13
  %154 = load ptr, ptr %12, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.reionization, ptr %154, i32 0, i32 16
  %156 = load i32, ptr %155, align 8, !tbaa !19
  %157 = sext i32 %156 to i64
  %158 = getelementptr inbounds double, ptr %153, i64 %157
  store double 1.000000e+00, ptr %158, align 8, !tbaa !20
  br label %159

159:                                              ; preds = %150, %145
  %160 = load ptr, ptr %10, align 8, !tbaa !5
  %161 = getelementptr inbounds %struct.thermo, ptr %160, i32 0, i32 9
  %162 = load double, ptr %161, align 8, !tbaa !21
  %163 = load ptr, ptr %12, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.reionization, ptr %163, i32 0, i32 25
  %165 = load ptr, ptr %164, align 8, !tbaa !13
  %166 = load ptr, ptr %12, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.reionization, ptr %166, i32 0, i32 13
  %168 = load i32, ptr %167, align 4, !tbaa !22
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds double, ptr %165, i64 %169
  store double %162, ptr %170, align 8, !tbaa !20
  %171 = load ptr, ptr %10, align 8, !tbaa !5
  %172 = getelementptr inbounds %struct.thermo, ptr %171, i32 0, i32 8
  %173 = load double, ptr %172, align 8, !tbaa !23
  %174 = load ptr, ptr %12, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.reionization, ptr %174, i32 0, i32 25
  %176 = load ptr, ptr %175, align 8, !tbaa !13
  %177 = load ptr, ptr %12, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.reionization, ptr %177, i32 0, i32 14
  %179 = load i32, ptr %178, align 8, !tbaa !24
  %180 = sext i32 %179 to i64
  %181 = getelementptr inbounds double, ptr %176, i64 %180
  store double %173, ptr %181, align 8, !tbaa !20
  %182 = load ptr, ptr %10, align 8, !tbaa !5
  %183 = getelementptr inbounds %struct.thermo, ptr %182, i32 0, i32 0
  %184 = load double, ptr %183, align 8, !tbaa !18
  %185 = load ptr, ptr %10, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.thermo, ptr %185, i32 0, i32 0
  %187 = load double, ptr %186, align 8, !tbaa !18
  %188 = fsub double 1.000000e+00, %187
  %189 = fmul double 3.971500e+00, %188
  %190 = fdiv double %184, %189
  %191 = load ptr, ptr %12, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.reionization, ptr %191, i32 0, i32 25
  %193 = load ptr, ptr %192, align 8, !tbaa !13
  %194 = load ptr, ptr %12, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.reionization, ptr %194, i32 0, i32 17
  %196 = load i32, ptr %195, align 4, !tbaa !25
  %197 = sext i32 %196 to i64
  %198 = getelementptr inbounds double, ptr %193, i64 %197
  store double %190, ptr %198, align 8, !tbaa !20
  %199 = load ptr, ptr %10, align 8, !tbaa !5
  %200 = getelementptr inbounds %struct.thermo, ptr %199, i32 0, i32 10
  %201 = load double, ptr %200, align 8, !tbaa !26
  %202 = load ptr, ptr %12, align 8, !tbaa !5
  %203 = getelementptr inbounds %struct.reionization, ptr %202, i32 0, i32 25
  %204 = load ptr, ptr %203, align 8, !tbaa !13
  %205 = load ptr, ptr %12, align 8, !tbaa !5
  %206 = getelementptr inbounds %struct.reionization, ptr %205, i32 0, i32 18
  %207 = load i32, ptr %206, align 8, !tbaa !27
  %208 = sext i32 %207 to i64
  %209 = getelementptr inbounds double, ptr %204, i64 %208
  store double %201, ptr %209, align 8, !tbaa !20
  %210 = load ptr, ptr %10, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.thermo, ptr %210, i32 0, i32 11
  %212 = load double, ptr %211, align 8, !tbaa !28
  %213 = load ptr, ptr %12, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.reionization, ptr %213, i32 0, i32 25
  %215 = load ptr, ptr %214, align 8, !tbaa !13
  %216 = load ptr, ptr %12, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.reionization, ptr %216, i32 0, i32 19
  %218 = load i32, ptr %217, align 4, !tbaa !29
  %219 = sext i32 %218 to i64
  %220 = getelementptr inbounds double, ptr %215, i64 %219
  store double %212, ptr %220, align 8, !tbaa !20
  %221 = load ptr, ptr %12, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.reionization, ptr %221, i32 0, i32 25
  %223 = load ptr, ptr %222, align 8, !tbaa !13
  %224 = load ptr, ptr %12, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.reionization, ptr %224, i32 0, i32 13
  %226 = load i32, ptr %225, align 4, !tbaa !22
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds double, ptr %223, i64 %227
  %229 = load double, ptr %228, align 8, !tbaa !20
  %230 = fcmp oeq double %229, 0.000000e+00
  br i1 %230, label %231, label %239

231:                                              ; preds = %159
  call void @llvm.lifetime.start.p0(i64 2048, ptr %28) #6
  %232 = getelementptr inbounds [2048 x i8], ptr %28, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %232, ptr noundef @.str.34)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %29) #6
  %233 = getelementptr inbounds [2048 x i8], ptr %29, i64 0, i64 0
  %234 = getelementptr inbounds [2048 x i8], ptr %28, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %233, ptr noundef @.str.10, ptr noundef @.str.149, ptr noundef %234)
  %235 = load ptr, ptr %10, align 8, !tbaa !5
  %236 = getelementptr inbounds %struct.thermo, ptr %235, i32 0, i32 93
  %237 = getelementptr inbounds [2048 x i8], ptr %236, i64 0, i64 0
  %238 = getelementptr inbounds [2048 x i8], ptr %29, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %237, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2258, ptr noundef %238)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %28) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

239:                                              ; preds = %159
  %240 = load ptr, ptr %12, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.reionization, ptr %240, i32 0, i32 25
  %242 = load ptr, ptr %241, align 8, !tbaa !13
  %243 = load ptr, ptr %12, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.reionization, ptr %243, i32 0, i32 14
  %245 = load i32, ptr %244, align 8, !tbaa !24
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds double, ptr %242, i64 %246
  %248 = load double, ptr %247, align 8, !tbaa !20
  %249 = fcmp oeq double %248, 0.000000e+00
  br i1 %249, label %250, label %258

250:                                              ; preds = %239
  call void @llvm.lifetime.start.p0(i64 2048, ptr %30) #6
  %251 = getelementptr inbounds [2048 x i8], ptr %30, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %251, ptr noundef @.str.34)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %31) #6
  %252 = getelementptr inbounds [2048 x i8], ptr %31, i64 0, i64 0
  %253 = getelementptr inbounds [2048 x i8], ptr %30, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %252, ptr noundef @.str.10, ptr noundef @.str.150, ptr noundef %253)
  %254 = load ptr, ptr %10, align 8, !tbaa !5
  %255 = getelementptr inbounds %struct.thermo, ptr %254, i32 0, i32 93
  %256 = getelementptr inbounds [2048 x i8], ptr %255, i64 0, i64 0
  %257 = getelementptr inbounds [2048 x i8], ptr %31, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %256, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2262, ptr noundef %257)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %30) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

258:                                              ; preds = %239
  %259 = load ptr, ptr %12, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.reionization, ptr %259, i32 0, i32 25
  %261 = load ptr, ptr %260, align 8, !tbaa !13
  %262 = load ptr, ptr %12, align 8, !tbaa !5
  %263 = getelementptr inbounds %struct.reionization, ptr %262, i32 0, i32 19
  %264 = load i32, ptr %263, align 4, !tbaa !29
  %265 = sext i32 %264 to i64
  %266 = getelementptr inbounds double, ptr %261, i64 %265
  %267 = load double, ptr %266, align 8, !tbaa !20
  %268 = fcmp oeq double %267, 0.000000e+00
  br i1 %268, label %269, label %277

269:                                              ; preds = %258
  call void @llvm.lifetime.start.p0(i64 2048, ptr %32) #6
  %270 = getelementptr inbounds [2048 x i8], ptr %32, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %270, ptr noundef @.str.34)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %33) #6
  %271 = getelementptr inbounds [2048 x i8], ptr %33, i64 0, i64 0
  %272 = getelementptr inbounds [2048 x i8], ptr %32, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %271, ptr noundef @.str.10, ptr noundef @.str.151, ptr noundef %272)
  %273 = load ptr, ptr %10, align 8, !tbaa !5
  %274 = getelementptr inbounds %struct.thermo, ptr %273, i32 0, i32 93
  %275 = getelementptr inbounds [2048 x i8], ptr %274, i64 0, i64 0
  %276 = getelementptr inbounds [2048 x i8], ptr %33, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %275, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2266, ptr noundef %276)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %32) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

277:                                              ; preds = %258
  %278 = load ptr, ptr %10, align 8, !tbaa !5
  %279 = getelementptr inbounds %struct.thermo, ptr %278, i32 0, i32 3
  %280 = load i32, ptr %279, align 8, !tbaa !30
  %281 = icmp eq i32 %280, 0
  br i1 %281, label %282, label %456

282:                                              ; preds = %277
  %283 = load ptr, ptr %10, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.thermo, ptr %283, i32 0, i32 5
  %285 = load double, ptr %284, align 8, !tbaa !31
  %286 = load ptr, ptr %12, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.reionization, ptr %286, i32 0, i32 25
  %288 = load ptr, ptr %287, align 8, !tbaa !13
  %289 = load ptr, ptr %12, align 8, !tbaa !5
  %290 = getelementptr inbounds %struct.reionization, ptr %289, i32 0, i32 12
  %291 = load i32, ptr %290, align 8, !tbaa !32
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds double, ptr %288, i64 %292
  store double %285, ptr %293, align 8, !tbaa !20
  %294 = load ptr, ptr %10, align 8, !tbaa !5
  %295 = getelementptr inbounds %struct.thermo, ptr %294, i32 0, i32 2
  %296 = load i32, ptr %295, align 4, !tbaa !15
  %297 = icmp eq i32 %296, 1
  br i1 %297, label %298, label %363

298:                                              ; preds = %282
  %299 = load ptr, ptr %12, align 8, !tbaa !5
  %300 = getelementptr inbounds %struct.reionization, ptr %299, i32 0, i32 25
  %301 = load ptr, ptr %300, align 8, !tbaa !13
  %302 = load ptr, ptr %12, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct.reionization, ptr %302, i32 0, i32 12
  %304 = load i32, ptr %303, align 8, !tbaa !32
  %305 = sext i32 %304 to i64
  %306 = getelementptr inbounds double, ptr %301, i64 %305
  %307 = load double, ptr %306, align 8, !tbaa !20
  %308 = load ptr, ptr %8, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.precision, ptr %308, i32 0, i32 47
  %310 = load double, ptr %309, align 8, !tbaa !33
  %311 = load ptr, ptr %10, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.thermo, ptr %311, i32 0, i32 8
  %313 = load double, ptr %312, align 8, !tbaa !23
  %314 = call double @llvm.fmuladd.f64(double %310, double %313, double %307)
  %315 = load ptr, ptr %12, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.reionization, ptr %315, i32 0, i32 25
  %317 = load ptr, ptr %316, align 8, !tbaa !13
  %318 = load ptr, ptr %12, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.reionization, ptr %318, i32 0, i32 24
  %320 = load i32, ptr %319, align 8, !tbaa !35
  %321 = sext i32 %320 to i64
  %322 = getelementptr inbounds double, ptr %317, i64 %321
  store double %314, ptr %322, align 8, !tbaa !20
  %323 = load ptr, ptr %12, align 8, !tbaa !5
  %324 = getelementptr inbounds %struct.reionization, ptr %323, i32 0, i32 25
  %325 = load ptr, ptr %324, align 8, !tbaa !13
  %326 = load ptr, ptr %12, align 8, !tbaa !5
  %327 = getelementptr inbounds %struct.reionization, ptr %326, i32 0, i32 24
  %328 = load i32, ptr %327, align 8, !tbaa !35
  %329 = sext i32 %328 to i64
  %330 = getelementptr inbounds double, ptr %325, i64 %329
  %331 = load double, ptr %330, align 8, !tbaa !20
  %332 = load ptr, ptr %10, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.thermo, ptr %332, i32 0, i32 10
  %334 = load double, ptr %333, align 8, !tbaa !26
  %335 = load ptr, ptr %8, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.precision, ptr %335, i32 0, i32 47
  %337 = load double, ptr %336, align 8, !tbaa !33
  %338 = load ptr, ptr %10, align 8, !tbaa !5
  %339 = getelementptr inbounds %struct.thermo, ptr %338, i32 0, i32 11
  %340 = load double, ptr %339, align 8, !tbaa !28
  %341 = call double @llvm.fmuladd.f64(double %337, double %340, double %334)
  %342 = fcmp olt double %331, %341
  br i1 %342, label %343, label %362

343:                                              ; preds = %298
  %344 = load ptr, ptr %10, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.thermo, ptr %344, i32 0, i32 10
  %346 = load double, ptr %345, align 8, !tbaa !26
  %347 = load ptr, ptr %8, align 8, !tbaa !5
  %348 = getelementptr inbounds %struct.precision, ptr %347, i32 0, i32 47
  %349 = load double, ptr %348, align 8, !tbaa !33
  %350 = load ptr, ptr %10, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.thermo, ptr %350, i32 0, i32 11
  %352 = load double, ptr %351, align 8, !tbaa !28
  %353 = call double @llvm.fmuladd.f64(double %349, double %352, double %346)
  %354 = load ptr, ptr %12, align 8, !tbaa !5
  %355 = getelementptr inbounds %struct.reionization, ptr %354, i32 0, i32 25
  %356 = load ptr, ptr %355, align 8, !tbaa !13
  %357 = load ptr, ptr %12, align 8, !tbaa !5
  %358 = getelementptr inbounds %struct.reionization, ptr %357, i32 0, i32 24
  %359 = load i32, ptr %358, align 8, !tbaa !35
  %360 = sext i32 %359 to i64
  %361 = getelementptr inbounds double, ptr %356, i64 %360
  store double %353, ptr %361, align 8, !tbaa !20
  br label %362

362:                                              ; preds = %343, %298
  br label %375

363:                                              ; preds = %282
  %364 = load ptr, ptr %10, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.thermo, ptr %364, i32 0, i32 5
  %366 = load double, ptr %365, align 8, !tbaa !31
  %367 = load ptr, ptr %12, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.reionization, ptr %367, i32 0, i32 25
  %369 = load ptr, ptr %368, align 8, !tbaa !13
  %370 = load ptr, ptr %12, align 8, !tbaa !5
  %371 = getelementptr inbounds %struct.reionization, ptr %370, i32 0, i32 24
  %372 = load i32, ptr %371, align 8, !tbaa !35
  %373 = sext i32 %372 to i64
  %374 = getelementptr inbounds double, ptr %369, i64 %373
  store double %366, ptr %374, align 8, !tbaa !20
  br label %375

375:                                              ; preds = %363, %362
  %376 = load ptr, ptr %12, align 8, !tbaa !5
  %377 = getelementptr inbounds %struct.reionization, ptr %376, i32 0, i32 25
  %378 = load ptr, ptr %377, align 8, !tbaa !13
  %379 = load ptr, ptr %12, align 8, !tbaa !5
  %380 = getelementptr inbounds %struct.reionization, ptr %379, i32 0, i32 24
  %381 = load i32, ptr %380, align 8, !tbaa !35
  %382 = sext i32 %381 to i64
  %383 = getelementptr inbounds double, ptr %378, i64 %382
  %384 = load double, ptr %383, align 8, !tbaa !20
  %385 = load ptr, ptr %8, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.precision, ptr %385, i32 0, i32 44
  %387 = load double, ptr %386, align 8, !tbaa !36
  %388 = fcmp ogt double %384, %387
  br i1 %388, label %389, label %400

389:                                              ; preds = %375
  call void @llvm.lifetime.start.p0(i64 2048, ptr %34) #6
  %390 = getelementptr inbounds [2048 x i8], ptr %34, i64 0, i64 0
  %391 = load ptr, ptr %8, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.precision, ptr %391, i32 0, i32 44
  %393 = load double, ptr %392, align 8, !tbaa !36
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %390, ptr noundef @.str.152, double noundef %393)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %35) #6
  %394 = getelementptr inbounds [2048 x i8], ptr %35, i64 0, i64 0
  %395 = getelementptr inbounds [2048 x i8], ptr %34, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %394, ptr noundef @.str.10, ptr noundef @.str.153, ptr noundef %395)
  %396 = load ptr, ptr %10, align 8, !tbaa !5
  %397 = getelementptr inbounds %struct.thermo, ptr %396, i32 0, i32 93
  %398 = getelementptr inbounds [2048 x i8], ptr %397, i64 0, i64 0
  %399 = getelementptr inbounds [2048 x i8], ptr %35, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %398, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2297, ptr noundef %399)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %34) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

400:                                              ; preds = %375
  %401 = load ptr, ptr %8, align 8, !tbaa !5
  %402 = load ptr, ptr %10, align 8, !tbaa !5
  %403 = load ptr, ptr %11, align 8, !tbaa !5
  %404 = load ptr, ptr %12, align 8, !tbaa !5
  %405 = getelementptr inbounds %struct.reionization, ptr %404, i32 0, i32 25
  %406 = load ptr, ptr %405, align 8, !tbaa !13
  %407 = load ptr, ptr %12, align 8, !tbaa !5
  %408 = getelementptr inbounds %struct.reionization, ptr %407, i32 0, i32 24
  %409 = load i32, ptr %408, align 8, !tbaa !35
  %410 = sext i32 %409 to i64
  %411 = getelementptr inbounds double, ptr %406, i64 %410
  %412 = load double, ptr %411, align 8, !tbaa !20
  %413 = load ptr, ptr %12, align 8, !tbaa !5
  %414 = getelementptr inbounds %struct.reionization, ptr %413, i32 0, i32 25
  %415 = load ptr, ptr %414, align 8, !tbaa !13
  %416 = load ptr, ptr %12, align 8, !tbaa !5
  %417 = getelementptr inbounds %struct.reionization, ptr %416, i32 0, i32 15
  %418 = load i32, ptr %417, align 4, !tbaa !37
  %419 = sext i32 %418 to i64
  %420 = getelementptr inbounds double, ptr %415, i64 %419
  %421 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %401, ptr noundef %402, ptr noundef %403, double noundef %412, ptr noundef %420)
  %422 = icmp eq i32 %421, 1
  br i1 %422, label %423, label %432

423:                                              ; preds = %400
  call void @llvm.lifetime.start.p0(i64 2048, ptr %36) #6
  %424 = getelementptr inbounds [2048 x i8], ptr %36, i64 0, i64 0
  %425 = load ptr, ptr %10, align 8, !tbaa !5
  %426 = getelementptr inbounds %struct.thermo, ptr %425, i32 0, i32 93
  %427 = getelementptr inbounds [2048 x i8], ptr %426, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %424, ptr noundef @.str, ptr noundef @.str.154, ptr noundef %427)
  %428 = load ptr, ptr %10, align 8, !tbaa !5
  %429 = getelementptr inbounds %struct.thermo, ptr %428, i32 0, i32 93
  %430 = getelementptr inbounds [2048 x i8], ptr %429, i64 0, i64 0
  %431 = getelementptr inbounds [2048 x i8], ptr %36, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %430, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2306, ptr noundef %431)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %36) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

432:                                              ; preds = %400
  %433 = load ptr, ptr %8, align 8, !tbaa !5
  %434 = load ptr, ptr %9, align 8, !tbaa !5
  %435 = load ptr, ptr %10, align 8, !tbaa !5
  %436 = load ptr, ptr %11, align 8, !tbaa !5
  %437 = load ptr, ptr %12, align 8, !tbaa !5
  %438 = load ptr, ptr %13, align 8, !tbaa !5
  %439 = call i32 @thermodynamics_reionization_sample(ptr noundef %433, ptr noundef %434, 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 = %432
  call void @llvm.lifetime.start.p0(i64 2048, ptr %37) #6
  %442 = getelementptr inbounds [2048 x i8], ptr %37, i64 0, i64 0
  %443 = load ptr, ptr %10, 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.155, ptr noundef %445)
  %446 = load ptr, ptr %10, 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 %37, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %448, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2311, ptr noundef %449)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %37) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

450:                                              ; preds = %432
  %451 = load ptr, ptr %12, align 8, !tbaa !5
  %452 = getelementptr inbounds %struct.reionization, ptr %451, i32 0, i32 11
  %453 = load double, ptr %452, align 8, !tbaa !38
  %454 = load ptr, ptr %10, align 8, !tbaa !5
  %455 = getelementptr inbounds %struct.thermo, ptr %454, i32 0, i32 4
  store double %453, ptr %455, align 8, !tbaa !39
  br label %456

456:                                              ; preds = %450, %277
  %457 = load ptr, ptr %10, align 8, !tbaa !5
  %458 = getelementptr inbounds %struct.thermo, ptr %457, i32 0, i32 3
  %459 = load i32, ptr %458, align 8, !tbaa !30
  %460 = icmp eq i32 %459, 1
  br i1 %460, label %461, label %785

461:                                              ; preds = %456
  %462 = load ptr, ptr %8, align 8, !tbaa !5
  %463 = getelementptr inbounds %struct.precision, ptr %462, i32 0, i32 44
  %464 = load double, ptr %463, align 8, !tbaa !36
  %465 = load ptr, ptr %8, align 8, !tbaa !5
  %466 = getelementptr inbounds %struct.precision, ptr %465, i32 0, i32 47
  %467 = load double, ptr %466, align 8, !tbaa !33
  %468 = load ptr, ptr %10, align 8, !tbaa !5
  %469 = getelementptr inbounds %struct.thermo, ptr %468, i32 0, i32 8
  %470 = load double, ptr %469, align 8, !tbaa !23
  %471 = fneg double %467
  %472 = call double @llvm.fmuladd.f64(double %471, double %470, double %464)
  store double %472, ptr %15, align 8, !tbaa !20
  %473 = load double, ptr %15, align 8, !tbaa !20
  %474 = fcmp olt double %473, 0.000000e+00
  br i1 %474, label %475, label %483

475:                                              ; preds = %461
  call void @llvm.lifetime.start.p0(i64 2048, ptr %38) #6
  %476 = getelementptr inbounds [2048 x i8], ptr %38, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %476, ptr noundef @.str.156)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %39) #6
  %477 = getelementptr inbounds [2048 x i8], ptr %39, i64 0, i64 0
  %478 = getelementptr inbounds [2048 x i8], ptr %38, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %477, ptr noundef @.str.10, ptr noundef @.str.157, ptr noundef %478)
  %479 = load ptr, ptr %10, align 8, !tbaa !5
  %480 = getelementptr inbounds %struct.thermo, ptr %479, i32 0, i32 93
  %481 = getelementptr inbounds [2048 x i8], ptr %480, i64 0, i64 0
  %482 = getelementptr inbounds [2048 x i8], ptr %39, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %481, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2326, ptr noundef %482)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %38) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

483:                                              ; preds = %461
  %484 = load double, ptr %15, align 8, !tbaa !20
  %485 = load ptr, ptr %12, align 8, !tbaa !5
  %486 = getelementptr inbounds %struct.reionization, ptr %485, i32 0, i32 25
  %487 = load ptr, ptr %486, align 8, !tbaa !13
  %488 = load ptr, ptr %12, align 8, !tbaa !5
  %489 = getelementptr inbounds %struct.reionization, ptr %488, i32 0, i32 12
  %490 = load i32, ptr %489, align 8, !tbaa !32
  %491 = sext i32 %490 to i64
  %492 = getelementptr inbounds double, ptr %487, i64 %491
  store double %484, ptr %492, align 8, !tbaa !20
  %493 = load ptr, ptr %8, align 8, !tbaa !5
  %494 = getelementptr inbounds %struct.precision, ptr %493, i32 0, i32 44
  %495 = load double, ptr %494, align 8, !tbaa !36
  %496 = load ptr, ptr %12, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.reionization, ptr %496, i32 0, i32 25
  %498 = load ptr, ptr %497, align 8, !tbaa !13
  %499 = load ptr, ptr %12, align 8, !tbaa !5
  %500 = getelementptr inbounds %struct.reionization, ptr %499, i32 0, i32 24
  %501 = load i32, ptr %500, align 8, !tbaa !35
  %502 = sext i32 %501 to i64
  %503 = getelementptr inbounds double, ptr %498, i64 %502
  store double %495, ptr %503, align 8, !tbaa !20
  %504 = load ptr, ptr %8, align 8, !tbaa !5
  %505 = load ptr, ptr %10, align 8, !tbaa !5
  %506 = load ptr, ptr %11, align 8, !tbaa !5
  %507 = load ptr, ptr %12, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.reionization, ptr %507, i32 0, i32 25
  %509 = load ptr, ptr %508, align 8, !tbaa !13
  %510 = load ptr, ptr %12, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.reionization, ptr %510, i32 0, i32 24
  %512 = load i32, ptr %511, align 8, !tbaa !35
  %513 = sext i32 %512 to i64
  %514 = getelementptr inbounds double, ptr %509, i64 %513
  %515 = load double, ptr %514, align 8, !tbaa !20
  %516 = load ptr, ptr %12, align 8, !tbaa !5
  %517 = getelementptr inbounds %struct.reionization, ptr %516, i32 0, i32 25
  %518 = load ptr, ptr %517, align 8, !tbaa !13
  %519 = load ptr, ptr %12, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.reionization, ptr %519, i32 0, i32 15
  %521 = load i32, ptr %520, align 4, !tbaa !37
  %522 = sext i32 %521 to i64
  %523 = getelementptr inbounds double, ptr %518, i64 %522
  %524 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %504, ptr noundef %505, ptr noundef %506, double noundef %515, ptr noundef %523)
  %525 = icmp eq i32 %524, 1
  br i1 %525, label %526, label %535

526:                                              ; preds = %483
  call void @llvm.lifetime.start.p0(i64 2048, ptr %40) #6
  %527 = getelementptr inbounds [2048 x i8], ptr %40, i64 0, i64 0
  %528 = load ptr, ptr %10, align 8, !tbaa !5
  %529 = getelementptr inbounds %struct.thermo, ptr %528, i32 0, i32 93
  %530 = getelementptr inbounds [2048 x i8], ptr %529, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %527, ptr noundef @.str, ptr noundef @.str.154, ptr noundef %530)
  %531 = load ptr, ptr %10, align 8, !tbaa !5
  %532 = getelementptr inbounds %struct.thermo, ptr %531, i32 0, i32 93
  %533 = getelementptr inbounds [2048 x i8], ptr %532, i64 0, i64 0
  %534 = getelementptr inbounds [2048 x i8], ptr %40, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %533, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2339, ptr noundef %534)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %40) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

535:                                              ; preds = %483
  %536 = load ptr, ptr %8, align 8, !tbaa !5
  %537 = load ptr, ptr %9, align 8, !tbaa !5
  %538 = load ptr, ptr %10, align 8, !tbaa !5
  %539 = load ptr, ptr %11, align 8, !tbaa !5
  %540 = load ptr, ptr %12, align 8, !tbaa !5
  %541 = load ptr, ptr %13, align 8, !tbaa !5
  %542 = call i32 @thermodynamics_reionization_sample(ptr noundef %536, ptr noundef %537, ptr noundef %538, ptr noundef %539, ptr noundef %540, ptr noundef %541)
  %543 = icmp eq i32 %542, 1
  br i1 %543, label %544, label %553

544:                                              ; preds = %535
  call void @llvm.lifetime.start.p0(i64 2048, ptr %41) #6
  %545 = getelementptr inbounds [2048 x i8], ptr %41, i64 0, i64 0
  %546 = load ptr, ptr %10, align 8, !tbaa !5
  %547 = getelementptr inbounds %struct.thermo, ptr %546, i32 0, i32 93
  %548 = getelementptr inbounds [2048 x i8], ptr %547, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %545, ptr noundef @.str, ptr noundef @.str.155, ptr noundef %548)
  %549 = load ptr, ptr %10, align 8, !tbaa !5
  %550 = getelementptr inbounds %struct.thermo, ptr %549, i32 0, i32 93
  %551 = getelementptr inbounds [2048 x i8], ptr %550, i64 0, i64 0
  %552 = getelementptr inbounds [2048 x i8], ptr %41, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %551, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2344, ptr noundef %552)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %41) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

553:                                              ; preds = %535
  %554 = load ptr, ptr %12, align 8, !tbaa !5
  %555 = getelementptr inbounds %struct.reionization, ptr %554, i32 0, i32 11
  %556 = load double, ptr %555, align 8, !tbaa !38
  store double %556, ptr %18, align 8, !tbaa !20
  %557 = load double, ptr %18, align 8, !tbaa !20
  %558 = load ptr, ptr %10, align 8, !tbaa !5
  %559 = getelementptr inbounds %struct.thermo, ptr %558, i32 0, i32 4
  %560 = load double, ptr %559, align 8, !tbaa !39
  %561 = fcmp olt double %557, %560
  br i1 %561, label %562, label %576

562:                                              ; preds = %553
  call void @llvm.lifetime.start.p0(i64 2048, ptr %42) #6
  %563 = getelementptr inbounds [2048 x i8], ptr %42, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %563, ptr noundef @.str.158)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %43) #6
  %564 = getelementptr inbounds [2048 x i8], ptr %43, i64 0, i64 0
  %565 = getelementptr inbounds [2048 x i8], ptr %42, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %564, ptr noundef @.str.10, ptr noundef @.str.159, ptr noundef %565)
  %566 = load ptr, ptr %10, align 8, !tbaa !5
  %567 = getelementptr inbounds %struct.thermo, ptr %566, i32 0, i32 93
  %568 = getelementptr inbounds [2048 x i8], ptr %567, i64 0, i64 0
  %569 = getelementptr inbounds [2048 x i8], ptr %43, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %568, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2351, ptr noundef %569)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %43) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %42) #6
  %570 = load ptr, ptr %12, align 8, !tbaa !5
  %571 = getelementptr inbounds %struct.reionization, ptr %570, i32 0, i32 25
  %572 = load ptr, ptr %571, align 8, !tbaa !13
  call void @free(ptr noundef %572) #6
  %573 = load ptr, ptr %12, align 8, !tbaa !5
  %574 = getelementptr inbounds %struct.reionization, ptr %573, i32 0, i32 10
  %575 = load ptr, ptr %574, align 8, !tbaa !40
  call void @free(ptr noundef %575) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

576:                                              ; preds = %553
  store double 0.000000e+00, ptr %17, align 8, !tbaa !20
  store double 0.000000e+00, ptr %20, align 8, !tbaa !20
  store i32 0, ptr %14, align 4, !tbaa !14
  br label %577

577:                                              ; preds = %772, %576
  %578 = load double, ptr %18, align 8, !tbaa !20
  %579 = load double, ptr %20, align 8, !tbaa !20
  %580 = fsub double %578, %579
  %581 = load ptr, ptr %10, align 8, !tbaa !5
  %582 = getelementptr inbounds %struct.thermo, ptr %581, i32 0, i32 4
  %583 = load double, ptr %582, align 8, !tbaa !39
  %584 = load ptr, ptr %8, align 8, !tbaa !5
  %585 = getelementptr inbounds %struct.precision, ptr %584, i32 0, i32 46
  %586 = load double, ptr %585, align 8, !tbaa !41
  %587 = fmul double %583, %586
  %588 = fcmp ogt double %580, %587
  br i1 %588, label %589, label %773

589:                                              ; preds = %577
  %590 = load double, ptr %15, align 8, !tbaa !20
  %591 = load double, ptr %17, align 8, !tbaa !20
  %592 = fadd double %590, %591
  %593 = fmul double 5.000000e-01, %592
  store double %593, ptr %16, align 8, !tbaa !20
  %594 = load double, ptr %16, align 8, !tbaa !20
  %595 = load ptr, ptr %12, align 8, !tbaa !5
  %596 = getelementptr inbounds %struct.reionization, ptr %595, i32 0, i32 25
  %597 = load ptr, ptr %596, align 8, !tbaa !13
  %598 = load ptr, ptr %12, align 8, !tbaa !5
  %599 = getelementptr inbounds %struct.reionization, ptr %598, i32 0, i32 12
  %600 = load i32, ptr %599, align 8, !tbaa !32
  %601 = sext i32 %600 to i64
  %602 = getelementptr inbounds double, ptr %597, i64 %601
  store double %594, ptr %602, align 8, !tbaa !20
  %603 = load ptr, ptr %12, align 8, !tbaa !5
  %604 = getelementptr inbounds %struct.reionization, ptr %603, i32 0, i32 25
  %605 = load ptr, ptr %604, align 8, !tbaa !13
  %606 = load ptr, ptr %12, align 8, !tbaa !5
  %607 = getelementptr inbounds %struct.reionization, ptr %606, i32 0, i32 12
  %608 = load i32, ptr %607, align 8, !tbaa !32
  %609 = sext i32 %608 to i64
  %610 = getelementptr inbounds double, ptr %605, i64 %609
  %611 = load double, ptr %610, align 8, !tbaa !20
  %612 = load ptr, ptr %8, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.precision, ptr %612, i32 0, i32 47
  %614 = load double, ptr %613, align 8, !tbaa !33
  %615 = load ptr, ptr %10, align 8, !tbaa !5
  %616 = getelementptr inbounds %struct.thermo, ptr %615, i32 0, i32 8
  %617 = load double, ptr %616, align 8, !tbaa !23
  %618 = call double @llvm.fmuladd.f64(double %614, double %617, double %611)
  %619 = load ptr, ptr %12, align 8, !tbaa !5
  %620 = getelementptr inbounds %struct.reionization, ptr %619, i32 0, i32 25
  %621 = load ptr, ptr %620, align 8, !tbaa !13
  %622 = load ptr, ptr %12, align 8, !tbaa !5
  %623 = getelementptr inbounds %struct.reionization, ptr %622, i32 0, i32 24
  %624 = load i32, ptr %623, align 8, !tbaa !35
  %625 = sext i32 %624 to i64
  %626 = getelementptr inbounds double, ptr %621, i64 %625
  store double %618, ptr %626, align 8, !tbaa !20
  %627 = load ptr, ptr %12, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.reionization, ptr %627, i32 0, i32 25
  %629 = load ptr, ptr %628, align 8, !tbaa !13
  %630 = load ptr, ptr %12, align 8, !tbaa !5
  %631 = getelementptr inbounds %struct.reionization, ptr %630, i32 0, i32 24
  %632 = load i32, ptr %631, align 8, !tbaa !35
  %633 = sext i32 %632 to i64
  %634 = getelementptr inbounds double, ptr %629, i64 %633
  %635 = load double, ptr %634, align 8, !tbaa !20
  %636 = load ptr, ptr %10, align 8, !tbaa !5
  %637 = getelementptr inbounds %struct.thermo, ptr %636, i32 0, i32 10
  %638 = load double, ptr %637, align 8, !tbaa !26
  %639 = load ptr, ptr %8, align 8, !tbaa !5
  %640 = getelementptr inbounds %struct.precision, ptr %639, i32 0, i32 47
  %641 = load double, ptr %640, align 8, !tbaa !33
  %642 = load ptr, ptr %10, align 8, !tbaa !5
  %643 = getelementptr inbounds %struct.thermo, ptr %642, i32 0, i32 11
  %644 = load double, ptr %643, align 8, !tbaa !28
  %645 = call double @llvm.fmuladd.f64(double %641, double %644, double %638)
  %646 = fcmp olt double %635, %645
  br i1 %646, label %647, label %666

647:                                              ; preds = %589
  %648 = load ptr, ptr %10, align 8, !tbaa !5
  %649 = getelementptr inbounds %struct.thermo, ptr %648, i32 0, i32 10
  %650 = load double, ptr %649, align 8, !tbaa !26
  %651 = load ptr, ptr %8, align 8, !tbaa !5
  %652 = getelementptr inbounds %struct.precision, ptr %651, i32 0, i32 47
  %653 = load double, ptr %652, align 8, !tbaa !33
  %654 = load ptr, ptr %10, align 8, !tbaa !5
  %655 = getelementptr inbounds %struct.thermo, ptr %654, i32 0, i32 11
  %656 = load double, ptr %655, align 8, !tbaa !28
  %657 = call double @llvm.fmuladd.f64(double %653, double %656, double %650)
  %658 = load ptr, ptr %12, align 8, !tbaa !5
  %659 = getelementptr inbounds %struct.reionization, ptr %658, i32 0, i32 25
  %660 = load ptr, ptr %659, align 8, !tbaa !13
  %661 = load ptr, ptr %12, align 8, !tbaa !5
  %662 = getelementptr inbounds %struct.reionization, ptr %661, i32 0, i32 24
  %663 = load i32, ptr %662, align 8, !tbaa !35
  %664 = sext i32 %663 to i64
  %665 = getelementptr inbounds double, ptr %660, i64 %664
  store double %657, ptr %665, align 8, !tbaa !20
  br label %666

666:                                              ; preds = %647, %589
  %667 = load ptr, ptr %12, align 8, !tbaa !5
  %668 = getelementptr inbounds %struct.reionization, ptr %667, i32 0, i32 25
  %669 = load ptr, ptr %668, align 8, !tbaa !13
  %670 = load ptr, ptr %12, align 8, !tbaa !5
  %671 = getelementptr inbounds %struct.reionization, ptr %670, i32 0, i32 24
  %672 = load i32, ptr %671, align 8, !tbaa !35
  %673 = sext i32 %672 to i64
  %674 = getelementptr inbounds double, ptr %669, i64 %673
  %675 = load double, ptr %674, align 8, !tbaa !20
  %676 = load ptr, ptr %8, align 8, !tbaa !5
  %677 = getelementptr inbounds %struct.precision, ptr %676, i32 0, i32 44
  %678 = load double, ptr %677, align 8, !tbaa !36
  %679 = fcmp ogt double %675, %678
  br i1 %679, label %680, label %691

680:                                              ; preds = %666
  call void @llvm.lifetime.start.p0(i64 2048, ptr %44) #6
  %681 = getelementptr inbounds [2048 x i8], ptr %44, i64 0, i64 0
  %682 = load ptr, ptr %8, align 8, !tbaa !5
  %683 = getelementptr inbounds %struct.precision, ptr %682, i32 0, i32 44
  %684 = load double, ptr %683, align 8, !tbaa !36
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %681, ptr noundef @.str.160, double noundef %684)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %45) #6
  %685 = getelementptr inbounds [2048 x i8], ptr %45, i64 0, i64 0
  %686 = getelementptr inbounds [2048 x i8], ptr %44, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %685, ptr noundef @.str.10, ptr noundef @.str.153, ptr noundef %686)
  %687 = load ptr, ptr %10, align 8, !tbaa !5
  %688 = getelementptr inbounds %struct.thermo, ptr %687, i32 0, i32 93
  %689 = getelementptr inbounds [2048 x i8], ptr %688, i64 0, i64 0
  %690 = getelementptr inbounds [2048 x i8], ptr %45, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %689, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2378, ptr noundef %690)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

691:                                              ; preds = %666
  %692 = load ptr, ptr %8, align 8, !tbaa !5
  %693 = load ptr, ptr %10, align 8, !tbaa !5
  %694 = load ptr, ptr %11, align 8, !tbaa !5
  %695 = load ptr, ptr %12, align 8, !tbaa !5
  %696 = getelementptr inbounds %struct.reionization, ptr %695, i32 0, i32 25
  %697 = load ptr, ptr %696, align 8, !tbaa !13
  %698 = load ptr, ptr %12, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct.reionization, ptr %698, i32 0, i32 24
  %700 = load i32, ptr %699, align 8, !tbaa !35
  %701 = sext i32 %700 to i64
  %702 = getelementptr inbounds double, ptr %697, i64 %701
  %703 = load double, ptr %702, align 8, !tbaa !20
  %704 = load ptr, ptr %12, align 8, !tbaa !5
  %705 = getelementptr inbounds %struct.reionization, ptr %704, i32 0, i32 25
  %706 = load ptr, ptr %705, align 8, !tbaa !13
  %707 = load ptr, ptr %12, align 8, !tbaa !5
  %708 = getelementptr inbounds %struct.reionization, ptr %707, i32 0, i32 15
  %709 = load i32, ptr %708, align 4, !tbaa !37
  %710 = sext i32 %709 to i64
  %711 = getelementptr inbounds double, ptr %706, i64 %710
  %712 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %692, ptr noundef %693, ptr noundef %694, double noundef %703, ptr noundef %711)
  %713 = icmp eq i32 %712, 1
  br i1 %713, label %714, label %723

714:                                              ; preds = %691
  call void @llvm.lifetime.start.p0(i64 2048, ptr %46) #6
  %715 = getelementptr inbounds [2048 x i8], ptr %46, i64 0, i64 0
  %716 = load ptr, ptr %10, align 8, !tbaa !5
  %717 = getelementptr inbounds %struct.thermo, ptr %716, i32 0, i32 93
  %718 = getelementptr inbounds [2048 x i8], ptr %717, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %715, ptr noundef @.str, ptr noundef @.str.154, ptr noundef %718)
  %719 = load ptr, ptr %10, align 8, !tbaa !5
  %720 = getelementptr inbounds %struct.thermo, ptr %719, i32 0, i32 93
  %721 = getelementptr inbounds [2048 x i8], ptr %720, i64 0, i64 0
  %722 = getelementptr inbounds [2048 x i8], ptr %46, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %721, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2387, ptr noundef %722)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %46) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

723:                                              ; preds = %691
  %724 = load ptr, ptr %12, align 8, !tbaa !5
  %725 = getelementptr inbounds %struct.reionization, ptr %724, i32 0, i32 10
  %726 = load ptr, ptr %725, align 8, !tbaa !40
  call void @free(ptr noundef %726) #6
  %727 = load ptr, ptr %8, align 8, !tbaa !5
  %728 = load ptr, ptr %9, align 8, !tbaa !5
  %729 = load ptr, ptr %10, align 8, !tbaa !5
  %730 = load ptr, ptr %11, align 8, !tbaa !5
  %731 = load ptr, ptr %12, align 8, !tbaa !5
  %732 = load ptr, ptr %13, align 8, !tbaa !5
  %733 = call i32 @thermodynamics_reionization_sample(ptr noundef %727, ptr noundef %728, ptr noundef %729, ptr noundef %730, ptr noundef %731, ptr noundef %732)
  %734 = icmp eq i32 %733, 1
  br i1 %734, label %735, label %744

735:                                              ; preds = %723
  call void @llvm.lifetime.start.p0(i64 2048, ptr %47) #6
  %736 = getelementptr inbounds [2048 x i8], ptr %47, i64 0, i64 0
  %737 = load ptr, ptr %10, align 8, !tbaa !5
  %738 = getelementptr inbounds %struct.thermo, ptr %737, i32 0, i32 93
  %739 = getelementptr inbounds [2048 x i8], ptr %738, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %736, ptr noundef @.str, ptr noundef @.str.155, ptr noundef %739)
  %740 = load ptr, ptr %10, align 8, !tbaa !5
  %741 = getelementptr inbounds %struct.thermo, ptr %740, i32 0, i32 93
  %742 = getelementptr inbounds [2048 x i8], ptr %741, i64 0, i64 0
  %743 = getelementptr inbounds [2048 x i8], ptr %47, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %742, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2393, ptr noundef %743)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %47) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

744:                                              ; preds = %723
  %745 = load ptr, ptr %12, align 8, !tbaa !5
  %746 = getelementptr inbounds %struct.reionization, ptr %745, i32 0, i32 11
  %747 = load double, ptr %746, align 8, !tbaa !38
  store double %747, ptr %19, align 8, !tbaa !20
  %748 = load double, ptr %19, align 8, !tbaa !20
  %749 = load ptr, ptr %10, align 8, !tbaa !5
  %750 = getelementptr inbounds %struct.thermo, ptr %749, i32 0, i32 4
  %751 = load double, ptr %750, align 8, !tbaa !39
  %752 = fcmp ogt double %748, %751
  br i1 %752, label %753, label %756

753:                                              ; preds = %744
  %754 = load double, ptr %16, align 8, !tbaa !20
  store double %754, ptr %15, align 8, !tbaa !20
  %755 = load double, ptr %19, align 8, !tbaa !20
  store double %755, ptr %18, align 8, !tbaa !20
  br label %759

756:                                              ; preds = %744
  %757 = load double, ptr %16, align 8, !tbaa !20
  store double %757, ptr %17, align 8, !tbaa !20
  %758 = load double, ptr %19, align 8, !tbaa !20
  store double %758, ptr %20, align 8, !tbaa !20
  br label %759

759:                                              ; preds = %756, %753
  %760 = load i32, ptr %14, align 4, !tbaa !14
  %761 = add nsw i32 %760, 1
  store i32 %761, ptr %14, align 4, !tbaa !14
  %762 = load i32, ptr %14, align 4, !tbaa !14
  %763 = icmp sgt i32 %762, 10000
  br i1 %763, label %764, label %772

764:                                              ; preds = %759
  call void @llvm.lifetime.start.p0(i64 2048, ptr %48) #6
  %765 = getelementptr inbounds [2048 x i8], ptr %48, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %765, ptr noundef @.str.161)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %49) #6
  %766 = getelementptr inbounds [2048 x i8], ptr %49, i64 0, i64 0
  %767 = getelementptr inbounds [2048 x i8], ptr %48, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %766, ptr noundef @.str.10, ptr noundef @.str.162, ptr noundef %767)
  %768 = load ptr, ptr %10, align 8, !tbaa !5
  %769 = getelementptr inbounds %struct.thermo, ptr %768, i32 0, i32 93
  %770 = getelementptr inbounds [2048 x i8], ptr %769, i64 0, i64 0
  %771 = getelementptr inbounds [2048 x i8], ptr %49, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %770, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2411, ptr noundef %771)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

772:                                              ; preds = %759
  br label %577, !llvm.loop !42

773:                                              ; preds = %577
  %774 = load ptr, ptr %12, align 8, !tbaa !5
  %775 = getelementptr inbounds %struct.reionization, ptr %774, i32 0, i32 25
  %776 = load ptr, ptr %775, align 8, !tbaa !13
  %777 = load ptr, ptr %12, align 8, !tbaa !5
  %778 = getelementptr inbounds %struct.reionization, ptr %777, i32 0, i32 12
  %779 = load i32, ptr %778, align 8, !tbaa !32
  %780 = sext i32 %779 to i64
  %781 = getelementptr inbounds double, ptr %776, i64 %780
  %782 = load double, ptr %781, align 8, !tbaa !20
  %783 = load ptr, ptr %10, align 8, !tbaa !5
  %784 = getelementptr inbounds %struct.thermo, ptr %783, i32 0, i32 5
  store double %782, ptr %784, align 8, !tbaa !31
  br label %785

785:                                              ; preds = %773, %456
  %786 = load ptr, ptr %12, align 8, !tbaa !5
  %787 = getelementptr inbounds %struct.reionization, ptr %786, i32 0, i32 25
  %788 = load ptr, ptr %787, align 8, !tbaa !13
  call void @free(ptr noundef %788) #6
  store i32 0, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

789:                                              ; preds = %116
  %790 = load ptr, ptr %10, align 8, !tbaa !5
  %791 = getelementptr inbounds %struct.thermo, ptr %790, i32 0, i32 2
  %792 = load i32, ptr %791, align 4, !tbaa !15
  %793 = icmp eq i32 %792, 2
  br i1 %793, label %794, label %1164

794:                                              ; preds = %789
  %795 = load ptr, ptr %10, align 8, !tbaa !5
  %796 = getelementptr inbounds %struct.thermo, ptr %795, i32 0, i32 12
  %797 = load i32, ptr %796, align 8, !tbaa !44
  %798 = icmp slt i32 %797, 2
  br i1 %798, label %799, label %807

799:                                              ; preds = %794
  call void @llvm.lifetime.start.p0(i64 2048, ptr %50) #6
  %800 = getelementptr inbounds [2048 x i8], ptr %50, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %800, ptr noundef @.str.163)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %51) #6
  %801 = getelementptr inbounds [2048 x i8], ptr %51, i64 0, i64 0
  %802 = getelementptr inbounds [2048 x i8], ptr %50, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %801, ptr noundef @.str.10, ptr noundef @.str.164, ptr noundef %802)
  %803 = load ptr, ptr %10, align 8, !tbaa !5
  %804 = getelementptr inbounds %struct.thermo, ptr %803, i32 0, i32 93
  %805 = getelementptr inbounds [2048 x i8], ptr %804, i64 0, i64 0
  %806 = getelementptr inbounds [2048 x i8], ptr %51, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %805, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2433, ptr noundef %806)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

807:                                              ; preds = %794
  store i32 1, ptr %21, align 4, !tbaa !14
  br label %808

808:                                              ; preds = %855, %807
  %809 = load i32, ptr %21, align 4, !tbaa !14
  %810 = load ptr, ptr %10, align 8, !tbaa !5
  %811 = getelementptr inbounds %struct.thermo, ptr %810, i32 0, i32 12
  %812 = load i32, ptr %811, align 8, !tbaa !44
  %813 = icmp slt i32 %809, %812
  br i1 %813, label %814, label %858

814:                                              ; preds = %808
  %815 = load ptr, ptr %10, align 8, !tbaa !5
  %816 = getelementptr inbounds %struct.thermo, ptr %815, i32 0, i32 13
  %817 = load ptr, ptr %816, align 8, !tbaa !45
  %818 = load i32, ptr %21, align 4, !tbaa !14
  %819 = sub nsw i32 %818, 1
  %820 = sext i32 %819 to i64
  %821 = getelementptr inbounds double, ptr %817, i64 %820
  %822 = load double, ptr %821, align 8, !tbaa !20
  %823 = load ptr, ptr %10, align 8, !tbaa !5
  %824 = getelementptr inbounds %struct.thermo, ptr %823, i32 0, i32 13
  %825 = load ptr, ptr %824, align 8, !tbaa !45
  %826 = load i32, ptr %21, align 4, !tbaa !14
  %827 = sext i32 %826 to i64
  %828 = getelementptr inbounds double, ptr %825, i64 %827
  %829 = load double, ptr %828, align 8, !tbaa !20
  %830 = fcmp oge double %822, %829
  br i1 %830, label %831, label %854

831:                                              ; preds = %814
  call void @llvm.lifetime.start.p0(i64 2048, ptr %52) #6
  %832 = getelementptr inbounds [2048 x i8], ptr %52, i64 0, i64 0
  %833 = load ptr, ptr %10, align 8, !tbaa !5
  %834 = getelementptr inbounds %struct.thermo, ptr %833, i32 0, i32 13
  %835 = load ptr, ptr %834, align 8, !tbaa !45
  %836 = load i32, ptr %21, align 4, !tbaa !14
  %837 = sub nsw i32 %836, 1
  %838 = sext i32 %837 to i64
  %839 = getelementptr inbounds double, ptr %835, i64 %838
  %840 = load double, ptr %839, align 8, !tbaa !20
  %841 = load ptr, ptr %10, align 8, !tbaa !5
  %842 = getelementptr inbounds %struct.thermo, ptr %841, i32 0, i32 13
  %843 = load ptr, ptr %842, align 8, !tbaa !45
  %844 = load i32, ptr %21, align 4, !tbaa !14
  %845 = sext i32 %844 to i64
  %846 = getelementptr inbounds double, ptr %843, i64 %845
  %847 = load double, ptr %846, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %832, ptr noundef @.str.165, double noundef %840, double noundef %847)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %53) #6
  %848 = getelementptr inbounds [2048 x i8], ptr %53, i64 0, i64 0
  %849 = getelementptr inbounds [2048 x i8], ptr %52, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %848, ptr noundef @.str.10, ptr noundef @.str.166, ptr noundef %849)
  %850 = load ptr, ptr %10, align 8, !tbaa !5
  %851 = getelementptr inbounds %struct.thermo, ptr %850, i32 0, i32 93
  %852 = getelementptr inbounds [2048 x i8], ptr %851, i64 0, i64 0
  %853 = getelementptr inbounds [2048 x i8], ptr %53, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %852, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2441, ptr noundef %853)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

854:                                              ; preds = %814
  br label %855

855:                                              ; preds = %854
  %856 = load i32, ptr %21, align 4, !tbaa !14
  %857 = add nsw i32 %856, 1
  store i32 %857, ptr %21, align 4, !tbaa !14
  br label %808, !llvm.loop !46

858:                                              ; preds = %808
  store i32 1, ptr %21, align 4, !tbaa !14
  br label %859

859:                                              ; preds = %903, %858
  %860 = load i32, ptr %21, align 4, !tbaa !14
  %861 = load ptr, ptr %12, align 8, !tbaa !5
  %862 = getelementptr inbounds %struct.reionization, ptr %861, i32 0, i32 20
  %863 = load i32, ptr %862, align 8, !tbaa !47
  %864 = sub nsw i32 %863, 1
  %865 = icmp slt i32 %860, %864
  br i1 %865, label %866, label %906

866:                                              ; preds = %859
  %867 = load ptr, ptr %10, align 8, !tbaa !5
  %868 = getelementptr inbounds %struct.thermo, ptr %867, i32 0, i32 13
  %869 = load ptr, ptr %868, align 8, !tbaa !45
  %870 = load i32, ptr %21, align 4, !tbaa !14
  %871 = sub nsw i32 %870, 1
  %872 = sext i32 %871 to i64
  %873 = getelementptr inbounds double, ptr %869, i64 %872
  %874 = load double, ptr %873, align 8, !tbaa !20
  %875 = load ptr, ptr %12, align 8, !tbaa !5
  %876 = getelementptr inbounds %struct.reionization, ptr %875, i32 0, i32 25
  %877 = load ptr, ptr %876, align 8, !tbaa !13
  %878 = load ptr, ptr %12, align 8, !tbaa !5
  %879 = getelementptr inbounds %struct.reionization, ptr %878, i32 0, i32 21
  %880 = load i32, ptr %879, align 4, !tbaa !48
  %881 = load i32, ptr %21, align 4, !tbaa !14
  %882 = add nsw i32 %880, %881
  %883 = sext i32 %882 to i64
  %884 = getelementptr inbounds double, ptr %877, i64 %883
  store double %874, ptr %884, align 8, !tbaa !20
  %885 = load ptr, ptr %10, align 8, !tbaa !5
  %886 = getelementptr inbounds %struct.thermo, ptr %885, i32 0, i32 14
  %887 = load ptr, ptr %886, align 8, !tbaa !49
  %888 = load i32, ptr %21, align 4, !tbaa !14
  %889 = sub nsw i32 %888, 1
  %890 = sext i32 %889 to i64
  %891 = getelementptr inbounds double, ptr %887, i64 %890
  %892 = load double, ptr %891, align 8, !tbaa !20
  %893 = load ptr, ptr %12, align 8, !tbaa !5
  %894 = getelementptr inbounds %struct.reionization, ptr %893, i32 0, i32 25
  %895 = load ptr, ptr %894, align 8, !tbaa !13
  %896 = load ptr, ptr %12, align 8, !tbaa !5
  %897 = getelementptr inbounds %struct.reionization, ptr %896, i32 0, i32 22
  %898 = load i32, ptr %897, align 8, !tbaa !50
  %899 = load i32, ptr %21, align 4, !tbaa !14
  %900 = add nsw i32 %898, %899
  %901 = sext i32 %900 to i64
  %902 = getelementptr inbounds double, ptr %895, i64 %901
  store double %892, ptr %902, align 8, !tbaa !20
  br label %903

903:                                              ; preds = %866
  %904 = load i32, ptr %21, align 4, !tbaa !14
  %905 = add nsw i32 %904, 1
  store i32 %905, ptr %21, align 4, !tbaa !14
  br label %859, !llvm.loop !51

906:                                              ; preds = %859
  %907 = load ptr, ptr %12, align 8, !tbaa !5
  %908 = getelementptr inbounds %struct.reionization, ptr %907, i32 0, i32 25
  %909 = load ptr, ptr %908, align 8, !tbaa !13
  %910 = load ptr, ptr %12, align 8, !tbaa !5
  %911 = getelementptr inbounds %struct.reionization, ptr %910, i32 0, i32 21
  %912 = load i32, ptr %911, align 4, !tbaa !48
  %913 = load ptr, ptr %12, align 8, !tbaa !5
  %914 = getelementptr inbounds %struct.reionization, ptr %913, i32 0, i32 20
  %915 = load i32, ptr %914, align 8, !tbaa !47
  %916 = add nsw i32 %912, %915
  %917 = sub nsw i32 %916, 2
  %918 = sext i32 %917 to i64
  %919 = getelementptr inbounds double, ptr %909, i64 %918
  %920 = load double, ptr %919, align 8, !tbaa !20
  %921 = load ptr, ptr %12, align 8, !tbaa !5
  %922 = getelementptr inbounds %struct.reionization, ptr %921, i32 0, i32 25
  %923 = load ptr, ptr %922, align 8, !tbaa !13
  %924 = load ptr, ptr %12, align 8, !tbaa !5
  %925 = getelementptr inbounds %struct.reionization, ptr %924, i32 0, i32 21
  %926 = load i32, ptr %925, align 4, !tbaa !48
  %927 = load ptr, ptr %12, align 8, !tbaa !5
  %928 = getelementptr inbounds %struct.reionization, ptr %927, i32 0, i32 20
  %929 = load i32, ptr %928, align 8, !tbaa !47
  %930 = add nsw i32 %926, %929
  %931 = sub nsw i32 %930, 2
  %932 = sext i32 %931 to i64
  %933 = getelementptr inbounds double, ptr %923, i64 %932
  %934 = load double, ptr %933, align 8, !tbaa !20
  %935 = load ptr, ptr %12, align 8, !tbaa !5
  %936 = getelementptr inbounds %struct.reionization, ptr %935, i32 0, i32 25
  %937 = load ptr, ptr %936, align 8, !tbaa !13
  %938 = load ptr, ptr %12, align 8, !tbaa !5
  %939 = getelementptr inbounds %struct.reionization, ptr %938, i32 0, i32 21
  %940 = load i32, ptr %939, align 4, !tbaa !48
  %941 = load ptr, ptr %12, align 8, !tbaa !5
  %942 = getelementptr inbounds %struct.reionization, ptr %941, i32 0, i32 20
  %943 = load i32, ptr %942, align 8, !tbaa !47
  %944 = add nsw i32 %940, %943
  %945 = sub nsw i32 %944, 3
  %946 = sext i32 %945 to i64
  %947 = getelementptr inbounds double, ptr %937, i64 %946
  %948 = load double, ptr %947, align 8, !tbaa !20
  %949 = fsub double %934, %948
  %950 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %949, double %920)
  %951 = load ptr, ptr %12, align 8, !tbaa !5
  %952 = getelementptr inbounds %struct.reionization, ptr %951, i32 0, i32 25
  %953 = load ptr, ptr %952, align 8, !tbaa !13
  %954 = load ptr, ptr %12, align 8, !tbaa !5
  %955 = getelementptr inbounds %struct.reionization, ptr %954, i32 0, i32 21
  %956 = load i32, ptr %955, align 4, !tbaa !48
  %957 = load ptr, ptr %12, align 8, !tbaa !5
  %958 = getelementptr inbounds %struct.reionization, ptr %957, i32 0, i32 20
  %959 = load i32, ptr %958, align 8, !tbaa !47
  %960 = add nsw i32 %956, %959
  %961 = sub nsw i32 %960, 1
  %962 = sext i32 %961 to i64
  %963 = getelementptr inbounds double, ptr %953, i64 %962
  store double %950, ptr %963, align 8, !tbaa !20
  %964 = load ptr, ptr %12, align 8, !tbaa !5
  %965 = getelementptr inbounds %struct.reionization, ptr %964, i32 0, i32 25
  %966 = load ptr, ptr %965, align 8, !tbaa !13
  %967 = load ptr, ptr %12, align 8, !tbaa !5
  %968 = getelementptr inbounds %struct.reionization, ptr %967, i32 0, i32 21
  %969 = load i32, ptr %968, align 4, !tbaa !48
  %970 = load ptr, ptr %12, align 8, !tbaa !5
  %971 = getelementptr inbounds %struct.reionization, ptr %970, i32 0, i32 20
  %972 = load i32, ptr %971, align 8, !tbaa !47
  %973 = add nsw i32 %969, %972
  %974 = sub nsw i32 %973, 1
  %975 = sext i32 %974 to i64
  %976 = getelementptr inbounds double, ptr %966, i64 %975
  %977 = load double, ptr %976, align 8, !tbaa !20
  %978 = load ptr, ptr %12, align 8, !tbaa !5
  %979 = getelementptr inbounds %struct.reionization, ptr %978, i32 0, i32 25
  %980 = load ptr, ptr %979, align 8, !tbaa !13
  %981 = load ptr, ptr %12, align 8, !tbaa !5
  %982 = getelementptr inbounds %struct.reionization, ptr %981, i32 0, i32 24
  %983 = load i32, ptr %982, align 8, !tbaa !35
  %984 = sext i32 %983 to i64
  %985 = getelementptr inbounds double, ptr %980, i64 %984
  store double %977, ptr %985, align 8, !tbaa !20
  %986 = load ptr, ptr %12, align 8, !tbaa !5
  %987 = getelementptr inbounds %struct.reionization, ptr %986, i32 0, i32 25
  %988 = load ptr, ptr %987, align 8, !tbaa !13
  %989 = load ptr, ptr %12, align 8, !tbaa !5
  %990 = getelementptr inbounds %struct.reionization, ptr %989, i32 0, i32 24
  %991 = load i32, ptr %990, align 8, !tbaa !35
  %992 = sext i32 %991 to i64
  %993 = getelementptr inbounds double, ptr %988, i64 %992
  %994 = load double, ptr %993, align 8, !tbaa !20
  %995 = load ptr, ptr %8, align 8, !tbaa !5
  %996 = getelementptr inbounds %struct.precision, ptr %995, i32 0, i32 44
  %997 = load double, ptr %996, align 8, !tbaa !36
  %998 = fcmp ogt double %994, %997
  br i1 %998, label %999, label %1019

999:                                              ; preds = %906
  call void @llvm.lifetime.start.p0(i64 2048, ptr %54) #6
  %1000 = getelementptr inbounds [2048 x i8], ptr %54, i64 0, i64 0
  %1001 = load ptr, ptr %12, align 8, !tbaa !5
  %1002 = getelementptr inbounds %struct.reionization, ptr %1001, i32 0, i32 25
  %1003 = load ptr, ptr %1002, align 8, !tbaa !13
  %1004 = load ptr, ptr %12, align 8, !tbaa !5
  %1005 = getelementptr inbounds %struct.reionization, ptr %1004, i32 0, i32 24
  %1006 = load i32, ptr %1005, align 8, !tbaa !35
  %1007 = sext i32 %1006 to i64
  %1008 = getelementptr inbounds double, ptr %1003, i64 %1007
  %1009 = load double, ptr %1008, align 8, !tbaa !20
  %1010 = load ptr, ptr %8, align 8, !tbaa !5
  %1011 = getelementptr inbounds %struct.precision, ptr %1010, i32 0, i32 44
  %1012 = load double, ptr %1011, align 8, !tbaa !36
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1000, ptr noundef @.str.167, double noundef %1009, double noundef %1012)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %55) #6
  %1013 = getelementptr inbounds [2048 x i8], ptr %55, i64 0, i64 0
  %1014 = getelementptr inbounds [2048 x i8], ptr %54, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1013, ptr noundef @.str.10, ptr noundef @.str.153, ptr noundef %1014)
  %1015 = load ptr, ptr %10, 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 = getelementptr inbounds [2048 x i8], ptr %55, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1017, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2470, ptr noundef %1018)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1019:                                             ; preds = %906
  %1020 = load ptr, ptr %12, align 8, !tbaa !5
  %1021 = getelementptr inbounds %struct.reionization, ptr %1020, i32 0, i32 25
  %1022 = load ptr, ptr %1021, align 8, !tbaa !13
  %1023 = load ptr, ptr %12, align 8, !tbaa !5
  %1024 = getelementptr inbounds %struct.reionization, ptr %1023, i32 0, i32 21
  %1025 = load i32, ptr %1024, align 4, !tbaa !48
  %1026 = add nsw i32 %1025, 1
  %1027 = sext i32 %1026 to i64
  %1028 = getelementptr inbounds double, ptr %1022, i64 %1027
  %1029 = load double, ptr %1028, align 8, !tbaa !20
  %1030 = load ptr, ptr %12, align 8, !tbaa !5
  %1031 = getelementptr inbounds %struct.reionization, ptr %1030, i32 0, i32 25
  %1032 = load ptr, ptr %1031, align 8, !tbaa !13
  %1033 = load ptr, ptr %12, align 8, !tbaa !5
  %1034 = getelementptr inbounds %struct.reionization, ptr %1033, i32 0, i32 21
  %1035 = load i32, ptr %1034, align 4, !tbaa !48
  %1036 = add nsw i32 %1035, 2
  %1037 = sext i32 %1036 to i64
  %1038 = getelementptr inbounds double, ptr %1032, i64 %1037
  %1039 = load double, ptr %1038, align 8, !tbaa !20
  %1040 = fneg double %1039
  %1041 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %1029, double %1040)
  %1042 = load ptr, ptr %12, align 8, !tbaa !5
  %1043 = getelementptr inbounds %struct.reionization, ptr %1042, i32 0, i32 25
  %1044 = load ptr, ptr %1043, align 8, !tbaa !13
  %1045 = load ptr, ptr %12, align 8, !tbaa !5
  %1046 = getelementptr inbounds %struct.reionization, ptr %1045, i32 0, i32 21
  %1047 = load i32, ptr %1046, align 4, !tbaa !48
  %1048 = sext i32 %1047 to i64
  %1049 = getelementptr inbounds double, ptr %1044, i64 %1048
  store double %1041, ptr %1049, align 8, !tbaa !20
  %1050 = load ptr, ptr %12, align 8, !tbaa !5
  %1051 = getelementptr inbounds %struct.reionization, ptr %1050, i32 0, i32 25
  %1052 = load ptr, ptr %1051, align 8, !tbaa !13
  %1053 = load ptr, ptr %12, align 8, !tbaa !5
  %1054 = getelementptr inbounds %struct.reionization, ptr %1053, i32 0, i32 21
  %1055 = load i32, ptr %1054, align 4, !tbaa !48
  %1056 = sext i32 %1055 to i64
  %1057 = getelementptr inbounds double, ptr %1052, i64 %1056
  %1058 = load double, ptr %1057, align 8, !tbaa !20
  %1059 = fcmp olt double %1058, 0.000000e+00
  br i1 %1059, label %1060, label %1069

1060:                                             ; preds = %1019
  %1061 = load ptr, ptr %12, align 8, !tbaa !5
  %1062 = getelementptr inbounds %struct.reionization, ptr %1061, i32 0, i32 25
  %1063 = load ptr, ptr %1062, align 8, !tbaa !13
  %1064 = load ptr, ptr %12, align 8, !tbaa !5
  %1065 = getelementptr inbounds %struct.reionization, ptr %1064, i32 0, i32 21
  %1066 = load i32, ptr %1065, align 4, !tbaa !48
  %1067 = sext i32 %1066 to i64
  %1068 = getelementptr inbounds double, ptr %1063, i64 %1067
  store double 0.000000e+00, ptr %1068, align 8, !tbaa !20
  br label %1069

1069:                                             ; preds = %1060, %1019
  %1070 = load ptr, ptr %8, align 8, !tbaa !5
  %1071 = load ptr, ptr %10, align 8, !tbaa !5
  %1072 = load ptr, ptr %11, align 8, !tbaa !5
  %1073 = load ptr, ptr %12, align 8, !tbaa !5
  %1074 = getelementptr inbounds %struct.reionization, ptr %1073, i32 0, i32 25
  %1075 = load ptr, ptr %1074, align 8, !tbaa !13
  %1076 = load ptr, ptr %12, align 8, !tbaa !5
  %1077 = getelementptr inbounds %struct.reionization, ptr %1076, i32 0, i32 21
  %1078 = load i32, ptr %1077, align 4, !tbaa !48
  %1079 = load ptr, ptr %12, align 8, !tbaa !5
  %1080 = getelementptr inbounds %struct.reionization, ptr %1079, i32 0, i32 20
  %1081 = load i32, ptr %1080, align 8, !tbaa !47
  %1082 = add nsw i32 %1078, %1081
  %1083 = sub nsw i32 %1082, 1
  %1084 = sext i32 %1083 to i64
  %1085 = getelementptr inbounds double, ptr %1075, i64 %1084
  %1086 = load double, ptr %1085, align 8, !tbaa !20
  %1087 = load ptr, ptr %12, align 8, !tbaa !5
  %1088 = getelementptr inbounds %struct.reionization, ptr %1087, i32 0, i32 25
  %1089 = load ptr, ptr %1088, align 8, !tbaa !13
  %1090 = load ptr, ptr %12, align 8, !tbaa !5
  %1091 = getelementptr inbounds %struct.reionization, ptr %1090, i32 0, i32 22
  %1092 = load i32, ptr %1091, align 8, !tbaa !50
  %1093 = load ptr, ptr %12, align 8, !tbaa !5
  %1094 = getelementptr inbounds %struct.reionization, ptr %1093, i32 0, i32 20
  %1095 = load i32, ptr %1094, align 8, !tbaa !47
  %1096 = add nsw i32 %1092, %1095
  %1097 = sub nsw i32 %1096, 1
  %1098 = sext i32 %1097 to i64
  %1099 = getelementptr inbounds double, ptr %1089, i64 %1098
  %1100 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %1070, ptr noundef %1071, ptr noundef %1072, double noundef %1086, ptr noundef %1099)
  %1101 = icmp eq i32 %1100, 1
  br i1 %1101, label %1102, label %1111

1102:                                             ; preds = %1069
  call void @llvm.lifetime.start.p0(i64 2048, ptr %56) #6
  %1103 = getelementptr inbounds [2048 x i8], ptr %56, i64 0, i64 0
  %1104 = load ptr, ptr %10, align 8, !tbaa !5
  %1105 = getelementptr inbounds %struct.thermo, ptr %1104, i32 0, i32 93
  %1106 = getelementptr inbounds [2048 x i8], ptr %1105, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1103, ptr noundef @.str, ptr noundef @.str.168, ptr noundef %1106)
  %1107 = load ptr, ptr %10, align 8, !tbaa !5
  %1108 = getelementptr inbounds %struct.thermo, ptr %1107, i32 0, i32 93
  %1109 = getelementptr inbounds [2048 x i8], ptr %1108, i64 0, i64 0
  %1110 = getelementptr inbounds [2048 x i8], ptr %56, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1109, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2498, ptr noundef %1110)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %56) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1111:                                             ; preds = %1069
  %1112 = load ptr, ptr %10, align 8, !tbaa !5
  %1113 = getelementptr inbounds %struct.thermo, ptr %1112, i32 0, i32 0
  %1114 = load double, ptr %1113, align 8, !tbaa !18
  %1115 = load ptr, ptr %10, align 8, !tbaa !5
  %1116 = getelementptr inbounds %struct.thermo, ptr %1115, i32 0, i32 0
  %1117 = load double, ptr %1116, align 8, !tbaa !18
  %1118 = fsub double 1.000000e+00, %1117
  %1119 = fmul double 3.971500e+00, %1118
  %1120 = fdiv double %1114, %1119
  %1121 = fadd double 1.000000e+00, %1120
  %1122 = load ptr, ptr %12, align 8, !tbaa !5
  %1123 = getelementptr inbounds %struct.reionization, ptr %1122, i32 0, i32 25
  %1124 = load ptr, ptr %1123, align 8, !tbaa !13
  %1125 = load ptr, ptr %12, align 8, !tbaa !5
  %1126 = getelementptr inbounds %struct.reionization, ptr %1125, i32 0, i32 22
  %1127 = load i32, ptr %1126, align 8, !tbaa !50
  %1128 = sext i32 %1127 to i64
  %1129 = getelementptr inbounds double, ptr %1124, i64 %1128
  store double %1121, ptr %1129, align 8, !tbaa !20
  %1130 = load ptr, ptr %10, align 8, !tbaa !5
  %1131 = getelementptr inbounds %struct.thermo, ptr %1130, i32 0, i32 15
  %1132 = load double, ptr %1131, align 8, !tbaa !52
  %1133 = load ptr, ptr %12, align 8, !tbaa !5
  %1134 = getelementptr inbounds %struct.reionization, ptr %1133, i32 0, i32 25
  %1135 = load ptr, ptr %1134, align 8, !tbaa !13
  %1136 = load ptr, ptr %12, align 8, !tbaa !5
  %1137 = getelementptr inbounds %struct.reionization, ptr %1136, i32 0, i32 23
  %1138 = load i32, ptr %1137, align 4, !tbaa !53
  %1139 = sext i32 %1138 to i64
  %1140 = getelementptr inbounds double, ptr %1135, i64 %1139
  store double %1132, ptr %1140, align 8, !tbaa !20
  %1141 = load ptr, ptr %8, align 8, !tbaa !5
  %1142 = load ptr, ptr %9, align 8, !tbaa !5
  %1143 = load ptr, ptr %10, align 8, !tbaa !5
  %1144 = load ptr, ptr %11, align 8, !tbaa !5
  %1145 = load ptr, ptr %12, align 8, !tbaa !5
  %1146 = load ptr, ptr %13, align 8, !tbaa !5
  %1147 = call i32 @thermodynamics_reionization_sample(ptr noundef %1141, ptr noundef %1142, ptr noundef %1143, ptr noundef %1144, ptr noundef %1145, ptr noundef %1146)
  %1148 = icmp eq i32 %1147, 1
  br i1 %1148, label %1149, label %1158

1149:                                             ; preds = %1111
  call void @llvm.lifetime.start.p0(i64 2048, ptr %57) #6
  %1150 = getelementptr inbounds [2048 x i8], ptr %57, i64 0, i64 0
  %1151 = load ptr, ptr %10, align 8, !tbaa !5
  %1152 = getelementptr inbounds %struct.thermo, ptr %1151, i32 0, i32 93
  %1153 = getelementptr inbounds [2048 x i8], ptr %1152, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1150, ptr noundef @.str, ptr noundef @.str.155, ptr noundef %1153)
  %1154 = load ptr, ptr %10, align 8, !tbaa !5
  %1155 = getelementptr inbounds %struct.thermo, ptr %1154, i32 0, i32 93
  %1156 = getelementptr inbounds [2048 x i8], ptr %1155, i64 0, i64 0
  %1157 = getelementptr inbounds [2048 x i8], ptr %57, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1156, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2509, ptr noundef %1157)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %57) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1158:                                             ; preds = %1111
  %1159 = load ptr, ptr %12, align 8, !tbaa !5
  %1160 = getelementptr inbounds %struct.reionization, ptr %1159, i32 0, i32 11
  %1161 = load double, ptr %1160, align 8, !tbaa !38
  %1162 = load ptr, ptr %10, align 8, !tbaa !5
  %1163 = getelementptr inbounds %struct.thermo, ptr %1162, i32 0, i32 4
  store double %1161, ptr %1163, align 8, !tbaa !39
  store i32 0, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1164:                                             ; preds = %789
  %1165 = load ptr, ptr %10, align 8, !tbaa !5
  %1166 = getelementptr inbounds %struct.thermo, ptr %1165, i32 0, i32 2
  %1167 = load i32, ptr %1166, align 4, !tbaa !15
  %1168 = icmp eq i32 %1167, 4
  br i1 %1168, label %1169, label %1589

1169:                                             ; preds = %1164
  %1170 = load ptr, ptr %10, align 8, !tbaa !5
  %1171 = getelementptr inbounds %struct.thermo, ptr %1170, i32 0, i32 16
  %1172 = load i32, ptr %1171, align 8, !tbaa !54
  %1173 = icmp slt i32 %1172, 1
  br i1 %1173, label %1174, label %1182

1174:                                             ; preds = %1169
  call void @llvm.lifetime.start.p0(i64 2048, ptr %58) #6
  %1175 = getelementptr inbounds [2048 x i8], ptr %58, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1175, ptr noundef @.str.169)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %59) #6
  %1176 = getelementptr inbounds [2048 x i8], ptr %59, i64 0, i64 0
  %1177 = getelementptr inbounds [2048 x i8], ptr %58, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1176, ptr noundef @.str.10, ptr noundef @.str.170, ptr noundef %1177)
  %1178 = load ptr, ptr %10, align 8, !tbaa !5
  %1179 = getelementptr inbounds %struct.thermo, ptr %1178, i32 0, i32 93
  %1180 = getelementptr inbounds [2048 x i8], ptr %1179, i64 0, i64 0
  %1181 = getelementptr inbounds [2048 x i8], ptr %59, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1180, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2524, ptr noundef %1181)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1182:                                             ; preds = %1169
  store i32 1, ptr %21, align 4, !tbaa !14
  br label %1183

1183:                                             ; preds = %1230, %1182
  %1184 = load i32, ptr %21, align 4, !tbaa !14
  %1185 = load ptr, ptr %10, align 8, !tbaa !5
  %1186 = getelementptr inbounds %struct.thermo, ptr %1185, i32 0, i32 16
  %1187 = load i32, ptr %1186, align 8, !tbaa !54
  %1188 = icmp slt i32 %1184, %1187
  br i1 %1188, label %1189, label %1233

1189:                                             ; preds = %1183
  %1190 = load ptr, ptr %10, align 8, !tbaa !5
  %1191 = getelementptr inbounds %struct.thermo, ptr %1190, i32 0, i32 17
  %1192 = load ptr, ptr %1191, align 8, !tbaa !55
  %1193 = load i32, ptr %21, align 4, !tbaa !14
  %1194 = sub nsw i32 %1193, 1
  %1195 = sext i32 %1194 to i64
  %1196 = getelementptr inbounds double, ptr %1192, i64 %1195
  %1197 = load double, ptr %1196, align 8, !tbaa !20
  %1198 = load ptr, ptr %10, align 8, !tbaa !5
  %1199 = getelementptr inbounds %struct.thermo, ptr %1198, i32 0, i32 17
  %1200 = load ptr, ptr %1199, align 8, !tbaa !55
  %1201 = load i32, ptr %21, align 4, !tbaa !14
  %1202 = sext i32 %1201 to i64
  %1203 = getelementptr inbounds double, ptr %1200, i64 %1202
  %1204 = load double, ptr %1203, align 8, !tbaa !20
  %1205 = fcmp oge double %1197, %1204
  br i1 %1205, label %1206, label %1229

1206:                                             ; preds = %1189
  call void @llvm.lifetime.start.p0(i64 2048, ptr %60) #6
  %1207 = getelementptr inbounds [2048 x i8], ptr %60, i64 0, i64 0
  %1208 = load ptr, ptr %10, align 8, !tbaa !5
  %1209 = getelementptr inbounds %struct.thermo, ptr %1208, i32 0, i32 17
  %1210 = load ptr, ptr %1209, align 8, !tbaa !55
  %1211 = load i32, ptr %21, align 4, !tbaa !14
  %1212 = sub nsw i32 %1211, 1
  %1213 = sext i32 %1212 to i64
  %1214 = getelementptr inbounds double, ptr %1210, i64 %1213
  %1215 = load double, ptr %1214, align 8, !tbaa !20
  %1216 = load ptr, ptr %10, align 8, !tbaa !5
  %1217 = getelementptr inbounds %struct.thermo, ptr %1216, i32 0, i32 17
  %1218 = load ptr, ptr %1217, align 8, !tbaa !55
  %1219 = load i32, ptr %21, align 4, !tbaa !14
  %1220 = sext i32 %1219 to i64
  %1221 = getelementptr inbounds double, ptr %1218, i64 %1220
  %1222 = load double, ptr %1221, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1207, ptr noundef @.str.165, double noundef %1215, double noundef %1222)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %61) #6
  %1223 = getelementptr inbounds [2048 x i8], ptr %61, i64 0, i64 0
  %1224 = getelementptr inbounds [2048 x i8], ptr %60, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1223, ptr noundef @.str.10, ptr noundef @.str.171, ptr noundef %1224)
  %1225 = load ptr, ptr %10, align 8, !tbaa !5
  %1226 = getelementptr inbounds %struct.thermo, ptr %1225, i32 0, i32 93
  %1227 = getelementptr inbounds [2048 x i8], ptr %1226, i64 0, i64 0
  %1228 = getelementptr inbounds [2048 x i8], ptr %61, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1227, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2532, ptr noundef %1228)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1229:                                             ; preds = %1189
  br label %1230

1230:                                             ; preds = %1229
  %1231 = load i32, ptr %21, align 4, !tbaa !14
  %1232 = add nsw i32 %1231, 1
  store i32 %1232, ptr %21, align 4, !tbaa !14
  br label %1183, !llvm.loop !56

1233:                                             ; preds = %1183
  store i32 1, ptr %21, align 4, !tbaa !14
  br label %1234

1234:                                             ; preds = %1339, %1233
  %1235 = load i32, ptr %21, align 4, !tbaa !14
  %1236 = load ptr, ptr %12, align 8, !tbaa !5
  %1237 = getelementptr inbounds %struct.reionization, ptr %1236, i32 0, i32 20
  %1238 = load i32, ptr %1237, align 8, !tbaa !47
  %1239 = sub nsw i32 %1238, 1
  %1240 = icmp slt i32 %1235, %1239
  br i1 %1240, label %1241, label %1342

1241:                                             ; preds = %1234
  %1242 = load ptr, ptr %10, align 8, !tbaa !5
  %1243 = getelementptr inbounds %struct.thermo, ptr %1242, i32 0, i32 17
  %1244 = load ptr, ptr %1243, align 8, !tbaa !55
  %1245 = load i32, ptr %21, align 4, !tbaa !14
  %1246 = sub nsw i32 %1245, 1
  %1247 = sext i32 %1246 to i64
  %1248 = getelementptr inbounds double, ptr %1244, i64 %1247
  %1249 = load double, ptr %1248, align 8, !tbaa !20
  %1250 = load ptr, ptr %12, align 8, !tbaa !5
  %1251 = getelementptr inbounds %struct.reionization, ptr %1250, i32 0, i32 25
  %1252 = load ptr, ptr %1251, align 8, !tbaa !13
  %1253 = load ptr, ptr %12, align 8, !tbaa !5
  %1254 = getelementptr inbounds %struct.reionization, ptr %1253, i32 0, i32 21
  %1255 = load i32, ptr %1254, align 4, !tbaa !48
  %1256 = load i32, ptr %21, align 4, !tbaa !14
  %1257 = add nsw i32 %1255, %1256
  %1258 = sext i32 %1257 to i64
  %1259 = getelementptr inbounds double, ptr %1252, i64 %1258
  store double %1249, ptr %1259, align 8, !tbaa !20
  %1260 = load ptr, ptr %10, align 8, !tbaa !5
  %1261 = getelementptr inbounds %struct.thermo, ptr %1260, i32 0, i32 18
  %1262 = load ptr, ptr %1261, align 8, !tbaa !57
  %1263 = load i32, ptr %21, align 4, !tbaa !14
  %1264 = sub nsw i32 %1263, 1
  %1265 = sext i32 %1264 to i64
  %1266 = getelementptr inbounds double, ptr %1262, i64 %1265
  %1267 = load double, ptr %1266, align 8, !tbaa !20
  store double %1267, ptr %23, align 8, !tbaa !20
  %1268 = load double, ptr %23, align 8, !tbaa !20
  %1269 = fcmp oge double %1268, 0.000000e+00
  br i1 %1269, label %1270, label %1272

1270:                                             ; preds = %1241
  %1271 = load double, ptr %23, align 8, !tbaa !20
  store double %1271, ptr %24, align 8, !tbaa !20
  br label %1327

1272:                                             ; preds = %1241
  %1273 = load double, ptr %23, align 8, !tbaa !20
  %1274 = fcmp olt double %1273, -9.000000e-01
  br i1 %1274, label %1275, label %1289

1275:                                             ; preds = %1272
  %1276 = load double, ptr %23, align 8, !tbaa !20
  %1277 = fcmp ogt double %1276, -1.100000e+00
  br i1 %1277, label %1278, label %1289

1278:                                             ; preds = %1275
  %1279 = load ptr, ptr %10, align 8, !tbaa !5
  %1280 = getelementptr inbounds %struct.thermo, ptr %1279, i32 0, i32 0
  %1281 = load double, ptr %1280, align 8, !tbaa !18
  %1282 = load ptr, ptr %10, align 8, !tbaa !5
  %1283 = getelementptr inbounds %struct.thermo, ptr %1282, i32 0, i32 0
  %1284 = load double, ptr %1283, align 8, !tbaa !18
  %1285 = fsub double 1.000000e+00, %1284
  %1286 = fmul double 3.971500e+00, %1285
  %1287 = fdiv double %1281, %1286
  %1288 = fadd double 1.000000e+00, %1287
  store double %1288, ptr %24, align 8, !tbaa !20
  br label %1326

1289:                                             ; preds = %1275, %1272
  %1290 = load double, ptr %23, align 8, !tbaa !20
  %1291 = fcmp olt double %1290, -1.900000e+00
  br i1 %1291, label %1292, label %1307

1292:                                             ; preds = %1289
  %1293 = load double, ptr %23, align 8, !tbaa !20
  %1294 = fcmp ogt double %1293, -2.100000e+00
  br i1 %1294, label %1295, label %1307

1295:                                             ; preds = %1292
  %1296 = load ptr, ptr %10, align 8, !tbaa !5
  %1297 = getelementptr inbounds %struct.thermo, ptr %1296, i32 0, i32 0
  %1298 = load double, ptr %1297, align 8, !tbaa !18
  %1299 = fmul double 2.000000e+00, %1298
  %1300 = load ptr, ptr %10, align 8, !tbaa !5
  %1301 = getelementptr inbounds %struct.thermo, ptr %1300, i32 0, i32 0
  %1302 = load double, ptr %1301, align 8, !tbaa !18
  %1303 = fsub double 1.000000e+00, %1302
  %1304 = fmul double 3.971500e+00, %1303
  %1305 = fdiv double %1299, %1304
  %1306 = fadd double 1.000000e+00, %1305
  store double %1306, ptr %24, align 8, !tbaa !20
  br label %1325

1307:                                             ; preds = %1292, %1289
  call void @llvm.lifetime.start.p0(i64 2048, ptr %62) #6
  %1308 = getelementptr inbounds [2048 x i8], ptr %62, i64 0, i64 0
  %1309 = load i32, ptr %21, align 4, !tbaa !14
  %1310 = sub nsw i32 %1309, 1
  %1311 = load ptr, ptr %10, align 8, !tbaa !5
  %1312 = getelementptr inbounds %struct.thermo, ptr %1311, i32 0, i32 18
  %1313 = load ptr, ptr %1312, align 8, !tbaa !57
  %1314 = load i32, ptr %21, align 4, !tbaa !14
  %1315 = sub nsw i32 %1314, 1
  %1316 = sext i32 %1315 to i64
  %1317 = getelementptr inbounds double, ptr %1313, i64 %1316
  %1318 = load double, ptr %1317, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1308, ptr noundef @.str.172, i32 noundef %1310, double noundef %1318)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %63) #6
  %1319 = getelementptr inbounds [2048 x i8], ptr %63, i64 0, i64 0
  %1320 = getelementptr inbounds [2048 x i8], ptr %62, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1319, ptr noundef @.str.139, ptr noundef %1320)
  %1321 = load ptr, ptr %10, align 8, !tbaa !5
  %1322 = getelementptr inbounds %struct.thermo, ptr %1321, i32 0, i32 93
  %1323 = getelementptr inbounds [2048 x i8], ptr %1322, i64 0, i64 0
  %1324 = getelementptr inbounds [2048 x i8], ptr %63, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1323, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2560, ptr noundef %1324)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %63) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 2048, ptr %62) #6
  br label %1945

1325:                                             ; preds = %1295
  br label %1326

1326:                                             ; preds = %1325, %1278
  br label %1327

1327:                                             ; preds = %1326, %1270
  %1328 = load double, ptr %24, align 8, !tbaa !20
  %1329 = load ptr, ptr %12, align 8, !tbaa !5
  %1330 = getelementptr inbounds %struct.reionization, ptr %1329, i32 0, i32 25
  %1331 = load ptr, ptr %1330, align 8, !tbaa !13
  %1332 = load ptr, ptr %12, align 8, !tbaa !5
  %1333 = getelementptr inbounds %struct.reionization, ptr %1332, i32 0, i32 22
  %1334 = load i32, ptr %1333, align 8, !tbaa !50
  %1335 = load i32, ptr %21, align 4, !tbaa !14
  %1336 = add nsw i32 %1334, %1335
  %1337 = sext i32 %1336 to i64
  %1338 = getelementptr inbounds double, ptr %1331, i64 %1337
  store double %1328, ptr %1338, align 8, !tbaa !20
  br label %1339

1339:                                             ; preds = %1327
  %1340 = load i32, ptr %21, align 4, !tbaa !14
  %1341 = add nsw i32 %1340, 1
  store i32 %1341, ptr %21, align 4, !tbaa !14
  br label %1234, !llvm.loop !58

1342:                                             ; preds = %1234
  %1343 = load ptr, ptr %12, align 8, !tbaa !5
  %1344 = getelementptr inbounds %struct.reionization, ptr %1343, i32 0, i32 25
  %1345 = load ptr, ptr %1344, align 8, !tbaa !13
  %1346 = load ptr, ptr %12, align 8, !tbaa !5
  %1347 = getelementptr inbounds %struct.reionization, ptr %1346, i32 0, i32 21
  %1348 = load i32, ptr %1347, align 4, !tbaa !48
  %1349 = load ptr, ptr %12, align 8, !tbaa !5
  %1350 = getelementptr inbounds %struct.reionization, ptr %1349, i32 0, i32 20
  %1351 = load i32, ptr %1350, align 8, !tbaa !47
  %1352 = add nsw i32 %1348, %1351
  %1353 = sub nsw i32 %1352, 2
  %1354 = sext i32 %1353 to i64
  %1355 = getelementptr inbounds double, ptr %1345, i64 %1354
  %1356 = load double, ptr %1355, align 8, !tbaa !20
  %1357 = load ptr, ptr %8, align 8, !tbaa !5
  %1358 = getelementptr inbounds %struct.precision, ptr %1357, i32 0, i32 47
  %1359 = load double, ptr %1358, align 8, !tbaa !33
  %1360 = load ptr, ptr %10, align 8, !tbaa !5
  %1361 = getelementptr inbounds %struct.thermo, ptr %1360, i32 0, i32 19
  %1362 = load double, ptr %1361, align 8, !tbaa !59
  %1363 = call double @llvm.fmuladd.f64(double %1359, double %1362, double %1356)
  %1364 = load ptr, ptr %12, align 8, !tbaa !5
  %1365 = getelementptr inbounds %struct.reionization, ptr %1364, i32 0, i32 25
  %1366 = load ptr, ptr %1365, align 8, !tbaa !13
  %1367 = load ptr, ptr %12, align 8, !tbaa !5
  %1368 = getelementptr inbounds %struct.reionization, ptr %1367, i32 0, i32 21
  %1369 = load i32, ptr %1368, align 4, !tbaa !48
  %1370 = load ptr, ptr %12, align 8, !tbaa !5
  %1371 = getelementptr inbounds %struct.reionization, ptr %1370, i32 0, i32 20
  %1372 = load i32, ptr %1371, align 8, !tbaa !47
  %1373 = add nsw i32 %1369, %1372
  %1374 = sub nsw i32 %1373, 1
  %1375 = sext i32 %1374 to i64
  %1376 = getelementptr inbounds double, ptr %1366, i64 %1375
  store double %1363, ptr %1376, align 8, !tbaa !20
  %1377 = load ptr, ptr %12, align 8, !tbaa !5
  %1378 = getelementptr inbounds %struct.reionization, ptr %1377, i32 0, i32 25
  %1379 = load ptr, ptr %1378, align 8, !tbaa !13
  %1380 = load ptr, ptr %12, align 8, !tbaa !5
  %1381 = getelementptr inbounds %struct.reionization, ptr %1380, i32 0, i32 21
  %1382 = load i32, ptr %1381, align 4, !tbaa !48
  %1383 = load ptr, ptr %12, align 8, !tbaa !5
  %1384 = getelementptr inbounds %struct.reionization, ptr %1383, i32 0, i32 20
  %1385 = load i32, ptr %1384, align 8, !tbaa !47
  %1386 = add nsw i32 %1382, %1385
  %1387 = sub nsw i32 %1386, 1
  %1388 = sext i32 %1387 to i64
  %1389 = getelementptr inbounds double, ptr %1379, i64 %1388
  %1390 = load double, ptr %1389, align 8, !tbaa !20
  %1391 = load ptr, ptr %12, align 8, !tbaa !5
  %1392 = getelementptr inbounds %struct.reionization, ptr %1391, i32 0, i32 25
  %1393 = load ptr, ptr %1392, align 8, !tbaa !13
  %1394 = load ptr, ptr %12, align 8, !tbaa !5
  %1395 = getelementptr inbounds %struct.reionization, ptr %1394, i32 0, i32 24
  %1396 = load i32, ptr %1395, align 8, !tbaa !35
  %1397 = sext i32 %1396 to i64
  %1398 = getelementptr inbounds double, ptr %1393, i64 %1397
  store double %1390, ptr %1398, align 8, !tbaa !20
  %1399 = load ptr, ptr %12, align 8, !tbaa !5
  %1400 = getelementptr inbounds %struct.reionization, ptr %1399, i32 0, i32 25
  %1401 = load ptr, ptr %1400, align 8, !tbaa !13
  %1402 = load ptr, ptr %12, align 8, !tbaa !5
  %1403 = getelementptr inbounds %struct.reionization, ptr %1402, i32 0, i32 24
  %1404 = load i32, ptr %1403, align 8, !tbaa !35
  %1405 = sext i32 %1404 to i64
  %1406 = getelementptr inbounds double, ptr %1401, i64 %1405
  %1407 = load double, ptr %1406, align 8, !tbaa !20
  %1408 = load ptr, ptr %8, align 8, !tbaa !5
  %1409 = getelementptr inbounds %struct.precision, ptr %1408, i32 0, i32 44
  %1410 = load double, ptr %1409, align 8, !tbaa !36
  %1411 = fcmp ogt double %1407, %1410
  br i1 %1411, label %1412, label %1432

1412:                                             ; preds = %1342
  call void @llvm.lifetime.start.p0(i64 2048, ptr %64) #6
  %1413 = getelementptr inbounds [2048 x i8], ptr %64, i64 0, i64 0
  %1414 = load ptr, ptr %12, align 8, !tbaa !5
  %1415 = getelementptr inbounds %struct.reionization, ptr %1414, i32 0, i32 25
  %1416 = load ptr, ptr %1415, align 8, !tbaa !13
  %1417 = load ptr, ptr %12, align 8, !tbaa !5
  %1418 = getelementptr inbounds %struct.reionization, ptr %1417, i32 0, i32 24
  %1419 = load i32, ptr %1418, align 8, !tbaa !35
  %1420 = sext i32 %1419 to i64
  %1421 = getelementptr inbounds double, ptr %1416, i64 %1420
  %1422 = load double, ptr %1421, align 8, !tbaa !20
  %1423 = load ptr, ptr %8, align 8, !tbaa !5
  %1424 = getelementptr inbounds %struct.precision, ptr %1423, i32 0, i32 44
  %1425 = load double, ptr %1424, align 8, !tbaa !36
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1413, ptr noundef @.str.167, double noundef %1422, double noundef %1425)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %65) #6
  %1426 = getelementptr inbounds [2048 x i8], ptr %65, i64 0, i64 0
  %1427 = getelementptr inbounds [2048 x i8], ptr %64, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1426, ptr noundef @.str.10, ptr noundef @.str.153, ptr noundef %1427)
  %1428 = load ptr, ptr %10, align 8, !tbaa !5
  %1429 = getelementptr inbounds %struct.thermo, ptr %1428, i32 0, i32 93
  %1430 = getelementptr inbounds [2048 x i8], ptr %1429, i64 0, i64 0
  %1431 = getelementptr inbounds [2048 x i8], ptr %65, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1430, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2580, ptr noundef %1431)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1432:                                             ; preds = %1342
  %1433 = load ptr, ptr %12, align 8, !tbaa !5
  %1434 = getelementptr inbounds %struct.reionization, ptr %1433, i32 0, i32 25
  %1435 = load ptr, ptr %1434, align 8, !tbaa !13
  %1436 = load ptr, ptr %12, align 8, !tbaa !5
  %1437 = getelementptr inbounds %struct.reionization, ptr %1436, i32 0, i32 21
  %1438 = load i32, ptr %1437, align 4, !tbaa !48
  %1439 = add nsw i32 %1438, 1
  %1440 = sext i32 %1439 to i64
  %1441 = getelementptr inbounds double, ptr %1435, i64 %1440
  %1442 = load double, ptr %1441, align 8, !tbaa !20
  %1443 = load ptr, ptr %8, align 8, !tbaa !5
  %1444 = getelementptr inbounds %struct.precision, ptr %1443, i32 0, i32 47
  %1445 = load double, ptr %1444, align 8, !tbaa !33
  %1446 = load ptr, ptr %10, align 8, !tbaa !5
  %1447 = getelementptr inbounds %struct.thermo, ptr %1446, i32 0, i32 19
  %1448 = load double, ptr %1447, align 8, !tbaa !59
  %1449 = fneg double %1445
  %1450 = call double @llvm.fmuladd.f64(double %1449, double %1448, double %1442)
  %1451 = load ptr, ptr %12, align 8, !tbaa !5
  %1452 = getelementptr inbounds %struct.reionization, ptr %1451, i32 0, i32 25
  %1453 = load ptr, ptr %1452, align 8, !tbaa !13
  %1454 = load ptr, ptr %12, align 8, !tbaa !5
  %1455 = getelementptr inbounds %struct.reionization, ptr %1454, i32 0, i32 21
  %1456 = load i32, ptr %1455, align 4, !tbaa !48
  %1457 = sext i32 %1456 to i64
  %1458 = getelementptr inbounds double, ptr %1453, i64 %1457
  store double %1450, ptr %1458, align 8, !tbaa !20
  %1459 = load ptr, ptr %12, align 8, !tbaa !5
  %1460 = getelementptr inbounds %struct.reionization, ptr %1459, i32 0, i32 25
  %1461 = load ptr, ptr %1460, align 8, !tbaa !13
  %1462 = load ptr, ptr %12, align 8, !tbaa !5
  %1463 = getelementptr inbounds %struct.reionization, ptr %1462, i32 0, i32 21
  %1464 = load i32, ptr %1463, align 4, !tbaa !48
  %1465 = sext i32 %1464 to i64
  %1466 = getelementptr inbounds double, ptr %1461, i64 %1465
  %1467 = load double, ptr %1466, align 8, !tbaa !20
  %1468 = fcmp olt double %1467, 0.000000e+00
  br i1 %1468, label %1469, label %1478

1469:                                             ; preds = %1432
  %1470 = load ptr, ptr %12, align 8, !tbaa !5
  %1471 = getelementptr inbounds %struct.reionization, ptr %1470, i32 0, i32 25
  %1472 = load ptr, ptr %1471, align 8, !tbaa !13
  %1473 = load ptr, ptr %12, align 8, !tbaa !5
  %1474 = getelementptr inbounds %struct.reionization, ptr %1473, i32 0, i32 21
  %1475 = load i32, ptr %1474, align 4, !tbaa !48
  %1476 = sext i32 %1475 to i64
  %1477 = getelementptr inbounds double, ptr %1472, i64 %1476
  store double 0.000000e+00, ptr %1477, align 8, !tbaa !20
  br label %1478

1478:                                             ; preds = %1469, %1432
  %1479 = load ptr, ptr %8, align 8, !tbaa !5
  %1480 = load ptr, ptr %10, align 8, !tbaa !5
  %1481 = load ptr, ptr %11, align 8, !tbaa !5
  %1482 = load ptr, ptr %12, align 8, !tbaa !5
  %1483 = getelementptr inbounds %struct.reionization, ptr %1482, i32 0, i32 25
  %1484 = load ptr, ptr %1483, align 8, !tbaa !13
  %1485 = load ptr, ptr %12, align 8, !tbaa !5
  %1486 = getelementptr inbounds %struct.reionization, ptr %1485, i32 0, i32 21
  %1487 = load i32, ptr %1486, align 4, !tbaa !48
  %1488 = load ptr, ptr %12, align 8, !tbaa !5
  %1489 = getelementptr inbounds %struct.reionization, ptr %1488, i32 0, i32 20
  %1490 = load i32, ptr %1489, align 8, !tbaa !47
  %1491 = add nsw i32 %1487, %1490
  %1492 = sub nsw i32 %1491, 1
  %1493 = sext i32 %1492 to i64
  %1494 = getelementptr inbounds double, ptr %1484, i64 %1493
  %1495 = load double, ptr %1494, align 8, !tbaa !20
  %1496 = load ptr, ptr %12, align 8, !tbaa !5
  %1497 = getelementptr inbounds %struct.reionization, ptr %1496, i32 0, i32 25
  %1498 = load ptr, ptr %1497, align 8, !tbaa !13
  %1499 = load ptr, ptr %12, align 8, !tbaa !5
  %1500 = getelementptr inbounds %struct.reionization, ptr %1499, i32 0, i32 22
  %1501 = load i32, ptr %1500, align 8, !tbaa !50
  %1502 = load ptr, ptr %12, align 8, !tbaa !5
  %1503 = getelementptr inbounds %struct.reionization, ptr %1502, i32 0, i32 20
  %1504 = load i32, ptr %1503, align 8, !tbaa !47
  %1505 = add nsw i32 %1501, %1504
  %1506 = sub nsw i32 %1505, 1
  %1507 = sext i32 %1506 to i64
  %1508 = getelementptr inbounds double, ptr %1498, i64 %1507
  %1509 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %1479, ptr noundef %1480, ptr noundef %1481, double noundef %1495, ptr noundef %1508)
  %1510 = icmp eq i32 %1509, 1
  br i1 %1510, label %1511, label %1520

1511:                                             ; preds = %1478
  call void @llvm.lifetime.start.p0(i64 2048, ptr %66) #6
  %1512 = getelementptr inbounds [2048 x i8], ptr %66, i64 0, i64 0
  %1513 = load ptr, ptr %10, align 8, !tbaa !5
  %1514 = getelementptr inbounds %struct.thermo, ptr %1513, i32 0, i32 93
  %1515 = getelementptr inbounds [2048 x i8], ptr %1514, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1512, ptr noundef @.str, ptr noundef @.str.168, ptr noundef %1515)
  %1516 = load ptr, ptr %10, align 8, !tbaa !5
  %1517 = getelementptr inbounds %struct.thermo, ptr %1516, i32 0, i32 93
  %1518 = getelementptr inbounds [2048 x i8], ptr %1517, i64 0, i64 0
  %1519 = getelementptr inbounds [2048 x i8], ptr %66, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1518, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2600, ptr noundef %1519)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %66) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1520:                                             ; preds = %1478
  %1521 = load ptr, ptr %12, align 8, !tbaa !5
  %1522 = getelementptr inbounds %struct.reionization, ptr %1521, i32 0, i32 25
  %1523 = load ptr, ptr %1522, align 8, !tbaa !13
  %1524 = load ptr, ptr %12, align 8, !tbaa !5
  %1525 = getelementptr inbounds %struct.reionization, ptr %1524, i32 0, i32 22
  %1526 = load i32, ptr %1525, align 8, !tbaa !50
  %1527 = add nsw i32 %1526, 1
  %1528 = sext i32 %1527 to i64
  %1529 = getelementptr inbounds double, ptr %1523, i64 %1528
  %1530 = load double, ptr %1529, align 8, !tbaa !20
  %1531 = load ptr, ptr %12, align 8, !tbaa !5
  %1532 = getelementptr inbounds %struct.reionization, ptr %1531, i32 0, i32 25
  %1533 = load ptr, ptr %1532, align 8, !tbaa !13
  %1534 = load ptr, ptr %12, align 8, !tbaa !5
  %1535 = getelementptr inbounds %struct.reionization, ptr %1534, i32 0, i32 22
  %1536 = load i32, ptr %1535, align 8, !tbaa !50
  %1537 = sext i32 %1536 to i64
  %1538 = getelementptr inbounds double, ptr %1533, i64 %1537
  store double %1530, ptr %1538, align 8, !tbaa !20
  %1539 = load ptr, ptr %10, align 8, !tbaa !5
  %1540 = getelementptr inbounds %struct.thermo, ptr %1539, i32 0, i32 19
  %1541 = load double, ptr %1540, align 8, !tbaa !59
  %1542 = fcmp ole double %1541, 0.000000e+00
  br i1 %1542, label %1543, label %1554

1543:                                             ; preds = %1520
  call void @llvm.lifetime.start.p0(i64 2048, ptr %67) #6
  %1544 = getelementptr inbounds [2048 x i8], ptr %67, i64 0, i64 0
  %1545 = load ptr, ptr %10, align 8, !tbaa !5
  %1546 = getelementptr inbounds %struct.thermo, ptr %1545, i32 0, i32 19
  %1547 = load double, ptr %1546, align 8, !tbaa !59
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1544, ptr noundef @.str.173, double noundef %1547)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %68) #6
  %1548 = getelementptr inbounds [2048 x i8], ptr %68, i64 0, i64 0
  %1549 = getelementptr inbounds [2048 x i8], ptr %67, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1548, ptr noundef @.str.10, ptr noundef @.str.174, ptr noundef %1549)
  %1550 = load ptr, ptr %10, align 8, !tbaa !5
  %1551 = getelementptr inbounds %struct.thermo, ptr %1550, i32 0, i32 93
  %1552 = getelementptr inbounds [2048 x i8], ptr %1551, i64 0, i64 0
  %1553 = getelementptr inbounds [2048 x i8], ptr %68, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1552, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2619, ptr noundef %1553)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %68) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %67) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1554:                                             ; preds = %1520
  %1555 = load ptr, ptr %10, align 8, !tbaa !5
  %1556 = getelementptr inbounds %struct.thermo, ptr %1555, i32 0, i32 19
  %1557 = load double, ptr %1556, align 8, !tbaa !59
  %1558 = load ptr, ptr %12, align 8, !tbaa !5
  %1559 = getelementptr inbounds %struct.reionization, ptr %1558, i32 0, i32 25
  %1560 = load ptr, ptr %1559, align 8, !tbaa !13
  %1561 = load ptr, ptr %12, align 8, !tbaa !5
  %1562 = getelementptr inbounds %struct.reionization, ptr %1561, i32 0, i32 23
  %1563 = load i32, ptr %1562, align 4, !tbaa !53
  %1564 = sext i32 %1563 to i64
  %1565 = getelementptr inbounds double, ptr %1560, i64 %1564
  store double %1557, ptr %1565, align 8, !tbaa !20
  %1566 = load ptr, ptr %8, align 8, !tbaa !5
  %1567 = load ptr, ptr %9, align 8, !tbaa !5
  %1568 = load ptr, ptr %10, align 8, !tbaa !5
  %1569 = load ptr, ptr %11, align 8, !tbaa !5
  %1570 = load ptr, ptr %12, align 8, !tbaa !5
  %1571 = load ptr, ptr %13, align 8, !tbaa !5
  %1572 = call i32 @thermodynamics_reionization_sample(ptr noundef %1566, ptr noundef %1567, ptr noundef %1568, ptr noundef %1569, ptr noundef %1570, ptr noundef %1571)
  %1573 = icmp eq i32 %1572, 1
  br i1 %1573, label %1574, label %1583

1574:                                             ; preds = %1554
  call void @llvm.lifetime.start.p0(i64 2048, ptr %69) #6
  %1575 = getelementptr inbounds [2048 x i8], ptr %69, i64 0, i64 0
  %1576 = load ptr, ptr %10, align 8, !tbaa !5
  %1577 = getelementptr inbounds %struct.thermo, ptr %1576, i32 0, i32 93
  %1578 = getelementptr inbounds [2048 x i8], ptr %1577, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1575, ptr noundef @.str, ptr noundef @.str.155, ptr noundef %1578)
  %1579 = load ptr, ptr %10, align 8, !tbaa !5
  %1580 = getelementptr inbounds %struct.thermo, ptr %1579, i32 0, i32 93
  %1581 = getelementptr inbounds [2048 x i8], ptr %1580, i64 0, i64 0
  %1582 = getelementptr inbounds [2048 x i8], ptr %69, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1581, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2626, ptr noundef %1582)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %69) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1583:                                             ; preds = %1554
  %1584 = load ptr, ptr %12, align 8, !tbaa !5
  %1585 = getelementptr inbounds %struct.reionization, ptr %1584, i32 0, i32 11
  %1586 = load double, ptr %1585, align 8, !tbaa !38
  %1587 = load ptr, ptr %10, align 8, !tbaa !5
  %1588 = getelementptr inbounds %struct.thermo, ptr %1587, i32 0, i32 4
  store double %1586, ptr %1588, align 8, !tbaa !39
  store i32 0, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1589:                                             ; preds = %1164
  %1590 = load ptr, ptr %10, align 8, !tbaa !5
  %1591 = getelementptr inbounds %struct.thermo, ptr %1590, i32 0, i32 2
  %1592 = load i32, ptr %1591, align 4, !tbaa !15
  %1593 = icmp eq i32 %1592, 5
  br i1 %1593, label %1594, label %1934

1594:                                             ; preds = %1589
  %1595 = load ptr, ptr %10, align 8, !tbaa !5
  %1596 = getelementptr inbounds %struct.thermo, ptr %1595, i32 0, i32 20
  %1597 = load i32, ptr %1596, align 8, !tbaa !60
  %1598 = icmp slt i32 %1597, 1
  br i1 %1598, label %1599, label %1607

1599:                                             ; preds = %1594
  call void @llvm.lifetime.start.p0(i64 2048, ptr %70) #6
  %1600 = getelementptr inbounds [2048 x i8], ptr %70, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1600, ptr noundef @.str.175)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %71) #6
  %1601 = getelementptr inbounds [2048 x i8], ptr %71, i64 0, i64 0
  %1602 = getelementptr inbounds [2048 x i8], ptr %70, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1601, ptr noundef @.str.10, ptr noundef @.str.176, ptr noundef %1602)
  %1603 = load ptr, ptr %10, align 8, !tbaa !5
  %1604 = getelementptr inbounds %struct.thermo, ptr %1603, i32 0, i32 93
  %1605 = getelementptr inbounds [2048 x i8], ptr %1604, i64 0, i64 0
  %1606 = getelementptr inbounds [2048 x i8], ptr %71, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1605, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2641, ptr noundef %1606)
  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 %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1607:                                             ; preds = %1594
  %1608 = load ptr, ptr %10, align 8, !tbaa !5
  %1609 = getelementptr inbounds %struct.thermo, ptr %1608, i32 0, i32 21
  %1610 = load ptr, ptr %1609, align 8, !tbaa !61
  %1611 = getelementptr inbounds double, ptr %1610, i64 0
  %1612 = load double, ptr %1611, align 8, !tbaa !20
  %1613 = fcmp une double %1612, 0.000000e+00
  br i1 %1613, label %1614, label %1627

1614:                                             ; preds = %1607
  call void @llvm.lifetime.start.p0(i64 2048, ptr %72) #6
  %1615 = getelementptr inbounds [2048 x i8], ptr %72, i64 0, i64 0
  %1616 = load ptr, ptr %10, align 8, !tbaa !5
  %1617 = getelementptr inbounds %struct.thermo, ptr %1616, i32 0, i32 21
  %1618 = load ptr, ptr %1617, align 8, !tbaa !61
  %1619 = getelementptr inbounds double, ptr %1618, i64 0
  %1620 = load double, ptr %1619, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1615, ptr noundef @.str.177, double noundef %1620)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %73) #6
  %1621 = getelementptr inbounds [2048 x i8], ptr %73, i64 0, i64 0
  %1622 = getelementptr inbounds [2048 x i8], ptr %72, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1621, ptr noundef @.str.10, ptr noundef @.str.178, ptr noundef %1622)
  %1623 = load ptr, ptr %10, align 8, !tbaa !5
  %1624 = getelementptr inbounds %struct.thermo, ptr %1623, i32 0, i32 93
  %1625 = getelementptr inbounds [2048 x i8], ptr %1624, i64 0, i64 0
  %1626 = getelementptr inbounds [2048 x i8], ptr %73, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1625, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2647, ptr noundef %1626)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %73) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %72) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1627:                                             ; preds = %1607
  store i32 1, ptr %22, align 4, !tbaa !14
  br label %1628

1628:                                             ; preds = %1675, %1627
  %1629 = load i32, ptr %22, align 4, !tbaa !14
  %1630 = load ptr, ptr %10, align 8, !tbaa !5
  %1631 = getelementptr inbounds %struct.thermo, ptr %1630, i32 0, i32 20
  %1632 = load i32, ptr %1631, align 8, !tbaa !60
  %1633 = icmp slt i32 %1629, %1632
  br i1 %1633, label %1634, label %1678

1634:                                             ; preds = %1628
  %1635 = load ptr, ptr %10, align 8, !tbaa !5
  %1636 = getelementptr inbounds %struct.thermo, ptr %1635, i32 0, i32 21
  %1637 = load ptr, ptr %1636, align 8, !tbaa !61
  %1638 = load i32, ptr %22, align 4, !tbaa !14
  %1639 = sub nsw i32 %1638, 1
  %1640 = sext i32 %1639 to i64
  %1641 = getelementptr inbounds double, ptr %1637, i64 %1640
  %1642 = load double, ptr %1641, align 8, !tbaa !20
  %1643 = load ptr, ptr %10, align 8, !tbaa !5
  %1644 = getelementptr inbounds %struct.thermo, ptr %1643, i32 0, i32 21
  %1645 = load ptr, ptr %1644, align 8, !tbaa !61
  %1646 = load i32, ptr %22, align 4, !tbaa !14
  %1647 = sext i32 %1646 to i64
  %1648 = getelementptr inbounds double, ptr %1645, i64 %1647
  %1649 = load double, ptr %1648, align 8, !tbaa !20
  %1650 = fcmp oge double %1642, %1649
  br i1 %1650, label %1651, label %1674

1651:                                             ; preds = %1634
  call void @llvm.lifetime.start.p0(i64 2048, ptr %74) #6
  %1652 = getelementptr inbounds [2048 x i8], ptr %74, i64 0, i64 0
  %1653 = load ptr, ptr %10, align 8, !tbaa !5
  %1654 = getelementptr inbounds %struct.thermo, ptr %1653, i32 0, i32 21
  %1655 = load ptr, ptr %1654, align 8, !tbaa !61
  %1656 = load i32, ptr %22, align 4, !tbaa !14
  %1657 = sub nsw i32 %1656, 1
  %1658 = sext i32 %1657 to i64
  %1659 = getelementptr inbounds double, ptr %1655, i64 %1658
  %1660 = load double, ptr %1659, align 8, !tbaa !20
  %1661 = load ptr, ptr %10, align 8, !tbaa !5
  %1662 = getelementptr inbounds %struct.thermo, ptr %1661, i32 0, i32 21
  %1663 = load ptr, ptr %1662, align 8, !tbaa !61
  %1664 = load i32, ptr %22, align 4, !tbaa !14
  %1665 = sext i32 %1664 to i64
  %1666 = getelementptr inbounds double, ptr %1663, i64 %1665
  %1667 = load double, ptr %1666, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1652, ptr noundef @.str.179, double noundef %1660, double noundef %1667)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %75) #6
  %1668 = getelementptr inbounds [2048 x i8], ptr %75, i64 0, i64 0
  %1669 = getelementptr inbounds [2048 x i8], ptr %74, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1668, ptr noundef @.str.10, ptr noundef @.str.180, ptr noundef %1669)
  %1670 = load ptr, ptr %10, align 8, !tbaa !5
  %1671 = getelementptr inbounds %struct.thermo, ptr %1670, i32 0, i32 93
  %1672 = getelementptr inbounds [2048 x i8], ptr %1671, i64 0, i64 0
  %1673 = getelementptr inbounds [2048 x i8], ptr %75, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1672, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2655, ptr noundef %1673)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %75) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %74) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1674:                                             ; preds = %1634
  br label %1675

1675:                                             ; preds = %1674
  %1676 = load i32, ptr %22, align 4, !tbaa !14
  %1677 = add nsw i32 %1676, 1
  store i32 %1677, ptr %22, align 4, !tbaa !14
  br label %1628, !llvm.loop !62

1678:                                             ; preds = %1628
  %1679 = load ptr, ptr %10, align 8, !tbaa !5
  %1680 = getelementptr inbounds %struct.thermo, ptr %1679, i32 0, i32 22
  %1681 = load ptr, ptr %1680, align 8, !tbaa !63
  %1682 = load ptr, ptr %10, align 8, !tbaa !5
  %1683 = getelementptr inbounds %struct.thermo, ptr %1682, i32 0, i32 20
  %1684 = load i32, ptr %1683, align 8, !tbaa !60
  %1685 = sub nsw i32 %1684, 1
  %1686 = sext i32 %1685 to i64
  %1687 = getelementptr inbounds double, ptr %1681, i64 %1686
  %1688 = load double, ptr %1687, align 8, !tbaa !20
  %1689 = fcmp une double %1688, 0.000000e+00
  br i1 %1689, label %1690, label %1708

1690:                                             ; preds = %1678
  call void @llvm.lifetime.start.p0(i64 2048, ptr %76) #6
  %1691 = getelementptr inbounds [2048 x i8], ptr %76, i64 0, i64 0
  %1692 = load ptr, ptr %10, align 8, !tbaa !5
  %1693 = getelementptr inbounds %struct.thermo, ptr %1692, i32 0, i32 22
  %1694 = load ptr, ptr %1693, align 8, !tbaa !63
  %1695 = load ptr, ptr %10, align 8, !tbaa !5
  %1696 = getelementptr inbounds %struct.thermo, ptr %1695, i32 0, i32 20
  %1697 = load i32, ptr %1696, align 8, !tbaa !60
  %1698 = sub nsw i32 %1697, 1
  %1699 = sext i32 %1698 to i64
  %1700 = getelementptr inbounds double, ptr %1694, i64 %1699
  %1701 = load double, ptr %1700, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1691, ptr noundef @.str.181, double noundef %1701)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %77) #6
  %1702 = getelementptr inbounds [2048 x i8], ptr %77, i64 0, i64 0
  %1703 = getelementptr inbounds [2048 x i8], ptr %76, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1702, ptr noundef @.str.10, ptr noundef @.str.182, ptr noundef %1703)
  %1704 = load ptr, ptr %10, align 8, !tbaa !5
  %1705 = getelementptr inbounds %struct.thermo, ptr %1704, i32 0, i32 93
  %1706 = getelementptr inbounds [2048 x i8], ptr %1705, i64 0, i64 0
  %1707 = getelementptr inbounds [2048 x i8], ptr %77, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1706, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2664, ptr noundef %1707)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %77) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %76) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1708:                                             ; preds = %1678
  store i32 0, ptr %22, align 4, !tbaa !14
  br label %1709

1709:                                             ; preds = %1809, %1708
  %1710 = load i32, ptr %22, align 4, !tbaa !14
  %1711 = load ptr, ptr %12, align 8, !tbaa !5
  %1712 = getelementptr inbounds %struct.reionization, ptr %1711, i32 0, i32 20
  %1713 = load i32, ptr %1712, align 8, !tbaa !47
  %1714 = icmp slt i32 %1710, %1713
  br i1 %1714, label %1715, label %1812

1715:                                             ; preds = %1709
  %1716 = load ptr, ptr %10, align 8, !tbaa !5
  %1717 = getelementptr inbounds %struct.thermo, ptr %1716, i32 0, i32 21
  %1718 = load ptr, ptr %1717, align 8, !tbaa !61
  %1719 = load i32, ptr %22, align 4, !tbaa !14
  %1720 = sext i32 %1719 to i64
  %1721 = getelementptr inbounds double, ptr %1718, i64 %1720
  %1722 = load double, ptr %1721, align 8, !tbaa !20
  %1723 = load ptr, ptr %12, align 8, !tbaa !5
  %1724 = getelementptr inbounds %struct.reionization, ptr %1723, i32 0, i32 25
  %1725 = load ptr, ptr %1724, align 8, !tbaa !13
  %1726 = load ptr, ptr %12, align 8, !tbaa !5
  %1727 = getelementptr inbounds %struct.reionization, ptr %1726, i32 0, i32 21
  %1728 = load i32, ptr %1727, align 4, !tbaa !48
  %1729 = load i32, ptr %22, align 4, !tbaa !14
  %1730 = add nsw i32 %1728, %1729
  %1731 = sext i32 %1730 to i64
  %1732 = getelementptr inbounds double, ptr %1725, i64 %1731
  store double %1722, ptr %1732, align 8, !tbaa !20
  %1733 = load ptr, ptr %10, align 8, !tbaa !5
  %1734 = getelementptr inbounds %struct.thermo, ptr %1733, i32 0, i32 22
  %1735 = load ptr, ptr %1734, align 8, !tbaa !63
  %1736 = load i32, ptr %22, align 4, !tbaa !14
  %1737 = sext i32 %1736 to i64
  %1738 = getelementptr inbounds double, ptr %1735, i64 %1737
  %1739 = load double, ptr %1738, align 8, !tbaa !20
  store double %1739, ptr %23, align 8, !tbaa !20
  %1740 = load double, ptr %23, align 8, !tbaa !20
  %1741 = fcmp oge double %1740, 0.000000e+00
  br i1 %1741, label %1742, label %1744

1742:                                             ; preds = %1715
  %1743 = load double, ptr %23, align 8, !tbaa !20
  store double %1743, ptr %24, align 8, !tbaa !20
  br label %1797

1744:                                             ; preds = %1715
  %1745 = load double, ptr %23, align 8, !tbaa !20
  %1746 = fcmp olt double %1745, -9.000000e-01
  br i1 %1746, label %1747, label %1761

1747:                                             ; preds = %1744
  %1748 = load double, ptr %23, align 8, !tbaa !20
  %1749 = fcmp ogt double %1748, -1.100000e+00
  br i1 %1749, label %1750, label %1761

1750:                                             ; preds = %1747
  %1751 = load ptr, ptr %10, align 8, !tbaa !5
  %1752 = getelementptr inbounds %struct.thermo, ptr %1751, i32 0, i32 0
  %1753 = load double, ptr %1752, align 8, !tbaa !18
  %1754 = load ptr, ptr %10, align 8, !tbaa !5
  %1755 = getelementptr inbounds %struct.thermo, ptr %1754, i32 0, i32 0
  %1756 = load double, ptr %1755, align 8, !tbaa !18
  %1757 = fsub double 1.000000e+00, %1756
  %1758 = fmul double 3.971500e+00, %1757
  %1759 = fdiv double %1753, %1758
  %1760 = fadd double 1.000000e+00, %1759
  store double %1760, ptr %24, align 8, !tbaa !20
  br label %1796

1761:                                             ; preds = %1747, %1744
  %1762 = load double, ptr %23, align 8, !tbaa !20
  %1763 = fcmp olt double %1762, -1.900000e+00
  br i1 %1763, label %1764, label %1779

1764:                                             ; preds = %1761
  %1765 = load double, ptr %23, align 8, !tbaa !20
  %1766 = fcmp ogt double %1765, -2.100000e+00
  br i1 %1766, label %1767, label %1779

1767:                                             ; preds = %1764
  %1768 = load ptr, ptr %10, align 8, !tbaa !5
  %1769 = getelementptr inbounds %struct.thermo, ptr %1768, i32 0, i32 0
  %1770 = load double, ptr %1769, align 8, !tbaa !18
  %1771 = fmul double 2.000000e+00, %1770
  %1772 = load ptr, ptr %10, align 8, !tbaa !5
  %1773 = getelementptr inbounds %struct.thermo, ptr %1772, i32 0, i32 0
  %1774 = load double, ptr %1773, align 8, !tbaa !18
  %1775 = fsub double 1.000000e+00, %1774
  %1776 = fmul double 3.971500e+00, %1775
  %1777 = fdiv double %1771, %1776
  %1778 = fadd double 1.000000e+00, %1777
  store double %1778, ptr %24, align 8, !tbaa !20
  br label %1795

1779:                                             ; preds = %1764, %1761
  call void @llvm.lifetime.start.p0(i64 2048, ptr %78) #6
  %1780 = getelementptr inbounds [2048 x i8], ptr %78, i64 0, i64 0
  %1781 = load i32, ptr %22, align 4, !tbaa !14
  %1782 = load ptr, ptr %10, align 8, !tbaa !5
  %1783 = getelementptr inbounds %struct.thermo, ptr %1782, i32 0, i32 22
  %1784 = load ptr, ptr %1783, align 8, !tbaa !63
  %1785 = load i32, ptr %22, align 4, !tbaa !14
  %1786 = sext i32 %1785 to i64
  %1787 = getelementptr inbounds double, ptr %1784, i64 %1786
  %1788 = load double, ptr %1787, align 8, !tbaa !20
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1780, ptr noundef @.str.183, i32 noundef %1781, double noundef %1788)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %79) #6
  %1789 = getelementptr inbounds [2048 x i8], ptr %79, i64 0, i64 0
  %1790 = getelementptr inbounds [2048 x i8], ptr %78, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1789, ptr noundef @.str.139, ptr noundef %1790)
  %1791 = load ptr, ptr %10, align 8, !tbaa !5
  %1792 = getelementptr inbounds %struct.thermo, ptr %1791, i32 0, i32 93
  %1793 = getelementptr inbounds [2048 x i8], ptr %1792, i64 0, i64 0
  %1794 = getelementptr inbounds [2048 x i8], ptr %79, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1793, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2689, ptr noundef %1794)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %79) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  call void @llvm.lifetime.end.p0(i64 2048, ptr %78) #6
  br label %1945

1795:                                             ; preds = %1767
  br label %1796

1796:                                             ; preds = %1795, %1750
  br label %1797

1797:                                             ; preds = %1796, %1742
  %1798 = load double, ptr %24, align 8, !tbaa !20
  %1799 = load ptr, ptr %12, align 8, !tbaa !5
  %1800 = getelementptr inbounds %struct.reionization, ptr %1799, i32 0, i32 25
  %1801 = load ptr, ptr %1800, align 8, !tbaa !13
  %1802 = load ptr, ptr %12, align 8, !tbaa !5
  %1803 = getelementptr inbounds %struct.reionization, ptr %1802, i32 0, i32 22
  %1804 = load i32, ptr %1803, align 8, !tbaa !50
  %1805 = load i32, ptr %22, align 4, !tbaa !14
  %1806 = add nsw i32 %1804, %1805
  %1807 = sext i32 %1806 to i64
  %1808 = getelementptr inbounds double, ptr %1801, i64 %1807
  store double %1798, ptr %1808, align 8, !tbaa !20
  br label %1809

1809:                                             ; preds = %1797
  %1810 = load i32, ptr %22, align 4, !tbaa !14
  %1811 = add nsw i32 %1810, 1
  store i32 %1811, ptr %22, align 4, !tbaa !14
  br label %1709, !llvm.loop !64

1812:                                             ; preds = %1709
  %1813 = load ptr, ptr %12, align 8, !tbaa !5
  %1814 = getelementptr inbounds %struct.reionization, ptr %1813, i32 0, i32 25
  %1815 = load ptr, ptr %1814, align 8, !tbaa !13
  %1816 = load ptr, ptr %12, align 8, !tbaa !5
  %1817 = getelementptr inbounds %struct.reionization, ptr %1816, i32 0, i32 21
  %1818 = load i32, ptr %1817, align 4, !tbaa !48
  %1819 = load ptr, ptr %12, align 8, !tbaa !5
  %1820 = getelementptr inbounds %struct.reionization, ptr %1819, i32 0, i32 20
  %1821 = load i32, ptr %1820, align 8, !tbaa !47
  %1822 = add nsw i32 %1818, %1821
  %1823 = sub nsw i32 %1822, 1
  %1824 = sext i32 %1823 to i64
  %1825 = getelementptr inbounds double, ptr %1815, i64 %1824
  %1826 = load double, ptr %1825, align 8, !tbaa !20
  %1827 = load ptr, ptr %12, align 8, !tbaa !5
  %1828 = getelementptr inbounds %struct.reionization, ptr %1827, i32 0, i32 25
  %1829 = load ptr, ptr %1828, align 8, !tbaa !13
  %1830 = load ptr, ptr %12, align 8, !tbaa !5
  %1831 = getelementptr inbounds %struct.reionization, ptr %1830, i32 0, i32 24
  %1832 = load i32, ptr %1831, align 8, !tbaa !35
  %1833 = sext i32 %1832 to i64
  %1834 = getelementptr inbounds double, ptr %1829, i64 %1833
  store double %1826, ptr %1834, align 8, !tbaa !20
  %1835 = load ptr, ptr %12, align 8, !tbaa !5
  %1836 = getelementptr inbounds %struct.reionization, ptr %1835, i32 0, i32 25
  %1837 = load ptr, ptr %1836, align 8, !tbaa !13
  %1838 = load ptr, ptr %12, align 8, !tbaa !5
  %1839 = getelementptr inbounds %struct.reionization, ptr %1838, i32 0, i32 24
  %1840 = load i32, ptr %1839, align 8, !tbaa !35
  %1841 = sext i32 %1840 to i64
  %1842 = getelementptr inbounds double, ptr %1837, i64 %1841
  %1843 = load double, ptr %1842, align 8, !tbaa !20
  %1844 = load ptr, ptr %8, align 8, !tbaa !5
  %1845 = getelementptr inbounds %struct.precision, ptr %1844, i32 0, i32 44
  %1846 = load double, ptr %1845, align 8, !tbaa !36
  %1847 = fcmp ogt double %1843, %1846
  br i1 %1847, label %1848, label %1868

1848:                                             ; preds = %1812
  call void @llvm.lifetime.start.p0(i64 2048, ptr %80) #6
  %1849 = getelementptr inbounds [2048 x i8], ptr %80, i64 0, i64 0
  %1850 = load ptr, ptr %12, align 8, !tbaa !5
  %1851 = getelementptr inbounds %struct.reionization, ptr %1850, i32 0, i32 25
  %1852 = load ptr, ptr %1851, align 8, !tbaa !13
  %1853 = load ptr, ptr %12, align 8, !tbaa !5
  %1854 = getelementptr inbounds %struct.reionization, ptr %1853, i32 0, i32 24
  %1855 = load i32, ptr %1854, align 8, !tbaa !35
  %1856 = sext i32 %1855 to i64
  %1857 = getelementptr inbounds double, ptr %1852, i64 %1856
  %1858 = load double, ptr %1857, align 8, !tbaa !20
  %1859 = load ptr, ptr %8, align 8, !tbaa !5
  %1860 = getelementptr inbounds %struct.precision, ptr %1859, i32 0, i32 44
  %1861 = load double, ptr %1860, align 8, !tbaa !36
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1849, ptr noundef @.str.167, double noundef %1858, double noundef %1861)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %81) #6
  %1862 = getelementptr inbounds [2048 x i8], ptr %81, i64 0, i64 0
  %1863 = getelementptr inbounds [2048 x i8], ptr %80, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1862, ptr noundef @.str.10, ptr noundef @.str.153, ptr noundef %1863)
  %1864 = load ptr, ptr %10, align 8, !tbaa !5
  %1865 = getelementptr inbounds %struct.thermo, ptr %1864, i32 0, i32 93
  %1866 = getelementptr inbounds [2048 x i8], ptr %1865, i64 0, i64 0
  %1867 = getelementptr inbounds [2048 x i8], ptr %81, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1866, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2703, ptr noundef %1867)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %81) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %80) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1868:                                             ; preds = %1812
  %1869 = load ptr, ptr %8, align 8, !tbaa !5
  %1870 = load ptr, ptr %10, align 8, !tbaa !5
  %1871 = load ptr, ptr %11, align 8, !tbaa !5
  %1872 = load ptr, ptr %12, align 8, !tbaa !5
  %1873 = getelementptr inbounds %struct.reionization, ptr %1872, i32 0, i32 25
  %1874 = load ptr, ptr %1873, align 8, !tbaa !13
  %1875 = load ptr, ptr %12, align 8, !tbaa !5
  %1876 = getelementptr inbounds %struct.reionization, ptr %1875, i32 0, i32 21
  %1877 = load i32, ptr %1876, align 4, !tbaa !48
  %1878 = load ptr, ptr %12, align 8, !tbaa !5
  %1879 = getelementptr inbounds %struct.reionization, ptr %1878, i32 0, i32 20
  %1880 = load i32, ptr %1879, align 8, !tbaa !47
  %1881 = add nsw i32 %1877, %1880
  %1882 = sub nsw i32 %1881, 1
  %1883 = sext i32 %1882 to i64
  %1884 = getelementptr inbounds double, ptr %1874, i64 %1883
  %1885 = load double, ptr %1884, align 8, !tbaa !20
  %1886 = load ptr, ptr %12, align 8, !tbaa !5
  %1887 = getelementptr inbounds %struct.reionization, ptr %1886, i32 0, i32 25
  %1888 = load ptr, ptr %1887, align 8, !tbaa !13
  %1889 = load ptr, ptr %12, align 8, !tbaa !5
  %1890 = getelementptr inbounds %struct.reionization, ptr %1889, i32 0, i32 22
  %1891 = load i32, ptr %1890, align 8, !tbaa !50
  %1892 = load ptr, ptr %12, align 8, !tbaa !5
  %1893 = getelementptr inbounds %struct.reionization, ptr %1892, i32 0, i32 20
  %1894 = load i32, ptr %1893, align 8, !tbaa !47
  %1895 = add nsw i32 %1891, %1894
  %1896 = sub nsw i32 %1895, 1
  %1897 = sext i32 %1896 to i64
  %1898 = getelementptr inbounds double, ptr %1888, i64 %1897
  %1899 = call i32 @thermodynamics_get_xe_before_reionization(ptr noundef %1869, ptr noundef %1870, ptr noundef %1871, double noundef %1885, ptr noundef %1898)
  %1900 = icmp eq i32 %1899, 1
  br i1 %1900, label %1901, label %1910

1901:                                             ; preds = %1868
  call void @llvm.lifetime.start.p0(i64 2048, ptr %82) #6
  %1902 = getelementptr inbounds [2048 x i8], ptr %82, i64 0, i64 0
  %1903 = load ptr, ptr %10, align 8, !tbaa !5
  %1904 = getelementptr inbounds %struct.thermo, ptr %1903, i32 0, i32 93
  %1905 = getelementptr inbounds [2048 x i8], ptr %1904, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1902, ptr noundef @.str, ptr noundef @.str.168, ptr noundef %1905)
  %1906 = load ptr, ptr %10, align 8, !tbaa !5
  %1907 = getelementptr inbounds %struct.thermo, ptr %1906, i32 0, i32 93
  %1908 = getelementptr inbounds [2048 x i8], ptr %1907, i64 0, i64 0
  %1909 = getelementptr inbounds [2048 x i8], ptr %82, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1908, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2712, ptr noundef %1909)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %82) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1910:                                             ; preds = %1868
  %1911 = load ptr, ptr %8, align 8, !tbaa !5
  %1912 = load ptr, ptr %9, align 8, !tbaa !5
  %1913 = load ptr, ptr %10, align 8, !tbaa !5
  %1914 = load ptr, ptr %11, align 8, !tbaa !5
  %1915 = load ptr, ptr %12, align 8, !tbaa !5
  %1916 = load ptr, ptr %13, align 8, !tbaa !5
  %1917 = call i32 @thermodynamics_reionization_sample(ptr noundef %1911, ptr noundef %1912, ptr noundef %1913, ptr noundef %1914, ptr noundef %1915, ptr noundef %1916)
  %1918 = icmp eq i32 %1917, 1
  br i1 %1918, label %1919, label %1928

1919:                                             ; preds = %1910
  call void @llvm.lifetime.start.p0(i64 2048, ptr %83) #6
  %1920 = getelementptr inbounds [2048 x i8], ptr %83, i64 0, i64 0
  %1921 = load ptr, ptr %10, align 8, !tbaa !5
  %1922 = getelementptr inbounds %struct.thermo, ptr %1921, i32 0, i32 93
  %1923 = getelementptr inbounds [2048 x i8], ptr %1922, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1920, ptr noundef @.str, ptr noundef @.str.155, ptr noundef %1923)
  %1924 = load ptr, ptr %10, align 8, !tbaa !5
  %1925 = getelementptr inbounds %struct.thermo, ptr %1924, i32 0, i32 93
  %1926 = getelementptr inbounds [2048 x i8], ptr %1925, i64 0, i64 0
  %1927 = getelementptr inbounds [2048 x i8], ptr %83, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1926, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2717, ptr noundef %1927)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %83) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1928:                                             ; preds = %1910
  %1929 = load ptr, ptr %12, align 8, !tbaa !5
  %1930 = getelementptr inbounds %struct.reionization, ptr %1929, i32 0, i32 11
  %1931 = load double, ptr %1930, align 8, !tbaa !38
  %1932 = load ptr, ptr %10, align 8, !tbaa !5
  %1933 = getelementptr inbounds %struct.thermo, ptr %1932, i32 0, i32 4
  store double %1931, ptr %1933, align 8, !tbaa !39
  store i32 0, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1934:                                             ; preds = %1589
  call void @llvm.lifetime.start.p0(i64 2048, ptr %84) #6
  %1935 = getelementptr inbounds [2048 x i8], ptr %84, i64 0, i64 0
  %1936 = load ptr, ptr %10, align 8, !tbaa !5
  %1937 = getelementptr inbounds %struct.thermo, ptr %1936, i32 0, i32 3
  %1938 = load i32, ptr %1937, align 8, !tbaa !30
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1935, ptr noundef @.str.184, i32 noundef %1938)
  call void @llvm.lifetime.start.p0(i64 2048, ptr %85) #6
  %1939 = getelementptr inbounds [2048 x i8], ptr %85, i64 0, i64 0
  %1940 = getelementptr inbounds [2048 x i8], ptr %84, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1939, ptr noundef @.str.10, ptr noundef @.str.146, ptr noundef %1940)
  %1941 = load ptr, ptr %10, align 8, !tbaa !5
  %1942 = getelementptr inbounds %struct.thermo, ptr %1941, i32 0, i32 93
  %1943 = getelementptr inbounds [2048 x i8], ptr %1942, i64 0, i64 0
  %1944 = getelementptr inbounds [2048 x i8], ptr %85, i64 0, i64 0
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef %1943, ptr noundef @.str.2, ptr noundef @__func__.thermodynamics_reionization, i32 noundef 2727, ptr noundef %1944)
  call void @llvm.lifetime.end.p0(i64 2048, ptr %85) #6
  call void @llvm.lifetime.end.p0(i64 2048, ptr %84) #6
  store i32 1, ptr %7, align 4
  store i32 1, ptr %27, align 4
  br label %1945

1945:                                             ; preds = %1934, %1928, %1919, %1901, %1848, %1779, %1690, %1651, %1614, %1599, %1583, %1574, %1543, %1511, %1412, %1307, %1206, %1174, %1158, %1149, %1102, %999, %831, %799, %785, %764, %735, %714, %680, %562, %544, %526, %475, %441, %423, %389, %269, %250, %231, %98
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 4, 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 8, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #6
  %1946 = load i32, ptr %7, align 4
  ret i32 %1946
}

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

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

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind 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 #4 = { 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 #5 = { 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 #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, !11, i64 120}
!10 = !{!"reionization", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !6, i64 40, !12, i64 48, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68, !11, i64 72, !11, i64 76, !11, i64 80, !11, i64 84, !11, i64 88, !11, i64 92, !11, i64 96, !11, i64 100, !11, i64 104, !6, i64 112, !11, i64 120, !11, i64 124}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!10, !6, i64 112}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !11, i64 12}
!16 = !{!"thermo", !12, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !12, i64 24, !12, i64 32, !17, i64 40, !17, i64 42, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !11, i64 80, !6, i64 88, !6, i64 96, !12, i64 104, !11, i64 112, !6, i64 120, !6, i64 128, !12, i64 136, !11, i64 144, !6, i64 152, !6, i64 160, !12, i64 168, !17, i64 176, !12, i64 184, !12, i64 192, !12, i64 200, !12, i64 208, !12, i64 216, !12, i64 224, !12, i64 232, !12, i64 240, !12, i64 248, !12, i64 256, !12, i64 264, !11, i64 272, !11, i64 276, !11, i64 280, !11, i64 284, !11, i64 288, !11, i64 292, !11, i64 296, !11, i64 300, !11, i64 304, !11, i64 308, !11, i64 312, !11, i64 316, !11, i64 320, !11, i64 324, !11, i64 328, !11, i64 332, !11, i64 336, !11, i64 340, !11, i64 344, !11, i64 348, !11, i64 352, !11, i64 356, !11, i64 360, !11, i64 364, !11, i64 368, !11, i64 372, !11, i64 376, !6, i64 384, !6, i64 392, !6, i64 400, !12, i64 408, !12, i64 416, !12, i64 424, !12, i64 432, !12, i64 440, !12, i64 448, !12, i64 456, !12, i64 464, !12, i64 472, !12, i64 480, !12, i64 488, !12, i64 496, !12, i64 504, !12, i64 512, !12, i64 520, !12, i64 528, !12, i64 536, !12, i64 544, !12, i64 552, !12, i64 560, !12, i64 568, !12, i64 576, !12, i64 584, !12, i64 592, !17, i64 600, !17, i64 602, !17, i64 604, !7, i64 606}
!17 = !{!"short", !7, i64 0}
!18 = !{!16, !12, i64 0}
!19 = !{!10, !11, i64 72}
!20 = !{!12, !12, i64 0}
!21 = !{!16, !12, i64 56}
!22 = !{!10, !11, i64 60}
!23 = !{!16, !12, i64 48}
!24 = !{!10, !11, i64 64}
!25 = !{!10, !11, i64 76}
!26 = !{!16, !12, i64 64}
!27 = !{!10, !11, i64 80}
!28 = !{!16, !12, i64 72}
!29 = !{!10, !11, i64 84}
!30 = !{!16, !11, i64 16}
!31 = !{!16, !12, i64 32}
!32 = !{!10, !11, i64 56}
!33 = !{!34, !12, i64 616}
!34 = !{!"precision", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !12, i64 40, !12, i64 48, !12, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !12, i64 88, !12, i64 96, !7, i64 104, !12, i64 360, !11, i64 368, !12, i64 376, !11, i64 384, !11, i64 388, !12, i64 392, !11, i64 400, !12, i64 408, !11, i64 416, !12, i64 424, !12, i64 432, !12, i64 440, !12, i64 448, !12, i64 456, !12, i64 464, !12, i64 472, !12, i64 480, !12, i64 488, !12, i64 496, !12, i64 504, !12, i64 512, !12, i64 520, !12, i64 528, !12, i64 536, !12, i64 544, !12, i64 552, !12, i64 560, !12, i64 568, !12, i64 576, !12, i64 584, !12, i64 592, !12, i64 600, !12, i64 608, !12, i64 616, !11, i64 624, !7, i64 628, !7, i64 884, !7, i64 1140, !12, i64 1400, !12, i64 1408, !12, i64 1416, !12, i64 1424, !12, i64 1432, !12, i64 1440, !12, i64 1448, !12, i64 1456, !12, i64 1464, !12, i64 1472, !12, i64 1480, !12, i64 1488, !12, i64 1496, !12, i64 1504, !12, i64 1512, !12, i64 1520, !11, i64 1528, !12, i64 1536, !12, i64 1544, !11, i64 1552, !11, i64 1556, !11, i64 1560, !11, i64 1564, !11, i64 1568, !11, i64 1572, !11, i64 1576, !11, i64 1580, !12, i64 1584, !12, i64 1592, !12, i64 1600, !12, i64 1608, !12, i64 1616, !12, i64 1624, !12, i64 1632, !12, i64 1640, !11, i64 1648, !12, i64 1656, !12, i64 1664, !11, i64 1672, !12, i64 1680, !12, i64 1688, !11, i64 1696, !12, i64 1704, !11, i64 1712, !12, i64 1720, !12, i64 1728, !11, i64 1736, !12, i64 1744, !12, i64 1752, !12, i64 1760, !11, i64 1768, !12, i64 1776, !12, i64 1784, !12, i64 1792, !12, i64 1800, !12, i64 1808, !11, i64 1816, !12, i64 1824, !12, i64 1832, !12, i64 1840, !12, i64 1848, !12, i64 1856, !12, i64 1864, !12, i64 1872, !11, i64 1880, !12, i64 1888, !12, i64 1896, !12, i64 1904, !12, i64 1912, !12, i64 1920, !12, i64 1928, !12, i64 1936, !12, i64 1944, !12, i64 1952, !12, i64 1960, !12, i64 1968, !12, i64 1976, !12, i64 1984, !12, i64 1992, !12, i64 2000, !12, i64 2008, !12, i64 2016, !12, i64 2024, !12, i64 2032, !12, i64 2040, !12, i64 2048, !12, i64 2056, !12, i64 2064, !12, i64 2072, !12, i64 2080, !12, i64 2088, !12, i64 2096, !12, i64 2104, !12, i64 2112, !12, i64 2120, !12, i64 2128, !12, i64 2136, !12, i64 2144, !12, i64 2152, !12, i64 2160, !12, i64 2168, !12, i64 2176, !12, i64 2184, !12, i64 2192, !12, i64 2200, !12, i64 2208, !12, i64 2216, !12, i64 2224, !12, i64 2232, !12, i64 2240, !12, i64 2248, !11, i64 2256, !12, i64 2264, !12, i64 2272, !12, i64 2280, !12, i64 2288, !11, i64 2296, !12, i64 2304, !12, i64 2312, !11, i64 2320, !11, i64 2324, !11, i64 2328, !12, i64 2336, !12, i64 2344, !7, i64 2352}
!35 = !{!10, !11, i64 104}
!36 = !{!34, !12, i64 592}
!37 = !{!10, !11, i64 68}
!38 = !{!10, !12, i64 48}
!39 = !{!16, !12, i64 24}
!40 = !{!10, !6, i64 40}
!41 = !{!34, !12, i64 608}
!42 = distinct !{!42, !43}
!43 = !{!"llvm.loop.mustprogress"}
!44 = !{!16, !11, i64 80}
!45 = !{!16, !6, i64 88}
!46 = distinct !{!46, !43}
!47 = !{!10, !11, i64 88}
!48 = !{!10, !11, i64 92}
!49 = !{!16, !6, i64 96}
!50 = !{!10, !11, i64 96}
!51 = distinct !{!51, !43}
!52 = !{!16, !12, i64 104}
!53 = !{!10, !11, i64 100}
!54 = !{!16, !11, i64 112}
!55 = !{!16, !6, i64 120}
!56 = distinct !{!56, !43}
!57 = !{!16, !6, i64 128}
!58 = distinct !{!58, !43}
!59 = !{!16, !12, i64 136}
!60 = !{!16, !11, i64 144}
!61 = !{!16, !6, i64 152}
!62 = distinct !{!62, !43}
!63 = !{!16, !6, i64 160}
!64 = distinct !{!64, !43}


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

@.str = external hidden unnamed_addr constant [18 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [35 x i8], align 1
@.str.139 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.146 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.148 = external hidden unnamed_addr constant [31 x i8], align 1
@__func__.thermodynamics_reionization = external hidden unnamed_addr constant [28 x i8], align 1
@.str.149 = external hidden unnamed_addr constant [62 x i8], align 1
@.str.150 = external hidden unnamed_addr constant [59 x i8], align 1
@.str.151 = external hidden unnamed_addr constant [70 x i8], align 1
@.str.152 = external hidden unnamed_addr constant [68 x i8], align 1
@.str.153 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.154 = external hidden unnamed_addr constant [180 x i8], align 1
@.str.155 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.156 = external hidden unnamed_addr constant [132 x i8], align 1
@.str.157 = external hidden unnamed_addr constant [11 x i8], align 1
@.str.158 = external hidden unnamed_addr constant [69 x i8], align 1
@.str.159 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.160 = external hidden unnamed_addr constant [67 x i8], align 1
@.str.161 = external hidden unnamed_addr constant [86 x i8], align 1
@.str.162 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.163 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.164 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.165 = external hidden unnamed_addr constant [85 x i8], align 1
@.str.166 = external hidden unnamed_addr constant [51 x i8], align 1
@.str.167 = external hidden unnamed_addr constant [137 x i8], align 1
@.str.168 = external hidden unnamed_addr constant [221 x i8], align 1
@.str.169 = external hidden unnamed_addr constant [75 x i8], align 1
@.str.170 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.171 = external hidden unnamed_addr constant [47 x i8], align 1
@.str.172 = external hidden unnamed_addr constant [88 x i8], align 1
@.str.173 = external hidden unnamed_addr constant [57 x i8], align 1
@.str.174 = external hidden unnamed_addr constant [24 x i8], align 1
@.str.175 = external hidden unnamed_addr constant [72 x i8], align 1
@.str.176 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.177 = external hidden unnamed_addr constant [98 x i8], align 1
@.str.178 = external hidden unnamed_addr constant [27 x i8], align 1
@.str.179 = external hidden unnamed_addr constant [93 x i8], align 1
@.str.180 = external hidden unnamed_addr constant [53 x i8], align 1
@.str.181 = external hidden unnamed_addr constant [98 x i8], align 1
@.str.182 = external hidden unnamed_addr constant [48 x i8], align 1
@.str.183 = external hidden unnamed_addr constant [89 x i8], align 1
@.str.184 = external hidden unnamed_addr constant [34 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 nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local range(i32 0, 2) i32 @thermodynamics_reionization(ptr noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5) local_unnamed_addr #5 {
  %7 = alloca [2048 x i8], align 16
  %8 = alloca [2048 x i8], align 16
  %9 = alloca [2048 x i8], align 16
  %10 = alloca [2048 x i8], align 16
  %11 = alloca [2048 x i8], align 16
  %12 = alloca [2048 x i8], align 16
  %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 = getelementptr inbounds i8, ptr %4, i64 120
  %67 = load i32, ptr %66, align 8, !tbaa !5
  %68 = sext i32 %67 to i64
  %69 = shl nsw i64 %68, 3
  %70 = tail call noalias ptr @malloc(i64 noundef %69) #6
  %71 = ptrtoint ptr %70 to i64
  %72 = getelementptr inbounds i8, ptr %4, i64 112
  store ptr %70, ptr %72, align 8, !tbaa !12
  %73 = icmp eq ptr %70, null
  br i1 %73, label %74, label %77

74:                                               ; preds = %6
  %75 = shl i32 %67, 3
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %7) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %7, ptr noundef nonnull @.str.37, ptr noundef nonnull @.str.148, i32 noundef %75) #7
  %76 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %76, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2235, ptr noundef nonnull %7) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %7) #7
  br label %673

77:                                               ; preds = %6
  %78 = getelementptr inbounds i8, ptr %2, i64 12
  %79 = load i32, ptr %78, align 4, !tbaa !13
  switch i32 %79, label %669 [
    i32 1, label %80
    i32 3, label %80
    i32 2, label %303
    i32 4, label %439
    i32 5, label %566
  ]

80:                                               ; preds = %77, %77
  %81 = icmp eq i32 %79, 1
  br i1 %81, label %.thread, label %87

.thread:                                          ; preds = %80
  %82 = load double, ptr %2, align 8, !tbaa !16
  %83 = fsub double 1.000000e+00, %82
  %84 = fmul double %83, 3.971500e+00
  %85 = fdiv double %82, %84
  %86 = fadd double %85, 1.000000e+00
  br label %.sink.split

87:                                               ; preds = %80
  %88 = icmp eq i32 %79, 3
  br i1 %88, label %.sink.split, label %93

.sink.split:                                      ; preds = %87, %.thread
  %.sink = phi double [ %86, %.thread ], [ 1.000000e+00, %87 ]
  %89 = getelementptr inbounds i8, ptr %4, i64 72
  %90 = load i32, ptr %89, align 8, !tbaa !17
  %91 = sext i32 %90 to i64
  %92 = getelementptr inbounds double, ptr %70, i64 %91
  store double %.sink, ptr %92, align 8, !tbaa !18
  br label %93

93:                                               ; preds = %.sink.split, %87
  %94 = getelementptr inbounds i8, ptr %2, i64 56
  %95 = load double, ptr %94, align 8, !tbaa !19
  %96 = getelementptr inbounds i8, ptr %4, i64 60
  %97 = load i32, ptr %96, align 4, !tbaa !20
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds double, ptr %70, i64 %98
  store double %95, ptr %99, align 8, !tbaa !18
  %100 = getelementptr inbounds i8, ptr %2, i64 48
  %101 = load double, ptr %100, align 8, !tbaa !21
  %102 = getelementptr inbounds i8, ptr %4, i64 64
  %103 = load i32, ptr %102, align 8, !tbaa !22
  %104 = sext i32 %103 to i64
  %105 = getelementptr inbounds double, ptr %70, i64 %104
  store double %101, ptr %105, align 8, !tbaa !18
  %106 = load double, ptr %2, align 8, !tbaa !16
  %107 = fsub double 1.000000e+00, %106
  %108 = fmul double %107, 3.971500e+00
  %109 = fdiv double %106, %108
  %110 = getelementptr inbounds i8, ptr %4, i64 76
  %111 = load i32, ptr %110, align 4, !tbaa !23
  %112 = sext i32 %111 to i64
  %113 = getelementptr inbounds double, ptr %70, i64 %112
  store double %109, ptr %113, align 8, !tbaa !18
  %114 = getelementptr inbounds i8, ptr %2, i64 64
  %115 = load double, ptr %114, align 8, !tbaa !24
  %116 = getelementptr inbounds i8, ptr %4, i64 80
  %117 = load i32, ptr %116, align 8, !tbaa !25
  %118 = sext i32 %117 to i64
  %119 = getelementptr inbounds double, ptr %70, i64 %118
  store double %115, ptr %119, align 8, !tbaa !18
  %120 = getelementptr inbounds i8, ptr %2, i64 72
  %121 = load double, ptr %120, align 8, !tbaa !26
  %122 = getelementptr inbounds i8, ptr %4, i64 84
  %123 = load i32, ptr %122, align 4, !tbaa !27
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds double, ptr %70, i64 %124
  store double %121, ptr %125, align 8, !tbaa !18
  %126 = load double, ptr %99, align 8, !tbaa !18
  %127 = fcmp oeq double %126, 0.000000e+00
  br i1 %127, label %128, label %130

128:                                              ; preds = %93
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %8) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %8, ptr noundef nonnull @.str.34) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %9) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %9, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.149, ptr noundef nonnull %8) #7
  %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_reionization, i32 noundef 2258, ptr noundef nonnull %9) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %9) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %8) #7
  br label %673

130:                                              ; preds = %93
  %131 = load double, ptr %105, align 8, !tbaa !18
  %132 = fcmp oeq double %131, 0.000000e+00
  br i1 %132, label %133, label %135

133:                                              ; preds = %130
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %10) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %10, ptr noundef nonnull @.str.34) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %11) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %11, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.150, ptr noundef nonnull %10) #7
  %134 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %134, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2262, ptr noundef nonnull %11) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %11) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %10) #7
  br label %673

135:                                              ; preds = %130
  %136 = fcmp oeq double %121, 0.000000e+00
  br i1 %136, label %137, label %139

137:                                              ; preds = %135
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %12) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %12, ptr noundef nonnull @.str.34) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %13) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %13, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.151, ptr noundef nonnull %12) #7
  %138 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %138, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2266, ptr noundef nonnull %13) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %13) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %12) #7
  br label %673

139:                                              ; preds = %135
  %140 = getelementptr inbounds i8, ptr %2, i64 16
  %141 = load i32, ptr %140, align 8, !tbaa !28
  %142 = icmp eq i32 %141, 0
  br i1 %142, label %143, label %191

143:                                              ; preds = %139
  %144 = getelementptr inbounds i8, ptr %2, i64 32
  %145 = load double, ptr %144, align 8, !tbaa !29
  %146 = getelementptr inbounds i8, ptr %4, i64 56
  %147 = load i32, ptr %146, align 8, !tbaa !30
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds double, ptr %70, i64 %148
  store double %145, ptr %149, align 8, !tbaa !18
  br i1 %81, label %150, label %161

150:                                              ; preds = %143
  %151 = getelementptr inbounds i8, ptr %0, i64 616
  %152 = load double, ptr %151, align 8, !tbaa !31
  %153 = tail call double @llvm.fmuladd.f64(double %152, double %101, double %145)
  %154 = getelementptr inbounds i8, ptr %4, i64 104
  %155 = load i32, ptr %154, align 8, !tbaa !33
  %156 = sext i32 %155 to i64
  %157 = getelementptr inbounds double, ptr %70, i64 %156
  store double %153, ptr %157, align 8, !tbaa !18
  %158 = tail call double @llvm.fmuladd.f64(double %152, double %121, double %115)
  %159 = fcmp olt double %153, %158
  br i1 %159, label %160, label %166

160:                                              ; preds = %150
  store double %158, ptr %157, align 8, !tbaa !18
  br label %166

161:                                              ; preds = %143
  %162 = getelementptr inbounds i8, ptr %4, i64 104
  %163 = load i32, ptr %162, align 8, !tbaa !33
  %164 = sext i32 %163 to i64
  %165 = getelementptr inbounds double, ptr %70, i64 %164
  store double %145, ptr %165, align 8, !tbaa !18
  br label %166

166:                                              ; preds = %150, %160, %161
  %167 = phi double [ %153, %150 ], [ %158, %160 ], [ %145, %161 ]
  %168 = getelementptr inbounds i8, ptr %0, i64 592
  %169 = load double, ptr %168, align 8, !tbaa !34
  %170 = fcmp ogt double %167, %169
  br i1 %170, label %171, label %173

171:                                              ; preds = %166
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %14) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %14, ptr noundef nonnull @.str.152, double noundef %169) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %15) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %15, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.153, ptr noundef nonnull %14) #7
  %172 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %172, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2297, ptr noundef nonnull %15) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %15) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %14) #7
  br label %673

173:                                              ; preds = %166
  %174 = getelementptr inbounds i8, ptr %4, i64 68
  %175 = load i32, ptr %174, align 4, !tbaa !35
  %176 = sext i32 %175 to i64
  %177 = getelementptr inbounds double, ptr %70, i64 %176
  %178 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef nonnull %2, ptr noundef %3, double noundef %167, ptr noundef %177)
  %179 = icmp eq i32 %178, 1
  br i1 %179, label %180, label %182

180:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %16) #7
  %181 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %16, ptr noundef nonnull @.str, ptr noundef nonnull @.str.154, ptr noundef nonnull %181) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %181, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2306, ptr noundef nonnull %16) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %16) #7
  br label %673

182:                                              ; preds = %173
  %183 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %184 = icmp eq i32 %183, 1
  br i1 %184, label %185, label %187

185:                                              ; preds = %182
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %17) #7
  %186 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %17, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %186) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %186, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2311, ptr noundef nonnull %17) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %17) #7
  br label %673

187:                                              ; preds = %182
  %188 = getelementptr inbounds i8, ptr %4, i64 48
  %189 = load double, ptr %188, align 8, !tbaa !36
  %190 = getelementptr inbounds i8, ptr %2, i64 24
  store double %189, ptr %190, align 8, !tbaa !37
  %.pr = load i32, ptr %140, align 8, !tbaa !28
  br label %191

191:                                              ; preds = %187, %139
  %192 = phi i32 [ %.pr, %187 ], [ %141, %139 ]
  %193 = icmp eq i32 %192, 1
  br i1 %193, label %194, label %._crit_edge609

._crit_edge609:                                   ; preds = %191
  %.pre610 = load ptr, ptr %72, align 8, !tbaa !12
  br label %301

194:                                              ; preds = %191
  %195 = getelementptr inbounds i8, ptr %0, i64 592
  %196 = load double, ptr %195, align 8, !tbaa !34
  %197 = getelementptr inbounds i8, ptr %0, i64 616
  %198 = load double, ptr %197, align 8, !tbaa !31
  %199 = load double, ptr %100, align 8, !tbaa !21
  %200 = fneg double %198
  %201 = tail call double @llvm.fmuladd.f64(double %200, double %199, double %196)
  %202 = fcmp olt double %201, 0.000000e+00
  br i1 %202, label %203, label %205

203:                                              ; preds = %194
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %18) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %18, ptr noundef nonnull @.str.156) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %19) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %19, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.157, ptr noundef nonnull %18) #7
  %204 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %204, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2326, ptr noundef nonnull %19) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %19) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %18) #7
  br label %673

205:                                              ; preds = %194
  %206 = load ptr, ptr %72, align 8, !tbaa !12
  %207 = getelementptr inbounds i8, ptr %4, i64 56
  %208 = load i32, ptr %207, align 8, !tbaa !30
  %209 = sext i32 %208 to i64
  %210 = getelementptr inbounds double, ptr %206, i64 %209
  store double %201, ptr %210, align 8, !tbaa !18
  %211 = load double, ptr %195, align 8, !tbaa !34
  %212 = getelementptr inbounds i8, ptr %4, i64 104
  %213 = load i32, ptr %212, align 8, !tbaa !33
  %214 = sext i32 %213 to i64
  %215 = getelementptr inbounds double, ptr %206, i64 %214
  store double %211, ptr %215, align 8, !tbaa !18
  %216 = getelementptr inbounds i8, ptr %4, i64 68
  %217 = load i32, ptr %216, align 4, !tbaa !35
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds double, ptr %206, i64 %218
  %220 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef nonnull %2, ptr noundef %3, double noundef %211, ptr noundef %219)
  %221 = icmp eq i32 %220, 1
  br i1 %221, label %222, label %224

222:                                              ; preds = %205
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %20) #7
  %223 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %20, ptr noundef nonnull @.str, ptr noundef nonnull @.str.154, ptr noundef nonnull %223) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %223, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2339, ptr noundef nonnull %20) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %20) #7
  br label %673

224:                                              ; preds = %205
  %225 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %226 = icmp eq i32 %225, 1
  br i1 %226, label %227, label %229

227:                                              ; preds = %224
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %21) #7
  %228 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %21, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %228) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %228, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2344, ptr noundef nonnull %21) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %21) #7
  br label %673

229:                                              ; preds = %224
  %230 = getelementptr inbounds i8, ptr %4, i64 48
  %231 = load double, ptr %230, align 8, !tbaa !36
  %232 = getelementptr inbounds i8, ptr %2, i64 24
  %233 = load double, ptr %232, align 8, !tbaa !37
  %234 = fcmp olt double %231, %233
  br i1 %234, label %237, label %.preheader

.preheader:                                       ; preds = %229
  %235 = getelementptr inbounds i8, ptr %0, i64 608
  %236 = getelementptr inbounds i8, ptr %4, i64 40
  br label %242

237:                                              ; preds = %229
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %22) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %22, ptr noundef nonnull @.str.158) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %23) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %23, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.159, ptr noundef nonnull %22) #7
  %238 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %238, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2351, ptr noundef nonnull %23) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %23) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %22) #7
  %239 = load ptr, ptr %72, align 8, !tbaa !12
  call void @free(ptr noundef %239) #7
  %240 = getelementptr inbounds i8, ptr %4, i64 40
  %241 = load ptr, ptr %240, align 8, !tbaa !38
  call void @free(ptr noundef %241) #7
  br label %673

242:                                              ; preds = %.preheader, %287
  %243 = phi double [ %289, %287 ], [ %233, %.preheader ]
  %.0485 = phi double [ %..0485, %287 ], [ %201, %.preheader ]
  %.0483 = phi double [ %.0483., %287 ], [ 0.000000e+00, %.preheader ]
  %.0481 = phi double [ %..0481, %287 ], [ %231, %.preheader ]
  %.0480 = phi i32 [ %291, %287 ], [ 0, %.preheader ]
  %.0478 = phi double [ %.0478., %287 ], [ 0.000000e+00, %.preheader ]
  %244 = fsub double %.0481, %.0478
  %245 = load double, ptr %235, align 8, !tbaa !39
  %246 = fmul double %243, %245
  %247 = fcmp ogt double %244, %246
  br i1 %247, label %248, label %294

248:                                              ; preds = %242
  %249 = fadd double %.0485, %.0483
  %250 = fmul double %249, 5.000000e-01
  %251 = load ptr, ptr %72, align 8, !tbaa !12
  %252 = load i32, ptr %207, align 8, !tbaa !30
  %253 = sext i32 %252 to i64
  %254 = getelementptr inbounds double, ptr %251, i64 %253
  store double %250, ptr %254, align 8, !tbaa !18
  %255 = load double, ptr %197, align 8, !tbaa !31
  %256 = load double, ptr %100, align 8, !tbaa !21
  %257 = tail call double @llvm.fmuladd.f64(double %255, double %256, double %250)
  %258 = load i32, ptr %212, align 8, !tbaa !33
  %259 = sext i32 %258 to i64
  %260 = getelementptr inbounds double, ptr %251, i64 %259
  store double %257, ptr %260, align 8, !tbaa !18
  %261 = load double, ptr %114, align 8, !tbaa !24
  %262 = load double, ptr %197, align 8, !tbaa !31
  %263 = load double, ptr %120, align 8, !tbaa !26
  %264 = tail call double @llvm.fmuladd.f64(double %262, double %263, double %261)
  %265 = fcmp olt double %257, %264
  br i1 %265, label %266, label %267

266:                                              ; preds = %248
  store double %264, ptr %260, align 8, !tbaa !18
  br label %267

267:                                              ; preds = %266, %248
  %268 = phi double [ %264, %266 ], [ %257, %248 ]
  %269 = load double, ptr %195, align 8, !tbaa !34
  %270 = fcmp ogt double %268, %269
  br i1 %270, label %271, label %273

271:                                              ; preds = %267
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %24) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %24, ptr noundef nonnull @.str.160, double noundef %269) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %25) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %25, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.153, ptr noundef nonnull %24) #7
  %272 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %272, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2378, ptr noundef nonnull %25) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %25) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %24) #7
  br label %673

273:                                              ; preds = %267
  %274 = load i32, ptr %216, align 4, !tbaa !35
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds double, ptr %251, i64 %275
  %277 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef nonnull %2, ptr noundef %3, double noundef %268, ptr noundef %276)
  %278 = icmp eq i32 %277, 1
  br i1 %278, label %279, label %281

279:                                              ; preds = %273
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %26) #7
  %280 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %26, ptr noundef nonnull @.str, ptr noundef nonnull @.str.154, ptr noundef nonnull %280) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %280, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2387, ptr noundef nonnull %26) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %26) #7
  br label %673

281:                                              ; preds = %273
  %282 = load ptr, ptr %236, align 8, !tbaa !38
  tail call void @free(ptr noundef %282) #7
  %283 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %284 = icmp eq i32 %283, 1
  br i1 %284, label %285, label %287

285:                                              ; preds = %281
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %27) #7
  %286 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %27, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %286) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %286, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2393, ptr noundef nonnull %27) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %27) #7
  br label %673

287:                                              ; preds = %281
  %288 = load double, ptr %230, align 8, !tbaa !36
  %289 = load double, ptr %232, align 8, !tbaa !37
  %290 = fcmp ogt double %288, %289
  %..0485 = select i1 %290, double %250, double %.0485
  %.0483. = select i1 %290, double %.0483, double %250
  %..0481 = select i1 %290, double %288, double %.0481
  %.0478. = select i1 %290, double %.0478, double %288
  %291 = add nuw nsw i32 %.0480, 1
  %exitcond604 = icmp eq i32 %291, 10001
  br i1 %exitcond604, label %292, label %242, !llvm.loop !40

292:                                              ; preds = %287
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %28) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %28, ptr noundef nonnull @.str.161) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %29) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %29, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.162, ptr noundef nonnull %28) #7
  %293 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %293, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2411, ptr noundef nonnull %29) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %29) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %28) #7
  br label %673

294:                                              ; preds = %242
  %295 = load ptr, ptr %72, align 8, !tbaa !12
  %296 = load i32, ptr %207, align 8, !tbaa !30
  %297 = sext i32 %296 to i64
  %298 = getelementptr inbounds double, ptr %295, i64 %297
  %299 = load double, ptr %298, align 8, !tbaa !18
  %300 = getelementptr inbounds i8, ptr %2, i64 32
  store double %299, ptr %300, align 8, !tbaa !29
  br label %301

301:                                              ; preds = %._crit_edge609, %294
  %302 = phi ptr [ %.pre610, %._crit_edge609 ], [ %295, %294 ]
  tail call void @free(ptr noundef %302) #7
  br label %673

303:                                              ; preds = %77
  %304 = getelementptr inbounds i8, ptr %2, i64 80
  %305 = load i32, ptr %304, align 8, !tbaa !42
  %306 = icmp slt i32 %305, 2
  br i1 %306, label %310, label %.preheader506

.preheader506:                                    ; preds = %303
  %307 = getelementptr inbounds i8, ptr %2, i64 88
  %308 = load ptr, ptr %307, align 8, !tbaa !43
  %309 = ptrtoint ptr %308 to i64
  %wide.trip.count597 = zext nneg i32 %305 to i64
  br label %357

310:                                              ; preds = %303
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %30) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %30, ptr noundef nonnull @.str.163) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %31) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %31, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.164, ptr noundef nonnull %30) #7
  %311 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %311, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2433, ptr noundef nonnull %31) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %31) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %30) #7
  br label %673

312:                                              ; preds = %357
  %indvars.iv.next595 = add nuw nsw i64 %indvars.iv594, 1
  %exitcond598.not = icmp eq i64 %indvars.iv.next595, %wide.trip.count597
  br i1 %exitcond598.not, label %.preheader505, label %357, !llvm.loop !44

.preheader505:                                    ; preds = %312
  %313 = getelementptr inbounds i8, ptr %4, i64 88
  %314 = load i32, ptr %313, align 8, !tbaa !45
  %315 = icmp sgt i32 %314, 2
  br i1 %315, label %.lr.ph552, label %.preheader505.._crit_edge553_crit_edge

.preheader505.._crit_edge553_crit_edge:           ; preds = %.preheader505
  %.phi.trans.insert607 = getelementptr inbounds i8, ptr %4, i64 92
  %.pre608 = load i32, ptr %.phi.trans.insert607, align 4, !tbaa !46
  br label %._crit_edge553

.lr.ph552:                                        ; preds = %.preheader505
  %316 = add nsw i32 %314, -1
  %317 = getelementptr inbounds i8, ptr %4, i64 92
  %318 = load i32, ptr %317, align 4, !tbaa !46
  %319 = getelementptr inbounds i8, ptr %2, i64 96
  %320 = load ptr, ptr %319, align 8, !tbaa !47
  %321 = getelementptr inbounds i8, ptr %4, i64 96
  %322 = load i32, ptr %321, align 8, !tbaa !48
  %323 = sext i32 %318 to i64
  %324 = sext i32 %322 to i64
  %wide.trip.count602 = zext nneg i32 %316 to i64
  %invariant.gep637 = getelementptr double, ptr %70, i64 %323
  %invariant.gep639 = getelementptr double, ptr %70, i64 %324
  %325 = add nsw i64 %wide.trip.count602, -1
  %min.iters.check = icmp ult i64 %325, 32
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph552
  %indvars.iv599.ph = phi i64 [ 1, %vector.memcheck ], [ 1, %.lr.ph552 ], [ %ind.end, %middle.block ]
  %326 = and i32 %314, 1
  %lcmp.mod.not = icmp eq i32 %326, 0
  br i1 %lcmp.mod.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %327 = add nsw i64 %indvars.iv599.ph, -1
  %328 = getelementptr inbounds double, ptr %308, i64 %327
  %329 = load double, ptr %328, align 8, !tbaa !18
  %gep638.prol = getelementptr double, ptr %invariant.gep637, i64 %indvars.iv599.ph
  store double %329, ptr %gep638.prol, align 8, !tbaa !18
  %330 = getelementptr inbounds double, ptr %320, i64 %327
  %331 = load double, ptr %330, align 8, !tbaa !18
  %gep640.prol = getelementptr double, ptr %invariant.gep639, i64 %indvars.iv599.ph
  store double %331, ptr %gep640.prol, align 8, !tbaa !18
  %indvars.iv.next600.prol = add nuw nsw i64 %indvars.iv599.ph, 1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv599.unr = phi i64 [ %indvars.iv599.ph, %scalar.ph.preheader ], [ %indvars.iv.next600.prol, %scalar.ph.prol ]
  %332 = add nsw i64 %wide.trip.count602, -1
  %333 = icmp eq i64 %indvars.iv599.ph, %332
  br i1 %333, label %._crit_edge553, label %scalar.ph

vector.memcheck:                                  ; preds = %.lr.ph552
  %334 = ptrtoint ptr %320 to i64
  %335 = shl nsw i64 %324, 3
  %336 = add i64 %335, %71
  %337 = add i64 %336, 8
  %338 = sub i64 %337, %309
  %diff.check = icmp ult i64 %338, 32
  %339 = sub i64 %337, %334
  %diff.check667 = icmp ult i64 %339, 32
  %conflict.rdx = or i1 %diff.check, %diff.check667
  %340 = shl nsw i64 %323, 3
  %341 = add i64 %340, %71
  %342 = add i64 %341, 8
  %343 = sub i64 %342, %309
  %diff.check668 = icmp ult i64 %343, 32
  %conflict.rdx669 = or i1 %conflict.rdx, %diff.check668
  %344 = add i64 %334, -8
  %345 = add i64 %340, %71
  %346 = sub i64 %344, %345
  %diff.check670 = icmp ult i64 %346, 32
  %conflict.rdx671 = or i1 %conflict.rdx669, %diff.check670
  %347 = sub nsw i64 %335, %340
  %diff.check672 = icmp ult i64 %347, 32
  %conflict.rdx673 = or i1 %conflict.rdx671, %diff.check672
  br i1 %conflict.rdx673, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %325, -4
  %ind.end = or disjoint i64 %n.vec, 1
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = or disjoint i64 %index, 1
  %348 = getelementptr inbounds double, ptr %308, i64 %index
  %349 = getelementptr inbounds i8, ptr %348, i64 16
  %wide.load = load <2 x double>, ptr %348, align 8, !tbaa !18
  %wide.load674 = load <2 x double>, ptr %349, align 8, !tbaa !18
  %350 = getelementptr double, ptr %invariant.gep637, i64 %offset.idx
  %351 = getelementptr i8, ptr %350, i64 16
  store <2 x double> %wide.load, ptr %350, align 8, !tbaa !18
  store <2 x double> %wide.load674, ptr %351, align 8, !tbaa !18
  %352 = getelementptr inbounds double, ptr %320, i64 %index
  %353 = getelementptr inbounds i8, ptr %352, i64 16
  %wide.load675 = load <2 x double>, ptr %352, align 8, !tbaa !18
  %wide.load676 = load <2 x double>, ptr %353, align 8, !tbaa !18
  %354 = getelementptr double, ptr %invariant.gep639, i64 %offset.idx
  %355 = getelementptr i8, ptr %354, i64 16
  store <2 x double> %wide.load675, ptr %354, align 8, !tbaa !18
  store <2 x double> %wide.load676, ptr %355, align 8, !tbaa !18
  %index.next = add nuw i64 %index, 4
  %356 = icmp eq i64 %index.next, %n.vec
  br i1 %356, label %middle.block, label %vector.body, !llvm.loop !49

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %325, %n.vec
  br i1 %cmp.n, label %._crit_edge553, label %scalar.ph.preheader

357:                                              ; preds = %.preheader506, %312
  %indvars.iv594 = phi i64 [ 1, %.preheader506 ], [ %indvars.iv.next595, %312 ]
  %358 = getelementptr double, ptr %308, i64 %indvars.iv594
  %359 = getelementptr i8, ptr %358, i64 -8
  %360 = load double, ptr %359, align 8, !tbaa !18
  %361 = load double, ptr %358, align 8, !tbaa !18
  %362 = fcmp ult double %360, %361
  br i1 %362, label %312, label %363

363:                                              ; preds = %357
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %32) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %32, ptr noundef nonnull @.str.165, double noundef %360, double noundef %361) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %33) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %33, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.166, ptr noundef nonnull %32) #7
  %364 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %364, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2441, ptr noundef nonnull %33) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %33) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %32) #7
  br label %673

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv599 = phi i64 [ %indvars.iv.next600.1, %scalar.ph ], [ %indvars.iv599.unr, %scalar.ph.prol.loopexit ]
  %365 = add nsw i64 %indvars.iv599, -1
  %366 = getelementptr inbounds double, ptr %308, i64 %365
  %367 = load double, ptr %366, align 8, !tbaa !18
  %gep638 = getelementptr double, ptr %invariant.gep637, i64 %indvars.iv599
  store double %367, ptr %gep638, align 8, !tbaa !18
  %368 = getelementptr inbounds double, ptr %320, i64 %365
  %369 = load double, ptr %368, align 8, !tbaa !18
  %gep640 = getelementptr double, ptr %invariant.gep639, i64 %indvars.iv599
  store double %369, ptr %gep640, align 8, !tbaa !18
  %indvars.iv.next600 = add nuw nsw i64 %indvars.iv599, 1
  %370 = getelementptr inbounds double, ptr %308, i64 %indvars.iv599
  %371 = load double, ptr %370, align 8, !tbaa !18
  %gep638.1 = getelementptr double, ptr %invariant.gep637, i64 %indvars.iv.next600
  store double %371, ptr %gep638.1, align 8, !tbaa !18
  %372 = getelementptr inbounds double, ptr %320, i64 %indvars.iv599
  %373 = load double, ptr %372, align 8, !tbaa !18
  %gep640.1 = getelementptr double, ptr %invariant.gep639, i64 %indvars.iv.next600
  store double %373, ptr %gep640.1, align 8, !tbaa !18
  %indvars.iv.next600.1 = add nuw nsw i64 %indvars.iv599, 2
  %exitcond603.not.1 = icmp eq i64 %indvars.iv.next600.1, %wide.trip.count602
  br i1 %exitcond603.not.1, label %._crit_edge553, label %scalar.ph, !llvm.loop !52

._crit_edge553:                                   ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block, %.preheader505.._crit_edge553_crit_edge
  %374 = phi i32 [ %.pre608, %.preheader505.._crit_edge553_crit_edge ], [ %318, %middle.block ], [ %318, %scalar.ph ], [ %318, %scalar.ph.prol.loopexit ]
  %375 = add nsw i32 %374, %314
  %376 = sext i32 %375 to i64
  %377 = getelementptr double, ptr %70, i64 %376
  %378 = getelementptr i8, ptr %377, i64 -16
  %379 = load double, ptr %378, align 8, !tbaa !18
  %380 = getelementptr i8, ptr %377, i64 -24
  %381 = load double, ptr %380, align 8, !tbaa !18
  %382 = fsub double %379, %381
  %383 = tail call double @llvm.fmuladd.f64(double %382, double 2.000000e+00, double %379)
  %384 = getelementptr i8, ptr %377, i64 -8
  store double %383, ptr %384, align 8, !tbaa !18
  %385 = getelementptr inbounds i8, ptr %4, i64 104
  %386 = load i32, ptr %385, align 8, !tbaa !33
  %387 = sext i32 %386 to i64
  %388 = getelementptr inbounds double, ptr %70, i64 %387
  store double %383, ptr %388, align 8, !tbaa !18
  %389 = getelementptr inbounds i8, ptr %0, i64 592
  %390 = load double, ptr %389, align 8, !tbaa !34
  %391 = fcmp ogt double %383, %390
  br i1 %391, label %392, label %394

392:                                              ; preds = %._crit_edge553
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %34) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %34, ptr noundef nonnull @.str.167, double noundef %383, double noundef %390) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %35) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %35, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.153, ptr noundef nonnull %34) #7
  %393 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %393, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2470, ptr noundef nonnull %35) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %35) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %34) #7
  br label %673

394:                                              ; preds = %._crit_edge553
  %395 = sext i32 %374 to i64
  %396 = getelementptr double, ptr %70, i64 %395
  %397 = getelementptr i8, ptr %396, i64 8
  %398 = load double, ptr %397, align 8, !tbaa !18
  %399 = getelementptr i8, ptr %396, i64 16
  %400 = load double, ptr %399, align 8, !tbaa !18
  %401 = fneg double %400
  %402 = tail call double @llvm.fmuladd.f64(double %398, double 2.000000e+00, double %401)
  %403 = fcmp olt double %402, 0.000000e+00
  %storemerge504 = select i1 %403, double 0.000000e+00, double %402
  store double %storemerge504, ptr %396, align 8, !tbaa !18
  %404 = load double, ptr %384, align 8, !tbaa !18
  %405 = getelementptr inbounds i8, ptr %4, i64 96
  %406 = load i32, ptr %405, align 8, !tbaa !48
  %407 = add nsw i32 %406, %314
  %408 = sext i32 %407 to i64
  %409 = getelementptr double, ptr %70, i64 %408
  %410 = getelementptr i8, ptr %409, i64 -8
  %411 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef nonnull %2, ptr noundef %3, double noundef %404, ptr noundef %410)
  %412 = icmp eq i32 %411, 1
  br i1 %412, label %413, label %415

413:                                              ; preds = %394
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %36) #7
  %414 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %36, ptr noundef nonnull @.str, ptr noundef nonnull @.str.168, ptr noundef nonnull %414) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %414, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2498, ptr noundef nonnull %36) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %36) #7
  br label %673

415:                                              ; preds = %394
  %416 = load double, ptr %2, align 8, !tbaa !16
  %417 = fsub double 1.000000e+00, %416
  %418 = fmul double %417, 3.971500e+00
  %419 = fdiv double %416, %418
  %420 = fadd double %419, 1.000000e+00
  %421 = load ptr, ptr %72, align 8, !tbaa !12
  %422 = load i32, ptr %405, align 8, !tbaa !48
  %423 = sext i32 %422 to i64
  %424 = getelementptr inbounds double, ptr %421, i64 %423
  store double %420, ptr %424, align 8, !tbaa !18
  %425 = getelementptr inbounds i8, ptr %2, i64 104
  %426 = load double, ptr %425, align 8, !tbaa !53
  %427 = getelementptr inbounds i8, ptr %4, i64 100
  %428 = load i32, ptr %427, align 4, !tbaa !54
  %429 = sext i32 %428 to i64
  %430 = getelementptr inbounds double, ptr %421, i64 %429
  store double %426, ptr %430, align 8, !tbaa !18
  %431 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %432 = icmp eq i32 %431, 1
  br i1 %432, label %433, label %435

433:                                              ; preds = %415
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %37) #7
  %434 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %37, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %434) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %434, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2509, ptr noundef nonnull %37) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %37) #7
  br label %673

435:                                              ; preds = %415
  %436 = getelementptr inbounds i8, ptr %4, i64 48
  %437 = load double, ptr %436, align 8, !tbaa !36
  %438 = getelementptr inbounds i8, ptr %2, i64 24
  store double %437, ptr %438, align 8, !tbaa !37
  br label %673

439:                                              ; preds = %77
  %440 = getelementptr inbounds i8, ptr %2, i64 112
  %441 = load i32, ptr %440, align 8, !tbaa !55
  %442 = icmp slt i32 %441, 1
  br i1 %442, label %445, label %.preheader508

.preheader508:                                    ; preds = %439
  %.not555 = icmp eq i32 %441, 1
  br i1 %.not555, label %.preheader507, label %.lr.ph540

.lr.ph540:                                        ; preds = %.preheader508
  %443 = getelementptr inbounds i8, ptr %2, i64 120
  %444 = load ptr, ptr %443, align 8, !tbaa !56
  %wide.trip.count587 = zext nneg i32 %441 to i64
  br label %460

445:                                              ; preds = %439
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %38) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %38, ptr noundef nonnull @.str.169) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %39) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %39, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.170, ptr noundef nonnull %38) #7
  %446 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %446, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2524, ptr noundef nonnull %39) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %39) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %38) #7
  br label %673

447:                                              ; preds = %460
  %indvars.iv.next585 = add nuw nsw i64 %indvars.iv584, 1
  %exitcond588.not = icmp eq i64 %indvars.iv.next585, %wide.trip.count587
  br i1 %exitcond588.not, label %.preheader507, label %460, !llvm.loop !57

.preheader507:                                    ; preds = %447, %.preheader508
  %448 = getelementptr inbounds i8, ptr %4, i64 88
  %449 = load i32, ptr %448, align 8, !tbaa !45
  %450 = icmp sgt i32 %449, 2
  br i1 %450, label %.lr.ph544, label %.preheader507.._crit_edge545_crit_edge

.preheader507.._crit_edge545_crit_edge:           ; preds = %.preheader507
  %.phi.trans.insert605 = getelementptr inbounds i8, ptr %4, i64 92
  %.pre606 = load i32, ptr %.phi.trans.insert605, align 4, !tbaa !46
  br label %._crit_edge545

.lr.ph544:                                        ; preds = %.preheader507
  %451 = add nsw i32 %449, -1
  %452 = getelementptr inbounds i8, ptr %2, i64 120
  %453 = load ptr, ptr %452, align 8, !tbaa !56
  %454 = getelementptr inbounds i8, ptr %4, i64 92
  %455 = load i32, ptr %454, align 4, !tbaa !46
  %456 = getelementptr inbounds i8, ptr %2, i64 128
  %457 = load ptr, ptr %456, align 8, !tbaa !58
  %458 = getelementptr inbounds i8, ptr %4, i64 96
  %459 = sext i32 %455 to i64
  %wide.trip.count592 = zext nneg i32 %451 to i64
  %invariant.gep635 = getelementptr double, ptr %70, i64 %459
  br label %468

460:                                              ; preds = %.lr.ph540, %447
  %indvars.iv584 = phi i64 [ 1, %.lr.ph540 ], [ %indvars.iv.next585, %447 ]
  %461 = getelementptr double, ptr %444, i64 %indvars.iv584
  %462 = getelementptr i8, ptr %461, i64 -8
  %463 = load double, ptr %462, align 8, !tbaa !18
  %464 = load double, ptr %461, align 8, !tbaa !18
  %465 = fcmp ult double %463, %464
  br i1 %465, label %447, label %466

466:                                              ; preds = %460
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %40) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %40, ptr noundef nonnull @.str.165, double noundef %463, double noundef %464) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %41) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %41, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.171, ptr noundef nonnull %40) #7
  %467 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %467, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2532, ptr noundef nonnull %41) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %41) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %40) #7
  br label %673

468:                                              ; preds = %.lr.ph544, %497
  %indvars.iv589 = phi i64 [ 1, %.lr.ph544 ], [ %indvars.iv.next590, %497 ]
  %469 = add nsw i64 %indvars.iv589, -1
  %470 = getelementptr inbounds double, ptr %453, i64 %469
  %471 = load double, ptr %470, align 8, !tbaa !18
  %gep636 = getelementptr double, ptr %invariant.gep635, i64 %indvars.iv589
  store double %471, ptr %gep636, align 8, !tbaa !18
  %472 = getelementptr inbounds double, ptr %457, i64 %469
  %473 = load double, ptr %472, align 8, !tbaa !18
  %474 = fcmp ult double %473, 0.000000e+00
  br i1 %474, label %475, label %497

475:                                              ; preds = %468
  %476 = fcmp olt double %473, -9.000000e-01
  %477 = fcmp ogt double %473, -1.100000e+00
  %or.cond = and i1 %476, %477
  br i1 %or.cond, label %478, label %484

478:                                              ; preds = %475
  %479 = load double, ptr %2, align 8, !tbaa !16
  %480 = fsub double 1.000000e+00, %479
  %481 = fmul double %480, 3.971500e+00
  %482 = fdiv double %479, %481
  %483 = fadd double %482, 1.000000e+00
  br label %497

484:                                              ; preds = %475
  %485 = fcmp olt double %473, -1.900000e+00
  %486 = fcmp ogt double %473, -2.100000e+00
  %or.cond3 = and i1 %485, %486
  br i1 %or.cond3, label %487, label %494

487:                                              ; preds = %484
  %488 = load double, ptr %2, align 8, !tbaa !16
  %489 = fmul double %488, 2.000000e+00
  %490 = fsub double 1.000000e+00, %488
  %491 = fmul double %490, 3.971500e+00
  %492 = fdiv double %489, %491
  %493 = fadd double %492, 1.000000e+00
  br label %497

494:                                              ; preds = %484
  %495 = trunc nuw nsw i64 %469 to i32
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %42) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %42, ptr noundef nonnull @.str.172, i32 noundef %495, double noundef %473) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %43) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %43, ptr noundef nonnull @.str.139, ptr noundef nonnull %42) #7
  %496 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %496, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2560, ptr noundef nonnull %43) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %43) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %42) #7
  br label %673

497:                                              ; preds = %468, %478, %487
  %.0473 = phi double [ %483, %478 ], [ %493, %487 ], [ %473, %468 ]
  %498 = load i32, ptr %458, align 8, !tbaa !48
  %499 = sext i32 %498 to i64
  %500 = getelementptr double, ptr %70, i64 %indvars.iv589
  %501 = getelementptr double, ptr %500, i64 %499
  store double %.0473, ptr %501, align 8, !tbaa !18
  %indvars.iv.next590 = add nuw nsw i64 %indvars.iv589, 1
  %exitcond593.not = icmp eq i64 %indvars.iv.next590, %wide.trip.count592
  br i1 %exitcond593.not, label %._crit_edge545, label %468, !llvm.loop !59

._crit_edge545:                                   ; preds = %497, %.preheader507.._crit_edge545_crit_edge
  %502 = phi i32 [ %.pre606, %.preheader507.._crit_edge545_crit_edge ], [ %455, %497 ]
  %503 = add nsw i32 %502, %449
  %504 = sext i32 %503 to i64
  %505 = getelementptr double, ptr %70, i64 %504
  %506 = getelementptr i8, ptr %505, i64 -16
  %507 = load double, ptr %506, align 8, !tbaa !18
  %508 = getelementptr inbounds i8, ptr %0, i64 616
  %509 = load double, ptr %508, align 8, !tbaa !31
  %510 = getelementptr inbounds i8, ptr %2, i64 136
  %511 = load double, ptr %510, align 8, !tbaa !60
  %512 = tail call double @llvm.fmuladd.f64(double %509, double %511, double %507)
  %513 = getelementptr i8, ptr %505, i64 -8
  store double %512, ptr %513, align 8, !tbaa !18
  %514 = getelementptr inbounds i8, ptr %4, i64 104
  %515 = load i32, ptr %514, align 8, !tbaa !33
  %516 = sext i32 %515 to i64
  %517 = getelementptr inbounds double, ptr %70, i64 %516
  store double %512, ptr %517, align 8, !tbaa !18
  %518 = getelementptr inbounds i8, ptr %0, i64 592
  %519 = load double, ptr %518, align 8, !tbaa !34
  %520 = fcmp ogt double %512, %519
  br i1 %520, label %521, label %523

521:                                              ; preds = %._crit_edge545
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %44) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %44, ptr noundef nonnull @.str.167, double noundef %512, double noundef %519) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %45) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %45, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.153, ptr noundef nonnull %44) #7
  %522 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %522, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2580, ptr noundef nonnull %45) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %45) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %44) #7
  br label %673

523:                                              ; preds = %._crit_edge545
  %524 = sext i32 %502 to i64
  %525 = getelementptr double, ptr %70, i64 %524
  %526 = getelementptr i8, ptr %525, i64 8
  %527 = load double, ptr %526, align 8, !tbaa !18
  %528 = fneg double %509
  %529 = tail call double @llvm.fmuladd.f64(double %528, double %511, double %527)
  %530 = fcmp olt double %529, 0.000000e+00
  %storemerge = select i1 %530, double 0.000000e+00, double %529
  store double %storemerge, ptr %525, align 8, !tbaa !18
  %531 = load double, ptr %513, align 8, !tbaa !18
  %532 = getelementptr inbounds i8, ptr %4, i64 96
  %533 = load i32, ptr %532, align 8, !tbaa !48
  %534 = add nsw i32 %533, %449
  %535 = sext i32 %534 to i64
  %536 = getelementptr double, ptr %70, i64 %535
  %537 = getelementptr i8, ptr %536, i64 -8
  %538 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef nonnull %2, ptr noundef %3, double noundef %531, ptr noundef %537)
  %539 = icmp eq i32 %538, 1
  br i1 %539, label %540, label %542

540:                                              ; preds = %523
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %46) #7
  %541 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %46, ptr noundef nonnull @.str, ptr noundef nonnull @.str.168, ptr noundef nonnull %541) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %541, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2600, ptr noundef nonnull %46) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %46) #7
  br label %673

542:                                              ; preds = %523
  %543 = load ptr, ptr %72, align 8, !tbaa !12
  %544 = load i32, ptr %532, align 8, !tbaa !48
  %545 = sext i32 %544 to i64
  %546 = getelementptr double, ptr %543, i64 %545
  %547 = getelementptr i8, ptr %546, i64 8
  %548 = load double, ptr %547, align 8, !tbaa !18
  store double %548, ptr %546, align 8, !tbaa !18
  %549 = load double, ptr %510, align 8, !tbaa !60
  %550 = fcmp ugt double %549, 0.000000e+00
  br i1 %550, label %553, label %551

551:                                              ; preds = %542
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %47) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %47, ptr noundef nonnull @.str.173, double noundef %549) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %48) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %48, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.174, ptr noundef nonnull %47) #7
  %552 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %552, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2619, ptr noundef nonnull %48) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %48) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %47) #7
  br label %673

553:                                              ; preds = %542
  %554 = getelementptr inbounds i8, ptr %4, i64 100
  %555 = load i32, ptr %554, align 4, !tbaa !54
  %556 = sext i32 %555 to i64
  %557 = getelementptr inbounds double, ptr %543, i64 %556
  store double %549, ptr %557, align 8, !tbaa !18
  %558 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef nonnull %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %559 = icmp eq i32 %558, 1
  br i1 %559, label %560, label %562

560:                                              ; preds = %553
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %49) #7
  %561 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %49, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %561) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %561, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2626, ptr noundef nonnull %49) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %49) #7
  br label %673

562:                                              ; preds = %553
  %563 = getelementptr inbounds i8, ptr %4, i64 48
  %564 = load double, ptr %563, align 8, !tbaa !36
  %565 = getelementptr inbounds i8, ptr %2, i64 24
  store double %564, ptr %565, align 8, !tbaa !37
  br label %673

566:                                              ; preds = %77
  %567 = getelementptr inbounds i8, ptr %2, i64 144
  %568 = load i32, ptr %567, align 8, !tbaa !61
  %569 = icmp slt i32 %568, 1
  br i1 %569, label %570, label %572

570:                                              ; preds = %566
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %50) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %50, ptr noundef nonnull @.str.175) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %51) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %51, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.176, ptr noundef nonnull %50) #7
  %571 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %571, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2641, ptr noundef nonnull %51) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %51) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %50) #7
  br label %673

572:                                              ; preds = %566
  %573 = getelementptr inbounds i8, ptr %2, i64 152
  %574 = load ptr, ptr %573, align 8, !tbaa !62
  %575 = load double, ptr %574, align 8, !tbaa !18
  %576 = fcmp une double %575, 0.000000e+00
  br i1 %576, label %577, label %.preheader510

.preheader510:                                    ; preds = %572
  %.not = icmp eq i32 %568, 1
  br i1 %.not, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %.preheader510
  %wide.trip.count = zext nneg i32 %568 to i64
  br label %.lr.ph

577:                                              ; preds = %572
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %52) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %52, ptr noundef nonnull @.str.177, double noundef %575) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %53) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %53, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.178, ptr noundef nonnull %52) #7
  %578 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %578, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2647, ptr noundef nonnull %53) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %53) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %52) #7
  br label %673

579:                                              ; preds = %.lr.ph
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !63

.lr.ph:                                           ; preds = %.lr.ph.preheader, %579
  %indvars.iv = phi i64 [ 1, %.lr.ph.preheader ], [ %indvars.iv.next, %579 ]
  %580 = getelementptr double, ptr %574, i64 %indvars.iv
  %581 = getelementptr i8, ptr %580, i64 -8
  %582 = load double, ptr %581, align 8, !tbaa !18
  %583 = load double, ptr %580, align 8, !tbaa !18
  %584 = fcmp ult double %582, %583
  br i1 %584, label %579, label %585

585:                                              ; preds = %.lr.ph
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %54) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %54, ptr noundef nonnull @.str.179, double noundef %582, double noundef %583) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %55) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %55, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.180, ptr noundef nonnull %54) #7
  %586 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %586, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2655, ptr noundef nonnull %55) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %55) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %54) #7
  br label %673

._crit_edge:                                      ; preds = %579, %.preheader510
  %.pre-phi612 = phi i64 [ 1, %.preheader510 ], [ %wide.trip.count, %579 ]
  %587 = getelementptr inbounds i8, ptr %2, i64 160
  %588 = load ptr, ptr %587, align 8, !tbaa !64
  %589 = getelementptr double, ptr %588, i64 %.pre-phi612
  %590 = getelementptr i8, ptr %589, i64 -8
  %591 = load double, ptr %590, align 8, !tbaa !18
  %592 = fcmp une double %591, 0.000000e+00
  br i1 %592, label %600, label %.preheader509

.preheader509:                                    ; preds = %._crit_edge
  %593 = getelementptr inbounds i8, ptr %4, i64 88
  %594 = load i32, ptr %593, align 8, !tbaa !45
  %595 = icmp sgt i32 %594, 0
  %596 = getelementptr inbounds i8, ptr %4, i64 92
  %597 = load i32, ptr %596, align 4, !tbaa !46
  br i1 %595, label %.lr.ph534, label %._crit_edge535

.lr.ph534:                                        ; preds = %.preheader509
  %598 = getelementptr inbounds i8, ptr %4, i64 96
  %599 = sext i32 %597 to i64
  %wide.trip.count582 = zext nneg i32 %594 to i64
  %invariant.gep = getelementptr double, ptr %70, i64 %599
  br label %602

600:                                              ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %56) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %56, ptr noundef nonnull @.str.181, double noundef %591) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %57) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %57, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.182, ptr noundef nonnull %56) #7
  %601 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %601, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2664, ptr noundef nonnull %57) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %57) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %56) #7
  br label %673

602:                                              ; preds = %.lr.ph534, %630
  %indvars.iv579 = phi i64 [ 0, %.lr.ph534 ], [ %indvars.iv.next580, %630 ]
  %603 = getelementptr inbounds double, ptr %574, i64 %indvars.iv579
  %604 = load double, ptr %603, align 8, !tbaa !18
  %gep = getelementptr double, ptr %invariant.gep, i64 %indvars.iv579
  store double %604, ptr %gep, align 8, !tbaa !18
  %605 = getelementptr inbounds double, ptr %588, i64 %indvars.iv579
  %606 = load double, ptr %605, align 8, !tbaa !18
  %607 = fcmp ult double %606, 0.000000e+00
  br i1 %607, label %608, label %630

608:                                              ; preds = %602
  %609 = fcmp olt double %606, -9.000000e-01
  %610 = fcmp ogt double %606, -1.100000e+00
  %or.cond5 = and i1 %609, %610
  br i1 %or.cond5, label %611, label %617

611:                                              ; preds = %608
  %612 = load double, ptr %2, align 8, !tbaa !16
  %613 = fsub double 1.000000e+00, %612
  %614 = fmul double %613, 3.971500e+00
  %615 = fdiv double %612, %614
  %616 = fadd double %615, 1.000000e+00
  br label %630

617:                                              ; preds = %608
  %618 = fcmp olt double %606, -1.900000e+00
  %619 = fcmp ogt double %606, -2.100000e+00
  %or.cond7 = and i1 %618, %619
  br i1 %or.cond7, label %620, label %627

620:                                              ; preds = %617
  %621 = load double, ptr %2, align 8, !tbaa !16
  %622 = fmul double %621, 2.000000e+00
  %623 = fsub double 1.000000e+00, %621
  %624 = fmul double %623, 3.971500e+00
  %625 = fdiv double %622, %624
  %626 = fadd double %625, 1.000000e+00
  br label %630

627:                                              ; preds = %617
  %628 = trunc nuw nsw i64 %indvars.iv579 to i32
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %58) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %58, ptr noundef nonnull @.str.183, i32 noundef %628, double noundef %606) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %59) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %59, ptr noundef nonnull @.str.139, ptr noundef nonnull %58) #7
  %629 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %629, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2689, ptr noundef nonnull %59) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %59) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %58) #7
  br label %673

630:                                              ; preds = %602, %611, %620
  %.1 = phi double [ %616, %611 ], [ %626, %620 ], [ %606, %602 ]
  %631 = load i32, ptr %598, align 8, !tbaa !48
  %632 = sext i32 %631 to i64
  %633 = getelementptr double, ptr %70, i64 %indvars.iv579
  %634 = getelementptr double, ptr %633, i64 %632
  store double %.1, ptr %634, align 8, !tbaa !18
  %indvars.iv.next580 = add nuw nsw i64 %indvars.iv579, 1
  %exitcond583.not = icmp eq i64 %indvars.iv.next580, %wide.trip.count582
  br i1 %exitcond583.not, label %._crit_edge535, label %602, !llvm.loop !65

._crit_edge535:                                   ; preds = %630, %.preheader509
  %635 = add nsw i32 %597, %594
  %636 = sext i32 %635 to i64
  %637 = getelementptr double, ptr %70, i64 %636
  %638 = getelementptr i8, ptr %637, i64 -8
  %639 = load double, ptr %638, align 8, !tbaa !18
  %640 = getelementptr inbounds i8, ptr %4, i64 104
  %641 = load i32, ptr %640, align 8, !tbaa !33
  %642 = sext i32 %641 to i64
  %643 = getelementptr inbounds double, ptr %70, i64 %642
  store double %639, ptr %643, align 8, !tbaa !18
  %644 = getelementptr inbounds i8, ptr %0, i64 592
  %645 = load double, ptr %644, align 8, !tbaa !34
  %646 = fcmp ogt double %639, %645
  br i1 %646, label %647, label %649

647:                                              ; preds = %._crit_edge535
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %60) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %60, ptr noundef nonnull @.str.167, double noundef %639, double noundef %645) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %61) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %61, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.153, ptr noundef nonnull %60) #7
  %648 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %648, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2703, ptr noundef nonnull %61) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %61) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %60) #7
  br label %673

649:                                              ; preds = %._crit_edge535
  %650 = getelementptr inbounds i8, ptr %4, i64 96
  %651 = load i32, ptr %650, align 8, !tbaa !48
  %652 = add nsw i32 %651, %594
  %653 = sext i32 %652 to i64
  %654 = getelementptr double, ptr %70, i64 %653
  %655 = getelementptr i8, ptr %654, i64 -8
  %656 = tail call i32 @thermodynamics_get_xe_before_reionization(ptr noundef nonnull %0, ptr noundef %2, ptr noundef %3, double noundef %639, ptr noundef %655)
  %657 = icmp eq i32 %656, 1
  br i1 %657, label %658, label %660

658:                                              ; preds = %649
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %62) #7
  %659 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %62, ptr noundef nonnull @.str, ptr noundef nonnull @.str.168, ptr noundef nonnull %659) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %659, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2712, ptr noundef nonnull %62) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %62) #7
  br label %673

660:                                              ; preds = %649
  %661 = tail call i32 @thermodynamics_reionization_sample(ptr noundef nonnull %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef nonnull %4, ptr noundef %5)
  %662 = icmp eq i32 %661, 1
  br i1 %662, label %663, label %665

663:                                              ; preds = %660
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %63) #7
  %664 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %63, ptr noundef nonnull @.str, ptr noundef nonnull @.str.155, ptr noundef nonnull %664) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %664, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2717, ptr noundef nonnull %63) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %63) #7
  br label %673

665:                                              ; preds = %660
  %666 = getelementptr inbounds i8, ptr %4, i64 48
  %667 = load double, ptr %666, align 8, !tbaa !36
  %668 = getelementptr inbounds i8, ptr %2, i64 24
  store double %667, ptr %668, align 8, !tbaa !37
  br label %673

669:                                              ; preds = %77
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %64) #7
  %670 = getelementptr inbounds i8, ptr %2, i64 16
  %671 = load i32, ptr %670, align 8, !tbaa !28
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %64, ptr noundef nonnull @.str.184, i32 noundef %671) #7
  call void @llvm.lifetime.start.p0(i64 2048, ptr nonnull %65) #7
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %65, ptr noundef nonnull @.str.10, ptr noundef nonnull @.str.146, ptr noundef nonnull %64) #7
  %672 = getelementptr inbounds i8, ptr %2, i64 606
  call void (ptr, ptr, ...) @class_protect_sprintf(ptr noundef nonnull %672, ptr noundef nonnull @.str.2, ptr noundef nonnull @__func__.thermodynamics_reionization, i32 noundef 2727, ptr noundef nonnull %65) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %65) #7
  call void @llvm.lifetime.end.p0(i64 2048, ptr nonnull %64) #7
  br label %673

673:                                              ; preds = %669, %665, %663, %658, %647, %627, %600, %585, %577, %570, %562, %560, %551, %540, %521, %494, %466, %445, %435, %433, %413, %392, %363, %310, %301, %292, %285, %279, %271, %237, %227, %222, %203, %185, %180, %171, %137, %133, %128, %74
  %.0 = phi i32 [ 1, %74 ], [ 1, %128 ], [ 1, %133 ], [ 1, %137 ], [ 1, %171 ], [ 1, %180 ], [ 1, %185 ], [ 1, %203 ], [ 1, %222 ], [ 1, %227 ], [ 1, %237 ], [ 1, %271 ], [ 1, %279 ], [ 1, %285 ], [ 1, %292 ], [ 0, %301 ], [ 1, %310 ], [ 1, %363 ], [ 1, %392 ], [ 1, %413 ], [ 1, %433 ], [ 0, %435 ], [ 1, %445 ], [ 1, %466 ], [ 1, %494 ], [ 1, %521 ], [ 1, %540 ], [ 1, %551 ], [ 1, %560 ], [ 0, %562 ], [ 1, %570 ], [ 1, %577 ], [ 1, %585 ], [ 1, %600 ], [ 1, %627 ], [ 1, %647 ], [ 1, %658 ], [ 1, %663 ], [ 0, %665 ], [ 1, %669 ]
  ret i32 %.0
}

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 120}
!6 = !{!"reionization", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !10, i64 40, !11, i64 48, !7, i64 56, !7, i64 60, !7, i64 64, !7, i64 68, !7, i64 72, !7, i64 76, !7, i64 80, !7, i64 84, !7, i64 88, !7, i64 92, !7, i64 96, !7, i64 100, !7, i64 104, !10, i64 112, !7, i64 120, !7, i64 124}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!6, !10, i64 112}
!13 = !{!14, !7, i64 12}
!14 = !{!"thermo", !11, i64 0, !7, i64 8, !7, i64 12, !7, i64 16, !11, i64 24, !11, i64 32, !15, i64 40, !15, i64 42, !11, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !7, i64 80, !10, i64 88, !10, i64 96, !11, i64 104, !7, i64 112, !10, i64 120, !10, i64 128, !11, i64 136, !7, i64 144, !10, i64 152, !10, i64 160, !11, i64 168, !15, i64 176, !11, i64 184, !11, i64 192, !11, i64 200, !11, i64 208, !11, i64 216, !11, i64 224, !11, i64 232, !11, i64 240, !11, i64 248, !11, i64 256, !11, i64 264, !7, i64 272, !7, i64 276, !7, i64 280, !7, i64 284, !7, i64 288, !7, i64 292, !7, i64 296, !7, i64 300, !7, i64 304, !7, i64 308, !7, i64 312, !7, i64 316, !7, i64 320, !7, i64 324, !7, i64 328, !7, i64 332, !7, i64 336, !7, i64 340, !7, i64 344, !7, i64 348, !7, i64 352, !7, i64 356, !7, i64 360, !7, i64 364, !7, i64 368, !7, i64 372, !7, i64 376, !10, i64 384, !10, i64 392, !10, i64 400, !11, i64 408, !11, i64 416, !11, i64 424, !11, i64 432, !11, i64 440, !11, i64 448, !11, i64 456, !11, i64 464, !11, i64 472, !11, i64 480, !11, i64 488, !11, i64 496, !11, i64 504, !11, i64 512, !11, i64 520, !11, i64 528, !11, i64 536, !11, i64 544, !11, i64 552, !11, i64 560, !11, i64 568, !11, i64 576, !11, i64 584, !11, i64 592, !15, i64 600, !15, i64 602, !15, i64 604, !8, i64 606}
!15 = !{!"short", !8, i64 0}
!16 = !{!14, !11, i64 0}
!17 = !{!6, !7, i64 72}
!18 = !{!11, !11, i64 0}
!19 = !{!14, !11, i64 56}
!20 = !{!6, !7, i64 60}
!21 = !{!14, !11, i64 48}
!22 = !{!6, !7, i64 64}
!23 = !{!6, !7, i64 76}
!24 = !{!14, !11, i64 64}
!25 = !{!6, !7, i64 80}
!26 = !{!14, !11, i64 72}
!27 = !{!6, !7, i64 84}
!28 = !{!14, !7, i64 16}
!29 = !{!14, !11, i64 32}
!30 = !{!6, !7, i64 56}
!31 = !{!32, !11, i64 616}
!32 = !{!"precision", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !11, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !11, i64 88, !11, i64 96, !8, i64 104, !11, i64 360, !7, i64 368, !11, i64 376, !7, i64 384, !7, i64 388, !11, i64 392, !7, i64 400, !11, i64 408, !7, i64 416, !11, i64 424, !11, i64 432, !11, i64 440, !11, i64 448, !11, i64 456, !11, i64 464, !11, i64 472, !11, i64 480, !11, i64 488, !11, i64 496, !11, i64 504, !11, i64 512, !11, i64 520, !11, i64 528, !11, i64 536, !11, i64 544, !11, i64 552, !11, i64 560, !11, i64 568, !11, i64 576, !11, i64 584, !11, i64 592, !11, i64 600, !11, i64 608, !11, i64 616, !7, i64 624, !8, i64 628, !8, i64 884, !8, i64 1140, !11, i64 1400, !11, i64 1408, !11, i64 1416, !11, i64 1424, !11, i64 1432, !11, i64 1440, !11, i64 1448, !11, i64 1456, !11, i64 1464, !11, i64 1472, !11, i64 1480, !11, i64 1488, !11, i64 1496, !11, i64 1504, !11, i64 1512, !11, i64 1520, !7, i64 1528, !11, i64 1536, !11, i64 1544, !7, i64 1552, !7, i64 1556, !7, i64 1560, !7, i64 1564, !7, i64 1568, !7, i64 1572, !7, i64 1576, !7, i64 1580, !11, i64 1584, !11, i64 1592, !11, i64 1600, !11, i64 1608, !11, i64 1616, !11, i64 1624, !11, i64 1632, !11, i64 1640, !7, i64 1648, !11, i64 1656, !11, i64 1664, !7, i64 1672, !11, i64 1680, !11, i64 1688, !7, i64 1696, !11, i64 1704, !7, i64 1712, !11, i64 1720, !11, i64 1728, !7, i64 1736, !11, i64 1744, !11, i64 1752, !11, i64 1760, !7, i64 1768, !11, i64 1776, !11, i64 1784, !11, i64 1792, !11, i64 1800, !11, i64 1808, !7, i64 1816, !11, i64 1824, !11, i64 1832, !11, i64 1840, !11, i64 1848, !11, i64 1856, !11, i64 1864, !11, i64 1872, !7, i64 1880, !11, i64 1888, !11, i64 1896, !11, i64 1904, !11, i64 1912, !11, i64 1920, !11, i64 1928, !11, i64 1936, !11, i64 1944, !11, i64 1952, !11, i64 1960, !11, i64 1968, !11, i64 1976, !11, i64 1984, !11, i64 1992, !11, i64 2000, !11, i64 2008, !11, i64 2016, !11, i64 2024, !11, i64 2032, !11, i64 2040, !11, i64 2048, !11, i64 2056, !11, i64 2064, !11, i64 2072, !11, i64 2080, !11, i64 2088, !11, i64 2096, !11, i64 2104, !11, i64 2112, !11, i64 2120, !11, i64 2128, !11, i64 2136, !11, i64 2144, !11, i64 2152, !11, i64 2160, !11, i64 2168, !11, i64 2176, !11, i64 2184, !11, i64 2192, !11, i64 2200, !11, i64 2208, !11, i64 2216, !11, i64 2224, !11, i64 2232, !11, i64 2240, !11, i64 2248, !7, i64 2256, !11, i64 2264, !11, i64 2272, !11, i64 2280, !11, i64 2288, !7, i64 2296, !11, i64 2304, !11, i64 2312, !7, i64 2320, !7, i64 2324, !7, i64 2328, !11, i64 2336, !11, i64 2344, !8, i64 2352}
!33 = !{!6, !7, i64 104}
!34 = !{!32, !11, i64 592}
!35 = !{!6, !7, i64 68}
!36 = !{!6, !11, i64 48}
!37 = !{!14, !11, i64 24}
!38 = !{!6, !10, i64 40}
!39 = !{!32, !11, i64 608}
!40 = distinct !{!40, !41}
!41 = !{!"llvm.loop.mustprogress"}
!42 = !{!14, !7, i64 80}
!43 = !{!14, !10, i64 88}
!44 = distinct !{!44, !41}
!45 = !{!6, !7, i64 88}
!46 = !{!6, !7, i64 92}
!47 = !{!14, !10, i64 96}
!48 = !{!6, !7, i64 96}
!49 = distinct !{!49, !41, !50, !51}
!50 = !{!"llvm.loop.isvectorized", i32 1}
!51 = !{!"llvm.loop.unroll.runtime.disable"}
!52 = distinct !{!52, !41, !50}
!53 = !{!14, !11, i64 104}
!54 = !{!6, !7, i64 100}
!55 = !{!14, !7, i64 112}
!56 = !{!14, !10, i64 120}
!57 = distinct !{!57, !41}
!58 = !{!14, !10, i64 128}
!59 = distinct !{!59, !41}
!60 = !{!14, !11, i64 136}
!61 = !{!14, !7, i64 144}
!62 = !{!14, !10, i64 152}
!63 = distinct !{!63, !41}
!64 = !{!14, !10, i64 160}
!65 = distinct !{!65, !41}


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