; LLVM IR from LukeMcCulloch/cfd_solvers_cpp :: src/EulerUnsteady2D_basic_package.ll (ZN13EulerSolver2D10MainData2D10compute_arEv)

; 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.std::basic_ostream" = type { ptr, %"class.std::basic_ios" }
%"class.std::basic_ios" = type { %"class.std::ios_base", ptr, i8, i8, ptr, ptr, ptr, ptr }
%"class.std::ios_base" = type { ptr, i64, i64, i32, i32, i32, ptr, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, ptr, %"class.std::locale" }
%"struct.std::ios_base::_Words" = type { ptr, i64 }
%"class.std::locale" = type { ptr }
%class.Array2D.4 = type { i32, i32, i32, i32, i32, i32, i8, i8, ptr }
%"class.EulerSolver2D::MainData2D" = type { %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", i64, %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", double, %"class.std::__cxx11::basic_string", %"class.std::__cxx11::basic_string", i64, double, double, double, double, double, double, double, double, i64, ptr, i64, i64, i64, ptr, i64, ptr, i64, ptr, i64, ptr, i64 }
%"class.std::__cxx11::basic_string" = type { %"struct.std::__cxx11::basic_string<char>::_Alloc_hider", i64, %union.anon }
%"struct.std::__cxx11::basic_string<char>::_Alloc_hider" = type { ptr }
%union.anon = type { i64, [8 x i8] }
%"class.EulerSolver2D::node_type" = type { double, double, i32, ptr, i32, %class.Vector1D, double, i32, i32, ptr, double, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, ptr, ptr, ptr }
%class.Vector1D = type { %"class.std::vector" }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.EulerSolver2D::elm_type" = type <{ i32, [4 x i8], ptr, i32, [4 x i8], ptr, double, double, double, ptr, ptr, ptr, ptr, ptr, double, double, i32, i32, %class.Vector1D, double, ptr, ptr, i32, [4 x i8] }>

@_ZSt4cout = external global %"class.std::basic_ostream", align 8
@.str.7 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.126 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.127 = external hidden unnamed_addr constant [59 x i8], align 1
@.str.128 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.129 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.130 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.131 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.132 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.133 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.134 = external hidden unnamed_addr constant [58 x i8], align 1

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

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) #1

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEPFRSoS_E(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) #2 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(ptr noundef nonnull align 8 dereferenceable(8)) #1

declare i32 @__gxx_personality_v0(...)

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

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

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8), double noundef) #2 align 2

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

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef double @_ZSt3absd(double noundef) #6

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #6

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #6

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13EulerSolver2D10MainData2D10compute_arEv(ptr noundef nonnull align 8 dereferenceable(512) %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 double, align 8
  %7 = alloca double, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca i32, align 4
  %11 = alloca double, align 8
  %12 = alloca double, align 8
  %13 = alloca double, align 8
  %14 = alloca double, align 8
  %15 = alloca %class.Array2D.4, align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca i32, align 4
  %19 = alloca i64, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca i64, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  store ptr %0, ptr %2, align 8, !tbaa !5
  %30 = load ptr, ptr %2, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr %15) #7
  call void @_ZN7Array2DIdEC2Eii(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 4, i32 noundef 1)
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #7
  store i64 0, ptr %16, align 8, !tbaa !9
  br label %31

31:                                               ; preds = %43, %1
  %32 = load i64, ptr %16, align 8, !tbaa !9
  %33 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 21
  %34 = load i64, ptr %33, align 8, !tbaa !11
  %35 = icmp ult i64 %32, %34
  br i1 %35, label %37, label %36

36:                                               ; preds = %31
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #7
  br label %46

37:                                               ; preds = %31
  %38 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %39 = load ptr, ptr %38, align 8, !tbaa !16
  %40 = load i64, ptr %16, align 8, !tbaa !9
  %41 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %39, i64 %40
  %42 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %41, i32 0, i32 10
  store double 0.000000e+00, ptr %42, align 8, !tbaa !17
  br label %43

43:                                               ; preds = %37
  %44 = load i64, ptr %16, align 8, !tbaa !9
  %45 = add i64 %44, 1
  store i64 %45, ptr %16, align 8, !tbaa !9
  br label %31, !llvm.loop !25

46:                                               ; preds = %36
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  store i64 0, ptr %17, align 8, !tbaa !9
  br label %47

47:                                               ; preds = %366, %46
  %48 = load i64, ptr %17, align 8, !tbaa !9
  %49 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 25
  %50 = load i64, ptr %49, align 8, !tbaa !27
  %51 = icmp ult i64 %48, %50
  br i1 %51, label %53, label %52

52:                                               ; preds = %47
  store i32 5, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  br label %370

53:                                               ; preds = %47
  store double -1.000000e+00, ptr %11, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  store i64 0, ptr %19, align 8, !tbaa !9
  br label %54

54:                                               ; preds = %189, %53
  %55 = load i64, ptr %19, align 8, !tbaa !9
  %56 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %57 = load ptr, ptr %56, align 8, !tbaa !29
  %58 = load i64, ptr %17, align 8, !tbaa !9
  %59 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %57, i64 %58
  %60 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %59, i32 0, i32 0
  %61 = load i32, ptr %60, align 8, !tbaa !30
  %62 = sext i32 %61 to i64
  %63 = icmp ult i64 %55, %62
  br i1 %63, label %65, label %64

64:                                               ; preds = %54
  store i32 8, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  br label %192

65:                                               ; preds = %54
  %66 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %67 = load ptr, ptr %66, align 8, !tbaa !29
  %68 = load i64, ptr %17, align 8, !tbaa !9
  %69 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %67, i64 %68
  %70 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %69, i32 0, i32 2
  %71 = load ptr, ptr %70, align 8, !tbaa !32
  %72 = load i64, ptr %19, align 8, !tbaa !9
  %73 = trunc i64 %72 to i32
  %74 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIiEclEi(ptr noundef nonnull align 8 dereferenceable(40) %71, i32 noundef %73)
          to label %75 unwind label %97

75:                                               ; preds = %65
  %76 = load i32, ptr %74, align 4, !tbaa !33
  store i32 %76, ptr %4, align 4, !tbaa !33
  %77 = load i64, ptr %19, align 8, !tbaa !9
  %78 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %79 = load ptr, ptr %78, align 8, !tbaa !29
  %80 = load i64, ptr %17, align 8, !tbaa !9
  %81 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %79, i64 %80
  %82 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %81, i32 0, i32 0
  %83 = load i32, ptr %82, align 8, !tbaa !30
  %84 = sub nsw i32 %83, 1
  %85 = sext i32 %84 to i64
  %86 = icmp eq i64 %77, %85
  br i1 %86, label %87, label %101

87:                                               ; preds = %75
  %88 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %89 = load ptr, ptr %88, align 8, !tbaa !29
  %90 = load i64, ptr %17, align 8, !tbaa !9
  %91 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %89, i64 %90
  %92 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %91, i32 0, i32 2
  %93 = load ptr, ptr %92, align 8, !tbaa !32
  %94 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIiEclEi(ptr noundef nonnull align 8 dereferenceable(40) %93, i32 noundef 0)
          to label %95 unwind label %97

95:                                               ; preds = %87
  %96 = load i32, ptr %94, align 4, !tbaa !33
  store i32 %96, ptr %5, align 4, !tbaa !33
  br label %114

97:                                               ; preds = %185, %181, %114, %101, %87, %65
  %98 = landingpad { ptr, i32 }
          cleanup
  %99 = extractvalue { ptr, i32 } %98, 0
  store ptr %99, ptr %20, align 8
  %100 = extractvalue { ptr, i32 } %98, 1
  store i32 %100, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  br label %369

101:                                              ; preds = %75
  %102 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %103 = load ptr, ptr %102, align 8, !tbaa !29
  %104 = load i64, ptr %17, align 8, !tbaa !9
  %105 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %103, i64 %104
  %106 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %105, i32 0, i32 2
  %107 = load ptr, ptr %106, align 8, !tbaa !32
  %108 = load i64, ptr %19, align 8, !tbaa !9
  %109 = add i64 %108, 1
  %110 = trunc i64 %109 to i32
  %111 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIiEclEi(ptr noundef nonnull align 8 dereferenceable(40) %107, i32 noundef %110)
          to label %112 unwind label %97

112:                                              ; preds = %101
  %113 = load i32, ptr %111, align 4, !tbaa !33
  store i32 %113, ptr %5, align 4, !tbaa !33
  br label %114

114:                                              ; preds = %112, %95
  %115 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %116 = load ptr, ptr %115, align 8, !tbaa !16
  %117 = load i32, ptr %5, align 4, !tbaa !33
  %118 = sext i32 %117 to i64
  %119 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %116, i64 %118
  %120 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %119, i32 0, i32 0
  %121 = load double, ptr %120, align 8, !tbaa !34
  %122 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %123 = load ptr, ptr %122, align 8, !tbaa !16
  %124 = load i32, ptr %4, align 4, !tbaa !33
  %125 = sext i32 %124 to i64
  %126 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %123, i64 %125
  %127 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %126, i32 0, i32 0
  %128 = load double, ptr %127, align 8, !tbaa !34
  %129 = fsub double %121, %128
  %130 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %131 = load ptr, ptr %130, align 8, !tbaa !16
  %132 = load i32, ptr %5, align 4, !tbaa !33
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %131, i64 %133
  %135 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %134, i32 0, i32 0
  %136 = load double, ptr %135, align 8, !tbaa !34
  %137 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %138 = load ptr, ptr %137, align 8, !tbaa !16
  %139 = load i32, ptr %4, align 4, !tbaa !33
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %138, i64 %140
  %142 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %141, i32 0, i32 0
  %143 = load double, ptr %142, align 8, !tbaa !34
  %144 = fsub double %136, %143
  %145 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %146 = load ptr, ptr %145, align 8, !tbaa !16
  %147 = load i32, ptr %5, align 4, !tbaa !33
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %146, i64 %148
  %150 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %149, i32 0, i32 1
  %151 = load double, ptr %150, align 8, !tbaa !35
  %152 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %153 = load ptr, ptr %152, align 8, !tbaa !16
  %154 = load i32, ptr %4, align 4, !tbaa !33
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %153, i64 %155
  %157 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %156, i32 0, i32 1
  %158 = load double, ptr %157, align 8, !tbaa !35
  %159 = fsub double %151, %158
  %160 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %161 = load ptr, ptr %160, align 8, !tbaa !16
  %162 = load i32, ptr %5, align 4, !tbaa !33
  %163 = sext i32 %162 to i64
  %164 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %161, i64 %163
  %165 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %164, i32 0, i32 1
  %166 = load double, ptr %165, align 8, !tbaa !35
  %167 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %168 = load ptr, ptr %167, align 8, !tbaa !16
  %169 = load i32, ptr %4, align 4, !tbaa !33
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %168, i64 %170
  %172 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %171, i32 0, i32 1
  %173 = load double, ptr %172, align 8, !tbaa !35
  %174 = fsub double %166, %173
  %175 = fmul double %159, %174
  %176 = call double @llvm.fmuladd.f64(double %129, double %144, double %175)
  %177 = call double @sqrt(double noundef %176) #7
  %178 = load i64, ptr %19, align 8, !tbaa !9
  %179 = trunc i64 %178 to i32
  %180 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef %179)
          to label %181 unwind label %97

181:                                              ; preds = %114
  store double %177, ptr %180, align 8, !tbaa !28
  %182 = load i64, ptr %19, align 8, !tbaa !9
  %183 = trunc i64 %182 to i32
  %184 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef %183)
          to label %185 unwind label %97

185:                                              ; preds = %181
  %186 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %11, ptr noundef nonnull align 8 dereferenceable(8) %184)
          to label %187 unwind label %97

187:                                              ; preds = %185
  %188 = load double, ptr %186, align 8, !tbaa !28
  store double %188, ptr %11, align 8, !tbaa !28
  br label %189

189:                                              ; preds = %187
  %190 = load i64, ptr %19, align 8, !tbaa !9
  %191 = add i64 %190, 1
  store i64 %191, ptr %19, align 8, !tbaa !9
  br label %54, !llvm.loop !36

192:                                              ; preds = %64
  %193 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %194 = load ptr, ptr %193, align 8, !tbaa !29
  %195 = load i64, ptr %17, align 8, !tbaa !9
  %196 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %194, i64 %195
  %197 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %196, i32 0, i32 0
  %198 = load i32, ptr %197, align 8, !tbaa !30
  %199 = icmp eq i32 %198, 3
  br i1 %199, label %200, label %349

200:                                              ; preds = %192
  %201 = load double, ptr %11, align 8, !tbaa !28
  %202 = fmul double 5.000000e-01, %201
  %203 = load double, ptr %11, align 8, !tbaa !28
  %204 = fmul double %202, %203
  %205 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %206 = load ptr, ptr %205, align 8, !tbaa !29
  %207 = load i64, ptr %17, align 8, !tbaa !9
  %208 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %206, i64 %207
  %209 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %208, i32 0, i32 8
  %210 = load double, ptr %209, align 8, !tbaa !37
  %211 = fdiv double %204, %210
  %212 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %213 = load ptr, ptr %212, align 8, !tbaa !29
  %214 = load i64, ptr %17, align 8, !tbaa !9
  %215 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %213, i64 %214
  %216 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %215, i32 0, i32 19
  store double %211, ptr %216, align 8, !tbaa !38
  %217 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %218 unwind label %250

218:                                              ; preds = %200
  %219 = load double, ptr %217, align 8, !tbaa !28
  %220 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %221 unwind label %250

221:                                              ; preds = %218
  %222 = load double, ptr %220, align 8, !tbaa !28
  %223 = fcmp oge double %219, %222
  br i1 %223, label %224, label %262

224:                                              ; preds = %221
  %225 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %226 unwind label %250

226:                                              ; preds = %224
  %227 = load double, ptr %225, align 8, !tbaa !28
  %228 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %229 unwind label %250

229:                                              ; preds = %226
  %230 = load double, ptr %228, align 8, !tbaa !28
  %231 = fcmp oge double %227, %230
  br i1 %231, label %232, label %262

232:                                              ; preds = %229
  %233 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %234 unwind label %250

234:                                              ; preds = %232
  %235 = load double, ptr %233, align 8, !tbaa !28
  store double %235, ptr %11, align 8, !tbaa !28
  %236 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %237 unwind label %250

237:                                              ; preds = %234
  %238 = load double, ptr %236, align 8, !tbaa !28
  %239 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %240 unwind label %250

240:                                              ; preds = %237
  %241 = load double, ptr %239, align 8, !tbaa !28
  %242 = fcmp oge double %238, %241
  br i1 %242, label %243, label %254

243:                                              ; preds = %240
  %244 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %245 unwind label %250

245:                                              ; preds = %243
  %246 = load double, ptr %244, align 8, !tbaa !28
  store double %246, ptr %12, align 8, !tbaa !28
  %247 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %248 unwind label %250

248:                                              ; preds = %245
  %249 = load double, ptr %247, align 8, !tbaa !28
  store double %249, ptr %13, align 8, !tbaa !28
  br label %261

250:                                              ; preds = %324, %322, %317, %315, %309, %306, %304, %298, %296, %291, %289, %283, %280, %278, %272, %270, %264, %262, %256, %254, %245, %243, %237, %234, %232, %226, %224, %218, %200
  %251 = landingpad { ptr, i32 }
          cleanup
  %252 = extractvalue { ptr, i32 } %251, 0
  store ptr %252, ptr %20, align 8
  %253 = extractvalue { ptr, i32 } %251, 1
  store i32 %253, ptr %21, align 4
  br label %369

254:                                              ; preds = %240
  %255 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %256 unwind label %250

256:                                              ; preds = %254
  %257 = load double, ptr %255, align 8, !tbaa !28
  store double %257, ptr %12, align 8, !tbaa !28
  %258 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %259 unwind label %250

259:                                              ; preds = %256
  %260 = load double, ptr %258, align 8, !tbaa !28
  store double %260, ptr %13, align 8, !tbaa !28
  br label %261

261:                                              ; preds = %259, %248
  br label %331

262:                                              ; preds = %229, %221
  %263 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %264 unwind label %250

264:                                              ; preds = %262
  %265 = load double, ptr %263, align 8, !tbaa !28
  %266 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %267 unwind label %250

267:                                              ; preds = %264
  %268 = load double, ptr %266, align 8, !tbaa !28
  %269 = fcmp oge double %265, %268
  br i1 %269, label %270, label %304

270:                                              ; preds = %267
  %271 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %272 unwind label %250

272:                                              ; preds = %270
  %273 = load double, ptr %271, align 8, !tbaa !28
  %274 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %275 unwind label %250

275:                                              ; preds = %272
  %276 = load double, ptr %274, align 8, !tbaa !28
  %277 = fcmp oge double %273, %276
  br i1 %277, label %278, label %304

278:                                              ; preds = %275
  %279 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %280 unwind label %250

280:                                              ; preds = %278
  %281 = load double, ptr %279, align 8, !tbaa !28
  store double %281, ptr %11, align 8, !tbaa !28
  %282 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %283 unwind label %250

283:                                              ; preds = %280
  %284 = load double, ptr %282, align 8, !tbaa !28
  %285 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %286 unwind label %250

286:                                              ; preds = %283
  %287 = load double, ptr %285, align 8, !tbaa !28
  %288 = fcmp oge double %284, %287
  br i1 %288, label %289, label %296

289:                                              ; preds = %286
  %290 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %291 unwind label %250

291:                                              ; preds = %289
  %292 = load double, ptr %290, align 8, !tbaa !28
  store double %292, ptr %12, align 8, !tbaa !28
  %293 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %294 unwind label %250

294:                                              ; preds = %291
  %295 = load double, ptr %293, align 8, !tbaa !28
  store double %295, ptr %13, align 8, !tbaa !28
  br label %303

296:                                              ; preds = %286
  %297 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %298 unwind label %250

298:                                              ; preds = %296
  %299 = load double, ptr %297, align 8, !tbaa !28
  store double %299, ptr %12, align 8, !tbaa !28
  %300 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %301 unwind label %250

301:                                              ; preds = %298
  %302 = load double, ptr %300, align 8, !tbaa !28
  store double %302, ptr %13, align 8, !tbaa !28
  br label %303

303:                                              ; preds = %301, %294
  br label %330

304:                                              ; preds = %275, %267
  %305 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 2)
          to label %306 unwind label %250

306:                                              ; preds = %304
  %307 = load double, ptr %305, align 8, !tbaa !28
  store double %307, ptr %11, align 8, !tbaa !28
  %308 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %309 unwind label %250

309:                                              ; preds = %306
  %310 = load double, ptr %308, align 8, !tbaa !28
  %311 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %312 unwind label %250

312:                                              ; preds = %309
  %313 = load double, ptr %311, align 8, !tbaa !28
  %314 = fcmp oge double %310, %313
  br i1 %314, label %315, label %322

315:                                              ; preds = %312
  %316 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %317 unwind label %250

317:                                              ; preds = %315
  %318 = load double, ptr %316, align 8, !tbaa !28
  store double %318, ptr %12, align 8, !tbaa !28
  %319 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %320 unwind label %250

320:                                              ; preds = %317
  %321 = load double, ptr %319, align 8, !tbaa !28
  store double %321, ptr %13, align 8, !tbaa !28
  br label %329

322:                                              ; preds = %312
  %323 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 1)
          to label %324 unwind label %250

324:                                              ; preds = %322
  %325 = load double, ptr %323, align 8, !tbaa !28
  store double %325, ptr %12, align 8, !tbaa !28
  %326 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %15, i32 noundef 0)
          to label %327 unwind label %250

327:                                              ; preds = %324
  %328 = load double, ptr %326, align 8, !tbaa !28
  store double %328, ptr %13, align 8, !tbaa !28
  br label %329

329:                                              ; preds = %327, %320
  br label %330

330:                                              ; preds = %329, %303
  br label %331

331:                                              ; preds = %330, %261
  %332 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %333 = load ptr, ptr %332, align 8, !tbaa !29
  %334 = load i64, ptr %17, align 8, !tbaa !9
  %335 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %333, i64 %334
  %336 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %335, i32 0, i32 8
  %337 = load double, ptr %336, align 8, !tbaa !37
  %338 = fmul double 2.000000e+00, %337
  %339 = load double, ptr %12, align 8, !tbaa !28
  %340 = fdiv double %338, %339
  store double %340, ptr %14, align 8, !tbaa !28
  %341 = load double, ptr %12, align 8, !tbaa !28
  %342 = load double, ptr %14, align 8, !tbaa !28
  %343 = fdiv double %341, %342
  %344 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %345 = load ptr, ptr %344, align 8, !tbaa !29
  %346 = load i64, ptr %17, align 8, !tbaa !9
  %347 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %345, i64 %346
  %348 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %347, i32 0, i32 19
  store double %343, ptr %348, align 8, !tbaa !38
  br label %365

349:                                              ; preds = %192
  %350 = load double, ptr %11, align 8, !tbaa !28
  %351 = load double, ptr %11, align 8, !tbaa !28
  %352 = fmul double %350, %351
  %353 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %354 = load ptr, ptr %353, align 8, !tbaa !29
  %355 = load i64, ptr %17, align 8, !tbaa !9
  %356 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %354, i64 %355
  %357 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %356, i32 0, i32 8
  %358 = load double, ptr %357, align 8, !tbaa !37
  %359 = fdiv double %352, %358
  %360 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %361 = load ptr, ptr %360, align 8, !tbaa !29
  %362 = load i64, ptr %17, align 8, !tbaa !9
  %363 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %361, i64 %362
  %364 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %363, i32 0, i32 19
  store double %359, ptr %364, align 8, !tbaa !38
  br label %365

365:                                              ; preds = %349, %331
  br label %366

366:                                              ; preds = %365
  %367 = load i64, ptr %17, align 8, !tbaa !9
  %368 = add i64 %367, 1
  store i64 %368, ptr %17, align 8, !tbaa !9
  br label %47, !llvm.loop !39

369:                                              ; preds = %250, %97
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  br label %658

370:                                              ; preds = %52
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  store i64 0, ptr %22, align 8, !tbaa !9
  br label %371

371:                                              ; preds = %450, %370
  %372 = load i64, ptr %22, align 8, !tbaa !9
  %373 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 21
  %374 = load i64, ptr %373, align 8, !tbaa !11
  %375 = icmp ult i64 %372, %374
  br i1 %375, label %377, label %376

376:                                              ; preds = %371
  store i32 11, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %453

377:                                              ; preds = %371
  %378 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %379 = load ptr, ptr %378, align 8, !tbaa !16
  %380 = load i64, ptr %22, align 8, !tbaa !9
  %381 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %379, i64 %380
  %382 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %381, i32 0, i32 10
  store double 0.000000e+00, ptr %382, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #7
  store i64 0, ptr %23, align 8, !tbaa !9
  br label %383

383:                                              ; preds = %423, %377
  %384 = load i64, ptr %23, align 8, !tbaa !9
  %385 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %386 = load ptr, ptr %385, align 8, !tbaa !16
  %387 = load i64, ptr %22, align 8, !tbaa !9
  %388 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %386, i64 %387
  %389 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %388, i32 0, i32 4
  %390 = load i32, ptr %389, align 8, !tbaa !40
  %391 = sext i32 %390 to i64
  %392 = icmp ult i64 %384, %391
  br i1 %392, label %394, label %393

393:                                              ; preds = %383
  store i32 14, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  br label %430

394:                                              ; preds = %383
  %395 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %396 = load ptr, ptr %395, align 8, !tbaa !16
  %397 = load i64, ptr %22, align 8, !tbaa !9
  %398 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %396, i64 %397
  %399 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %398, i32 0, i32 10
  %400 = load double, ptr %399, align 8, !tbaa !17
  %401 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 26
  %402 = load ptr, ptr %401, align 8, !tbaa !29
  %403 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %404 = load ptr, ptr %403, align 8, !tbaa !16
  %405 = load i64, ptr %22, align 8, !tbaa !9
  %406 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %404, i64 %405
  %407 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %406, i32 0, i32 5
  %408 = load i64, ptr %23, align 8, !tbaa !9
  %409 = trunc i64 %408 to i32
  %410 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN8Vector1DIiEclEi(ptr noundef nonnull align 8 dereferenceable(24) %407, i32 noundef %409)
          to label %411 unwind label %426

411:                                              ; preds = %394
  %412 = load i32, ptr %410, align 4, !tbaa !33
  %413 = sext i32 %412 to i64
  %414 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %402, i64 %413
  %415 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %414, i32 0, i32 19
  %416 = load double, ptr %415, align 8, !tbaa !38
  %417 = fadd double %400, %416
  %418 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %419 = load ptr, ptr %418, align 8, !tbaa !16
  %420 = load i64, ptr %22, align 8, !tbaa !9
  %421 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %419, i64 %420
  %422 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %421, i32 0, i32 10
  store double %417, ptr %422, align 8, !tbaa !17
  br label %423

423:                                              ; preds = %411
  %424 = load i64, ptr %23, align 8, !tbaa !9
  %425 = add i64 %424, 1
  store i64 %425, ptr %23, align 8, !tbaa !9
  br label %383, !llvm.loop !41

426:                                              ; preds = %394
  %427 = landingpad { ptr, i32 }
          cleanup
  %428 = extractvalue { ptr, i32 } %427, 0
  store ptr %428, ptr %20, align 8
  %429 = extractvalue { ptr, i32 } %427, 1
  store i32 %429, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %658

430:                                              ; preds = %393
  %431 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %432 = load ptr, ptr %431, align 8, !tbaa !16
  %433 = load i64, ptr %22, align 8, !tbaa !9
  %434 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %432, i64 %433
  %435 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %434, i32 0, i32 10
  %436 = load double, ptr %435, align 8, !tbaa !17
  %437 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %438 = load ptr, ptr %437, align 8, !tbaa !16
  %439 = load i64, ptr %22, align 8, !tbaa !9
  %440 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %438, i64 %439
  %441 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %440, i32 0, i32 4
  %442 = load i32, ptr %441, align 8, !tbaa !40
  %443 = sitofp i32 %442 to double
  %444 = fdiv double %436, %443
  %445 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %446 = load ptr, ptr %445, align 8, !tbaa !16
  %447 = load i64, ptr %22, align 8, !tbaa !9
  %448 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %446, i64 %447
  %449 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %448, i32 0, i32 10
  store double %444, ptr %449, align 8, !tbaa !17
  br label %450

450:                                              ; preds = %430
  %451 = load i64, ptr %22, align 8, !tbaa !9
  %452 = add i64 %451, 1
  store i64 %452, ptr %22, align 8, !tbaa !9
  br label %371, !llvm.loop !42

453:                                              ; preds = %376
  store double 0.000000e+00, ptr %9, align 8, !tbaa !28
  store double 0.000000e+00, ptr %6, align 8, !tbaa !28
  store double 1.000000e+05, ptr %7, align 8, !tbaa !28
  store double -1.000000e+05, ptr %8, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  store i64 0, ptr %24, align 8, !tbaa !9
  br label %454

454:                                              ; preds = %504, %453
  %455 = load i64, ptr %24, align 8, !tbaa !9
  %456 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 21
  %457 = load i64, ptr %456, align 8, !tbaa !11
  %458 = icmp ult i64 %455, %457
  br i1 %458, label %460, label %459

459:                                              ; preds = %454
  store i32 17, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  br label %520

460:                                              ; preds = %454
  %461 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %462 = load ptr, ptr %461, align 8, !tbaa !16
  %463 = load i64, ptr %24, align 8, !tbaa !9
  %464 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %462, i64 %463
  %465 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %464, i32 0, i32 7
  %466 = load i32, ptr %465, align 8, !tbaa !43
  %467 = icmp ne i32 %466, -1
  br i1 %467, label %468, label %469

468:                                              ; preds = %460
  br label %504

469:                                              ; preds = %460
  %470 = load double, ptr %6, align 8, !tbaa !28
  %471 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %472 = load ptr, ptr %471, align 8, !tbaa !16
  %473 = load i64, ptr %24, align 8, !tbaa !9
  %474 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %472, i64 %473
  %475 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %474, i32 0, i32 10
  %476 = load double, ptr %475, align 8, !tbaa !17
  %477 = invoke noundef double @_ZSt3absd(double noundef %476)
          to label %478 unwind label %507

478:                                              ; preds = %469
  %479 = fadd double %470, %477
  store double %479, ptr %6, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %480 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %481 = load ptr, ptr %480, align 8, !tbaa !16
  %482 = load i64, ptr %24, align 8, !tbaa !9
  %483 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %481, i64 %482
  %484 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %483, i32 0, i32 10
  %485 = load double, ptr %484, align 8, !tbaa !17
  %486 = invoke noundef double @_ZSt3absd(double noundef %485)
          to label %487 unwind label %511

487:                                              ; preds = %478
  store double %486, ptr %25, align 8, !tbaa !28
  %488 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %7, ptr noundef nonnull align 8 dereferenceable(8) %25)
          to label %489 unwind label %511

489:                                              ; preds = %487
  %490 = load double, ptr %488, align 8, !tbaa !28
  store double %490, ptr %7, align 8, !tbaa !28
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #7
  %491 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %492 = load ptr, ptr %491, align 8, !tbaa !16
  %493 = load i64, ptr %24, align 8, !tbaa !9
  %494 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %492, i64 %493
  %495 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %494, i32 0, i32 10
  %496 = load double, ptr %495, align 8, !tbaa !17
  %497 = invoke noundef double @_ZSt3absd(double noundef %496)
          to label %498 unwind label %515

498:                                              ; preds = %489
  store double %497, ptr %26, align 8, !tbaa !28
  %499 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %8, ptr noundef nonnull align 8 dereferenceable(8) %26)
          to label %500 unwind label %515

500:                                              ; preds = %498
  %501 = load double, ptr %499, align 8, !tbaa !28
  store double %501, ptr %8, align 8, !tbaa !28
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  %502 = load double, ptr %9, align 8, !tbaa !28
  %503 = fadd double %502, 1.000000e+00
  store double %503, ptr %9, align 8, !tbaa !28
  br label %504

504:                                              ; preds = %500, %468
  %505 = load i64, ptr %24, align 8, !tbaa !9
  %506 = add i64 %505, 1
  store i64 %506, ptr %24, align 8, !tbaa !9
  br label %454, !llvm.loop !44

507:                                              ; preds = %469
  %508 = landingpad { ptr, i32 }
          cleanup
  %509 = extractvalue { ptr, i32 } %508, 0
  store ptr %509, ptr %20, align 8
  %510 = extractvalue { ptr, i32 } %508, 1
  store i32 %510, ptr %21, align 4
  br label %519

511:                                              ; preds = %487, %478
  %512 = landingpad { ptr, i32 }
          cleanup
  %513 = extractvalue { ptr, i32 } %512, 0
  store ptr %513, ptr %20, align 8
  %514 = extractvalue { ptr, i32 } %512, 1
  store i32 %514, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  br label %519

515:                                              ; preds = %498, %489
  %516 = landingpad { ptr, i32 }
          cleanup
  %517 = extractvalue { ptr, i32 } %516, 0
  store ptr %517, ptr %20, align 8
  %518 = extractvalue { ptr, i32 } %516, 1
  store i32 %518, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #7
  br label %519

519:                                              ; preds = %515, %511, %507
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  br label %658

520:                                              ; preds = %459
  %521 = load double, ptr %6, align 8, !tbaa !28
  %522 = load double, ptr %9, align 8, !tbaa !28
  %523 = fdiv double %521, %522
  store double %523, ptr %6, align 8, !tbaa !28
  %524 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.126)
          to label %525 unwind label %557

525:                                              ; preds = %520
  %526 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.127)
          to label %527 unwind label %557

527:                                              ; preds = %525
  %528 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.128)
          to label %529 unwind label %557

529:                                              ; preds = %527
  %530 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.129)
          to label %531 unwind label %557

531:                                              ; preds = %529
  %532 = load double, ptr %6, align 8, !tbaa !28
  %533 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %530, double noundef %532)
          to label %534 unwind label %557

534:                                              ; preds = %531
  %535 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %533, ptr noundef @.str.14)
          to label %536 unwind label %557

536:                                              ; preds = %534
  %537 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.130)
          to label %538 unwind label %557

538:                                              ; preds = %536
  %539 = load double, ptr %7, align 8, !tbaa !28
  %540 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %537, double noundef %539)
          to label %541 unwind label %557

541:                                              ; preds = %538
  %542 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %540, ptr noundef @.str.14)
          to label %543 unwind label %557

543:                                              ; preds = %541
  %544 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.131)
          to label %545 unwind label %557

545:                                              ; preds = %543
  %546 = load double, ptr %8, align 8, !tbaa !28
  %547 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %544, double noundef %546)
          to label %548 unwind label %557

548:                                              ; preds = %545
  %549 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEPFRSoS_E(ptr noundef nonnull align 8 dereferenceable(8) %547, ptr noundef @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
          to label %550 unwind label %557

550:                                              ; preds = %548
  store double 0.000000e+00, ptr %9, align 8, !tbaa !28
  store double 0.000000e+00, ptr %6, align 8, !tbaa !28
  store double 1.000000e+05, ptr %7, align 8, !tbaa !28
  store double -1.000000e+05, ptr %8, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  store i64 0, ptr %27, align 8, !tbaa !9
  br label %551

551:                                              ; preds = %605, %550
  %552 = load i64, ptr %27, align 8, !tbaa !9
  %553 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 21
  %554 = load i64, ptr %553, align 8, !tbaa !11
  %555 = icmp ult i64 %552, %554
  br i1 %555, label %561, label %556

556:                                              ; preds = %551
  store i32 20, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  br label %621

557:                                              ; preds = %655, %653, %651, %648, %646, %644, %641, %639, %637, %634, %632, %630, %628, %626, %621, %548, %545, %543, %541, %538, %536, %534, %531, %529, %527, %525, %520
  %558 = landingpad { ptr, i32 }
          cleanup
  %559 = extractvalue { ptr, i32 } %558, 0
  store ptr %559, ptr %20, align 8
  %560 = extractvalue { ptr, i32 } %558, 1
  store i32 %560, ptr %21, align 4
  br label %658

561:                                              ; preds = %551
  %562 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %563 = load ptr, ptr %562, align 8, !tbaa !16
  %564 = load i64, ptr %27, align 8, !tbaa !9
  %565 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %563, i64 %564
  %566 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %565, i32 0, i32 7
  %567 = load i32, ptr %566, align 8, !tbaa !43
  %568 = icmp eq i32 %567, -1
  br i1 %568, label %569, label %570

569:                                              ; preds = %561
  br label %605

570:                                              ; preds = %561
  %571 = load double, ptr %6, align 8, !tbaa !28
  %572 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %573 = load ptr, ptr %572, align 8, !tbaa !16
  %574 = load i64, ptr %27, align 8, !tbaa !9
  %575 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %573, i64 %574
  %576 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %575, i32 0, i32 10
  %577 = load double, ptr %576, align 8, !tbaa !17
  %578 = invoke noundef double @_ZSt3absd(double noundef %577)
          to label %579 unwind label %608

579:                                              ; preds = %570
  %580 = fadd double %571, %578
  store double %580, ptr %6, align 8, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #7
  %581 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %582 = load ptr, ptr %581, align 8, !tbaa !16
  %583 = load i64, ptr %27, align 8, !tbaa !9
  %584 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %582, i64 %583
  %585 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %584, i32 0, i32 10
  %586 = load double, ptr %585, align 8, !tbaa !17
  %587 = invoke noundef double @_ZSt3absd(double noundef %586)
          to label %588 unwind label %612

588:                                              ; preds = %579
  store double %587, ptr %28, align 8, !tbaa !28
  %589 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %7, ptr noundef nonnull align 8 dereferenceable(8) %28)
          to label %590 unwind label %612

590:                                              ; preds = %588
  %591 = load double, ptr %589, align 8, !tbaa !28
  store double %591, ptr %7, align 8, !tbaa !28
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #7
  %592 = getelementptr inbounds %"class.EulerSolver2D::MainData2D", ptr %30, i32 0, i32 22
  %593 = load ptr, ptr %592, align 8, !tbaa !16
  %594 = load i64, ptr %27, align 8, !tbaa !9
  %595 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %593, i64 %594
  %596 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %595, i32 0, i32 10
  %597 = load double, ptr %596, align 8, !tbaa !17
  %598 = invoke noundef double @_ZSt3absd(double noundef %597)
          to label %599 unwind label %616

599:                                              ; preds = %590
  store double %598, ptr %29, align 8, !tbaa !28
  %600 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %8, ptr noundef nonnull align 8 dereferenceable(8) %29)
          to label %601 unwind label %616

601:                                              ; preds = %599
  %602 = load double, ptr %600, align 8, !tbaa !28
  store double %602, ptr %8, align 8, !tbaa !28
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  %603 = load double, ptr %9, align 8, !tbaa !28
  %604 = fadd double %603, 1.000000e+00
  store double %604, ptr %9, align 8, !tbaa !28
  br label %605

605:                                              ; preds = %601, %569
  %606 = load i64, ptr %27, align 8, !tbaa !9
  %607 = add i64 %606, 1
  store i64 %607, ptr %27, align 8, !tbaa !9
  br label %551, !llvm.loop !45

608:                                              ; preds = %570
  %609 = landingpad { ptr, i32 }
          cleanup
  %610 = extractvalue { ptr, i32 } %609, 0
  store ptr %610, ptr %20, align 8
  %611 = extractvalue { ptr, i32 } %609, 1
  store i32 %611, ptr %21, align 4
  br label %620

612:                                              ; preds = %588, %579
  %613 = landingpad { ptr, i32 }
          cleanup
  %614 = extractvalue { ptr, i32 } %613, 0
  store ptr %614, ptr %20, align 8
  %615 = extractvalue { ptr, i32 } %613, 1
  store i32 %615, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #7
  br label %620

616:                                              ; preds = %599, %590
  %617 = landingpad { ptr, i32 }
          cleanup
  %618 = extractvalue { ptr, i32 } %617, 0
  store ptr %618, ptr %20, align 8
  %619 = extractvalue { ptr, i32 } %617, 1
  store i32 %619, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #7
  br label %620

620:                                              ; preds = %616, %612, %608
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  br label %658

621:                                              ; preds = %556
  %622 = load double, ptr %6, align 8, !tbaa !28
  %623 = load double, ptr %9, align 8, !tbaa !28
  %624 = fdiv double %622, %623
  store double %624, ptr %6, align 8, !tbaa !28
  %625 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.7)
          to label %626 unwind label %557

626:                                              ; preds = %621
  %627 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %625, ptr noundef @.str.14)
          to label %628 unwind label %557

628:                                              ; preds = %626
  %629 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.132)
          to label %630 unwind label %557

630:                                              ; preds = %628
  %631 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %629, ptr noundef @.str.14)
          to label %632 unwind label %557

632:                                              ; preds = %630
  %633 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.129)
          to label %634 unwind label %557

634:                                              ; preds = %632
  %635 = load double, ptr %6, align 8, !tbaa !28
  %636 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %633, double noundef %635)
          to label %637 unwind label %557

637:                                              ; preds = %634
  %638 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %636, ptr noundef @.str.14)
          to label %639 unwind label %557

639:                                              ; preds = %637
  %640 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.133)
          to label %641 unwind label %557

641:                                              ; preds = %639
  %642 = load double, ptr %7, align 8, !tbaa !28
  %643 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %640, double noundef %642)
          to label %644 unwind label %557

644:                                              ; preds = %641
  %645 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %643, ptr noundef @.str.14)
          to label %646 unwind label %557

646:                                              ; preds = %644
  %647 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.131)
          to label %648 unwind label %557

648:                                              ; preds = %646
  %649 = load double, ptr %8, align 8, !tbaa !28
  %650 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %647, double noundef %649)
          to label %651 unwind label %557

651:                                              ; preds = %648
  %652 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %650, ptr noundef @.str.14)
          to label %653 unwind label %557

653:                                              ; preds = %651
  %654 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str.134)
          to label %655 unwind label %557

655:                                              ; preds = %653
  %656 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEPFRSoS_E(ptr noundef nonnull align 8 dereferenceable(8) %654, ptr noundef @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
          to label %657 unwind label %557

657:                                              ; preds = %655
  call void @_ZN7Array2DIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #7
  ret void

658:                                              ; preds = %620, %557, %519, %426, %369
  call void @_ZN7Array2DIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #7
  br label %659

659:                                              ; preds = %658
  %660 = load ptr, ptr %20, align 8
  %661 = load i32, ptr %21, align 4
  %662 = insertvalue { ptr, i32 } poison, ptr %660, 0
  %663 = insertvalue { ptr, i32 } %662, i32 %661, 1
  resume { ptr, i32 } %663
}

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !10, i64 408}
!12 = !{!"_ZTSN13EulerSolver2D10MainData2DE", !13, i64 0, !13, i64 32, !13, i64 64, !13, i64 96, !13, i64 128, !13, i64 160, !10, i64 192, !13, i64 200, !13, i64 232, !15, i64 264, !13, i64 272, !13, i64 304, !10, i64 336, !15, i64 344, !15, i64 352, !15, i64 360, !15, i64 368, !15, i64 376, !15, i64 384, !15, i64 392, !15, i64 400, !10, i64 408, !6, i64 416, !10, i64 424, !10, i64 432, !10, i64 440, !6, i64 448, !10, i64 456, !6, i64 464, !10, i64 472, !6, i64 480, !10, i64 488, !6, i64 496, !10, i64 504}
!13 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !14, i64 0, !10, i64 8, !7, i64 16}
!14 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !6, i64 0}
!15 = !{!"double", !7, i64 0}
!16 = !{!12, !6, i64 416}
!17 = !{!18, !15, i64 88}
!18 = !{!"_ZTSN13EulerSolver2D9node_typeE", !15, i64 0, !15, i64 8, !19, i64 16, !6, i64 24, !19, i64 32, !20, i64 40, !15, i64 64, !19, i64 72, !19, i64 76, !6, i64 80, !15, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !15, i64 200, !15, i64 208, !15, i64 216, !6, i64 224, !6, i64 232, !6, i64 240}
!19 = !{!"int", !7, i64 0}
!20 = !{!"_ZTS8Vector1DIiE", !21, i64 0}
!21 = !{!"_ZTSSt6vectorIiSaIiEE", !22, i64 0}
!22 = !{!"_ZTSSt12_Vector_baseIiSaIiEE", !23, i64 0}
!23 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE12_Vector_implE", !24, i64 0}
!24 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!12, !10, i64 440}
!28 = !{!15, !15, i64 0}
!29 = !{!12, !6, i64 448}
!30 = !{!31, !19, i64 0}
!31 = !{!"_ZTSN13EulerSolver2D8elm_typeE", !19, i64 0, !6, i64 8, !19, i64 16, !6, i64 24, !15, i64 32, !15, i64 40, !15, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !15, i64 96, !15, i64 104, !19, i64 112, !19, i64 116, !20, i64 120, !15, i64 144, !6, i64 152, !6, i64 160, !19, i64 168}
!32 = !{!31, !6, i64 8}
!33 = !{!19, !19, i64 0}
!34 = !{!18, !15, i64 0}
!35 = !{!18, !15, i64 8}
!36 = distinct !{!36, !26}
!37 = !{!31, !15, i64 48}
!38 = !{!31, !15, i64 144}
!39 = distinct !{!39, !26}
!40 = !{!18, !19, i64 32}
!41 = distinct !{!41, !26}
!42 = distinct !{!42, !26}
!43 = !{!18, !19, i64 72}
!44 = distinct !{!44, !26}
!45 = distinct !{!45, !26}


; 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.std::basic_ostream" = type { ptr, %"class.std::basic_ios" }
%"class.std::basic_ios" = type { %"class.std::ios_base", ptr, i8, i8, ptr, ptr, ptr, ptr }
%"class.std::ios_base" = type { ptr, i64, i64, i32, i32, i32, ptr, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, ptr, %"class.std::locale" }
%"struct.std::ios_base::_Words" = type { ptr, i64 }
%"class.std::locale" = type { ptr }
%class.Array2D.4 = type { i32, i32, i32, i32, i32, i32, i8, i8, ptr }
%"class.EulerSolver2D::node_type" = type { double, double, i32, ptr, i32, %class.Vector1D, double, i32, i32, ptr, double, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, ptr, ptr, ptr }
%class.Vector1D = type { %"class.std::vector" }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%"class.EulerSolver2D::elm_type" = type <{ i32, [4 x i8], ptr, i32, [4 x i8], ptr, double, double, double, ptr, ptr, ptr, ptr, ptr, double, double, i32, i32, %class.Vector1D, double, ptr, ptr, i32, [4 x i8] }>

@_ZSt4cout = external global %"class.std::basic_ostream", align 8
@.str.7 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.126 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.127 = external hidden unnamed_addr constant [59 x i8], align 1
@.str.128 = external hidden unnamed_addr constant [23 x i8], align 1
@.str.129 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.130 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.131 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.132 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.133 = external hidden unnamed_addr constant [13 x i8], align 1
@.str.134 = external hidden unnamed_addr constant [58 x i8], align 1

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

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) local_unnamed_addr #1

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

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(ptr noundef nonnull align 8 dereferenceable(8)) #1

declare i32 @__gxx_personality_v0(...)

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

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

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8), double noundef) local_unnamed_addr #2 align 2

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

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

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

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef double @_ZSt3absd(double noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #5

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13EulerSolver2D10MainData2D10compute_arEv(ptr nocapture noundef nonnull readonly align 8 dereferenceable(512) %0) local_unnamed_addr #2 align 2 personality ptr @__gxx_personality_v0 {
  %2 = alloca double, align 8
  %3 = alloca double, align 8
  %4 = alloca double, align 8
  %5 = alloca %class.Array2D.4, align 8
  %6 = alloca double, align 8
  %7 = alloca double, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #7
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %5) #7
  call void @_ZN7Array2DIdEC2Eii(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 4, i32 noundef 1)
  %10 = getelementptr inbounds i8, ptr %0, i64 408
  %11 = load i64, ptr %10, align 8, !tbaa !5
  %.not131 = icmp eq i64 %11, 0
  br i1 %.not131, label %.preheader91, label %.lr.ph

.lr.ph:                                           ; preds = %1
  %12 = getelementptr inbounds i8, ptr %0, i64 416
  %13 = load ptr, ptr %12, align 8, !tbaa !14
  %xtraiter = and i64 %11, 3
  %14 = icmp ult i64 %11, 4
  br i1 %14, label %.preheader91.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %11, -4
  br label %21

.preheader91.loopexit.unr-lcssa:                  ; preds = %21, %.lr.ph
  %.080100.unr = phi i64 [ 0, %.lr.ph ], [ %29, %21 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.preheader91, label %.epil.preheader

.epil.preheader:                                  ; preds = %.preheader91.loopexit.unr-lcssa, %.epil.preheader
  %.080100.epil = phi i64 [ %16, %.epil.preheader ], [ %.080100.unr, %.preheader91.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %.preheader91.loopexit.unr-lcssa ]
  %15 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %13, i64 %.080100.epil, i32 10
  store double 0.000000e+00, ptr %15, align 8, !tbaa !15
  %16 = add nuw i64 %.080100.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %.preheader91, label %.epil.preheader, !llvm.loop !23

.preheader91:                                     ; preds = %.preheader91.loopexit.unr-lcssa, %.epil.preheader, %1
  %17 = getelementptr inbounds i8, ptr %0, i64 440
  %18 = load i64, ptr %17, align 8, !tbaa !25
  %.not132 = icmp eq i64 %18, 0
  br i1 %.not132, label %.preheader, label %.lr.ph106

.lr.ph106:                                        ; preds = %.preheader91
  %19 = getelementptr inbounds i8, ptr %0, i64 448
  %20 = getelementptr inbounds i8, ptr %0, i64 416
  %.pre = load ptr, ptr %19, align 8, !tbaa !26
  br label %33

21:                                               ; preds = %21, %.lr.ph.new
  %.080100 = phi i64 [ 0, %.lr.ph.new ], [ %29, %21 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.3, %21 ]
  %22 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %13, i64 %.080100, i32 10
  store double 0.000000e+00, ptr %22, align 8, !tbaa !15
  %23 = or disjoint i64 %.080100, 1
  %24 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %13, i64 %23, i32 10
  store double 0.000000e+00, ptr %24, align 8, !tbaa !15
  %25 = or disjoint i64 %.080100, 2
  %26 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %13, i64 %25, i32 10
  store double 0.000000e+00, ptr %26, align 8, !tbaa !15
  %27 = or disjoint i64 %.080100, 3
  %28 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %13, i64 %27, i32 10
  store double 0.000000e+00, ptr %28, align 8, !tbaa !15
  %29 = add nuw i64 %.080100, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %.preheader91.loopexit.unr-lcssa, label %21, !llvm.loop !27

.preheader.loopexit:                              ; preds = %202
  %.pre142 = load i64, ptr %10, align 8, !tbaa !5
  br label %.preheader

.preheader:                                       ; preds = %.preheader.loopexit, %.preheader91
  %30 = phi i64 [ %.pre142, %.preheader.loopexit ], [ %11, %.preheader91 ]
  %.not134 = icmp eq i64 %30, 0
  br i1 %.not134, label %._crit_edge114.thread, label %.lr.ph113

._crit_edge114.thread:                            ; preds = %.preheader
  store double 1.000000e+05, ptr %2, align 8, !tbaa !29
  store double -1.000000e+05, ptr %3, align 8, !tbaa !29
  br label %._crit_edge120

.lr.ph113:                                        ; preds = %.preheader
  %31 = getelementptr inbounds i8, ptr %0, i64 416
  %32 = getelementptr inbounds i8, ptr %0, i64 448
  %.pre143 = load ptr, ptr %31, align 8, !tbaa !14
  br label %209

33:                                               ; preds = %.lr.ph106, %202
  %34 = phi ptr [ %.pre, %.lr.ph106 ], [ %203, %202 ]
  %.079105 = phi i64 [ 0, %.lr.ph106 ], [ %205, %202 ]
  store double -1.000000e+00, ptr %4, align 8, !tbaa !29
  %35 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %34, i64 %.079105
  %36 = load i32, ptr %35, align 8, !tbaa !30
  %.not133 = icmp eq i32 %36, 0
  br i1 %.not133, label %._crit_edge.thread, label %.lr.ph102

._crit_edge:                                      ; preds = %76
  %37 = icmp eq i32 %82, 3
  br i1 %37, label %85, label %._crit_edge.thread

.lr.ph102:                                        ; preds = %33, %76
  %38 = phi ptr [ %80, %76 ], [ %34, %33 ]
  %.078101 = phi i64 [ %79, %76 ], [ 0, %33 ]
  %39 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %38, i64 %.079105, i32 2
  %40 = load ptr, ptr %39, align 8, !tbaa !32
  %41 = trunc i64 %.078101 to i32
  %42 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIiEclEi(ptr noundef nonnull align 8 dereferenceable(40) %40, i32 noundef %41)
          to label %.invoke unwind label %55

.invoke:                                          ; preds = %.lr.ph102
  %43 = load i32, ptr %42, align 4, !tbaa !33
  %44 = load ptr, ptr %19, align 8, !tbaa !26
  %45 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %44, i64 %.079105
  %46 = load i32, ptr %45, align 8, !tbaa !30
  %47 = add nsw i32 %46, -1
  %48 = sext i32 %47 to i64
  %49 = icmp eq i64 %.078101, %48
  %50 = getelementptr inbounds i8, ptr %45, i64 8
  %51 = load ptr, ptr %50, align 8, !tbaa !32
  %52 = add i32 %41, 1
  %53 = select i1 %49, i32 0, i32 %52
  %54 = invoke noundef nonnull align 4 dereferenceable(4) ptr @_ZN7Array2DIiEclEi(ptr noundef nonnull align 8 dereferenceable(40) %51, i32 noundef %53)
          to label %57 unwind label %55

55:                                               ; preds = %.invoke, %70, %57, %.lr.ph102
  %56 = landingpad { ptr, i32 }
          cleanup
  br label %367

57:                                               ; preds = %.invoke
  %.081 = load i32, ptr %54, align 4, !tbaa !33
  %58 = load ptr, ptr %20, align 8, !tbaa !14
  %59 = sext i32 %.081 to i64
  %60 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %58, i64 %59
  %61 = load double, ptr %60, align 8, !tbaa !34
  %62 = sext i32 %43 to i64
  %63 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %58, i64 %62
  %64 = load double, ptr %63, align 8, !tbaa !34
  %65 = getelementptr inbounds i8, ptr %60, i64 8
  %66 = load double, ptr %65, align 8, !tbaa !35
  %67 = getelementptr inbounds i8, ptr %63, i64 8
  %68 = load double, ptr %67, align 8, !tbaa !35
  %69 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef %41)
          to label %70 unwind label %55

70:                                               ; preds = %57
  %71 = fsub double %61, %64
  %72 = fsub double %66, %68
  %73 = fmul double %72, %72
  %74 = call double @llvm.fmuladd.f64(double %71, double %71, double %73)
  %sqrt = call double @llvm.sqrt.f64(double %74)
  store double %sqrt, ptr %69, align 8, !tbaa !29
  %75 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef %41)
          to label %76 unwind label %55

76:                                               ; preds = %70
  %77 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %4, ptr noundef nonnull align 8 dereferenceable(8) %75)
  %78 = load double, ptr %77, align 8, !tbaa !29
  store double %78, ptr %4, align 8, !tbaa !29
  %79 = add nuw i64 %.078101, 1
  %80 = load ptr, ptr %19, align 8, !tbaa !26
  %81 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %80, i64 %.079105
  %82 = load i32, ptr %81, align 8, !tbaa !30
  %83 = sext i32 %82 to i64
  %84 = icmp ult i64 %79, %83
  br i1 %84, label %.lr.ph102, label %._crit_edge, !llvm.loop !36

85:                                               ; preds = %._crit_edge
  %86 = fmul double %78, 5.000000e-01
  %87 = fmul double %78, %86
  %88 = getelementptr inbounds i8, ptr %81, i64 48
  %89 = load double, ptr %88, align 8, !tbaa !37
  %90 = fdiv double %87, %89
  %91 = getelementptr inbounds i8, ptr %81, i64 144
  store double %90, ptr %91, align 8, !tbaa !38
  %92 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %93 unwind label %123

93:                                               ; preds = %85
  %94 = load double, ptr %92, align 8, !tbaa !29
  %95 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %96 unwind label %123

96:                                               ; preds = %93
  %97 = load double, ptr %95, align 8, !tbaa !29
  %98 = fcmp ult double %94, %97
  br i1 %98, label %130, label %99

99:                                               ; preds = %96
  %100 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %101 unwind label %123

101:                                              ; preds = %99
  %102 = load double, ptr %100, align 8, !tbaa !29
  %103 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %104 unwind label %123

104:                                              ; preds = %101
  %105 = load double, ptr %103, align 8, !tbaa !29
  %106 = fcmp ult double %102, %105
  br i1 %106, label %130, label %107

107:                                              ; preds = %104
  %108 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %109 unwind label %123

109:                                              ; preds = %107
  %110 = load double, ptr %108, align 8, !tbaa !29
  store double %110, ptr %4, align 8, !tbaa !29
  %111 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %112 unwind label %123

112:                                              ; preds = %109
  %113 = load double, ptr %111, align 8, !tbaa !29
  %114 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %115 unwind label %123

115:                                              ; preds = %112
  %116 = load double, ptr %114, align 8, !tbaa !29
  %117 = fcmp ult double %113, %116
  br i1 %117, label %125, label %118

118:                                              ; preds = %115
  %119 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %120 unwind label %123

120:                                              ; preds = %118
  %121 = load double, ptr %119, align 8, !tbaa !29
  %122 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %188 unwind label %123

123:                                              ; preds = %185, %183, %180, %178, %172, %169, %167, %164, %162, %159, %157, %151, %148, %146, %140, %138, %132, %130, %127, %125, %120, %118, %112, %109, %107, %101, %99, %93, %85
  %124 = landingpad { ptr, i32 }
          cleanup
  br label %367

125:                                              ; preds = %115
  %126 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %127 unwind label %123

127:                                              ; preds = %125
  %128 = load double, ptr %126, align 8, !tbaa !29
  %129 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %188 unwind label %123

130:                                              ; preds = %104, %96
  %131 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %132 unwind label %123

132:                                              ; preds = %130
  %133 = load double, ptr %131, align 8, !tbaa !29
  %134 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %135 unwind label %123

135:                                              ; preds = %132
  %136 = load double, ptr %134, align 8, !tbaa !29
  %137 = fcmp ult double %133, %136
  br i1 %137, label %167, label %138

138:                                              ; preds = %135
  %139 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %140 unwind label %123

140:                                              ; preds = %138
  %141 = load double, ptr %139, align 8, !tbaa !29
  %142 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %143 unwind label %123

143:                                              ; preds = %140
  %144 = load double, ptr %142, align 8, !tbaa !29
  %145 = fcmp ult double %141, %144
  br i1 %145, label %167, label %146

146:                                              ; preds = %143
  %147 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %148 unwind label %123

148:                                              ; preds = %146
  %149 = load double, ptr %147, align 8, !tbaa !29
  store double %149, ptr %4, align 8, !tbaa !29
  %150 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %151 unwind label %123

151:                                              ; preds = %148
  %152 = load double, ptr %150, align 8, !tbaa !29
  %153 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %154 unwind label %123

154:                                              ; preds = %151
  %155 = load double, ptr %153, align 8, !tbaa !29
  %156 = fcmp ult double %152, %155
  br i1 %156, label %162, label %157

157:                                              ; preds = %154
  %158 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %159 unwind label %123

159:                                              ; preds = %157
  %160 = load double, ptr %158, align 8, !tbaa !29
  %161 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %188 unwind label %123

162:                                              ; preds = %154
  %163 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %164 unwind label %123

164:                                              ; preds = %162
  %165 = load double, ptr %163, align 8, !tbaa !29
  %166 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %188 unwind label %123

167:                                              ; preds = %143, %135
  %168 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 2)
          to label %169 unwind label %123

169:                                              ; preds = %167
  %170 = load double, ptr %168, align 8, !tbaa !29
  store double %170, ptr %4, align 8, !tbaa !29
  %171 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %172 unwind label %123

172:                                              ; preds = %169
  %173 = load double, ptr %171, align 8, !tbaa !29
  %174 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %175 unwind label %123

175:                                              ; preds = %172
  %176 = load double, ptr %174, align 8, !tbaa !29
  %177 = fcmp ult double %173, %176
  br i1 %177, label %183, label %178

178:                                              ; preds = %175
  %179 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %180 unwind label %123

180:                                              ; preds = %178
  %181 = load double, ptr %179, align 8, !tbaa !29
  %182 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %188 unwind label %123

183:                                              ; preds = %175
  %184 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 1)
          to label %185 unwind label %123

185:                                              ; preds = %183
  %186 = load double, ptr %184, align 8, !tbaa !29
  %187 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN7Array2DIdEclEi(ptr noundef nonnull align 8 dereferenceable(40) %5, i32 noundef 0)
          to label %188 unwind label %123

188:                                              ; preds = %185, %180, %164, %159, %127, %120
  %.082 = phi double [ %121, %120 ], [ %128, %127 ], [ %160, %159 ], [ %165, %164 ], [ %181, %180 ], [ %186, %185 ]
  %189 = load ptr, ptr %19, align 8, !tbaa !26
  %190 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %189, i64 %.079105
  %191 = getelementptr inbounds i8, ptr %190, i64 48
  %192 = load double, ptr %191, align 8, !tbaa !37
  %193 = fmul double %192, 2.000000e+00
  %194 = fdiv double %193, %.082
  %195 = fdiv double %.082, %194
  br label %202

._crit_edge.thread:                               ; preds = %33, %._crit_edge
  %.lcssa95149 = phi ptr [ %81, %._crit_edge ], [ %35, %33 ]
  %196 = phi ptr [ %80, %._crit_edge ], [ %34, %33 ]
  %197 = phi double [ %78, %._crit_edge ], [ -1.000000e+00, %33 ]
  %198 = fmul double %197, %197
  %199 = getelementptr inbounds i8, ptr %.lcssa95149, i64 48
  %200 = load double, ptr %199, align 8, !tbaa !37
  %201 = fdiv double %198, %200
  br label %202

202:                                              ; preds = %188, %._crit_edge.thread
  %.sink160 = phi ptr [ %190, %188 ], [ %.lcssa95149, %._crit_edge.thread ]
  %.sink = phi double [ %195, %188 ], [ %201, %._crit_edge.thread ]
  %203 = phi ptr [ %189, %188 ], [ %196, %._crit_edge.thread ]
  %204 = getelementptr inbounds i8, ptr %.sink160, i64 144
  store double %.sink, ptr %204, align 8, !tbaa !38
  %205 = add nuw i64 %.079105, 1
  %206 = load i64, ptr %17, align 8, !tbaa !25
  %207 = icmp ult i64 %205, %206
  br i1 %207, label %33, label %.preheader.loopexit, !llvm.loop !39

._crit_edge114:                                   ; preds = %._crit_edge110
  store double 1.000000e+05, ptr %2, align 8, !tbaa !29
  store double -1.000000e+05, ptr %3, align 8, !tbaa !29
  %.not136 = icmp eq i64 %216, 0
  br i1 %.not136, label %._crit_edge120, label %.lr.ph119

.lr.ph119:                                        ; preds = %._crit_edge114
  %208 = getelementptr inbounds i8, ptr %0, i64 416
  br label %247

209:                                              ; preds = %.lr.ph113, %._crit_edge110
  %210 = phi i64 [ %30, %.lr.ph113 ], [ %216, %._crit_edge110 ]
  %211 = phi ptr [ %.pre143, %.lr.ph113 ], [ %218, %._crit_edge110 ]
  %.074112 = phi i64 [ 0, %.lr.ph113 ], [ %222, %._crit_edge110 ]
  %212 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %211, i64 %.074112, i32 10
  store double 0.000000e+00, ptr %212, align 8, !tbaa !15
  %213 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %211, i64 %.074112
  %214 = getelementptr inbounds i8, ptr %213, i64 32
  %215 = load i32, ptr %214, align 8, !tbaa !40
  %.not135 = icmp eq i32 %215, 0
  br i1 %.not135, label %._crit_edge110, label %.lr.ph109

._crit_edge110.loopexit:                          ; preds = %.lr.ph109
  %.pre144 = load i64, ptr %10, align 8, !tbaa !5
  br label %._crit_edge110

._crit_edge110:                                   ; preds = %._crit_edge110.loopexit, %209
  %216 = phi i64 [ %210, %209 ], [ %.pre144, %._crit_edge110.loopexit ]
  %217 = phi double [ 0.000000e+00, %209 ], [ %235, %._crit_edge110.loopexit ]
  %218 = phi ptr [ %211, %209 ], [ %236, %._crit_edge110.loopexit ]
  %.lcssa = phi i32 [ 0, %209 ], [ %241, %._crit_edge110.loopexit ]
  %219 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %218, i64 %.074112, i32 10
  %220 = sitofp i32 %.lcssa to double
  %221 = fdiv double %217, %220
  store double %221, ptr %219, align 8, !tbaa !15
  %222 = add nuw i64 %.074112, 1
  %223 = icmp ult i64 %222, %216
  br i1 %223, label %209, label %._crit_edge114, !llvm.loop !41

.lr.ph109:                                        ; preds = %209, %.lr.ph109
  %224 = phi ptr [ %239, %.lr.ph109 ], [ %213, %209 ]
  %.073107 = phi i64 [ %238, %.lr.ph109 ], [ 0, %209 ]
  %225 = getelementptr inbounds i8, ptr %224, i64 88
  %226 = load double, ptr %225, align 8, !tbaa !15
  %227 = load ptr, ptr %32, align 8, !tbaa !26
  %228 = getelementptr inbounds i8, ptr %224, i64 40
  %229 = trunc i64 %.073107 to i32
  %230 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZN8Vector1DIiEclEi(ptr noundef nonnull align 8 dereferenceable(24) %228, i32 noundef %229)
  %231 = load i32, ptr %230, align 4, !tbaa !33
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds %"class.EulerSolver2D::elm_type", ptr %227, i64 %232, i32 19
  %234 = load double, ptr %233, align 8, !tbaa !38
  %235 = fadd double %226, %234
  %236 = load ptr, ptr %31, align 8, !tbaa !14
  %237 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %236, i64 %.074112, i32 10
  store double %235, ptr %237, align 8, !tbaa !15
  %238 = add nuw i64 %.073107, 1
  %239 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %236, i64 %.074112
  %240 = getelementptr inbounds i8, ptr %239, i64 32
  %241 = load i32, ptr %240, align 8, !tbaa !40
  %242 = sext i32 %241 to i64
  %243 = icmp ult i64 %238, %242
  br i1 %243, label %.lr.ph109, label %._crit_edge110.loopexit, !llvm.loop !42

._crit_edge120.loopexit:                          ; preds = %271
  %244 = fdiv double %.184, %.186
  br label %._crit_edge120

._crit_edge120:                                   ; preds = %._crit_edge114.thread, %._crit_edge120.loopexit, %._crit_edge114
  %245 = phi double [ 0x7FF8000000000000, %._crit_edge114 ], [ %244, %._crit_edge120.loopexit ], [ 0x7FF8000000000000, %._crit_edge114.thread ]
  %246 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.126)
          to label %275 unwind label %305

247:                                              ; preds = %.lr.ph119, %271
  %248 = phi i64 [ %216, %.lr.ph119 ], [ %272, %271 ]
  %.072117 = phi i64 [ 0, %.lr.ph119 ], [ %273, %271 ]
  %.083116 = phi double [ 0.000000e+00, %.lr.ph119 ], [ %.184, %271 ]
  %.085115 = phi double [ 0.000000e+00, %.lr.ph119 ], [ %.186, %271 ]
  %249 = load ptr, ptr %208, align 8, !tbaa !14
  %250 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %249, i64 %.072117
  %251 = getelementptr inbounds i8, ptr %250, i64 72
  %252 = load i32, ptr %251, align 8, !tbaa !43
  %.not = icmp eq i32 %252, -1
  br i1 %.not, label %253, label %271

253:                                              ; preds = %247
  %254 = getelementptr inbounds i8, ptr %250, i64 88
  %255 = load double, ptr %254, align 8, !tbaa !15
  %256 = call noundef double @_ZSt3absd(double noundef %255)
  %257 = fadd double %.083116, %256
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %6) #7
  %258 = load ptr, ptr %208, align 8, !tbaa !14
  %259 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %258, i64 %.072117, i32 10
  %260 = load double, ptr %259, align 8, !tbaa !15
  %261 = call noundef double @_ZSt3absd(double noundef %260)
  store double %261, ptr %6, align 8, !tbaa !29
  %262 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %2, ptr noundef nonnull align 8 dereferenceable(8) %6)
  %263 = load double, ptr %262, align 8, !tbaa !29
  store double %263, ptr %2, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %6) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %7) #7
  %264 = load ptr, ptr %208, align 8, !tbaa !14
  %265 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %264, i64 %.072117, i32 10
  %266 = load double, ptr %265, align 8, !tbaa !15
  %267 = call noundef double @_ZSt3absd(double noundef %266)
  store double %267, ptr %7, align 8, !tbaa !29
  %268 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %3, ptr noundef nonnull align 8 dereferenceable(8) %7)
  %269 = load double, ptr %268, align 8, !tbaa !29
  store double %269, ptr %3, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %7) #7
  %270 = fadd double %.085115, 1.000000e+00
  %.pre145 = load i64, ptr %10, align 8, !tbaa !5
  br label %271

271:                                              ; preds = %247, %253
  %272 = phi i64 [ %248, %247 ], [ %.pre145, %253 ]
  %.186 = phi double [ %.085115, %247 ], [ %270, %253 ]
  %.184 = phi double [ %.083116, %247 ], [ %257, %253 ]
  %273 = add nuw i64 %.072117, 1
  %274 = icmp ult i64 %273, %272
  br i1 %274, label %247, label %._crit_edge120.loopexit, !llvm.loop !44

275:                                              ; preds = %._crit_edge120
  %276 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.127)
          to label %277 unwind label %305

277:                                              ; preds = %275
  %278 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.128)
          to label %279 unwind label %305

279:                                              ; preds = %277
  %280 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.129)
          to label %281 unwind label %305

281:                                              ; preds = %279
  %282 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %280, double noundef %245)
          to label %283 unwind label %305

283:                                              ; preds = %281
  %284 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %282, ptr noundef nonnull @.str.14)
          to label %285 unwind label %305

285:                                              ; preds = %283
  %286 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.130)
          to label %287 unwind label %305

287:                                              ; preds = %285
  %288 = load double, ptr %2, align 8, !tbaa !29
  %289 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %286, double noundef %288)
          to label %290 unwind label %305

290:                                              ; preds = %287
  %291 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %289, ptr noundef nonnull @.str.14)
          to label %292 unwind label %305

292:                                              ; preds = %290
  %293 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.131)
          to label %294 unwind label %305

294:                                              ; preds = %292
  %295 = load double, ptr %3, align 8, !tbaa !29
  %296 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %293, double noundef %295)
          to label %297 unwind label %305

297:                                              ; preds = %294
  %298 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEPFRSoS_E(ptr noundef nonnull align 8 dereferenceable(8) %296, ptr noundef nonnull @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
          to label %299 unwind label %305

299:                                              ; preds = %297
  store double 1.000000e+05, ptr %2, align 8, !tbaa !29
  store double -1.000000e+05, ptr %3, align 8, !tbaa !29
  %300 = load i64, ptr %10, align 8, !tbaa !5
  %.not137 = icmp eq i64 %300, 0
  br i1 %.not137, label %._crit_edge128, label %.lr.ph127

.lr.ph127:                                        ; preds = %299
  %301 = getelementptr inbounds i8, ptr %0, i64 416
  br label %307

._crit_edge128.loopexit:                          ; preds = %332
  %302 = fdiv double %.3, %.388
  br label %._crit_edge128

._crit_edge128:                                   ; preds = %._crit_edge128.loopexit, %299
  %303 = phi double [ 0x7FF8000000000000, %299 ], [ %302, %._crit_edge128.loopexit ]
  %304 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.7)
          to label %336 unwind label %305

305:                                              ; preds = %364, %362, %360, %357, %355, %353, %350, %348, %346, %344, %342, %340, %338, %336, %._crit_edge128, %297, %294, %292, %290, %287, %285, %283, %281, %279, %277, %275, %._crit_edge120
  %306 = landingpad { ptr, i32 }
          cleanup
  br label %367

307:                                              ; preds = %.lr.ph127, %332
  %308 = phi i64 [ %300, %.lr.ph127 ], [ %333, %332 ]
  %.0125 = phi i64 [ 0, %.lr.ph127 ], [ %334, %332 ]
  %.2124 = phi double [ 0.000000e+00, %.lr.ph127 ], [ %.3, %332 ]
  %.287123 = phi double [ 0.000000e+00, %.lr.ph127 ], [ %.388, %332 ]
  %309 = load ptr, ptr %301, align 8, !tbaa !14
  %310 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %309, i64 %.0125
  %311 = getelementptr inbounds i8, ptr %310, i64 72
  %312 = load i32, ptr %311, align 8, !tbaa !43
  %313 = icmp eq i32 %312, -1
  br i1 %313, label %332, label %314

314:                                              ; preds = %307
  %315 = getelementptr inbounds i8, ptr %310, i64 88
  %316 = load double, ptr %315, align 8, !tbaa !15
  %317 = call noundef double @_ZSt3absd(double noundef %316)
  %318 = fadd double %.2124, %317
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #7
  %319 = load ptr, ptr %301, align 8, !tbaa !14
  %320 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %319, i64 %.0125, i32 10
  %321 = load double, ptr %320, align 8, !tbaa !15
  %322 = call noundef double @_ZSt3absd(double noundef %321)
  store double %322, ptr %8, align 8, !tbaa !29
  %323 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3minIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %2, ptr noundef nonnull align 8 dereferenceable(8) %8)
  %324 = load double, ptr %323, align 8, !tbaa !29
  store double %324, ptr %2, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #7
  %325 = load ptr, ptr %301, align 8, !tbaa !14
  %326 = getelementptr inbounds %"class.EulerSolver2D::node_type", ptr %325, i64 %.0125, i32 10
  %327 = load double, ptr %326, align 8, !tbaa !15
  %328 = call noundef double @_ZSt3absd(double noundef %327)
  store double %328, ptr %9, align 8, !tbaa !29
  %329 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIdERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %3, ptr noundef nonnull align 8 dereferenceable(8) %9)
  %330 = load double, ptr %329, align 8, !tbaa !29
  store double %330, ptr %3, align 8, !tbaa !29
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #7
  %331 = fadd double %.287123, 1.000000e+00
  %.pre146 = load i64, ptr %10, align 8, !tbaa !5
  br label %332

332:                                              ; preds = %307, %314
  %333 = phi i64 [ %308, %307 ], [ %.pre146, %314 ]
  %.388 = phi double [ %.287123, %307 ], [ %331, %314 ]
  %.3 = phi double [ %.2124, %307 ], [ %318, %314 ]
  %334 = add nuw i64 %.0125, 1
  %335 = icmp ult i64 %334, %333
  br i1 %335, label %307, label %._crit_edge128.loopexit, !llvm.loop !45

336:                                              ; preds = %._crit_edge128
  %337 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %304, ptr noundef nonnull @.str.14)
          to label %338 unwind label %305

338:                                              ; preds = %336
  %339 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.132)
          to label %340 unwind label %305

340:                                              ; preds = %338
  %341 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %339, ptr noundef nonnull @.str.14)
          to label %342 unwind label %305

342:                                              ; preds = %340
  %343 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.129)
          to label %344 unwind label %305

344:                                              ; preds = %342
  %345 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %343, double noundef %303)
          to label %346 unwind label %305

346:                                              ; preds = %344
  %347 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %345, ptr noundef nonnull @.str.14)
          to label %348 unwind label %305

348:                                              ; preds = %346
  %349 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.133)
          to label %350 unwind label %305

350:                                              ; preds = %348
  %351 = load double, ptr %2, align 8, !tbaa !29
  %352 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %349, double noundef %351)
          to label %353 unwind label %305

353:                                              ; preds = %350
  %354 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %352, ptr noundef nonnull @.str.14)
          to label %355 unwind label %305

355:                                              ; preds = %353
  %356 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.131)
          to label %357 unwind label %305

357:                                              ; preds = %355
  %358 = load double, ptr %3, align 8, !tbaa !29
  %359 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEd(ptr noundef nonnull align 8 dereferenceable(8) %356, double noundef %358)
          to label %360 unwind label %305

360:                                              ; preds = %357
  %361 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %359, ptr noundef nonnull @.str.14)
          to label %362 unwind label %305

362:                                              ; preds = %360
  %363 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str.134)
          to label %364 unwind label %305

364:                                              ; preds = %362
  %365 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEPFRSoS_E(ptr noundef nonnull align 8 dereferenceable(8) %363, ptr noundef nonnull @_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)
          to label %366 unwind label %305

366:                                              ; preds = %364
  call void @_ZN7Array2DIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %5) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %5) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #7
  ret void

367:                                              ; preds = %55, %123, %305
  %.pn.pn = phi { ptr, i32 } [ %306, %305 ], [ %56, %55 ], [ %124, %123 ]
  call void @_ZN7Array2DIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %5) #7
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %5) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #7
  resume { ptr, i32 } %.pn.pn
}

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !12, i64 408}
!6 = !{!"_ZTSN13EulerSolver2D10MainData2DE", !7, i64 0, !7, i64 32, !7, i64 64, !7, i64 96, !7, i64 128, !7, i64 160, !12, i64 192, !7, i64 200, !7, i64 232, !13, i64 264, !7, i64 272, !7, i64 304, !12, i64 336, !13, i64 344, !13, i64 352, !13, i64 360, !13, i64 368, !13, i64 376, !13, i64 384, !13, i64 392, !13, i64 400, !12, i64 408, !9, i64 416, !12, i64 424, !12, i64 432, !12, i64 440, !9, i64 448, !12, i64 456, !9, i64 464, !12, i64 472, !9, i64 480, !12, i64 488, !9, i64 496, !12, i64 504}
!7 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !8, i64 0, !12, i64 8, !10, i64 16}
!8 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !9, i64 0}
!9 = !{!"any pointer", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C++ TBAA"}
!12 = !{!"long", !10, i64 0}
!13 = !{!"double", !10, i64 0}
!14 = !{!6, !9, i64 416}
!15 = !{!16, !13, i64 88}
!16 = !{!"_ZTSN13EulerSolver2D9node_typeE", !13, i64 0, !13, i64 8, !17, i64 16, !9, i64 24, !17, i64 32, !18, i64 40, !13, i64 64, !17, i64 72, !17, i64 76, !9, i64 80, !13, i64 88, !9, i64 96, !9, i64 104, !9, i64 112, !9, i64 120, !9, i64 128, !9, i64 136, !9, i64 144, !9, i64 152, !9, i64 160, !9, i64 168, !9, i64 176, !9, i64 184, !9, i64 192, !13, i64 200, !13, i64 208, !13, i64 216, !9, i64 224, !9, i64 232, !9, i64 240}
!17 = !{!"int", !10, i64 0}
!18 = !{!"_ZTS8Vector1DIiE", !19, i64 0}
!19 = !{!"_ZTSSt6vectorIiSaIiEE", !20, i64 0}
!20 = !{!"_ZTSSt12_Vector_baseIiSaIiEE", !21, i64 0}
!21 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE12_Vector_implE", !22, i64 0}
!22 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE17_Vector_impl_dataE", !9, i64 0, !9, i64 8, !9, i64 16}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.unroll.disable"}
!25 = !{!6, !12, i64 440}
!26 = !{!6, !9, i64 448}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!13, !13, i64 0}
!30 = !{!31, !17, i64 0}
!31 = !{!"_ZTSN13EulerSolver2D8elm_typeE", !17, i64 0, !9, i64 8, !17, i64 16, !9, i64 24, !13, i64 32, !13, i64 40, !13, i64 48, !9, i64 56, !9, i64 64, !9, i64 72, !9, i64 80, !9, i64 88, !13, i64 96, !13, i64 104, !17, i64 112, !17, i64 116, !18, i64 120, !13, i64 144, !9, i64 152, !9, i64 160, !17, i64 168}
!32 = !{!31, !9, i64 8}
!33 = !{!17, !17, i64 0}
!34 = !{!16, !13, i64 0}
!35 = !{!16, !13, i64 8}
!36 = distinct !{!36, !28}
!37 = !{!31, !13, i64 48}
!38 = !{!31, !13, i64 144}
!39 = distinct !{!39, !28}
!40 = !{!16, !17, i64 32}
!41 = distinct !{!41, !28}
!42 = distinct !{!42, !28}
!43 = !{!16, !17, i64 72}
!44 = distinct !{!44, !28}
!45 = distinct !{!45, !28}


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