; LLVM IR from LukeMcCulloch/cfd_solvers_cpp :: src/EulerShockTube1D.ll (ZN13EulerSolver1D6Solver7Euler1DEv)

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

%class.Array2D = type { i32, i32, i32, i32, i32, i32, i8, i8, ptr }
%"class.EulerSolver1D::Solver" = type { float, float, float, float, float, float, float, float, float, float, float, i32, i32, i32, i32, i32, i32, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D, ptr }
%"struct.EulerSolver1D::cell_data" = type { float, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D }

@.str.3 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [8 x i8], align 1

declare i32 @__gxx_personality_v0(...)

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13EulerSolver1D6Solver7Euler1DEv(ptr noundef nonnull align 8 dereferenceable(280) %0) #2 align 2 personality ptr @__gxx_personality_v0 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca %class.Array2D, align 8
  %8 = alloca %class.Array2D, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i32, align 4
  %11 = alloca %class.Array2D, align 8
  %12 = alloca %class.Array2D, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca %class.Array2D, align 8
  %16 = alloca i32, align 4
  %17 = alloca %class.Array2D, align 8
  %18 = alloca %class.Array2D, align 8
  %19 = alloca %class.Array2D, align 8
  %20 = alloca %class.Array2D, align 8
  %21 = alloca %class.Array2D, align 8
  %22 = alloca %class.Array2D, align 8
  %23 = alloca %class.Array2D, align 8
  %24 = alloca %class.Array2D, align 8
  %25 = alloca %class.Array2D, align 8
  %26 = alloca %class.Array2D, align 8
  %27 = alloca %class.Array2D, align 8
  %28 = alloca %class.Array2D, align 8
  %29 = alloca %class.Array2D, align 8
  %30 = alloca %class.Array2D, align 8
  %31 = alloca %class.Array2D, align 8
  %32 = alloca %class.Array2D, align 8
  %33 = alloca %class.Array2D, align 8
  %34 = alloca %class.Array2D, align 8
  %35 = alloca %class.Array2D, align 8
  %36 = alloca %class.Array2D, align 8
  %37 = alloca %class.Array2D, align 8
  %38 = alloca %class.Array2D, align 8
  %39 = alloca %class.Array2D, align 8
  %40 = alloca %class.Array2D, align 8
  %41 = alloca %class.Array2D, align 8
  %42 = alloca %class.Array2D, align 8
  %43 = alloca %class.Array2D, align 8
  %44 = alloca %class.Array2D, align 8
  %45 = alloca i32, align 4
  %46 = alloca %class.Array2D, align 8
  %47 = alloca %class.Array2D, align 8
  %48 = alloca %class.Array2D, align 8
  %49 = alloca %class.Array2D, align 8
  %50 = alloca float, align 4
  %51 = alloca %class.Array2D, align 8
  %52 = alloca %class.Array2D, align 8
  %53 = alloca i32, align 4
  %54 = alloca %class.Array2D, align 8
  %55 = alloca %class.Array2D, align 8
  %56 = alloca %class.Array2D, align 8
  %57 = alloca float, align 4
  %58 = alloca %class.Array2D, align 8
  %59 = alloca %class.Array2D, align 8
  %60 = alloca %class.Array2D, align 8
  %61 = alloca %class.Array2D, align 8
  %62 = alloca %class.Array2D, align 8
  %63 = alloca %class.Array2D, align 8
  %64 = alloca %class.Array2D, align 8
  store ptr %0, ptr %2, align 8, !tbaa !5
  %65 = load ptr, ptr %2, align 8
  %66 = call i32 (ptr, ...) @printf(ptr noundef @.str.3)
  %67 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 0
  %68 = load float, ptr %67, align 8, !tbaa !9
  %69 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  store float %68, ptr %69, align 4, !tbaa !15
  %70 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 12
  store i32 0, ptr %70, align 8, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #4
  store i32 0, ptr %3, align 4, !tbaa !17
  br label %71

71:                                               ; preds = %644, %1
  %72 = load i32, ptr %3, align 4, !tbaa !17
  %73 = icmp slt i32 %72, 50000
  br i1 %73, label %75, label %74

74:                                               ; preds = %71
  store i32 2, ptr %4, align 4
  br label %647

75:                                               ; preds = %71
  %76 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  %77 = load float, ptr %76, align 4, !tbaa !15
  %78 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 8
  %79 = load float, ptr %78, align 8, !tbaa !18
  %80 = fcmp oeq float %77, %79
  br i1 %80, label %81, label %83

81:                                               ; preds = %75
  %82 = call i32 (ptr, ...) @printf(ptr noundef @.str.4)
  store i32 2, ptr %4, align 4
  br label %647

83:                                               ; preds = %75
  %84 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 9
  %85 = load float, ptr %84, align 4, !tbaa !19
  %86 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 6
  %87 = load float, ptr %86, align 8, !tbaa !20
  %88 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 3
  %89 = load float, ptr %88, align 4, !tbaa !21
  %90 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %91 = load i32, ptr %90, align 4, !tbaa !22
  %92 = call noundef float @_ZN13EulerSolver1D6Solver8timestepEfffi(ptr noundef nonnull align 8 dereferenceable(280) %65, float noundef %85, float noundef %87, float noundef %89, i32 noundef %91)
  %93 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  store float %92, ptr %93, align 8, !tbaa !23
  %94 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  %95 = load float, ptr %94, align 4, !tbaa !15
  %96 = fpext float %95 to double
  %97 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  %98 = load float, ptr %97, align 8, !tbaa !23
  %99 = fpext float %98 to double
  %100 = call i32 (ptr, ...) @printf(ptr noundef @.str.5, double noundef %96, double noundef %99)
  %101 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  %102 = load float, ptr %101, align 4, !tbaa !15
  %103 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  %104 = load float, ptr %103, align 8, !tbaa !23
  %105 = fadd float %102, %104
  %106 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 8
  %107 = load float, ptr %106, align 8, !tbaa !18
  %108 = fcmp ogt float %105, %107
  br i1 %108, label %109, label %116

109:                                              ; preds = %83
  %110 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 8
  %111 = load float, ptr %110, align 8, !tbaa !18
  %112 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  %113 = load float, ptr %112, align 4, !tbaa !15
  %114 = fsub float %111, %113
  %115 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  store float %114, ptr %115, align 8, !tbaa !23
  br label %116

116:                                              ; preds = %109, %83
  %117 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  %118 = load float, ptr %117, align 4, !tbaa !15
  %119 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  %120 = load float, ptr %119, align 8, !tbaa !23
  %121 = fadd float %118, %120
  %122 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 7
  store float %121, ptr %122, align 4, !tbaa !15
  %123 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 12
  %124 = load i32, ptr %123, align 8, !tbaa !16
  %125 = add nsw i32 %124, 1
  %126 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 12
  store i32 %125, ptr %126, align 8, !tbaa !16
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #4
  store i32 0, ptr %5, align 4, !tbaa !17
  br label %127

127:                                              ; preds = %639, %116
  %128 = load i32, ptr %5, align 4, !tbaa !17
  %129 = icmp slt i32 %128, 2
  br i1 %129, label %131, label %130

130:                                              ; preds = %127
  store i32 5, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #4
  br label %643

131:                                              ; preds = %127
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #4
  store i32 1, ptr %6, align 4, !tbaa !17
  br label %132

132:                                              ; preds = %204, %131
  %133 = load i32, ptr %6, align 4, !tbaa !17
  %134 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %135 = load i32, ptr %134, align 4, !tbaa !22
  %136 = add nsw i32 %135, 1
  %137 = icmp slt i32 %133, %136
  br i1 %137, label %139, label %138

138:                                              ; preds = %132
  store i32 8, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #4
  br label %208

139:                                              ; preds = %132
  call void @llvm.lifetime.start.p0(i64 40, ptr %8) #4
  %140 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %141 = load ptr, ptr %140, align 8, !tbaa !24
  %142 = load i32, ptr %6, align 4, !tbaa !17
  %143 = sext i32 %142 to i64
  %144 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %141, i64 %143
  %145 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %144, i32 0, i32 3
  %146 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %147 = load ptr, ptr %146, align 8, !tbaa !24
  %148 = load i32, ptr %6, align 4, !tbaa !17
  %149 = sub nsw i32 %148, 1
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %147, i64 %150
  %152 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %151, i32 0, i32 3
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %8, ptr noundef nonnull align 8 dereferenceable(40) %145, ptr noundef nonnull align 8 dereferenceable(40) %152)
  %153 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 17
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %7, ptr noundef nonnull align 8 dereferenceable(40) %153, ptr noundef nonnull align 8 dereferenceable(40) %8)
          to label %154 unwind label %174

154:                                              ; preds = %139
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %7) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %8) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %8) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %12) #4
  %155 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %156 = load ptr, ptr %155, align 8, !tbaa !24
  %157 = load i32, ptr %6, align 4, !tbaa !17
  %158 = add nsw i32 %157, 1
  %159 = sext i32 %158 to i64
  %160 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %156, i64 %159
  %161 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %160, i32 0, i32 3
  %162 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %163 = load ptr, ptr %162, align 8, !tbaa !24
  %164 = load i32, ptr %6, align 4, !tbaa !17
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %163, i64 %165
  %167 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %166, i32 0, i32 3
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %12, ptr noundef nonnull align 8 dereferenceable(40) %161, ptr noundef nonnull align 8 dereferenceable(40) %167)
  %168 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 18
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %11, ptr noundef nonnull align 8 dereferenceable(40) %168, ptr noundef nonnull align 8 dereferenceable(40) %12)
          to label %169 unwind label %178

169:                                              ; preds = %154
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %11) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  store i32 0, ptr %13, align 4, !tbaa !17
  br label %170

170:                                              ; preds = %200, %169
  %171 = load i32, ptr %13, align 4, !tbaa !17
  %172 = icmp slt i32 %171, 3
  br i1 %172, label %182, label %173

173:                                              ; preds = %170
  store i32 11, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  br label %203

174:                                              ; preds = %139
  %175 = landingpad { ptr, i32 }
          cleanup
  %176 = extractvalue { ptr, i32 } %175, 0
  store ptr %176, ptr %9, align 8
  %177 = extractvalue { ptr, i32 } %175, 1
  store i32 %177, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %8) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %8) #4
  br label %207

178:                                              ; preds = %154
  %179 = landingpad { ptr, i32 }
          cleanup
  %180 = extractvalue { ptr, i32 } %179, 0
  store ptr %180, ptr %9, align 8
  %181 = extractvalue { ptr, i32 } %179, 1
  store i32 %181, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %12) #4
  br label %207

182:                                              ; preds = %170
  %183 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 17
  %184 = load i32, ptr %13, align 4, !tbaa !17
  %185 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %183, i32 noundef %184)
  %186 = load float, ptr %185, align 4, !tbaa !25
  %187 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 18
  %188 = load i32, ptr %13, align 4, !tbaa !17
  %189 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %187, i32 noundef %188)
  %190 = load float, ptr %189, align 4, !tbaa !25
  %191 = call noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280) %65, float noundef %186, float noundef %190)
  %192 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %193 = load ptr, ptr %192, align 8, !tbaa !24
  %194 = load i32, ptr %6, align 4, !tbaa !17
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %193, i64 %195
  %197 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %196, i32 0, i32 4
  %198 = load i32, ptr %13, align 4, !tbaa !17
  %199 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %197, i32 noundef %198)
  store float %191, ptr %199, align 4, !tbaa !25
  br label %200

200:                                              ; preds = %182
  %201 = load i32, ptr %13, align 4, !tbaa !17
  %202 = add nsw i32 %201, 1
  store i32 %202, ptr %13, align 4, !tbaa !17
  br label %170, !llvm.loop !26

203:                                              ; preds = %173
  br label %204

204:                                              ; preds = %203
  %205 = load i32, ptr %6, align 4, !tbaa !17
  %206 = add nsw i32 %205, 1
  store i32 %206, ptr %6, align 4, !tbaa !17
  br label %132, !llvm.loop !28

207:                                              ; preds = %178, %174
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #4
  br label %642

208:                                              ; preds = %138
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 1, ptr %14, align 4, !tbaa !17
  br label %209

209:                                              ; preds = %225, %208
  %210 = load i32, ptr %14, align 4, !tbaa !17
  %211 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %212 = load i32, ptr %211, align 4, !tbaa !22
  %213 = add nsw i32 %212, 1
  %214 = icmp slt i32 %210, %213
  br i1 %214, label %216, label %215

215:                                              ; preds = %209
  store i32 14, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  br label %228

216:                                              ; preds = %209
  %217 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 0
  %218 = load float, ptr %217, align 8, !tbaa !9
  %219 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %220 = load ptr, ptr %219, align 8, !tbaa !24
  %221 = load i32, ptr %14, align 4, !tbaa !17
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %220, i64 %222
  %224 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %223, i32 0, i32 5
  call void @_ZN7Array2DIfEaSEf(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %15, ptr noundef nonnull align 8 dereferenceable(40) %224, float noundef %218)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #4
  br label %225

225:                                              ; preds = %216
  %226 = load i32, ptr %14, align 4, !tbaa !17
  %227 = add nsw i32 %226, 1
  store i32 %227, ptr %14, align 4, !tbaa !17
  br label %209, !llvm.loop !29

228:                                              ; preds = %215
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #4
  store i32 1, ptr %16, align 4, !tbaa !17
  br label %229

229:                                              ; preds = %304, %228
  %230 = load i32, ptr %16, align 4, !tbaa !17
  %231 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %232 = load i32, ptr %231, align 4, !tbaa !22
  %233 = icmp slt i32 %230, %232
  br i1 %233, label %235, label %234

234:                                              ; preds = %229
  store i32 17, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  br label %338

235:                                              ; preds = %229
  call void @llvm.lifetime.start.p0(i64 40, ptr %18) #4
  %236 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %237 = load ptr, ptr %236, align 8, !tbaa !24
  %238 = load i32, ptr %16, align 4, !tbaa !17
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %237, i64 %239
  %241 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %240, i32 0, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr %19) #4
  %242 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 2
  %243 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %244 = load ptr, ptr %243, align 8, !tbaa !24
  %245 = load i32, ptr %16, align 4, !tbaa !17
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %244, i64 %246
  %248 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %247, i32 0, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %19, ptr noundef nonnull align 4 dereferenceable(4) %242, ptr noundef nonnull align 8 dereferenceable(40) %248)
  invoke void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %18, ptr noundef nonnull align 8 dereferenceable(40) %241, ptr noundef nonnull align 8 dereferenceable(40) %19)
          to label %249 unwind label %307

249:                                              ; preds = %235
  %250 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %17, ptr noundef nonnull align 8 dereferenceable(40) %250, ptr noundef nonnull align 8 dereferenceable(40) %18)
          to label %251 unwind label %311

251:                                              ; preds = %249
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %17) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %18) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %19) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %18) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %21) #4
  %252 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %253 = load ptr, ptr %252, align 8, !tbaa !24
  %254 = load i32, ptr %16, align 4, !tbaa !17
  %255 = add nsw i32 %254, 1
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %253, i64 %256
  %258 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %257, i32 0, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr %22) #4
  %259 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 2
  %260 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %261 = load ptr, ptr %260, align 8, !tbaa !24
  %262 = load i32, ptr %16, align 4, !tbaa !17
  %263 = add nsw i32 %262, 1
  %264 = sext i32 %263 to i64
  %265 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %261, i64 %264
  %266 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %265, i32 0, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %22, ptr noundef nonnull align 4 dereferenceable(4) %259, ptr noundef nonnull align 8 dereferenceable(40) %266)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %21, ptr noundef nonnull align 8 dereferenceable(40) %258, ptr noundef nonnull align 8 dereferenceable(40) %22)
          to label %267 unwind label %316

267:                                              ; preds = %251
  %268 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %20, ptr noundef nonnull align 8 dereferenceable(40) %268, ptr noundef nonnull align 8 dereferenceable(40) %21)
          to label %269 unwind label %320

269:                                              ; preds = %267
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %20) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %21) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %22) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %21) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %24) #4
  %270 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  %271 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %24, ptr noundef nonnull align 8 dereferenceable(280) %65, ptr noundef nonnull align 8 dereferenceable(40) %270, ptr noundef nonnull align 8 dereferenceable(40) %271)
  %272 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %23, ptr noundef nonnull align 8 dereferenceable(40) %272, ptr noundef nonnull align 8 dereferenceable(40) %24)
          to label %273 unwind label %325

273:                                              ; preds = %269
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %23) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %24) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %26) #4
  %274 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %275 = load ptr, ptr %274, align 8, !tbaa !24
  %276 = load i32, ptr %16, align 4, !tbaa !17
  %277 = sext i32 %276 to i64
  %278 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %275, i64 %277
  %279 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %278, i32 0, i32 5
  %280 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %26, ptr noundef nonnull align 8 dereferenceable(40) %279, ptr noundef nonnull align 8 dereferenceable(40) %280)
  %281 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %282 = load ptr, ptr %281, align 8, !tbaa !24
  %283 = load i32, ptr %16, align 4, !tbaa !17
  %284 = sext i32 %283 to i64
  %285 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %282, i64 %284
  %286 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %285, i32 0, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %25, ptr noundef nonnull align 8 dereferenceable(40) %286, ptr noundef nonnull align 8 dereferenceable(40) %26)
          to label %287 unwind label %329

287:                                              ; preds = %273
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %25) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %26) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %28) #4
  %288 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %289 = load ptr, ptr %288, align 8, !tbaa !24
  %290 = load i32, ptr %16, align 4, !tbaa !17
  %291 = add nsw i32 %290, 1
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %289, i64 %292
  %294 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %293, i32 0, i32 5
  %295 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %28, ptr noundef nonnull align 8 dereferenceable(40) %294, ptr noundef nonnull align 8 dereferenceable(40) %295)
  %296 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %297 = load ptr, ptr %296, align 8, !tbaa !24
  %298 = load i32, ptr %16, align 4, !tbaa !17
  %299 = add nsw i32 %298, 1
  %300 = sext i32 %299 to i64
  %301 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %297, i64 %300
  %302 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %301, i32 0, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %27, ptr noundef nonnull align 8 dereferenceable(40) %302, ptr noundef nonnull align 8 dereferenceable(40) %28)
          to label %303 unwind label %333

303:                                              ; preds = %287
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %27) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %28) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %28) #4
  br label %304

304:                                              ; preds = %303
  %305 = load i32, ptr %16, align 4, !tbaa !17
  %306 = add nsw i32 %305, 1
  store i32 %306, ptr %16, align 4, !tbaa !17
  br label %229, !llvm.loop !30

307:                                              ; preds = %235
  %308 = landingpad { ptr, i32 }
          cleanup
  %309 = extractvalue { ptr, i32 } %308, 0
  store ptr %309, ptr %9, align 8
  %310 = extractvalue { ptr, i32 } %308, 1
  store i32 %310, ptr %10, align 4
  br label %315

311:                                              ; preds = %249
  %312 = landingpad { ptr, i32 }
          cleanup
  %313 = extractvalue { ptr, i32 } %312, 0
  store ptr %313, ptr %9, align 8
  %314 = extractvalue { ptr, i32 } %312, 1
  store i32 %314, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %18) #4
  br label %315

315:                                              ; preds = %311, %307
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %19) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %18) #4
  br label %337

316:                                              ; preds = %251
  %317 = landingpad { ptr, i32 }
          cleanup
  %318 = extractvalue { ptr, i32 } %317, 0
  store ptr %318, ptr %9, align 8
  %319 = extractvalue { ptr, i32 } %317, 1
  store i32 %319, ptr %10, align 4
  br label %324

320:                                              ; preds = %267
  %321 = landingpad { ptr, i32 }
          cleanup
  %322 = extractvalue { ptr, i32 } %321, 0
  store ptr %322, ptr %9, align 8
  %323 = extractvalue { ptr, i32 } %321, 1
  store i32 %323, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %21) #4
  br label %324

324:                                              ; preds = %320, %316
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %22) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %21) #4
  br label %337

325:                                              ; preds = %269
  %326 = landingpad { ptr, i32 }
          cleanup
  %327 = extractvalue { ptr, i32 } %326, 0
  store ptr %327, ptr %9, align 8
  %328 = extractvalue { ptr, i32 } %326, 1
  store i32 %328, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %24) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %24) #4
  br label %337

329:                                              ; preds = %273
  %330 = landingpad { ptr, i32 }
          cleanup
  %331 = extractvalue { ptr, i32 } %330, 0
  store ptr %331, ptr %9, align 8
  %332 = extractvalue { ptr, i32 } %330, 1
  store i32 %332, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %26) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %26) #4
  br label %337

333:                                              ; preds = %287
  %334 = landingpad { ptr, i32 }
          cleanup
  %335 = extractvalue { ptr, i32 } %334, 0
  store ptr %335, ptr %9, align 8
  %336 = extractvalue { ptr, i32 } %334, 1
  store i32 %336, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %28) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %28) #4
  br label %337

337:                                              ; preds = %333, %329, %325, %324, %315
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #4
  br label %642

338:                                              ; preds = %234
  call void @llvm.lifetime.start.p0(i64 40, ptr %30) #4
  %339 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %340 = load ptr, ptr %339, align 8, !tbaa !24
  %341 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %340, i64 1
  %342 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %341, i32 0, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr %31) #4
  %343 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 2
  %344 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %345 = load ptr, ptr %344, align 8, !tbaa !24
  %346 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %345, i64 1
  %347 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %346, i32 0, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %31, ptr noundef nonnull align 4 dereferenceable(4) %343, ptr noundef nonnull align 8 dereferenceable(40) %347)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %30, ptr noundef nonnull align 8 dereferenceable(40) %342, ptr noundef nonnull align 8 dereferenceable(40) %31)
          to label %348 unwind label %417

348:                                              ; preds = %338
  %349 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %29, ptr noundef nonnull align 8 dereferenceable(40) %349, ptr noundef nonnull align 8 dereferenceable(40) %30)
          to label %350 unwind label %421

350:                                              ; preds = %348
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %29) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %30) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %31) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %30) #4
  %351 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  %352 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %32, ptr noundef nonnull align 8 dereferenceable(40) %352, ptr noundef nonnull align 8 dereferenceable(40) %351)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %32) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %34) #4
  %353 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  %354 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %34, ptr noundef nonnull align 8 dereferenceable(280) %65, ptr noundef nonnull align 8 dereferenceable(40) %353, ptr noundef nonnull align 8 dereferenceable(40) %354)
  %355 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %33, ptr noundef nonnull align 8 dereferenceable(40) %355, ptr noundef nonnull align 8 dereferenceable(40) %34)
          to label %356 unwind label %426

356:                                              ; preds = %350
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %33) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %34) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %34) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %36) #4
  %357 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %358 = load ptr, ptr %357, align 8, !tbaa !24
  %359 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %358, i64 1
  %360 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %359, i32 0, i32 5
  %361 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %36, ptr noundef nonnull align 8 dereferenceable(40) %360, ptr noundef nonnull align 8 dereferenceable(40) %361)
  %362 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %363 = load ptr, ptr %362, align 8, !tbaa !24
  %364 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %363, i64 1
  %365 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %364, i32 0, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %35, ptr noundef nonnull align 8 dereferenceable(40) %365, ptr noundef nonnull align 8 dereferenceable(40) %36)
          to label %366 unwind label %430

366:                                              ; preds = %356
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %35) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %36) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %36) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %38) #4
  %367 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %368 = load ptr, ptr %367, align 8, !tbaa !24
  %369 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %370 = load i32, ptr %369, align 4, !tbaa !22
  %371 = sext i32 %370 to i64
  %372 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %368, i64 %371
  %373 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %372, i32 0, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr %39) #4
  %374 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 2
  %375 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %376 = load ptr, ptr %375, align 8, !tbaa !24
  %377 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %378 = load i32, ptr %377, align 4, !tbaa !22
  %379 = sext i32 %378 to i64
  %380 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %376, i64 %379
  %381 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %380, i32 0, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %39, ptr noundef nonnull align 4 dereferenceable(4) %374, ptr noundef nonnull align 8 dereferenceable(40) %381)
  invoke void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %38, ptr noundef nonnull align 8 dereferenceable(40) %373, ptr noundef nonnull align 8 dereferenceable(40) %39)
          to label %382 unwind label %434

382:                                              ; preds = %366
  %383 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %37, ptr noundef nonnull align 8 dereferenceable(40) %383, ptr noundef nonnull align 8 dereferenceable(40) %38)
          to label %384 unwind label %438

384:                                              ; preds = %382
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %37) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %38) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %38) #4
  %385 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  %386 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %40, ptr noundef nonnull align 8 dereferenceable(40) %386, ptr noundef nonnull align 8 dereferenceable(40) %385)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %40) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %42) #4
  %387 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 19
  %388 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 20
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %42, ptr noundef nonnull align 8 dereferenceable(280) %65, ptr noundef nonnull align 8 dereferenceable(40) %387, ptr noundef nonnull align 8 dereferenceable(40) %388)
  %389 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %41, ptr noundef nonnull align 8 dereferenceable(40) %389, ptr noundef nonnull align 8 dereferenceable(40) %42)
          to label %390 unwind label %443

390:                                              ; preds = %384
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %41) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %42) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %42) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %44) #4
  %391 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %392 = load ptr, ptr %391, align 8, !tbaa !24
  %393 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %394 = load i32, ptr %393, align 4, !tbaa !22
  %395 = sext i32 %394 to i64
  %396 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %392, i64 %395
  %397 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %396, i32 0, i32 5
  %398 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 21
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %44, ptr noundef nonnull align 8 dereferenceable(40) %397, ptr noundef nonnull align 8 dereferenceable(40) %398)
  %399 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %400 = load ptr, ptr %399, align 8, !tbaa !24
  %401 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %402 = load i32, ptr %401, align 4, !tbaa !22
  %403 = sext i32 %402 to i64
  %404 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %400, i64 %403
  %405 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %404, i32 0, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %43, ptr noundef nonnull align 8 dereferenceable(40) %405, ptr noundef nonnull align 8 dereferenceable(40) %44)
          to label %406 unwind label %447

406:                                              ; preds = %390
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %43) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %44) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %44) #4
  %407 = load i32, ptr %5, align 4, !tbaa !17
  %408 = icmp eq i32 %407, 0
  br i1 %408, label %409, label %520

409:                                              ; preds = %406
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #4
  store i32 1, ptr %45, align 4, !tbaa !17
  br label %410

410:                                              ; preds = %502, %409
  %411 = load i32, ptr %45, align 4, !tbaa !17
  %412 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %413 = load i32, ptr %412, align 4, !tbaa !22
  %414 = add nsw i32 %413, 1
  %415 = icmp slt i32 %411, %414
  br i1 %415, label %451, label %416

416:                                              ; preds = %410
  store i32 20, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  br label %519

417:                                              ; preds = %338
  %418 = landingpad { ptr, i32 }
          cleanup
  %419 = extractvalue { ptr, i32 } %418, 0
  store ptr %419, ptr %9, align 8
  %420 = extractvalue { ptr, i32 } %418, 1
  store i32 %420, ptr %10, align 4
  br label %425

421:                                              ; preds = %348
  %422 = landingpad { ptr, i32 }
          cleanup
  %423 = extractvalue { ptr, i32 } %422, 0
  store ptr %423, ptr %9, align 8
  %424 = extractvalue { ptr, i32 } %422, 1
  store i32 %424, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %30) #4
  br label %425

425:                                              ; preds = %421, %417
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %31) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %30) #4
  br label %642

426:                                              ; preds = %350
  %427 = landingpad { ptr, i32 }
          cleanup
  %428 = extractvalue { ptr, i32 } %427, 0
  store ptr %428, ptr %9, align 8
  %429 = extractvalue { ptr, i32 } %427, 1
  store i32 %429, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %34) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %34) #4
  br label %642

430:                                              ; preds = %356
  %431 = landingpad { ptr, i32 }
          cleanup
  %432 = extractvalue { ptr, i32 } %431, 0
  store ptr %432, ptr %9, align 8
  %433 = extractvalue { ptr, i32 } %431, 1
  store i32 %433, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %36) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %36) #4
  br label %642

434:                                              ; preds = %366
  %435 = landingpad { ptr, i32 }
          cleanup
  %436 = extractvalue { ptr, i32 } %435, 0
  store ptr %436, ptr %9, align 8
  %437 = extractvalue { ptr, i32 } %435, 1
  store i32 %437, ptr %10, align 4
  br label %442

438:                                              ; preds = %382
  %439 = landingpad { ptr, i32 }
          cleanup
  %440 = extractvalue { ptr, i32 } %439, 0
  store ptr %440, ptr %9, align 8
  %441 = extractvalue { ptr, i32 } %439, 1
  store i32 %441, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %38) #4
  br label %442

442:                                              ; preds = %438, %434
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %38) #4
  br label %642

443:                                              ; preds = %384
  %444 = landingpad { ptr, i32 }
          cleanup
  %445 = extractvalue { ptr, i32 } %444, 0
  store ptr %445, ptr %9, align 8
  %446 = extractvalue { ptr, i32 } %444, 1
  store i32 %446, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %42) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %42) #4
  br label %642

447:                                              ; preds = %390
  %448 = landingpad { ptr, i32 }
          cleanup
  %449 = extractvalue { ptr, i32 } %448, 0
  store ptr %449, ptr %9, align 8
  %450 = extractvalue { ptr, i32 } %448, 1
  store i32 %450, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %44) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %44) #4
  br label %642

451:                                              ; preds = %410
  %452 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %453 = load ptr, ptr %452, align 8, !tbaa !24
  %454 = load i32, ptr %45, align 4, !tbaa !17
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %453, i64 %455
  %457 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %456, i32 0, i32 1
  %458 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %459 = load ptr, ptr %458, align 8, !tbaa !24
  %460 = load i32, ptr %45, align 4, !tbaa !17
  %461 = sext i32 %460 to i64
  %462 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %459, i64 %461
  %463 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %462, i32 0, i32 2
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %46, ptr noundef nonnull align 8 dereferenceable(40) %463, ptr noundef nonnull align 8 dereferenceable(40) %457)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %46) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %48) #4
  %464 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %465 = load ptr, ptr %464, align 8, !tbaa !24
  %466 = load i32, ptr %45, align 4, !tbaa !17
  %467 = sext i32 %466 to i64
  %468 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %465, i64 %467
  %469 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %468, i32 0, i32 1
  call void @llvm.lifetime.start.p0(i64 40, ptr %49) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #4
  %470 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  %471 = load float, ptr %470, align 8, !tbaa !23
  %472 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 6
  %473 = load float, ptr %472, align 8, !tbaa !20
  %474 = fdiv float %471, %473
  store float %474, ptr %50, align 4, !tbaa !25
  %475 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %476 = load ptr, ptr %475, align 8, !tbaa !24
  %477 = load i32, ptr %45, align 4, !tbaa !17
  %478 = sext i32 %477 to i64
  %479 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %476, i64 %478
  %480 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %479, i32 0, i32 5
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %49, ptr noundef nonnull align 4 dereferenceable(4) %50, ptr noundef nonnull align 8 dereferenceable(40) %480)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %48, ptr noundef nonnull align 8 dereferenceable(40) %469, ptr noundef nonnull align 8 dereferenceable(40) %49)
          to label %481 unwind label %505

481:                                              ; preds = %451
  %482 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %483 = load ptr, ptr %482, align 8, !tbaa !24
  %484 = load i32, ptr %45, align 4, !tbaa !17
  %485 = sext i32 %484 to i64
  %486 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %483, i64 %485
  %487 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %486, i32 0, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %47, ptr noundef nonnull align 8 dereferenceable(40) %487, ptr noundef nonnull align 8 dereferenceable(40) %48)
          to label %488 unwind label %509

488:                                              ; preds = %481
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %47) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %48) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %49) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %49) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %48) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %52) #4
  %489 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %490 = load ptr, ptr %489, align 8, !tbaa !24
  %491 = load i32, ptr %45, align 4, !tbaa !17
  %492 = sext i32 %491 to i64
  %493 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %490, i64 %492
  %494 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %493, i32 0, i32 1
  call void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %52, ptr noundef nonnull align 8 dereferenceable(280) %65, ptr noundef nonnull align 8 dereferenceable(40) %494)
  %495 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %496 = load ptr, ptr %495, align 8, !tbaa !24
  %497 = load i32, ptr %45, align 4, !tbaa !17
  %498 = sext i32 %497 to i64
  %499 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %496, i64 %498
  %500 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %499, i32 0, i32 3
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %51, ptr noundef nonnull align 8 dereferenceable(40) %500, ptr noundef nonnull align 8 dereferenceable(40) %52)
          to label %501 unwind label %514

501:                                              ; preds = %488
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %51) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %52) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %52) #4
  br label %502

502:                                              ; preds = %501
  %503 = load i32, ptr %45, align 4, !tbaa !17
  %504 = add nsw i32 %503, 1
  store i32 %504, ptr %45, align 4, !tbaa !17
  br label %410, !llvm.loop !31

505:                                              ; preds = %451
  %506 = landingpad { ptr, i32 }
          cleanup
  %507 = extractvalue { ptr, i32 } %506, 0
  store ptr %507, ptr %9, align 8
  %508 = extractvalue { ptr, i32 } %506, 1
  store i32 %508, ptr %10, align 4
  br label %513

509:                                              ; preds = %481
  %510 = landingpad { ptr, i32 }
          cleanup
  %511 = extractvalue { ptr, i32 } %510, 0
  store ptr %511, ptr %9, align 8
  %512 = extractvalue { ptr, i32 } %510, 1
  store i32 %512, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %48) #4
  br label %513

513:                                              ; preds = %509, %505
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %49) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %49) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %48) #4
  br label %518

514:                                              ; preds = %488
  %515 = landingpad { ptr, i32 }
          cleanup
  %516 = extractvalue { ptr, i32 } %515, 0
  store ptr %516, ptr %9, align 8
  %517 = extractvalue { ptr, i32 } %515, 1
  store i32 %517, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %52) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %52) #4
  br label %518

518:                                              ; preds = %514, %513
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #4
  br label %642

519:                                              ; preds = %416
  br label %615

520:                                              ; preds = %406
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #4
  store i32 1, ptr %53, align 4, !tbaa !17
  br label %521

521:                                              ; preds = %588, %520
  %522 = load i32, ptr %53, align 4, !tbaa !17
  %523 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %524 = load i32, ptr %523, align 4, !tbaa !22
  %525 = add nsw i32 %524, 1
  %526 = icmp slt i32 %522, %525
  br i1 %526, label %528, label %527

527:                                              ; preds = %521
  store i32 23, ptr %4, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #4
  br label %614

528:                                              ; preds = %521
  call void @llvm.lifetime.start.p0(i64 40, ptr %55) #4
  %529 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %530 = load ptr, ptr %529, align 8, !tbaa !24
  %531 = load i32, ptr %53, align 4, !tbaa !17
  %532 = sext i32 %531 to i64
  %533 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %530, i64 %532
  %534 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %533, i32 0, i32 1
  call void @llvm.lifetime.start.p0(i64 40, ptr %56) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #4
  %535 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 10
  %536 = load float, ptr %535, align 8, !tbaa !23
  %537 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 6
  %538 = load float, ptr %537, align 8, !tbaa !20
  %539 = fdiv float %536, %538
  store float %539, ptr %57, align 4, !tbaa !25
  %540 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %541 = load ptr, ptr %540, align 8, !tbaa !24
  %542 = load i32, ptr %53, align 4, !tbaa !17
  %543 = sext i32 %542 to i64
  %544 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %541, i64 %543
  %545 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %544, i32 0, i32 5
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %56, ptr noundef nonnull align 4 dereferenceable(4) %57, ptr noundef nonnull align 8 dereferenceable(40) %545)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %55, ptr noundef nonnull align 8 dereferenceable(40) %534, ptr noundef nonnull align 8 dereferenceable(40) %56)
          to label %546 unwind label %591

546:                                              ; preds = %528
  %547 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %548 = load ptr, ptr %547, align 8, !tbaa !24
  %549 = load i32, ptr %53, align 4, !tbaa !17
  %550 = sext i32 %549 to i64
  %551 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %548, i64 %550
  %552 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %551, i32 0, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %54, ptr noundef nonnull align 8 dereferenceable(40) %552, ptr noundef nonnull align 8 dereferenceable(40) %55)
          to label %553 unwind label %595

553:                                              ; preds = %546
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %54) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %55) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %56) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %55) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %59) #4
  %554 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 2
  call void @llvm.lifetime.start.p0(i64 40, ptr %60) #4
  %555 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %556 = load ptr, ptr %555, align 8, !tbaa !24
  %557 = load i32, ptr %53, align 4, !tbaa !17
  %558 = sext i32 %557 to i64
  %559 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %556, i64 %558
  %560 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %559, i32 0, i32 2
  %561 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %562 = load ptr, ptr %561, align 8, !tbaa !24
  %563 = load i32, ptr %53, align 4, !tbaa !17
  %564 = sext i32 %563 to i64
  %565 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %562, i64 %564
  %566 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %565, i32 0, i32 1
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %60, ptr noundef nonnull align 8 dereferenceable(40) %560, ptr noundef nonnull align 8 dereferenceable(40) %566)
  invoke void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %59, ptr noundef nonnull align 4 dereferenceable(4) %554, ptr noundef nonnull align 8 dereferenceable(40) %60)
          to label %567 unwind label %600

567:                                              ; preds = %553
  %568 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %569 = load ptr, ptr %568, align 8, !tbaa !24
  %570 = load i32, ptr %53, align 4, !tbaa !17
  %571 = sext i32 %570 to i64
  %572 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %569, i64 %571
  %573 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %572, i32 0, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %58, ptr noundef nonnull align 8 dereferenceable(40) %573, ptr noundef nonnull align 8 dereferenceable(40) %59)
          to label %574 unwind label %604

574:                                              ; preds = %567
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %58) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %59) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %60) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %60) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %59) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr %62) #4
  %575 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %576 = load ptr, ptr %575, align 8, !tbaa !24
  %577 = load i32, ptr %53, align 4, !tbaa !17
  %578 = sext i32 %577 to i64
  %579 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %576, i64 %578
  %580 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %579, i32 0, i32 1
  call void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %62, ptr noundef nonnull align 8 dereferenceable(280) %65, ptr noundef nonnull align 8 dereferenceable(40) %580)
  %581 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %582 = load ptr, ptr %581, align 8, !tbaa !24
  %583 = load i32, ptr %53, align 4, !tbaa !17
  %584 = sext i32 %583 to i64
  %585 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %582, i64 %584
  %586 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %585, i32 0, i32 3
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %61, ptr noundef nonnull align 8 dereferenceable(40) %586, ptr noundef nonnull align 8 dereferenceable(40) %62)
          to label %587 unwind label %609

587:                                              ; preds = %574
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %61) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %62) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %62) #4
  br label %588

588:                                              ; preds = %587
  %589 = load i32, ptr %53, align 4, !tbaa !17
  %590 = add nsw i32 %589, 1
  store i32 %590, ptr %53, align 4, !tbaa !17
  br label %521, !llvm.loop !32

591:                                              ; preds = %528
  %592 = landingpad { ptr, i32 }
          cleanup
  %593 = extractvalue { ptr, i32 } %592, 0
  store ptr %593, ptr %9, align 8
  %594 = extractvalue { ptr, i32 } %592, 1
  store i32 %594, ptr %10, align 4
  br label %599

595:                                              ; preds = %546
  %596 = landingpad { ptr, i32 }
          cleanup
  %597 = extractvalue { ptr, i32 } %596, 0
  store ptr %597, ptr %9, align 8
  %598 = extractvalue { ptr, i32 } %596, 1
  store i32 %598, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %55) #4
  br label %599

599:                                              ; preds = %595, %591
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %56) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %55) #4
  br label %613

600:                                              ; preds = %553
  %601 = landingpad { ptr, i32 }
          cleanup
  %602 = extractvalue { ptr, i32 } %601, 0
  store ptr %602, ptr %9, align 8
  %603 = extractvalue { ptr, i32 } %601, 1
  store i32 %603, ptr %10, align 4
  br label %608

604:                                              ; preds = %567
  %605 = landingpad { ptr, i32 }
          cleanup
  %606 = extractvalue { ptr, i32 } %605, 0
  store ptr %606, ptr %9, align 8
  %607 = extractvalue { ptr, i32 } %605, 1
  store i32 %607, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %59) #4
  br label %608

608:                                              ; preds = %604, %600
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %60) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %60) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %59) #4
  br label %613

609:                                              ; preds = %574
  %610 = landingpad { ptr, i32 }
          cleanup
  %611 = extractvalue { ptr, i32 } %610, 0
  store ptr %611, ptr %9, align 8
  %612 = extractvalue { ptr, i32 } %610, 1
  store i32 %612, ptr %10, align 4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %62) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %62) #4
  br label %613

613:                                              ; preds = %609, %608, %599
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #4
  br label %642

614:                                              ; preds = %527
  br label %615

615:                                              ; preds = %614, %519
  %616 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %617 = load ptr, ptr %616, align 8, !tbaa !24
  %618 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %617, i64 1
  %619 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %618, i32 0, i32 3
  %620 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %621 = load ptr, ptr %620, align 8, !tbaa !24
  %622 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %621, i64 0
  %623 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %622, i32 0, i32 3
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %63, ptr noundef nonnull align 8 dereferenceable(40) %623, ptr noundef nonnull align 8 dereferenceable(40) %619)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %63) #4
  %624 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %625 = load ptr, ptr %624, align 8, !tbaa !24
  %626 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %627 = load i32, ptr %626, align 4, !tbaa !22
  %628 = sext i32 %627 to i64
  %629 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %625, i64 %628
  %630 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %629, i32 0, i32 3
  %631 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 22
  %632 = load ptr, ptr %631, align 8, !tbaa !24
  %633 = getelementptr inbounds %"class.EulerSolver1D::Solver", ptr %65, i32 0, i32 11
  %634 = load i32, ptr %633, align 4, !tbaa !22
  %635 = add nsw i32 %634, 1
  %636 = sext i32 %635 to i64
  %637 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %632, i64 %636
  %638 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %637, i32 0, i32 3
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind writable sret(%class.Array2D) align 8 %64, ptr noundef nonnull align 8 dereferenceable(40) %638, ptr noundef nonnull align 8 dereferenceable(40) %630)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %64) #4
  br label %639

639:                                              ; preds = %615
  %640 = load i32, ptr %5, align 4, !tbaa !17
  %641 = add nsw i32 %640, 1
  store i32 %641, ptr %5, align 4, !tbaa !17
  br label %127, !llvm.loop !33

642:                                              ; preds = %613, %518, %447, %443, %442, %430, %426, %425, %337, %207
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #4
  br label %649

643:                                              ; preds = %130
  br label %644

644:                                              ; preds = %643
  %645 = load i32, ptr %3, align 4, !tbaa !17
  %646 = add nsw i32 %645, 1
  store i32 %646, ptr %3, align 4, !tbaa !17
  br label %71, !llvm.loop !34

647:                                              ; preds = %81, %74
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #4
  br label %648

648:                                              ; preds = %647
  ret void

649:                                              ; preds = %642
  %650 = load ptr, ptr %9, align 8
  %651 = load i32, ptr %10, align 4
  %652 = insertvalue { ptr, i32 } poison, ptr %650, 0
  %653 = insertvalue { ptr, i32 } %652, i32 %651, 1
  resume { ptr, i32 } %653
}

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZN13EulerSolver1D6Solver8timestepEfffi(ptr noundef nonnull align 8 dereferenceable(280), float noundef, float noundef, float noundef, i32 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) #2 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280), float noundef, float noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40), i32 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN7Array2DIfEaSEf(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), float noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 8 dereferenceable(40)) #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(280), ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(280), ptr noundef nonnull align 8 dereferenceable(40)) #2 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"_ZTSN13EulerSolver1D6SolverE", !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, !11, i64 40, !12, i64 44, !12, i64 48, !12, i64 52, !12, i64 56, !12, i64 60, !12, i64 64, !13, i64 72, !13, i64 112, !13, i64 152, !13, i64 192, !13, i64 232, !6, i64 272}
!11 = !{!"float", !7, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!"_ZTS7Array2DIfE", !12, i64 0, !12, i64 4, !12, i64 8, !12, i64 12, !12, i64 16, !12, i64 20, !14, i64 24, !14, i64 25, !6, i64 32}
!14 = !{!"bool", !7, i64 0}
!15 = !{!10, !11, i64 28}
!16 = !{!10, !12, i64 48}
!17 = !{!12, !12, i64 0}
!18 = !{!10, !11, i64 32}
!19 = !{!10, !11, i64 36}
!20 = !{!10, !11, i64 24}
!21 = !{!10, !11, i64 12}
!22 = !{!10, !12, i64 44}
!23 = !{!10, !11, i64 40}
!24 = !{!10, !6, i64 272}
!25 = !{!11, !11, i64 0}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = distinct !{!28, !27}
!29 = distinct !{!29, !27}
!30 = distinct !{!30, !27}
!31 = distinct !{!31, !27}
!32 = distinct !{!32, !27}
!33 = distinct !{!33, !27}
!34 = distinct !{!34, !27}


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

%class.Array2D = type { i32, i32, i32, i32, i32, i32, i8, i8, ptr }
%"struct.EulerSolver1D::cell_data" = type { float, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D, %class.Array2D }

@.str.3 = external hidden unnamed_addr constant [10 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [8 x i8], align 1

declare i32 @__gxx_personality_v0(...)

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40)) unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13EulerSolver1D6Solver7Euler1DEv(ptr noundef nonnull align 8 dereferenceable(280) %0) local_unnamed_addr #2 align 2 personality ptr @__gxx_personality_v0 {
  %2 = alloca %class.Array2D, align 8
  %3 = alloca %class.Array2D, align 8
  %4 = alloca %class.Array2D, align 8
  %5 = alloca %class.Array2D, align 8
  %6 = alloca %class.Array2D, align 8
  %7 = alloca %class.Array2D, align 8
  %8 = alloca %class.Array2D, align 8
  %9 = alloca %class.Array2D, align 8
  %10 = alloca %class.Array2D, align 8
  %11 = alloca %class.Array2D, align 8
  %12 = alloca %class.Array2D, align 8
  %13 = alloca %class.Array2D, align 8
  %14 = alloca %class.Array2D, align 8
  %15 = alloca %class.Array2D, align 8
  %16 = alloca %class.Array2D, align 8
  %17 = alloca %class.Array2D, align 8
  %18 = alloca %class.Array2D, align 8
  %19 = alloca %class.Array2D, align 8
  %20 = alloca %class.Array2D, align 8
  %21 = alloca %class.Array2D, align 8
  %22 = alloca %class.Array2D, align 8
  %23 = alloca %class.Array2D, align 8
  %24 = alloca %class.Array2D, align 8
  %25 = alloca %class.Array2D, align 8
  %26 = alloca %class.Array2D, align 8
  %27 = alloca %class.Array2D, align 8
  %28 = alloca %class.Array2D, align 8
  %29 = alloca %class.Array2D, align 8
  %30 = alloca %class.Array2D, align 8
  %31 = alloca %class.Array2D, align 8
  %32 = alloca %class.Array2D, align 8
  %33 = alloca %class.Array2D, align 8
  %34 = alloca %class.Array2D, align 8
  %35 = alloca %class.Array2D, align 8
  %36 = alloca %class.Array2D, align 8
  %37 = alloca %class.Array2D, align 8
  %38 = alloca %class.Array2D, align 8
  %39 = alloca float, align 4
  %40 = alloca %class.Array2D, align 8
  %41 = alloca %class.Array2D, align 8
  %42 = alloca %class.Array2D, align 8
  %43 = alloca %class.Array2D, align 8
  %44 = alloca %class.Array2D, align 8
  %45 = alloca float, align 4
  %46 = alloca %class.Array2D, align 8
  %47 = alloca %class.Array2D, align 8
  %48 = alloca %class.Array2D, align 8
  %49 = alloca %class.Array2D, align 8
  %50 = alloca %class.Array2D, align 8
  %51 = alloca %class.Array2D, align 8
  %52 = alloca %class.Array2D, align 8
  %53 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.3)
  %54 = load float, ptr %0, align 8, !tbaa !5
  %55 = getelementptr inbounds i8, ptr %0, i64 28
  store float %54, ptr %55, align 4, !tbaa !14
  %56 = getelementptr inbounds i8, ptr %0, i64 48
  store i32 0, ptr %56, align 8, !tbaa !15
  %57 = getelementptr inbounds i8, ptr %0, i64 32
  %58 = getelementptr inbounds i8, ptr %0, i64 36
  %59 = getelementptr inbounds i8, ptr %0, i64 24
  %60 = getelementptr inbounds i8, ptr %0, i64 12
  %61 = getelementptr inbounds i8, ptr %0, i64 44
  %62 = getelementptr inbounds i8, ptr %0, i64 40
  %63 = getelementptr inbounds i8, ptr %0, i64 272
  %64 = getelementptr inbounds i8, ptr %0, i64 72
  %65 = getelementptr inbounds i8, ptr %0, i64 112
  %66 = getelementptr inbounds i8, ptr %0, i64 8
  %67 = getelementptr inbounds i8, ptr %0, i64 152
  %68 = getelementptr inbounds i8, ptr %0, i64 192
  %69 = getelementptr inbounds i8, ptr %0, i64 232
  br label %70

70:                                               ; preds = %1, %98
  %.070119 = phi i32 [ 0, %1 ], [ %99, %98 ]
  %71 = load float, ptr %55, align 4, !tbaa !14
  %72 = load float, ptr %57, align 8, !tbaa !16
  %73 = fcmp oeq float %71, %72
  br i1 %73, label %74, label %76

74:                                               ; preds = %70
  %75 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.4)
  br label %.loopexit103

76:                                               ; preds = %70
  %77 = load float, ptr %58, align 4, !tbaa !17
  %78 = load float, ptr %59, align 8, !tbaa !18
  %79 = load float, ptr %60, align 4, !tbaa !19
  %80 = load i32, ptr %61, align 4, !tbaa !20
  %81 = call noundef float @_ZN13EulerSolver1D6Solver8timestepEfffi(ptr noundef nonnull align 8 dereferenceable(280) %0, float noundef %77, float noundef %78, float noundef %79, i32 noundef %80)
  store float %81, ptr %62, align 8, !tbaa !21
  %82 = load float, ptr %55, align 4, !tbaa !14
  %83 = fpext float %82 to double
  %84 = fpext float %81 to double
  %85 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.5, double noundef %83, double noundef %84)
  %86 = load float, ptr %55, align 4, !tbaa !14
  %87 = load float, ptr %62, align 8, !tbaa !21
  %88 = fadd float %86, %87
  %89 = load float, ptr %57, align 8, !tbaa !16
  %90 = fcmp ogt float %88, %89
  br i1 %90, label %91, label %93

91:                                               ; preds = %76
  %92 = fsub float %89, %86
  store float %92, ptr %62, align 8, !tbaa !21
  %.pre = fadd float %86, %92
  br label %93

93:                                               ; preds = %91, %76
  %.pre-phi = phi float [ %.pre, %91 ], [ %88, %76 ]
  store float %.pre-phi, ptr %55, align 4, !tbaa !14
  %94 = load i32, ptr %56, align 8, !tbaa !15
  %95 = add nsw i32 %94, 1
  store i32 %95, ptr %56, align 8, !tbaa !15
  br label %.preheader102

.preheader102:                                    ; preds = %93, %.loopexit97
  %96 = phi i1 [ true, %93 ], [ false, %.loopexit97 ]
  %97 = load i32, ptr %61, align 4, !tbaa !20
  %.not105 = icmp slt i32 %97, 1
  br i1 %.not105, label %._crit_edge, label %.lr.ph

98:                                               ; preds = %.loopexit97
  %99 = add nuw nsw i32 %.070119, 1
  %exitcond.not = icmp eq i32 %99, 50000
  br i1 %exitcond.not, label %.loopexit103, label %70, !llvm.loop !22

.preheader101:                                    ; preds = %.loopexit
  %.not72107 = icmp slt i32 %132, 1
  br i1 %.not72107, label %._crit_edge, label %.lr.ph109

.lr.ph:                                           ; preds = %.preheader102, %.loopexit
  %indvars.iv = phi i64 [ %indvars.iv.next, %.loopexit ], [ 1, %.preheader102 ]
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %3) #4
  %100 = load ptr, ptr %63, align 8, !tbaa !24
  %101 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %100, i64 %indvars.iv, i32 3
  %102 = getelementptr %"struct.EulerSolver1D::cell_data", ptr %100, i64 %indvars.iv
  %103 = getelementptr i8, ptr %102, i64 -120
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %3, ptr noundef nonnull align 8 dereferenceable(40) %101, ptr noundef nonnull align 8 dereferenceable(40) %103)
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %2, ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(40) %3)
          to label %104 unwind label %134

104:                                              ; preds = %.lr.ph
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %2) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %3) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %3) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %5) #4
  %105 = load ptr, ptr %63, align 8, !tbaa !24
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %106 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %105, i64 %indvars.iv.next, i32 3
  %107 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %105, i64 %indvars.iv, i32 3
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %5, ptr noundef nonnull align 8 dereferenceable(40) %106, ptr noundef nonnull align 8 dereferenceable(40) %107)
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %4, ptr noundef nonnull align 8 dereferenceable(40) %65, ptr noundef nonnull align 8 dereferenceable(40) %5)
          to label %.loopexit unwind label %136

.loopexit:                                        ; preds = %104
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %4) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %5) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %5) #4
  %108 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %64, i32 noundef 0)
  %109 = load float, ptr %108, align 4, !tbaa !25
  %110 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %65, i32 noundef 0)
  %111 = load float, ptr %110, align 4, !tbaa !25
  %112 = call noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280) %0, float noundef %109, float noundef %111)
  %113 = load ptr, ptr %63, align 8, !tbaa !24
  %114 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %113, i64 %indvars.iv, i32 4
  %115 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %114, i32 noundef 0)
  store float %112, ptr %115, align 4, !tbaa !25
  %116 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %64, i32 noundef 1)
  %117 = load float, ptr %116, align 4, !tbaa !25
  %118 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %65, i32 noundef 1)
  %119 = load float, ptr %118, align 4, !tbaa !25
  %120 = call noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280) %0, float noundef %117, float noundef %119)
  %121 = load ptr, ptr %63, align 8, !tbaa !24
  %122 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %121, i64 %indvars.iv, i32 4
  %123 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %122, i32 noundef 1)
  store float %120, ptr %123, align 4, !tbaa !25
  %124 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %64, i32 noundef 2)
  %125 = load float, ptr %124, align 4, !tbaa !25
  %126 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %65, i32 noundef 2)
  %127 = load float, ptr %126, align 4, !tbaa !25
  %128 = call noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280) %0, float noundef %125, float noundef %127)
  %129 = load ptr, ptr %63, align 8, !tbaa !24
  %130 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %129, i64 %indvars.iv, i32 4
  %131 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40) %130, i32 noundef 2)
  store float %128, ptr %131, align 4, !tbaa !25
  %132 = load i32, ptr %61, align 4, !tbaa !20
  %133 = sext i32 %132 to i64
  %.not.not = icmp slt i64 %indvars.iv, %133
  br i1 %.not.not, label %.lr.ph, label %.preheader101, !llvm.loop !26

134:                                              ; preds = %.lr.ph
  %135 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %3) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %3) #4
  br label %305

136:                                              ; preds = %104
  %137 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %5) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %5) #4
  br label %305

.preheader100:                                    ; preds = %.lr.ph109
  %138 = icmp sgt i32 %142, 1
  br i1 %138, label %.lr.ph111, label %._crit_edge

.lr.ph109:                                        ; preds = %.preheader101, %.lr.ph109
  %indvars.iv122 = phi i64 [ %indvars.iv.next123, %.lr.ph109 ], [ 1, %.preheader101 ]
  %139 = load float, ptr %0, align 8, !tbaa !5
  %140 = load ptr, ptr %63, align 8, !tbaa !24
  %141 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %140, i64 %indvars.iv122, i32 5
  call void @_ZN7Array2DIfEaSEf(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %6, ptr noundef nonnull align 8 dereferenceable(40) %141, float noundef %139)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %6) #4
  %indvars.iv.next123 = add nuw nsw i64 %indvars.iv122, 1
  %142 = load i32, ptr %61, align 4, !tbaa !20
  %143 = sext i32 %142 to i64
  %.not72.not = icmp slt i64 %indvars.iv122, %143
  br i1 %.not72.not, label %.lr.ph109, label %.preheader100, !llvm.loop !27

._crit_edge:                                      ; preds = %167, %.preheader102, %.preheader101, %.preheader100
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %20) #4
  %144 = load ptr, ptr %63, align 8, !tbaa !24
  %145 = getelementptr inbounds i8, ptr %144, i64 296
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %21) #4
  %146 = getelementptr inbounds i8, ptr %144, i64 336
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %21, ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 8 dereferenceable(40) %146)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %20, ptr noundef nonnull align 8 dereferenceable(40) %145, ptr noundef nonnull align 8 dereferenceable(40) %21)
          to label %187 unwind label %213

.lr.ph111:                                        ; preds = %.preheader100, %167
  %indvars.iv125 = phi i64 [ %indvars.iv.next126, %167 ], [ 1, %.preheader100 ]
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %8) #4
  %147 = load ptr, ptr %63, align 8, !tbaa !24
  %148 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %147, i64 %indvars.iv125, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %9) #4
  %149 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %147, i64 %indvars.iv125, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %9, ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 8 dereferenceable(40) %149)
  invoke void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %8, ptr noundef nonnull align 8 dereferenceable(40) %148, ptr noundef nonnull align 8 dereferenceable(40) %9)
          to label %150 unwind label %171

150:                                              ; preds = %.lr.ph111
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %7, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %8)
          to label %151 unwind label %173

151:                                              ; preds = %150
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %7) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %8) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %9) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %9) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %11) #4
  %152 = load ptr, ptr %63, align 8, !tbaa !24
  %indvars.iv.next126 = add nuw nsw i64 %indvars.iv125, 1
  %153 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %152, i64 %indvars.iv.next126, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %12) #4
  %154 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %152, i64 %indvars.iv.next126, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %12, ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 8 dereferenceable(40) %154)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %11, ptr noundef nonnull align 8 dereferenceable(40) %153, ptr noundef nonnull align 8 dereferenceable(40) %12)
          to label %155 unwind label %176

155:                                              ; preds = %151
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %10, ptr noundef nonnull align 8 dereferenceable(40) %68, ptr noundef nonnull align 8 dereferenceable(40) %11)
          to label %156 unwind label %178

156:                                              ; preds = %155
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %10) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %11) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %14) #4
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %14, ptr noundef nonnull align 8 dereferenceable(280) %0, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %68)
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %13, ptr noundef nonnull align 8 dereferenceable(40) %69, ptr noundef nonnull align 8 dereferenceable(40) %14)
          to label %157 unwind label %181

157:                                              ; preds = %156
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %13) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %14) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %14) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %16) #4
  %158 = load ptr, ptr %63, align 8, !tbaa !24
  %159 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %158, i64 %indvars.iv125, i32 5
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %16, ptr noundef nonnull align 8 dereferenceable(40) %159, ptr noundef nonnull align 8 dereferenceable(40) %69)
  %160 = load ptr, ptr %63, align 8, !tbaa !24
  %161 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %160, i64 %indvars.iv125, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %15, ptr noundef nonnull align 8 dereferenceable(40) %161, ptr noundef nonnull align 8 dereferenceable(40) %16)
          to label %162 unwind label %183

162:                                              ; preds = %157
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %16) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %16) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %18) #4
  %163 = load ptr, ptr %63, align 8, !tbaa !24
  %164 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %163, i64 %indvars.iv.next126, i32 5
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %18, ptr noundef nonnull align 8 dereferenceable(40) %164, ptr noundef nonnull align 8 dereferenceable(40) %69)
  %165 = load ptr, ptr %63, align 8, !tbaa !24
  %166 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %165, i64 %indvars.iv.next126, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %17, ptr noundef nonnull align 8 dereferenceable(40) %166, ptr noundef nonnull align 8 dereferenceable(40) %18)
          to label %167 unwind label %185

167:                                              ; preds = %162
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %17) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %18) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %18) #4
  %168 = load i32, ptr %61, align 4, !tbaa !20
  %169 = sext i32 %168 to i64
  %170 = icmp slt i64 %indvars.iv.next126, %169
  br i1 %170, label %.lr.ph111, label %._crit_edge, !llvm.loop !28

171:                                              ; preds = %.lr.ph111
  %172 = landingpad { ptr, i32 }
          cleanup
  br label %175

173:                                              ; preds = %150
  %174 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %8) #4
  br label %175

175:                                              ; preds = %173, %171
  %.pn88 = phi { ptr, i32 } [ %174, %173 ], [ %172, %171 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %9) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %9) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %8) #4
  br label %305

176:                                              ; preds = %151
  %177 = landingpad { ptr, i32 }
          cleanup
  br label %180

178:                                              ; preds = %155
  %179 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %11) #4
  br label %180

180:                                              ; preds = %178, %176
  %.pn90 = phi { ptr, i32 } [ %179, %178 ], [ %177, %176 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %12) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %11) #4
  br label %305

181:                                              ; preds = %156
  %182 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %14) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %14) #4
  br label %305

183:                                              ; preds = %157
  %184 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %16) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %16) #4
  br label %305

185:                                              ; preds = %162
  %186 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %18) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %18) #4
  br label %305

187:                                              ; preds = %._crit_edge
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %19, ptr noundef nonnull align 8 dereferenceable(40) %68, ptr noundef nonnull align 8 dereferenceable(40) %20)
          to label %188 unwind label %215

188:                                              ; preds = %187
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %19) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %20) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %21) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %21) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %20) #4
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %22, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %68)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %22) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %24) #4
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %24, ptr noundef nonnull align 8 dereferenceable(280) %0, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %68)
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %23, ptr noundef nonnull align 8 dereferenceable(40) %69, ptr noundef nonnull align 8 dereferenceable(40) %24)
          to label %189 unwind label %218

189:                                              ; preds = %188
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %23) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %24) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %24) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %26) #4
  %190 = load ptr, ptr %63, align 8, !tbaa !24
  %191 = getelementptr inbounds i8, ptr %190, i64 376
  call void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %26, ptr noundef nonnull align 8 dereferenceable(40) %191, ptr noundef nonnull align 8 dereferenceable(40) %69)
  %192 = load ptr, ptr %63, align 8, !tbaa !24
  %193 = getelementptr inbounds i8, ptr %192, i64 376
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %25, ptr noundef nonnull align 8 dereferenceable(40) %193, ptr noundef nonnull align 8 dereferenceable(40) %26)
          to label %194 unwind label %220

194:                                              ; preds = %189
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %25) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %26) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %26) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %28) #4
  %195 = load ptr, ptr %63, align 8, !tbaa !24
  %196 = load i32, ptr %61, align 4, !tbaa !20
  %197 = sext i32 %196 to i64
  %198 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %195, i64 %197, i32 3
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %29) #4
  %199 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %195, i64 %197, i32 4
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %29, ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 8 dereferenceable(40) %199)
  invoke void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %28, ptr noundef nonnull align 8 dereferenceable(40) %198, ptr noundef nonnull align 8 dereferenceable(40) %29)
          to label %200 unwind label %222

200:                                              ; preds = %194
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %27, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %28)
          to label %201 unwind label %224

201:                                              ; preds = %200
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %27) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %28) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %29) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %29) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %28) #4
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %30, ptr noundef nonnull align 8 dereferenceable(40) %68, ptr noundef nonnull align 8 dereferenceable(40) %67)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %30) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %32) #4
  call void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %32, ptr noundef nonnull align 8 dereferenceable(280) %0, ptr noundef nonnull align 8 dereferenceable(40) %67, ptr noundef nonnull align 8 dereferenceable(40) %68)
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %31, ptr noundef nonnull align 8 dereferenceable(40) %69, ptr noundef nonnull align 8 dereferenceable(40) %32)
          to label %202 unwind label %227

202:                                              ; preds = %201
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %31) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %32) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %32) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %34) #4
  %203 = load ptr, ptr %63, align 8, !tbaa !24
  %204 = load i32, ptr %61, align 4, !tbaa !20
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %203, i64 %205, i32 5
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %34, ptr noundef nonnull align 8 dereferenceable(40) %206, ptr noundef nonnull align 8 dereferenceable(40) %69)
  %207 = load ptr, ptr %63, align 8, !tbaa !24
  %208 = load i32, ptr %61, align 4, !tbaa !20
  %209 = sext i32 %208 to i64
  %210 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %207, i64 %209, i32 5
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %33, ptr noundef nonnull align 8 dereferenceable(40) %210, ptr noundef nonnull align 8 dereferenceable(40) %34)
          to label %211 unwind label %229

211:                                              ; preds = %202
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %33) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %34) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %34) #4
  %212 = load i32, ptr %61, align 4, !tbaa !20
  %.not83115 = icmp slt i32 %212, 1
  br i1 %96, label %.preheader, label %.preheader98

.preheader98:                                     ; preds = %211
  br i1 %.not83115, label %.loopexit97, label %.lr.ph114

.preheader:                                       ; preds = %211
  br i1 %.not83115, label %.loopexit97, label %.lr.ph117

213:                                              ; preds = %._crit_edge
  %214 = landingpad { ptr, i32 }
          cleanup
  br label %217

215:                                              ; preds = %187
  %216 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %20) #4
  br label %217

217:                                              ; preds = %215, %213
  %.pn = phi { ptr, i32 } [ %216, %215 ], [ %214, %213 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %21) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %21) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %20) #4
  br label %305

218:                                              ; preds = %188
  %219 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %24) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %24) #4
  br label %305

220:                                              ; preds = %189
  %221 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %26) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %26) #4
  br label %305

222:                                              ; preds = %194
  %223 = landingpad { ptr, i32 }
          cleanup
  br label %226

224:                                              ; preds = %200
  %225 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %28) #4
  br label %226

226:                                              ; preds = %224, %222
  %.pn74 = phi { ptr, i32 } [ %225, %224 ], [ %223, %222 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %29) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %29) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %28) #4
  br label %305

227:                                              ; preds = %201
  %228 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %32) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %32) #4
  br label %305

229:                                              ; preds = %202
  %230 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %34) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %34) #4
  br label %305

.lr.ph117:                                        ; preds = %.preheader, %249
  %indvars.iv131 = phi i64 [ %indvars.iv.next132, %249 ], [ 1, %.preheader ]
  %231 = load ptr, ptr %63, align 8, !tbaa !24
  %232 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %231, i64 %indvars.iv131
  %233 = getelementptr inbounds i8, ptr %232, i64 8
  %234 = getelementptr inbounds i8, ptr %232, i64 48
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %35, ptr noundef nonnull align 8 dereferenceable(40) %234, ptr noundef nonnull align 8 dereferenceable(40) %233)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %35) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %37) #4
  %235 = load ptr, ptr %63, align 8, !tbaa !24
  %236 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %235, i64 %indvars.iv131, i32 1
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %38) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %39) #4
  %237 = load float, ptr %62, align 8, !tbaa !21
  %238 = load float, ptr %59, align 8, !tbaa !18
  %239 = fdiv float %237, %238
  store float %239, ptr %39, align 4, !tbaa !25
  %240 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %235, i64 %indvars.iv131, i32 5
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %38, ptr noundef nonnull align 4 dereferenceable(4) %39, ptr noundef nonnull align 8 dereferenceable(40) %240)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %37, ptr noundef nonnull align 8 dereferenceable(40) %236, ptr noundef nonnull align 8 dereferenceable(40) %38)
          to label %241 unwind label %252

241:                                              ; preds = %.lr.ph117
  %242 = load ptr, ptr %63, align 8, !tbaa !24
  %243 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %242, i64 %indvars.iv131, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %36, ptr noundef nonnull align 8 dereferenceable(40) %243, ptr noundef nonnull align 8 dereferenceable(40) %37)
          to label %244 unwind label %254

244:                                              ; preds = %241
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %36) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %37) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %38) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %38) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %37) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %41) #4
  %245 = load ptr, ptr %63, align 8, !tbaa !24
  %246 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %245, i64 %indvars.iv131, i32 1
  call void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %41, ptr noundef nonnull align 8 dereferenceable(280) %0, ptr noundef nonnull align 8 dereferenceable(40) %246)
  %247 = load ptr, ptr %63, align 8, !tbaa !24
  %248 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %247, i64 %indvars.iv131, i32 3
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %40, ptr noundef nonnull align 8 dereferenceable(40) %248, ptr noundef nonnull align 8 dereferenceable(40) %41)
          to label %249 unwind label %257

249:                                              ; preds = %244
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %40) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %41) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %41) #4
  %indvars.iv.next132 = add nuw nsw i64 %indvars.iv131, 1
  %250 = load i32, ptr %61, align 4, !tbaa !20
  %251 = sext i32 %250 to i64
  %.not83.not = icmp slt i64 %indvars.iv131, %251
  br i1 %.not83.not, label %.lr.ph117, label %.loopexit97, !llvm.loop !29

252:                                              ; preds = %.lr.ph117
  %253 = landingpad { ptr, i32 }
          cleanup
  br label %256

254:                                              ; preds = %241
  %255 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %37) #4
  br label %256

256:                                              ; preds = %254, %252
  %.pn84 = phi { ptr, i32 } [ %255, %254 ], [ %253, %252 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %38) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %39) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %38) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %37) #4
  br label %305

257:                                              ; preds = %244
  %258 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %41) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %41) #4
  br label %305

.lr.ph114:                                        ; preds = %.preheader98, %281
  %indvars.iv128 = phi i64 [ %indvars.iv.next129, %281 ], [ 1, %.preheader98 ]
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %43) #4
  %259 = load ptr, ptr %63, align 8, !tbaa !24
  %260 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %259, i64 %indvars.iv128, i32 1
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %44) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %45) #4
  %261 = load float, ptr %62, align 8, !tbaa !21
  %262 = load float, ptr %59, align 8, !tbaa !18
  %263 = fdiv float %261, %262
  store float %263, ptr %45, align 4, !tbaa !25
  %264 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %259, i64 %indvars.iv128, i32 5
  call void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %44, ptr noundef nonnull align 4 dereferenceable(4) %45, ptr noundef nonnull align 8 dereferenceable(40) %264)
  invoke void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %43, ptr noundef nonnull align 8 dereferenceable(40) %260, ptr noundef nonnull align 8 dereferenceable(40) %44)
          to label %265 unwind label %284

265:                                              ; preds = %.lr.ph114
  %266 = load ptr, ptr %63, align 8, !tbaa !24
  %267 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %266, i64 %indvars.iv128, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %42, ptr noundef nonnull align 8 dereferenceable(40) %267, ptr noundef nonnull align 8 dereferenceable(40) %43)
          to label %268 unwind label %286

268:                                              ; preds = %265
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %42) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %43) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %45) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %44) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %43) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %47) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %48) #4
  %269 = load ptr, ptr %63, align 8, !tbaa !24
  %270 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %269, i64 %indvars.iv128
  %271 = getelementptr inbounds i8, ptr %270, i64 48
  %272 = getelementptr inbounds i8, ptr %270, i64 8
  call void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %48, ptr noundef nonnull align 8 dereferenceable(40) %271, ptr noundef nonnull align 8 dereferenceable(40) %272)
  invoke void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %47, ptr noundef nonnull align 4 dereferenceable(4) %66, ptr noundef nonnull align 8 dereferenceable(40) %48)
          to label %273 unwind label %289

273:                                              ; preds = %268
  %274 = load ptr, ptr %63, align 8, !tbaa !24
  %275 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %274, i64 %indvars.iv128, i32 1
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %46, ptr noundef nonnull align 8 dereferenceable(40) %275, ptr noundef nonnull align 8 dereferenceable(40) %47)
          to label %276 unwind label %291

276:                                              ; preds = %273
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %46) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %47) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %48) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %48) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %47) #4
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %50) #4
  %277 = load ptr, ptr %63, align 8, !tbaa !24
  %278 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %277, i64 %indvars.iv128, i32 1
  call void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %50, ptr noundef nonnull align 8 dereferenceable(280) %0, ptr noundef nonnull align 8 dereferenceable(40) %278)
  %279 = load ptr, ptr %63, align 8, !tbaa !24
  %280 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %279, i64 %indvars.iv128, i32 3
  invoke void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %49, ptr noundef nonnull align 8 dereferenceable(40) %280, ptr noundef nonnull align 8 dereferenceable(40) %50)
          to label %281 unwind label %294

281:                                              ; preds = %276
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %49) #4
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %50) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %50) #4
  %indvars.iv.next129 = add nuw nsw i64 %indvars.iv128, 1
  %282 = load i32, ptr %61, align 4, !tbaa !20
  %283 = sext i32 %282 to i64
  %.not76.not = icmp slt i64 %indvars.iv128, %283
  br i1 %.not76.not, label %.lr.ph114, label %.loopexit97, !llvm.loop !30

284:                                              ; preds = %.lr.ph114
  %285 = landingpad { ptr, i32 }
          cleanup
  br label %288

286:                                              ; preds = %265
  %287 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %43) #4
  br label %288

288:                                              ; preds = %286, %284
  %.pn77 = phi { ptr, i32 } [ %287, %286 ], [ %285, %284 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %45) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %44) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %43) #4
  br label %305

289:                                              ; preds = %268
  %290 = landingpad { ptr, i32 }
          cleanup
  br label %293

291:                                              ; preds = %273
  %292 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %47) #4
  br label %293

293:                                              ; preds = %291, %289
  %.pn79 = phi { ptr, i32 } [ %292, %291 ], [ %290, %289 ]
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %48) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %48) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %47) #4
  br label %305

294:                                              ; preds = %276
  %295 = landingpad { ptr, i32 }
          cleanup
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %50) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %50) #4
  br label %305

.loopexit97:                                      ; preds = %281, %249, %.preheader98, %.preheader
  %296 = load ptr, ptr %63, align 8, !tbaa !24
  %297 = getelementptr inbounds i8, ptr %296, i64 296
  %298 = getelementptr inbounds i8, ptr %296, i64 88
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %51, ptr noundef nonnull align 8 dereferenceable(40) %298, ptr noundef nonnull align 8 dereferenceable(40) %297)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %51) #4
  %299 = load ptr, ptr %63, align 8, !tbaa !24
  %300 = load i32, ptr %61, align 4, !tbaa !20
  %301 = sext i32 %300 to i64
  %302 = getelementptr inbounds %"struct.EulerSolver1D::cell_data", ptr %299, i64 %301, i32 3
  %303 = getelementptr %"struct.EulerSolver1D::cell_data", ptr %299, i64 %301
  %304 = getelementptr i8, ptr %303, i64 296
  call void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind nonnull writable sret(%class.Array2D) align 8 %52, ptr noundef nonnull align 8 dereferenceable(40) %304, ptr noundef nonnull align 8 dereferenceable(40) %302)
  call void @_ZN7Array2DIfED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %52) #4
  br i1 %96, label %.preheader102, label %98, !llvm.loop !31

305:                                              ; preds = %288, %293, %294, %256, %257, %175, %180, %181, %183, %185, %134, %136, %229, %227, %226, %220, %218, %217
  %.pn94.pn = phi { ptr, i32 } [ %230, %229 ], [ %228, %227 ], [ %.pn74, %226 ], [ %221, %220 ], [ %219, %218 ], [ %.pn, %217 ], [ %137, %136 ], [ %135, %134 ], [ %186, %185 ], [ %184, %183 ], [ %182, %181 ], [ %.pn90, %180 ], [ %.pn88, %175 ], [ %258, %257 ], [ %.pn84, %256 ], [ %295, %294 ], [ %.pn79, %293 ], [ %.pn77, %288 ]
  resume { ptr, i32 } %.pn94.pn

.loopexit103:                                     ; preds = %98, %74
  ret void
}

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZN13EulerSolver1D6Solver8timestepEfffi(ptr noundef nonnull align 8 dereferenceable(280), float noundef, float noundef, float noundef, i32 noundef) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZmiIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN7Array2DIfEaSERKS0_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local noundef float @_ZN13EulerSolver1D6Solver6minmodEff(ptr noundef nonnull align 8 dereferenceable(280), float noundef, float noundef) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIfEclEi(ptr noundef nonnull align 8 dereferenceable(40), i32 noundef) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN7Array2DIfEaSEf(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), float noundef) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZplIfE7Array2DIT_ERKS2_S4_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZmlIfE7Array2DIT_ERKS1_RKS2_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 4 dereferenceable(4), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13EulerSolver1D6Solver8roe_fluxER7Array2DIfES3_(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(280), ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13EulerSolver1D6Solver3u2wER7Array2DIfE(ptr dead_on_unwind noalias writable sret(%class.Array2D) align 8, ptr noundef nonnull align 8 dereferenceable(280), ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #2 align 2

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTSN13EulerSolver1D6SolverE", !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, !7, i64 40, !10, i64 44, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !11, i64 72, !11, i64 112, !11, i64 152, !11, i64 192, !11, i64 232, !13, i64 272}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"_ZTS7Array2DIfE", !10, i64 0, !10, i64 4, !10, i64 8, !10, i64 12, !10, i64 16, !10, i64 20, !12, i64 24, !12, i64 25, !13, i64 32}
!12 = !{!"bool", !8, i64 0}
!13 = !{!"any pointer", !8, i64 0}
!14 = !{!6, !7, i64 28}
!15 = !{!6, !10, i64 48}
!16 = !{!6, !7, i64 32}
!17 = !{!6, !7, i64 36}
!18 = !{!6, !7, i64 24}
!19 = !{!6, !7, i64 12}
!20 = !{!6, !10, i64 44}
!21 = !{!6, !7, i64 40}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!6, !13, i64 272}
!25 = !{!7, !7, i64 0}
!26 = distinct !{!26, !23}
!27 = distinct !{!27, !23}
!28 = distinct !{!28, !23}
!29 = distinct !{!29, !23}
!30 = distinct !{!30, !23}
!31 = distinct !{!31, !23}


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