; LLVM IR from cdalvaro/computational-physics :: computational-physics/math/differential_equations (SolveEDP)

; 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.cda::math::containers::Vector" = type { i64, ptr, ptr }
%"class.cda::math::containers::Matrix" = type { i64, i64, i64, ptr, ptr }
%"class.cda::math::differential_equations::EDP" = type { %"class.cda::math::containers::Vector", %"class.cda::math::containers::Matrix", %"class.cda::math::containers::Matrix.0", %"class.std::__cxx11::basic_string", ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, ptr, ptr, double }
%"class.cda::math::containers::Matrix.0" = type { i64, i64, i64, ptr, ptr }
%"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] }

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

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
define dso_local void @_ZN3cda4math22differential_equations3EDP12solveDIF_FINEhhRNS0_10containers6VectorIdEES6_d(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8 %0, ptr noundef nonnull align 8 dereferenceable(280) %1, i8 noundef zeroext %2, i8 noundef zeroext %3, ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(24) %5, double noundef %6) #1 align 2 personality ptr @__gxx_personality_v0 {
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca i8, align 1
  %11 = alloca i8, align 1
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca double, align 8
  %15 = alloca i32, align 4
  %16 = alloca i1, align 1
  %17 = alloca i64, align 8
  %18 = alloca double, align 8
  %19 = alloca i64, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i64, align 8
  %23 = alloca double, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, align 8
  %26 = alloca i8, align 1
  %27 = alloca %"class.cda::math::containers::Matrix", align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca %"class.cda::math::containers::Vector", align 8
  %31 = alloca i64, align 8
  %32 = alloca %"class.cda::math::containers::Vector", align 8
  %33 = alloca i64, align 8
  %34 = alloca i32, align 4
  %35 = alloca i64, align 8
  %36 = alloca i64, align 8
  %37 = alloca i64, align 8
  %38 = alloca i64, align 8
  %39 = alloca i64, align 8
  %40 = alloca i64, align 8
  %41 = alloca i64, align 8
  %42 = alloca i64, align 8
  %43 = alloca i64, align 8
  %44 = alloca i64, align 8
  %45 = alloca %"class.cda::math::containers::Vector", align 8
  %46 = alloca %"class.cda::math::containers::Vector", align 8
  %47 = alloca %"class.cda::math::containers::Vector", align 8
  %48 = alloca i64, align 8
  %49 = alloca %"class.cda::math::containers::Matrix", align 8
  %50 = alloca i64, align 8
  %51 = alloca i64, align 8
  %52 = alloca %"class.cda::math::containers::Vector", align 8
  %53 = alloca i64, align 8
  %54 = alloca %"class.cda::math::containers::Vector", align 8
  %55 = alloca i64, align 8
  %56 = alloca i64, align 8
  %57 = alloca i64, align 8
  %58 = alloca i64, align 8
  %59 = alloca i64, align 8
  %60 = alloca i64, align 8
  %61 = alloca i64, align 8
  %62 = alloca i64, align 8
  %63 = alloca i64, align 8
  %64 = alloca i32, align 4
  %65 = alloca i64, align 8
  %66 = alloca i64, align 8
  %67 = alloca i64, align 8
  %68 = alloca i64, align 8
  %69 = alloca i64, align 8
  %70 = alloca i64, align 8
  %71 = alloca i64, align 8
  %72 = alloca i64, align 8
  %73 = alloca i64, align 8
  %74 = alloca i64, align 8
  %75 = alloca i64, align 8
  %76 = alloca i64, align 8
  %77 = alloca %"class.cda::math::containers::Vector", align 8
  %78 = alloca %"class.cda::math::containers::Vector", align 8
  %79 = alloca %"class.cda::math::containers::Vector", align 8
  %80 = alloca %"class.cda::math::containers::Matrix", align 8
  %81 = alloca i64, align 8
  %82 = alloca i64, align 8
  %83 = alloca %"class.cda::math::containers::Vector", align 8
  %84 = alloca i64, align 8
  %85 = alloca %"class.cda::math::containers::Vector", align 8
  %86 = alloca i64, align 8
  %87 = alloca i32, align 4
  %88 = alloca i64, align 8
  %89 = alloca i64, align 8
  %90 = alloca i64, align 8
  %91 = alloca i64, align 8
  %92 = alloca i64, align 8
  %93 = alloca i64, align 8
  %94 = alloca i64, align 8
  %95 = alloca i64, align 8
  %96 = alloca i64, align 8
  %97 = alloca i64, align 8
  %98 = alloca i64, align 8
  %99 = alloca i64, align 8
  %100 = alloca i64, align 8
  %101 = alloca i64, align 8
  %102 = alloca i64, align 8
  %103 = alloca %"class.cda::math::containers::Vector", align 8
  %104 = alloca %"class.cda::math::containers::Vector", align 8
  %105 = alloca %"class.cda::math::containers::Vector", align 8
  %106 = alloca i64, align 8
  %107 = alloca %"class.cda::math::containers::Matrix", align 8
  %108 = alloca i64, align 8
  %109 = alloca i64, align 8
  %110 = alloca %"class.cda::math::containers::Vector", align 8
  %111 = alloca i64, align 8
  %112 = alloca %"class.cda::math::containers::Vector", align 8
  %113 = alloca i64, align 8
  %114 = alloca i64, align 8
  %115 = alloca i64, align 8
  %116 = alloca i64, align 8
  %117 = alloca i64, align 8
  %118 = alloca i64, align 8
  %119 = alloca i64, align 8
  %120 = alloca i64, align 8
  %121 = alloca i64, align 8
  %122 = alloca i32, align 4
  %123 = alloca i64, align 8
  %124 = alloca i64, align 8
  %125 = alloca i64, align 8
  %126 = alloca i64, align 8
  %127 = alloca i64, align 8
  %128 = alloca i64, align 8
  %129 = alloca i64, align 8
  %130 = alloca %"class.cda::math::containers::Vector", align 8
  %131 = alloca %"class.cda::math::containers::Vector", align 8
  %132 = alloca %"class.cda::math::containers::Vector", align 8
  %133 = alloca i64, align 8
  store ptr %0, ptr %8, align 8
  store ptr %1, ptr %9, align 8, !tbaa !5
  store i8 %2, ptr %10, align 1, !tbaa !9
  store i8 %3, ptr %11, align 1, !tbaa !9
  store ptr %4, ptr %12, align 8, !tbaa !5
  store ptr %5, ptr %13, align 8, !tbaa !5
  store double %6, ptr %14, align 8, !tbaa !10
  %134 = load ptr, ptr %9, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  %135 = load ptr, ptr %12, align 8, !tbaa !5
  %136 = call noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %135)
  %137 = trunc i64 %136 to i32
  store i32 %137, ptr %15, align 4, !tbaa !12
  store i1 false, ptr %16, align 1
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %138 = load i32, ptr %15, align 4, !tbaa !12
  %139 = sext i32 %138 to i64
  store i64 %139, ptr %17, align 8, !tbaa !14
  call void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %17)
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #4
  %140 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #4
  %141 = load i32, ptr %15, align 4, !tbaa !12
  %142 = sub nsw i32 %141, 1
  %143 = sext i32 %142 to i64
  store i64 %143, ptr %19, align 8, !tbaa !14
  %144 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %140, ptr noundef nonnull align 8 dereferenceable(8) %19)
          to label %145 unwind label %193

145:                                              ; preds = %7
  %146 = load double, ptr %144, align 8, !tbaa !10
  %147 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #4
  store i64 0, ptr %22, align 8, !tbaa !14
  %148 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %147, ptr noundef nonnull align 8 dereferenceable(8) %22)
          to label %149 unwind label %197

149:                                              ; preds = %145
  %150 = load double, ptr %148, align 8, !tbaa !10
  %151 = fsub double %146, %150
  %152 = load i32, ptr %15, align 4, !tbaa !12
  %153 = sub nsw i32 %152, 1
  %154 = sitofp i32 %153 to double
  %155 = fdiv double %151, %154
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  store double %155, ptr %18, align 8, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #4
  %156 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #4
  store i64 0, ptr %24, align 8, !tbaa !14
  %157 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %156, ptr noundef nonnull align 8 dereferenceable(8) %24)
          to label %158 unwind label %202

158:                                              ; preds = %149
  %159 = load double, ptr %157, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  store double %159, ptr %23, align 8, !tbaa !10
  %160 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  %161 = load ptr, ptr %12, align 8, !tbaa !5
  %162 = invoke noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %161)
          to label %163 unwind label %206

163:                                              ; preds = %158
  store i64 %162, ptr %25, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 1, ptr %26) #4
  store i8 1, ptr %26, align 1, !tbaa !16
  invoke void @_ZN3cda4math10containers6VectorIdE6resizeERKmRKb(ptr noundef nonnull align 8 dereferenceable(24) %160, ptr noundef nonnull align 8 dereferenceable(8) %25, ptr noundef nonnull align 1 dereferenceable(1) %26)
          to label %164 unwind label %210

164:                                              ; preds = %163
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  %165 = load i8, ptr %10, align 1, !tbaa !9
  %166 = zext i8 %165 to i32
  %167 = and i32 %166, 1
  %168 = icmp ne i32 %167, 0
  br i1 %168, label %169, label %469

169:                                              ; preds = %164
  %170 = load i8, ptr %10, align 1, !tbaa !9
  %171 = zext i8 %170 to i32
  %172 = and i32 %171, 2
  %173 = icmp ne i32 %172, 0
  br i1 %173, label %174, label %469

174:                                              ; preds = %169
  call void @llvm.lifetime.start.p0(i64 40, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  %175 = load i32, ptr %15, align 4, !tbaa !12
  %176 = sub nsw i32 %175, 2
  %177 = sext i32 %176 to i64
  store i64 %177, ptr %28, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  store i64 3, ptr %29, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(8) %28, ptr noundef nonnull align 8 dereferenceable(8) %29)
          to label %178 unwind label %215

178:                                              ; preds = %174
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  %179 = load i32, ptr %15, align 4, !tbaa !12
  %180 = sub nsw i32 %179, 2
  %181 = sext i32 %180 to i64
  store i64 %181, ptr %31, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 8 dereferenceable(8) %31)
          to label %182 unwind label %219

182:                                              ; preds = %178
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %32) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #4
  %183 = load i32, ptr %15, align 4, !tbaa !12
  %184 = sub nsw i32 %183, 2
  %185 = sext i32 %184 to i64
  store i64 %185, ptr %33, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %32, ptr noundef nonnull align 8 dereferenceable(8) %33)
          to label %186 unwind label %223

186:                                              ; preds = %182
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  store i32 0, ptr %34, align 4, !tbaa !12
  br label %187

187:                                              ; preds = %289, %186
  %188 = load i32, ptr %34, align 4, !tbaa !12
  %189 = load i32, ptr %15, align 4, !tbaa !12
  %190 = sub nsw i32 %189, 2
  %191 = icmp slt i32 %188, %190
  br i1 %191, label %227, label %192

192:                                              ; preds = %187
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #4
  br label %313

193:                                              ; preds = %7
  %194 = landingpad { ptr, i32 }
          cleanup
  %195 = extractvalue { ptr, i32 } %194, 0
  store ptr %195, ptr %20, align 8
  %196 = extractvalue { ptr, i32 } %194, 1
  store i32 %196, ptr %21, align 4
  br label %201

197:                                              ; preds = %145
  %198 = landingpad { ptr, i32 }
          cleanup
  %199 = extractvalue { ptr, i32 } %198, 0
  store ptr %199, ptr %20, align 8
  %200 = extractvalue { ptr, i32 } %198, 1
  store i32 %200, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  br label %201

201:                                              ; preds = %197, %193
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #4
  br label %1569

202:                                              ; preds = %149
  %203 = landingpad { ptr, i32 }
          cleanup
  %204 = extractvalue { ptr, i32 } %203, 0
  store ptr %204, ptr %20, align 8
  %205 = extractvalue { ptr, i32 } %203, 1
  store i32 %205, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #4
  br label %1568

206:                                              ; preds = %158
  %207 = landingpad { ptr, i32 }
          cleanup
  %208 = extractvalue { ptr, i32 } %207, 0
  store ptr %208, ptr %20, align 8
  %209 = extractvalue { ptr, i32 } %207, 1
  store i32 %209, ptr %21, align 4
  br label %214

210:                                              ; preds = %163
  %211 = landingpad { ptr, i32 }
          cleanup
  %212 = extractvalue { ptr, i32 } %211, 0
  store ptr %212, ptr %20, align 8
  %213 = extractvalue { ptr, i32 } %211, 1
  store i32 %213, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 1, ptr %26) #4
  br label %214

214:                                              ; preds = %210, %206
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  br label %1568

215:                                              ; preds = %174
  %216 = landingpad { ptr, i32 }
          cleanup
  %217 = extractvalue { ptr, i32 } %216, 0
  store ptr %217, ptr %20, align 8
  %218 = extractvalue { ptr, i32 } %216, 1
  store i32 %218, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  br label %468

219:                                              ; preds = %178
  %220 = landingpad { ptr, i32 }
          cleanup
  %221 = extractvalue { ptr, i32 } %220, 0
  store ptr %221, ptr %20, align 8
  %222 = extractvalue { ptr, i32 } %220, 1
  store i32 %222, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  br label %467

223:                                              ; preds = %182
  %224 = landingpad { ptr, i32 }
          cleanup
  %225 = extractvalue { ptr, i32 } %224, 0
  store ptr %225, ptr %20, align 8
  %226 = extractvalue { ptr, i32 } %224, 1
  store i32 %226, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #4
  br label %466

227:                                              ; preds = %187
  %228 = load double, ptr %18, align 8, !tbaa !10
  %229 = load double, ptr %23, align 8, !tbaa !10
  %230 = fadd double %229, %228
  store double %230, ptr %23, align 8, !tbaa !10
  %231 = load double, ptr %18, align 8, !tbaa !10
  %232 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %233 = load ptr, ptr %232, align 8, !tbaa !18
  %234 = load double, ptr %23, align 8, !tbaa !10
  %235 = invoke noundef double %233(double noundef %234)
          to label %236 unwind label %292

236:                                              ; preds = %227
  %237 = fmul double %231, %235
  %238 = fdiv double %237, 2.000000e+00
  %239 = fadd double %238, 1.000000e+00
  %240 = fneg double %239
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #4
  %241 = load i32, ptr %34, align 4, !tbaa !12
  %242 = sext i32 %241 to i64
  store i64 %242, ptr %35, align 8, !tbaa !14
  %243 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(8) %35)
          to label %244 unwind label %296

244:                                              ; preds = %236
  %245 = getelementptr inbounds double, ptr %243, i64 0
  store double %240, ptr %245, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #4
  %246 = load double, ptr %18, align 8, !tbaa !10
  %247 = load double, ptr %18, align 8, !tbaa !10
  %248 = fmul double %246, %247
  %249 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %250 = load ptr, ptr %249, align 8, !tbaa !25
  %251 = load double, ptr %23, align 8, !tbaa !10
  %252 = invoke noundef double %250(double noundef %251)
          to label %253 unwind label %292

253:                                              ; preds = %244
  %254 = fneg double %248
  %255 = call double @llvm.fmuladd.f64(double %254, double %252, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #4
  %256 = load i32, ptr %34, align 4, !tbaa !12
  %257 = sext i32 %256 to i64
  store i64 %257, ptr %36, align 8, !tbaa !14
  %258 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(8) %36)
          to label %259 unwind label %300

259:                                              ; preds = %253
  %260 = getelementptr inbounds double, ptr %258, i64 1
  store double %255, ptr %260, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  %261 = load double, ptr %18, align 8, !tbaa !10
  %262 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %263 = load ptr, ptr %262, align 8, !tbaa !18
  %264 = load double, ptr %23, align 8, !tbaa !10
  %265 = invoke noundef double %263(double noundef %264)
          to label %266 unwind label %292

266:                                              ; preds = %259
  %267 = fmul double %261, %265
  %268 = fdiv double %267, 2.000000e+00
  %269 = fsub double %268, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #4
  %270 = load i32, ptr %34, align 4, !tbaa !12
  %271 = sext i32 %270 to i64
  store i64 %271, ptr %37, align 8, !tbaa !14
  %272 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(8) %37)
          to label %273 unwind label %304

273:                                              ; preds = %266
  %274 = getelementptr inbounds double, ptr %272, i64 2
  store double %269, ptr %274, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  %275 = load double, ptr %18, align 8, !tbaa !10
  %276 = fneg double %275
  %277 = load double, ptr %18, align 8, !tbaa !10
  %278 = fmul double %276, %277
  %279 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %280 = load ptr, ptr %279, align 8, !tbaa !26
  %281 = load double, ptr %23, align 8, !tbaa !10
  %282 = invoke noundef double %280(double noundef %281)
          to label %283 unwind label %292

283:                                              ; preds = %273
  %284 = fmul double %278, %282
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #4
  %285 = load i32, ptr %34, align 4, !tbaa !12
  %286 = sext i32 %285 to i64
  store i64 %286, ptr %38, align 8, !tbaa !14
  %287 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 8 dereferenceable(8) %38)
          to label %288 unwind label %308

288:                                              ; preds = %283
  store double %284, ptr %287, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  br label %289

289:                                              ; preds = %288
  %290 = load i32, ptr %34, align 4, !tbaa !12
  %291 = add nsw i32 %290, 1
  store i32 %291, ptr %34, align 4, !tbaa !12
  br label %187, !llvm.loop !27

292:                                              ; preds = %273, %259, %244, %227
  %293 = landingpad { ptr, i32 }
          cleanup
  %294 = extractvalue { ptr, i32 } %293, 0
  store ptr %294, ptr %20, align 8
  %295 = extractvalue { ptr, i32 } %293, 1
  store i32 %295, ptr %21, align 4
  br label %312

296:                                              ; preds = %236
  %297 = landingpad { ptr, i32 }
          cleanup
  %298 = extractvalue { ptr, i32 } %297, 0
  store ptr %298, ptr %20, align 8
  %299 = extractvalue { ptr, i32 } %297, 1
  store i32 %299, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #4
  br label %312

300:                                              ; preds = %253
  %301 = landingpad { ptr, i32 }
          cleanup
  %302 = extractvalue { ptr, i32 } %301, 0
  store ptr %302, ptr %20, align 8
  %303 = extractvalue { ptr, i32 } %301, 1
  store i32 %303, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #4
  br label %312

304:                                              ; preds = %266
  %305 = landingpad { ptr, i32 }
          cleanup
  %306 = extractvalue { ptr, i32 } %305, 0
  store ptr %306, ptr %20, align 8
  %307 = extractvalue { ptr, i32 } %305, 1
  store i32 %307, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #4
  br label %312

308:                                              ; preds = %283
  %309 = landingpad { ptr, i32 }
          cleanup
  %310 = extractvalue { ptr, i32 } %309, 0
  store ptr %310, ptr %20, align 8
  %311 = extractvalue { ptr, i32 } %309, 1
  store i32 %311, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #4
  br label %312

312:                                              ; preds = %308, %304, %300, %296, %292
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #4
  br label %465

313:                                              ; preds = %192
  %314 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %315 = load ptr, ptr %314, align 8, !tbaa !18
  %316 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #4
  store i64 0, ptr %39, align 8, !tbaa !14
  %317 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %316, ptr noundef nonnull align 8 dereferenceable(8) %39)
          to label %318 unwind label %383

318:                                              ; preds = %313
  %319 = load double, ptr %317, align 8, !tbaa !10
  %320 = load double, ptr %18, align 8, !tbaa !10
  %321 = fadd double %319, %320
  %322 = invoke noundef double %315(double noundef %321)
          to label %323 unwind label %383

323:                                              ; preds = %318
  %324 = load double, ptr %18, align 8, !tbaa !10
  %325 = fmul double %322, %324
  %326 = fdiv double %325, 2.000000e+00
  %327 = fadd double 1.000000e+00, %326
  %328 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 7
  %329 = load ptr, ptr %328, align 8, !tbaa !29
  %330 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #4
  store i64 0, ptr %40, align 8, !tbaa !14
  %331 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %330, ptr noundef nonnull align 8 dereferenceable(8) %40)
          to label %332 unwind label %387

332:                                              ; preds = %323
  %333 = load double, ptr %331, align 8, !tbaa !10
  %334 = invoke noundef double %329(double noundef %333, double noundef 0.000000e+00)
          to label %335 unwind label %387

335:                                              ; preds = %332
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #4
  store i64 0, ptr %41, align 8, !tbaa !14
  %336 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 8 dereferenceable(8) %41)
          to label %337 unwind label %391

337:                                              ; preds = %335
  %338 = load double, ptr %336, align 8, !tbaa !10
  %339 = call double @llvm.fmuladd.f64(double %327, double %334, double %338)
  store double %339, ptr %336, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  %340 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %341 = load ptr, ptr %340, align 8, !tbaa !18
  %342 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #4
  %343 = load i32, ptr %15, align 4, !tbaa !12
  %344 = sub nsw i32 %343, 1
  %345 = sext i32 %344 to i64
  store i64 %345, ptr %42, align 8, !tbaa !14
  %346 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %342, ptr noundef nonnull align 8 dereferenceable(8) %42)
          to label %347 unwind label %397

347:                                              ; preds = %337
  %348 = load double, ptr %346, align 8, !tbaa !10
  %349 = load double, ptr %18, align 8, !tbaa !10
  %350 = fsub double %348, %349
  %351 = invoke noundef double %341(double noundef %350)
          to label %352 unwind label %397

352:                                              ; preds = %347
  %353 = load double, ptr %18, align 8, !tbaa !10
  %354 = fmul double %351, %353
  %355 = fdiv double %354, 2.000000e+00
  %356 = fsub double 1.000000e+00, %355
  %357 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 8
  %358 = load ptr, ptr %357, align 8, !tbaa !30
  %359 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #4
  %360 = load i32, ptr %15, align 4, !tbaa !12
  %361 = sub nsw i32 %360, 1
  %362 = sext i32 %361 to i64
  store i64 %362, ptr %43, align 8, !tbaa !14
  %363 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %359, ptr noundef nonnull align 8 dereferenceable(8) %43)
          to label %364 unwind label %401

364:                                              ; preds = %352
  %365 = load double, ptr %363, align 8, !tbaa !10
  %366 = invoke noundef double %358(double noundef %365, double noundef 0.000000e+00)
          to label %367 unwind label %401

367:                                              ; preds = %364
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  %368 = load i32, ptr %15, align 4, !tbaa !12
  %369 = sub nsw i32 %368, 3
  %370 = sext i32 %369 to i64
  store i64 %370, ptr %44, align 8, !tbaa !14
  %371 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 8 dereferenceable(8) %44)
          to label %372 unwind label %405

372:                                              ; preds = %367
  %373 = load double, ptr %371, align 8, !tbaa !10
  %374 = call double @llvm.fmuladd.f64(double %356, double %366, double %373)
  store double %374, ptr %371, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  %375 = load i8, ptr %11, align 1, !tbaa !9
  %376 = zext i8 %375 to i32
  %377 = and i32 %376, 32
  %378 = icmp ne i32 %377, 0
  br i1 %378, label %379, label %420

379:                                              ; preds = %372
  call void @llvm.lifetime.start.p0(i64 24, ptr %45) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %45, ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(24) %30)
          to label %380 unwind label %411

380:                                              ; preds = %379
  %381 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %32, ptr noundef nonnull align 8 dereferenceable(24) %45)
          to label %382 unwind label %415

382:                                              ; preds = %380
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %45) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %45) #4
  br label %452

383:                                              ; preds = %318, %313
  %384 = landingpad { ptr, i32 }
          cleanup
  %385 = extractvalue { ptr, i32 } %384, 0
  store ptr %385, ptr %20, align 8
  %386 = extractvalue { ptr, i32 } %384, 1
  store i32 %386, ptr %21, align 4
  br label %396

387:                                              ; preds = %332, %323
  %388 = landingpad { ptr, i32 }
          cleanup
  %389 = extractvalue { ptr, i32 } %388, 0
  store ptr %389, ptr %20, align 8
  %390 = extractvalue { ptr, i32 } %388, 1
  store i32 %390, ptr %21, align 4
  br label %395

391:                                              ; preds = %335
  %392 = landingpad { ptr, i32 }
          cleanup
  %393 = extractvalue { ptr, i32 } %392, 0
  store ptr %393, ptr %20, align 8
  %394 = extractvalue { ptr, i32 } %392, 1
  store i32 %394, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #4
  br label %395

395:                                              ; preds = %391, %387
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #4
  br label %396

396:                                              ; preds = %395, %383
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #4
  br label %465

397:                                              ; preds = %347, %337
  %398 = landingpad { ptr, i32 }
          cleanup
  %399 = extractvalue { ptr, i32 } %398, 0
  store ptr %399, ptr %20, align 8
  %400 = extractvalue { ptr, i32 } %398, 1
  store i32 %400, ptr %21, align 4
  br label %410

401:                                              ; preds = %364, %352
  %402 = landingpad { ptr, i32 }
          cleanup
  %403 = extractvalue { ptr, i32 } %402, 0
  store ptr %403, ptr %20, align 8
  %404 = extractvalue { ptr, i32 } %402, 1
  store i32 %404, ptr %21, align 4
  br label %409

405:                                              ; preds = %367
  %406 = landingpad { ptr, i32 }
          cleanup
  %407 = extractvalue { ptr, i32 } %406, 0
  store ptr %407, ptr %20, align 8
  %408 = extractvalue { ptr, i32 } %406, 1
  store i32 %408, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  br label %409

409:                                              ; preds = %405, %401
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #4
  br label %410

410:                                              ; preds = %409, %397
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #4
  br label %465

411:                                              ; preds = %379
  %412 = landingpad { ptr, i32 }
          cleanup
  %413 = extractvalue { ptr, i32 } %412, 0
  store ptr %413, ptr %20, align 8
  %414 = extractvalue { ptr, i32 } %412, 1
  store i32 %414, ptr %21, align 4
  br label %419

415:                                              ; preds = %380
  %416 = landingpad { ptr, i32 }
          cleanup
  %417 = extractvalue { ptr, i32 } %416, 0
  store ptr %417, ptr %20, align 8
  %418 = extractvalue { ptr, i32 } %416, 1
  store i32 %418, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %45) #4
  br label %419

419:                                              ; preds = %415, %411
  call void @llvm.lifetime.end.p0(i64 24, ptr %45) #4
  br label %465

420:                                              ; preds = %372
  %421 = load i8, ptr %11, align 1, !tbaa !9
  %422 = zext i8 %421 to i32
  %423 = and i32 %422, 64
  %424 = icmp ne i32 %423, 0
  br i1 %424, label %425, label %438

425:                                              ; preds = %420
  call void @llvm.lifetime.start.p0(i64 24, ptr %46) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %46, ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(24) %30, ptr noundef nonnull align 8 dereferenceable(8) %14)
          to label %426 unwind label %429

426:                                              ; preds = %425
  %427 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %32, ptr noundef nonnull align 8 dereferenceable(24) %46)
          to label %428 unwind label %433

428:                                              ; preds = %426
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %46) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %46) #4
  br label %451

429:                                              ; preds = %425
  %430 = landingpad { ptr, i32 }
          cleanup
  %431 = extractvalue { ptr, i32 } %430, 0
  store ptr %431, ptr %20, align 8
  %432 = extractvalue { ptr, i32 } %430, 1
  store i32 %432, ptr %21, align 4
  br label %437

433:                                              ; preds = %426
  %434 = landingpad { ptr, i32 }
          cleanup
  %435 = extractvalue { ptr, i32 } %434, 0
  store ptr %435, ptr %20, align 8
  %436 = extractvalue { ptr, i32 } %434, 1
  store i32 %436, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %46) #4
  br label %437

437:                                              ; preds = %433, %429
  call void @llvm.lifetime.end.p0(i64 24, ptr %46) #4
  br label %465

438:                                              ; preds = %420
  call void @llvm.lifetime.start.p0(i64 24, ptr %47) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %47, ptr noundef nonnull align 8 dereferenceable(40) %27, ptr noundef nonnull align 8 dereferenceable(24) %30)
          to label %439 unwind label %442

439:                                              ; preds = %438
  %440 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %32, ptr noundef nonnull align 8 dereferenceable(24) %47)
          to label %441 unwind label %446

441:                                              ; preds = %439
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %47) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %47) #4
  br label %451

442:                                              ; preds = %438
  %443 = landingpad { ptr, i32 }
          cleanup
  %444 = extractvalue { ptr, i32 } %443, 0
  store ptr %444, ptr %20, align 8
  %445 = extractvalue { ptr, i32 } %443, 1
  store i32 %445, ptr %21, align 4
  br label %450

446:                                              ; preds = %439
  %447 = landingpad { ptr, i32 }
          cleanup
  %448 = extractvalue { ptr, i32 } %447, 0
  store ptr %448, ptr %20, align 8
  %449 = extractvalue { ptr, i32 } %447, 1
  store i32 %449, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %47) #4
  br label %450

450:                                              ; preds = %446, %442
  call void @llvm.lifetime.end.p0(i64 24, ptr %47) #4
  br label %465

451:                                              ; preds = %441, %428
  br label %452

452:                                              ; preds = %451, %382
  %453 = load ptr, ptr %13, align 8, !tbaa !5
  %454 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %453)
          to label %455 unwind label %457

455:                                              ; preds = %452
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #4
  store i64 1, ptr %48, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %48, ptr noundef nonnull align 8 dereferenceable(24) %32)
          to label %456 unwind label %461

456:                                              ; preds = %455
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %32) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %32) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %30) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %27) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %27) #4
  br label %469

457:                                              ; preds = %452
  %458 = landingpad { ptr, i32 }
          cleanup
  %459 = extractvalue { ptr, i32 } %458, 0
  store ptr %459, ptr %20, align 8
  %460 = extractvalue { ptr, i32 } %458, 1
  store i32 %460, ptr %21, align 4
  br label %465

461:                                              ; preds = %455
  %462 = landingpad { ptr, i32 }
          cleanup
  %463 = extractvalue { ptr, i32 } %462, 0
  store ptr %463, ptr %20, align 8
  %464 = extractvalue { ptr, i32 } %462, 1
  store i32 %464, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #4
  br label %465

465:                                              ; preds = %461, %457, %450, %437, %419, %410, %396, %312
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %32) #4
  br label %466

466:                                              ; preds = %465, %223
  call void @llvm.lifetime.end.p0(i64 24, ptr %32) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %30) #4
  br label %467

467:                                              ; preds = %466, %219
  call void @llvm.lifetime.end.p0(i64 24, ptr %30) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %27) #4
  br label %468

468:                                              ; preds = %467, %215
  call void @llvm.lifetime.end.p0(i64 40, ptr %27) #4
  br label %1568

469:                                              ; preds = %456, %169, %164
  %470 = load i8, ptr %11, align 1, !tbaa !9
  %471 = zext i8 %470 to i32
  %472 = and i32 %471, 16
  %473 = icmp eq i32 %472, 16
  br i1 %473, label %474, label %872

474:                                              ; preds = %469
  %475 = load i8, ptr %11, align 1, !tbaa !9
  %476 = zext i8 %475 to i32
  %477 = and i32 %476, 32
  %478 = icmp eq i32 %477, 32
  br i1 %478, label %479, label %872

479:                                              ; preds = %474
  call void @llvm.lifetime.start.p0(i64 40, ptr %49) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #4
  %480 = load i32, ptr %15, align 4, !tbaa !12
  %481 = sext i32 %480 to i64
  store i64 %481, ptr %50, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #4
  store i64 3, ptr %51, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %50, ptr noundef nonnull align 8 dereferenceable(8) %51)
          to label %482 unwind label %556

482:                                              ; preds = %479
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %52) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #4
  %483 = load i32, ptr %15, align 4, !tbaa !12
  %484 = sext i32 %483 to i64
  store i64 %484, ptr %53, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %52, ptr noundef nonnull align 8 dereferenceable(8) %53)
          to label %485 unwind label %560

485:                                              ; preds = %482
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %54) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #4
  %486 = load i32, ptr %15, align 4, !tbaa !12
  %487 = sext i32 %486 to i64
  store i64 %487, ptr %55, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %54, ptr noundef nonnull align 8 dereferenceable(8) %55)
          to label %488 unwind label %564

488:                                              ; preds = %485
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #4
  store i64 0, ptr %56, align 8, !tbaa !14
  %489 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %56)
          to label %490 unwind label %568

490:                                              ; preds = %488
  %491 = getelementptr inbounds double, ptr %489, i64 0
  store double 0.000000e+00, ptr %491, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #4
  %492 = load double, ptr %18, align 8, !tbaa !10
  %493 = load double, ptr %18, align 8, !tbaa !10
  %494 = fmul double %492, %493
  %495 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %496 = load ptr, ptr %495, align 8, !tbaa !25
  %497 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #4
  store i64 0, ptr %57, align 8, !tbaa !14
  %498 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %497, ptr noundef nonnull align 8 dereferenceable(8) %57)
          to label %499 unwind label %572

499:                                              ; preds = %490
  %500 = load double, ptr %498, align 8, !tbaa !10
  %501 = invoke noundef double %496(double noundef %500)
          to label %502 unwind label %572

502:                                              ; preds = %499
  %503 = fneg double %494
  %504 = call double @llvm.fmuladd.f64(double %503, double %501, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #4
  store i64 0, ptr %58, align 8, !tbaa !14
  %505 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %58)
          to label %506 unwind label %576

506:                                              ; preds = %502
  %507 = getelementptr inbounds double, ptr %505, i64 1
  store double %504, ptr %507, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #4
  store i64 0, ptr %59, align 8, !tbaa !14
  %508 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %59)
          to label %509 unwind label %581

509:                                              ; preds = %506
  %510 = getelementptr inbounds double, ptr %508, i64 2
  store double -2.000000e+00, ptr %510, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #4
  %511 = load double, ptr %18, align 8, !tbaa !10
  %512 = fneg double %511
  %513 = load double, ptr %18, align 8, !tbaa !10
  %514 = fmul double %512, %513
  %515 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %516 = load ptr, ptr %515, align 8, !tbaa !26
  %517 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #4
  store i64 0, ptr %60, align 8, !tbaa !14
  %518 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %517, ptr noundef nonnull align 8 dereferenceable(8) %60)
          to label %519 unwind label %585

519:                                              ; preds = %509
  %520 = load double, ptr %518, align 8, !tbaa !10
  %521 = invoke noundef double %516(double noundef %520)
          to label %522 unwind label %585

522:                                              ; preds = %519
  %523 = load double, ptr %18, align 8, !tbaa !10
  %524 = fmul double 2.000000e+00, %523
  %525 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 7
  %526 = load ptr, ptr %525, align 8, !tbaa !29
  %527 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #4
  store i64 0, ptr %61, align 8, !tbaa !14
  %528 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %527, ptr noundef nonnull align 8 dereferenceable(8) %61)
          to label %529 unwind label %589

529:                                              ; preds = %522
  %530 = load double, ptr %528, align 8, !tbaa !10
  %531 = invoke noundef double %526(double noundef %530, double noundef 0.000000e+00)
          to label %532 unwind label %589

532:                                              ; preds = %529
  %533 = fmul double %524, %531
  %534 = load double, ptr %18, align 8, !tbaa !10
  %535 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %536 = load ptr, ptr %535, align 8, !tbaa !18
  %537 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #4
  store i64 0, ptr %62, align 8, !tbaa !14
  %538 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %537, ptr noundef nonnull align 8 dereferenceable(8) %62)
          to label %539 unwind label %593

539:                                              ; preds = %532
  %540 = load double, ptr %538, align 8, !tbaa !10
  %541 = invoke noundef double %536(double noundef %540)
          to label %542 unwind label %593

542:                                              ; preds = %539
  %543 = fmul double %534, %541
  %544 = fdiv double %543, 2.000000e+00
  %545 = fsub double %544, 1.000000e+00
  %546 = fmul double %533, %545
  %547 = call double @llvm.fmuladd.f64(double %514, double %521, double %546)
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #4
  store i64 0, ptr %63, align 8, !tbaa !14
  %548 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %52, ptr noundef nonnull align 8 dereferenceable(8) %63)
          to label %549 unwind label %597

549:                                              ; preds = %542
  store double %547, ptr %548, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %64) #4
  store i32 1, ptr %64, align 4, !tbaa !12
  br label %550

550:                                              ; preds = %666, %549
  %551 = load i32, ptr %64, align 4, !tbaa !12
  %552 = load i32, ptr %15, align 4, !tbaa !12
  %553 = sub nsw i32 %552, 1
  %554 = icmp slt i32 %551, %553
  br i1 %554, label %604, label %555

555:                                              ; preds = %550
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #4
  br label %690

556:                                              ; preds = %479
  %557 = landingpad { ptr, i32 }
          cleanup
  %558 = extractvalue { ptr, i32 } %557, 0
  store ptr %558, ptr %20, align 8
  %559 = extractvalue { ptr, i32 } %557, 1
  store i32 %559, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #4
  br label %871

560:                                              ; preds = %482
  %561 = landingpad { ptr, i32 }
          cleanup
  %562 = extractvalue { ptr, i32 } %561, 0
  store ptr %562, ptr %20, align 8
  %563 = extractvalue { ptr, i32 } %561, 1
  store i32 %563, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #4
  br label %870

564:                                              ; preds = %485
  %565 = landingpad { ptr, i32 }
          cleanup
  %566 = extractvalue { ptr, i32 } %565, 0
  store ptr %566, ptr %20, align 8
  %567 = extractvalue { ptr, i32 } %565, 1
  store i32 %567, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #4
  br label %869

568:                                              ; preds = %488
  %569 = landingpad { ptr, i32 }
          cleanup
  %570 = extractvalue { ptr, i32 } %569, 0
  store ptr %570, ptr %20, align 8
  %571 = extractvalue { ptr, i32 } %569, 1
  store i32 %571, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #4
  br label %868

572:                                              ; preds = %499, %490
  %573 = landingpad { ptr, i32 }
          cleanup
  %574 = extractvalue { ptr, i32 } %573, 0
  store ptr %574, ptr %20, align 8
  %575 = extractvalue { ptr, i32 } %573, 1
  store i32 %575, ptr %21, align 4
  br label %580

576:                                              ; preds = %502
  %577 = landingpad { ptr, i32 }
          cleanup
  %578 = extractvalue { ptr, i32 } %577, 0
  store ptr %578, ptr %20, align 8
  %579 = extractvalue { ptr, i32 } %577, 1
  store i32 %579, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #4
  br label %580

580:                                              ; preds = %576, %572
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #4
  br label %868

581:                                              ; preds = %506
  %582 = landingpad { ptr, i32 }
          cleanup
  %583 = extractvalue { ptr, i32 } %582, 0
  store ptr %583, ptr %20, align 8
  %584 = extractvalue { ptr, i32 } %582, 1
  store i32 %584, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #4
  br label %868

585:                                              ; preds = %519, %509
  %586 = landingpad { ptr, i32 }
          cleanup
  %587 = extractvalue { ptr, i32 } %586, 0
  store ptr %587, ptr %20, align 8
  %588 = extractvalue { ptr, i32 } %586, 1
  store i32 %588, ptr %21, align 4
  br label %603

589:                                              ; preds = %529, %522
  %590 = landingpad { ptr, i32 }
          cleanup
  %591 = extractvalue { ptr, i32 } %590, 0
  store ptr %591, ptr %20, align 8
  %592 = extractvalue { ptr, i32 } %590, 1
  store i32 %592, ptr %21, align 4
  br label %602

593:                                              ; preds = %539, %532
  %594 = landingpad { ptr, i32 }
          cleanup
  %595 = extractvalue { ptr, i32 } %594, 0
  store ptr %595, ptr %20, align 8
  %596 = extractvalue { ptr, i32 } %594, 1
  store i32 %596, ptr %21, align 4
  br label %601

597:                                              ; preds = %542
  %598 = landingpad { ptr, i32 }
          cleanup
  %599 = extractvalue { ptr, i32 } %598, 0
  store ptr %599, ptr %20, align 8
  %600 = extractvalue { ptr, i32 } %598, 1
  store i32 %600, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #4
  br label %601

601:                                              ; preds = %597, %593
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #4
  br label %602

602:                                              ; preds = %601, %589
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #4
  br label %603

603:                                              ; preds = %602, %585
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #4
  br label %868

604:                                              ; preds = %550
  %605 = load double, ptr %18, align 8, !tbaa !10
  %606 = load double, ptr %23, align 8, !tbaa !10
  %607 = fadd double %606, %605
  store double %607, ptr %23, align 8, !tbaa !10
  %608 = load double, ptr %18, align 8, !tbaa !10
  %609 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %610 = load ptr, ptr %609, align 8, !tbaa !18
  %611 = load double, ptr %23, align 8, !tbaa !10
  %612 = invoke noundef double %610(double noundef %611)
          to label %613 unwind label %669

613:                                              ; preds = %604
  %614 = fmul double %608, %612
  %615 = fdiv double %614, 2.000000e+00
  %616 = fadd double %615, 1.000000e+00
  %617 = fneg double %616
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #4
  %618 = load i32, ptr %64, align 4, !tbaa !12
  %619 = sext i32 %618 to i64
  store i64 %619, ptr %65, align 8, !tbaa !14
  %620 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %65)
          to label %621 unwind label %673

621:                                              ; preds = %613
  %622 = getelementptr inbounds double, ptr %620, i64 0
  store double %617, ptr %622, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #4
  %623 = load double, ptr %18, align 8, !tbaa !10
  %624 = load double, ptr %18, align 8, !tbaa !10
  %625 = fmul double %623, %624
  %626 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %627 = load ptr, ptr %626, align 8, !tbaa !25
  %628 = load double, ptr %23, align 8, !tbaa !10
  %629 = invoke noundef double %627(double noundef %628)
          to label %630 unwind label %669

630:                                              ; preds = %621
  %631 = fneg double %625
  %632 = call double @llvm.fmuladd.f64(double %631, double %629, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #4
  %633 = load i32, ptr %64, align 4, !tbaa !12
  %634 = sext i32 %633 to i64
  store i64 %634, ptr %66, align 8, !tbaa !14
  %635 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %66)
          to label %636 unwind label %677

636:                                              ; preds = %630
  %637 = getelementptr inbounds double, ptr %635, i64 1
  store double %632, ptr %637, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #4
  %638 = load double, ptr %18, align 8, !tbaa !10
  %639 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %640 = load ptr, ptr %639, align 8, !tbaa !18
  %641 = load double, ptr %23, align 8, !tbaa !10
  %642 = invoke noundef double %640(double noundef %641)
          to label %643 unwind label %669

643:                                              ; preds = %636
  %644 = fmul double %638, %642
  %645 = fdiv double %644, 2.000000e+00
  %646 = fsub double %645, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #4
  %647 = load i32, ptr %64, align 4, !tbaa !12
  %648 = sext i32 %647 to i64
  store i64 %648, ptr %67, align 8, !tbaa !14
  %649 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %67)
          to label %650 unwind label %681

650:                                              ; preds = %643
  %651 = getelementptr inbounds double, ptr %649, i64 2
  store double %646, ptr %651, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #4
  %652 = load double, ptr %18, align 8, !tbaa !10
  %653 = fneg double %652
  %654 = load double, ptr %18, align 8, !tbaa !10
  %655 = fmul double %653, %654
  %656 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %657 = load ptr, ptr %656, align 8, !tbaa !26
  %658 = load double, ptr %23, align 8, !tbaa !10
  %659 = invoke noundef double %657(double noundef %658)
          to label %660 unwind label %669

660:                                              ; preds = %650
  %661 = fmul double %655, %659
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #4
  %662 = load i32, ptr %64, align 4, !tbaa !12
  %663 = sext i32 %662 to i64
  store i64 %663, ptr %68, align 8, !tbaa !14
  %664 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %52, ptr noundef nonnull align 8 dereferenceable(8) %68)
          to label %665 unwind label %685

665:                                              ; preds = %660
  store double %661, ptr %664, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #4
  br label %666

666:                                              ; preds = %665
  %667 = load i32, ptr %64, align 4, !tbaa !12
  %668 = add nsw i32 %667, 1
  store i32 %668, ptr %64, align 4, !tbaa !12
  br label %550, !llvm.loop !31

669:                                              ; preds = %650, %636, %621, %604
  %670 = landingpad { ptr, i32 }
          cleanup
  %671 = extractvalue { ptr, i32 } %670, 0
  store ptr %671, ptr %20, align 8
  %672 = extractvalue { ptr, i32 } %670, 1
  store i32 %672, ptr %21, align 4
  br label %689

673:                                              ; preds = %613
  %674 = landingpad { ptr, i32 }
          cleanup
  %675 = extractvalue { ptr, i32 } %674, 0
  store ptr %675, ptr %20, align 8
  %676 = extractvalue { ptr, i32 } %674, 1
  store i32 %676, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #4
  br label %689

677:                                              ; preds = %630
  %678 = landingpad { ptr, i32 }
          cleanup
  %679 = extractvalue { ptr, i32 } %678, 0
  store ptr %679, ptr %20, align 8
  %680 = extractvalue { ptr, i32 } %678, 1
  store i32 %680, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #4
  br label %689

681:                                              ; preds = %643
  %682 = landingpad { ptr, i32 }
          cleanup
  %683 = extractvalue { ptr, i32 } %682, 0
  store ptr %683, ptr %20, align 8
  %684 = extractvalue { ptr, i32 } %682, 1
  store i32 %684, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #4
  br label %689

685:                                              ; preds = %660
  %686 = landingpad { ptr, i32 }
          cleanup
  %687 = extractvalue { ptr, i32 } %686, 0
  store ptr %687, ptr %20, align 8
  %688 = extractvalue { ptr, i32 } %686, 1
  store i32 %688, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #4
  br label %689

689:                                              ; preds = %685, %681, %677, %673, %669
  call void @llvm.lifetime.end.p0(i64 4, ptr %64) #4
  br label %868

690:                                              ; preds = %555
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #4
  %691 = load i32, ptr %15, align 4, !tbaa !12
  %692 = sub nsw i32 %691, 1
  %693 = sext i32 %692 to i64
  store i64 %693, ptr %69, align 8, !tbaa !14
  %694 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %69)
          to label %695 unwind label %784

695:                                              ; preds = %690
  %696 = getelementptr inbounds double, ptr %694, i64 0
  store double -2.000000e+00, ptr %696, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #4
  %697 = load double, ptr %18, align 8, !tbaa !10
  %698 = load double, ptr %18, align 8, !tbaa !10
  %699 = fmul double %697, %698
  %700 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %701 = load ptr, ptr %700, align 8, !tbaa !25
  %702 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %70) #4
  %703 = load i32, ptr %15, align 4, !tbaa !12
  %704 = sub nsw i32 %703, 1
  %705 = sext i32 %704 to i64
  store i64 %705, ptr %70, align 8, !tbaa !14
  %706 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %702, ptr noundef nonnull align 8 dereferenceable(8) %70)
          to label %707 unwind label %788

707:                                              ; preds = %695
  %708 = load double, ptr %706, align 8, !tbaa !10
  %709 = invoke noundef double %701(double noundef %708)
          to label %710 unwind label %788

710:                                              ; preds = %707
  %711 = fneg double %699
  %712 = call double @llvm.fmuladd.f64(double %711, double %709, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #4
  %713 = load i32, ptr %15, align 4, !tbaa !12
  %714 = sub nsw i32 %713, 1
  %715 = sext i32 %714 to i64
  store i64 %715, ptr %71, align 8, !tbaa !14
  %716 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %71)
          to label %717 unwind label %792

717:                                              ; preds = %710
  %718 = getelementptr inbounds double, ptr %716, i64 1
  store double %712, ptr %718, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #4
  %719 = load i32, ptr %15, align 4, !tbaa !12
  %720 = sub nsw i32 %719, 1
  %721 = sext i32 %720 to i64
  store i64 %721, ptr %72, align 8, !tbaa !14
  %722 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(8) %72)
          to label %723 unwind label %797

723:                                              ; preds = %717
  %724 = getelementptr inbounds double, ptr %722, i64 2
  store double 0.000000e+00, ptr %724, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #4
  %725 = load double, ptr %18, align 8, !tbaa !10
  %726 = fneg double %725
  %727 = load double, ptr %18, align 8, !tbaa !10
  %728 = fmul double %726, %727
  %729 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %730 = load ptr, ptr %729, align 8, !tbaa !26
  %731 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #4
  %732 = load i32, ptr %15, align 4, !tbaa !12
  %733 = sub nsw i32 %732, 1
  %734 = sext i32 %733 to i64
  store i64 %734, ptr %73, align 8, !tbaa !14
  %735 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %731, ptr noundef nonnull align 8 dereferenceable(8) %73)
          to label %736 unwind label %801

736:                                              ; preds = %723
  %737 = load double, ptr %735, align 8, !tbaa !10
  %738 = invoke noundef double %730(double noundef %737)
          to label %739 unwind label %801

739:                                              ; preds = %736
  %740 = load double, ptr %18, align 8, !tbaa !10
  %741 = fmul double 2.000000e+00, %740
  %742 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 8
  %743 = load ptr, ptr %742, align 8, !tbaa !30
  %744 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #4
  %745 = load i32, ptr %15, align 4, !tbaa !12
  %746 = sub nsw i32 %745, 1
  %747 = sext i32 %746 to i64
  store i64 %747, ptr %74, align 8, !tbaa !14
  %748 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %744, ptr noundef nonnull align 8 dereferenceable(8) %74)
          to label %749 unwind label %805

749:                                              ; preds = %739
  %750 = load double, ptr %748, align 8, !tbaa !10
  %751 = invoke noundef double %743(double noundef %750, double noundef 0.000000e+00)
          to label %752 unwind label %805

752:                                              ; preds = %749
  %753 = fmul double %741, %751
  %754 = load double, ptr %18, align 8, !tbaa !10
  %755 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %756 = load ptr, ptr %755, align 8, !tbaa !18
  %757 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #4
  %758 = load i32, ptr %15, align 4, !tbaa !12
  %759 = sub nsw i32 %758, 1
  %760 = sext i32 %759 to i64
  store i64 %760, ptr %75, align 8, !tbaa !14
  %761 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %757, ptr noundef nonnull align 8 dereferenceable(8) %75)
          to label %762 unwind label %809

762:                                              ; preds = %752
  %763 = load double, ptr %761, align 8, !tbaa !10
  %764 = invoke noundef double %756(double noundef %763)
          to label %765 unwind label %809

765:                                              ; preds = %762
  %766 = fmul double %754, %764
  %767 = fdiv double %766, 2.000000e+00
  %768 = fadd double %767, 1.000000e+00
  %769 = fmul double %753, %768
  %770 = call double @llvm.fmuladd.f64(double %728, double %738, double %769)
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #4
  %771 = load i32, ptr %15, align 4, !tbaa !12
  %772 = sub nsw i32 %771, 1
  %773 = sext i32 %772 to i64
  store i64 %773, ptr %76, align 8, !tbaa !14
  %774 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %52, ptr noundef nonnull align 8 dereferenceable(8) %76)
          to label %775 unwind label %813

775:                                              ; preds = %765
  store double %770, ptr %774, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #4
  %776 = load i8, ptr %11, align 1, !tbaa !9
  %777 = zext i8 %776 to i32
  %778 = and i32 %777, 32
  %779 = icmp ne i32 %778, 0
  br i1 %779, label %780, label %829

780:                                              ; preds = %775
  call void @llvm.lifetime.start.p0(i64 24, ptr %77) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %77, ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(24) %52)
          to label %781 unwind label %820

781:                                              ; preds = %780
  %782 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %54, ptr noundef nonnull align 8 dereferenceable(24) %77)
          to label %783 unwind label %824

783:                                              ; preds = %781
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %77) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %77) #4
  br label %861

784:                                              ; preds = %690
  %785 = landingpad { ptr, i32 }
          cleanup
  %786 = extractvalue { ptr, i32 } %785, 0
  store ptr %786, ptr %20, align 8
  %787 = extractvalue { ptr, i32 } %785, 1
  store i32 %787, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #4
  br label %868

788:                                              ; preds = %707, %695
  %789 = landingpad { ptr, i32 }
          cleanup
  %790 = extractvalue { ptr, i32 } %789, 0
  store ptr %790, ptr %20, align 8
  %791 = extractvalue { ptr, i32 } %789, 1
  store i32 %791, ptr %21, align 4
  br label %796

792:                                              ; preds = %710
  %793 = landingpad { ptr, i32 }
          cleanup
  %794 = extractvalue { ptr, i32 } %793, 0
  store ptr %794, ptr %20, align 8
  %795 = extractvalue { ptr, i32 } %793, 1
  store i32 %795, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #4
  br label %796

796:                                              ; preds = %792, %788
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #4
  br label %868

797:                                              ; preds = %717
  %798 = landingpad { ptr, i32 }
          cleanup
  %799 = extractvalue { ptr, i32 } %798, 0
  store ptr %799, ptr %20, align 8
  %800 = extractvalue { ptr, i32 } %798, 1
  store i32 %800, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #4
  br label %868

801:                                              ; preds = %736, %723
  %802 = landingpad { ptr, i32 }
          cleanup
  %803 = extractvalue { ptr, i32 } %802, 0
  store ptr %803, ptr %20, align 8
  %804 = extractvalue { ptr, i32 } %802, 1
  store i32 %804, ptr %21, align 4
  br label %819

805:                                              ; preds = %749, %739
  %806 = landingpad { ptr, i32 }
          cleanup
  %807 = extractvalue { ptr, i32 } %806, 0
  store ptr %807, ptr %20, align 8
  %808 = extractvalue { ptr, i32 } %806, 1
  store i32 %808, ptr %21, align 4
  br label %818

809:                                              ; preds = %762, %752
  %810 = landingpad { ptr, i32 }
          cleanup
  %811 = extractvalue { ptr, i32 } %810, 0
  store ptr %811, ptr %20, align 8
  %812 = extractvalue { ptr, i32 } %810, 1
  store i32 %812, ptr %21, align 4
  br label %817

813:                                              ; preds = %765
  %814 = landingpad { ptr, i32 }
          cleanup
  %815 = extractvalue { ptr, i32 } %814, 0
  store ptr %815, ptr %20, align 8
  %816 = extractvalue { ptr, i32 } %814, 1
  store i32 %816, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #4
  br label %817

817:                                              ; preds = %813, %809
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #4
  br label %818

818:                                              ; preds = %817, %805
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #4
  br label %819

819:                                              ; preds = %818, %801
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #4
  br label %868

820:                                              ; preds = %780
  %821 = landingpad { ptr, i32 }
          cleanup
  %822 = extractvalue { ptr, i32 } %821, 0
  store ptr %822, ptr %20, align 8
  %823 = extractvalue { ptr, i32 } %821, 1
  store i32 %823, ptr %21, align 4
  br label %828

824:                                              ; preds = %781
  %825 = landingpad { ptr, i32 }
          cleanup
  %826 = extractvalue { ptr, i32 } %825, 0
  store ptr %826, ptr %20, align 8
  %827 = extractvalue { ptr, i32 } %825, 1
  store i32 %827, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %77) #4
  br label %828

828:                                              ; preds = %824, %820
  call void @llvm.lifetime.end.p0(i64 24, ptr %77) #4
  br label %868

829:                                              ; preds = %775
  %830 = load i8, ptr %11, align 1, !tbaa !9
  %831 = zext i8 %830 to i32
  %832 = and i32 %831, 64
  %833 = icmp ne i32 %832, 0
  br i1 %833, label %834, label %847

834:                                              ; preds = %829
  call void @llvm.lifetime.start.p0(i64 24, ptr %78) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %78, ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(24) %52, ptr noundef nonnull align 8 dereferenceable(8) %14)
          to label %835 unwind label %838

835:                                              ; preds = %834
  %836 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %54, ptr noundef nonnull align 8 dereferenceable(24) %78)
          to label %837 unwind label %842

837:                                              ; preds = %835
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %78) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %78) #4
  br label %860

838:                                              ; preds = %834
  %839 = landingpad { ptr, i32 }
          cleanup
  %840 = extractvalue { ptr, i32 } %839, 0
  store ptr %840, ptr %20, align 8
  %841 = extractvalue { ptr, i32 } %839, 1
  store i32 %841, ptr %21, align 4
  br label %846

842:                                              ; preds = %835
  %843 = landingpad { ptr, i32 }
          cleanup
  %844 = extractvalue { ptr, i32 } %843, 0
  store ptr %844, ptr %20, align 8
  %845 = extractvalue { ptr, i32 } %843, 1
  store i32 %845, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %78) #4
  br label %846

846:                                              ; preds = %842, %838
  call void @llvm.lifetime.end.p0(i64 24, ptr %78) #4
  br label %868

847:                                              ; preds = %829
  call void @llvm.lifetime.start.p0(i64 24, ptr %79) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %79, ptr noundef nonnull align 8 dereferenceable(40) %49, ptr noundef nonnull align 8 dereferenceable(24) %52)
          to label %848 unwind label %851

848:                                              ; preds = %847
  %849 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %54, ptr noundef nonnull align 8 dereferenceable(24) %79)
          to label %850 unwind label %855

850:                                              ; preds = %848
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %79) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %79) #4
  br label %860

851:                                              ; preds = %847
  %852 = landingpad { ptr, i32 }
          cleanup
  %853 = extractvalue { ptr, i32 } %852, 0
  store ptr %853, ptr %20, align 8
  %854 = extractvalue { ptr, i32 } %852, 1
  store i32 %854, ptr %21, align 4
  br label %859

855:                                              ; preds = %848
  %856 = landingpad { ptr, i32 }
          cleanup
  %857 = extractvalue { ptr, i32 } %856, 0
  store ptr %857, ptr %20, align 8
  %858 = extractvalue { ptr, i32 } %856, 1
  store i32 %858, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %79) #4
  br label %859

859:                                              ; preds = %855, %851
  call void @llvm.lifetime.end.p0(i64 24, ptr %79) #4
  br label %868

860:                                              ; preds = %850, %837
  br label %861

861:                                              ; preds = %860, %783
  %862 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %54)
          to label %863 unwind label %864

863:                                              ; preds = %861
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %54) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %54) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %52) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %52) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %49) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %49) #4
  br label %872

864:                                              ; preds = %861
  %865 = landingpad { ptr, i32 }
          cleanup
  %866 = extractvalue { ptr, i32 } %865, 0
  store ptr %866, ptr %20, align 8
  %867 = extractvalue { ptr, i32 } %865, 1
  store i32 %867, ptr %21, align 4
  br label %868

868:                                              ; preds = %864, %859, %846, %828, %819, %797, %796, %784, %689, %603, %581, %580, %568
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %54) #4
  br label %869

869:                                              ; preds = %868, %564
  call void @llvm.lifetime.end.p0(i64 24, ptr %54) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %52) #4
  br label %870

870:                                              ; preds = %869, %560
  call void @llvm.lifetime.end.p0(i64 24, ptr %52) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %49) #4
  br label %871

871:                                              ; preds = %870, %556
  call void @llvm.lifetime.end.p0(i64 40, ptr %49) #4
  br label %1568

872:                                              ; preds = %863, %474, %469
  %873 = load i8, ptr %11, align 1, !tbaa !9
  %874 = zext i8 %873 to i32
  %875 = and i32 %874, 1
  %876 = icmp eq i32 %875, 1
  br i1 %876, label %877, label %1227

877:                                              ; preds = %872
  %878 = load i8, ptr %11, align 1, !tbaa !9
  %879 = zext i8 %878 to i32
  %880 = and i32 %879, 32
  %881 = icmp eq i32 %880, 32
  br i1 %881, label %882, label %1227

882:                                              ; preds = %877
  call void @llvm.lifetime.start.p0(i64 40, ptr %80) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %81) #4
  %883 = load i32, ptr %15, align 4, !tbaa !12
  %884 = sub nsw i32 %883, 1
  %885 = sext i32 %884 to i64
  store i64 %885, ptr %81, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #4
  store i64 3, ptr %82, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %81, ptr noundef nonnull align 8 dereferenceable(8) %82)
          to label %886 unwind label %901

886:                                              ; preds = %882
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %83) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #4
  %887 = load i32, ptr %15, align 4, !tbaa !12
  %888 = sub nsw i32 %887, 1
  %889 = sext i32 %888 to i64
  store i64 %889, ptr %84, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 8 dereferenceable(8) %84)
          to label %890 unwind label %905

890:                                              ; preds = %886
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %85) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %86) #4
  %891 = load i32, ptr %15, align 4, !tbaa !12
  %892 = sub nsw i32 %891, 1
  %893 = sext i32 %892 to i64
  store i64 %893, ptr %86, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %85, ptr noundef nonnull align 8 dereferenceable(8) %86)
          to label %894 unwind label %909

894:                                              ; preds = %890
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %87) #4
  store i32 0, ptr %87, align 4, !tbaa !12
  br label %895

895:                                              ; preds = %975, %894
  %896 = load i32, ptr %87, align 4, !tbaa !12
  %897 = load i32, ptr %15, align 4, !tbaa !12
  %898 = sub nsw i32 %897, 2
  %899 = icmp slt i32 %896, %898
  br i1 %899, label %913, label %900

900:                                              ; preds = %895
  call void @llvm.lifetime.end.p0(i64 4, ptr %87) #4
  br label %999

901:                                              ; preds = %882
  %902 = landingpad { ptr, i32 }
          cleanup
  %903 = extractvalue { ptr, i32 } %902, 0
  store ptr %903, ptr %20, align 8
  %904 = extractvalue { ptr, i32 } %902, 1
  store i32 %904, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %81) #4
  br label %1226

905:                                              ; preds = %886
  %906 = landingpad { ptr, i32 }
          cleanup
  %907 = extractvalue { ptr, i32 } %906, 0
  store ptr %907, ptr %20, align 8
  %908 = extractvalue { ptr, i32 } %906, 1
  store i32 %908, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #4
  br label %1225

909:                                              ; preds = %890
  %910 = landingpad { ptr, i32 }
          cleanup
  %911 = extractvalue { ptr, i32 } %910, 0
  store ptr %911, ptr %20, align 8
  %912 = extractvalue { ptr, i32 } %910, 1
  store i32 %912, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %86) #4
  br label %1224

913:                                              ; preds = %895
  %914 = load double, ptr %18, align 8, !tbaa !10
  %915 = load double, ptr %23, align 8, !tbaa !10
  %916 = fadd double %915, %914
  store double %916, ptr %23, align 8, !tbaa !10
  %917 = load double, ptr %18, align 8, !tbaa !10
  %918 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %919 = load ptr, ptr %918, align 8, !tbaa !18
  %920 = load double, ptr %23, align 8, !tbaa !10
  %921 = invoke noundef double %919(double noundef %920)
          to label %922 unwind label %978

922:                                              ; preds = %913
  %923 = fmul double %917, %921
  %924 = fdiv double %923, 2.000000e+00
  %925 = fadd double %924, 1.000000e+00
  %926 = fneg double %925
  call void @llvm.lifetime.start.p0(i64 8, ptr %88) #4
  %927 = load i32, ptr %87, align 4, !tbaa !12
  %928 = sext i32 %927 to i64
  store i64 %928, ptr %88, align 8, !tbaa !14
  %929 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %88)
          to label %930 unwind label %982

930:                                              ; preds = %922
  %931 = getelementptr inbounds double, ptr %929, i64 0
  store double %926, ptr %931, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #4
  %932 = load double, ptr %18, align 8, !tbaa !10
  %933 = load double, ptr %18, align 8, !tbaa !10
  %934 = fmul double %932, %933
  %935 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %936 = load ptr, ptr %935, align 8, !tbaa !25
  %937 = load double, ptr %23, align 8, !tbaa !10
  %938 = invoke noundef double %936(double noundef %937)
          to label %939 unwind label %978

939:                                              ; preds = %930
  %940 = fneg double %934
  %941 = call double @llvm.fmuladd.f64(double %940, double %938, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %89) #4
  %942 = load i32, ptr %87, align 4, !tbaa !12
  %943 = sext i32 %942 to i64
  store i64 %943, ptr %89, align 8, !tbaa !14
  %944 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %89)
          to label %945 unwind label %986

945:                                              ; preds = %939
  %946 = getelementptr inbounds double, ptr %944, i64 1
  store double %941, ptr %946, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %89) #4
  %947 = load double, ptr %18, align 8, !tbaa !10
  %948 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %949 = load ptr, ptr %948, align 8, !tbaa !18
  %950 = load double, ptr %23, align 8, !tbaa !10
  %951 = invoke noundef double %949(double noundef %950)
          to label %952 unwind label %978

952:                                              ; preds = %945
  %953 = fmul double %947, %951
  %954 = fdiv double %953, 2.000000e+00
  %955 = fsub double %954, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr %90) #4
  %956 = load i32, ptr %87, align 4, !tbaa !12
  %957 = sext i32 %956 to i64
  store i64 %957, ptr %90, align 8, !tbaa !14
  %958 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %90)
          to label %959 unwind label %990

959:                                              ; preds = %952
  %960 = getelementptr inbounds double, ptr %958, i64 2
  store double %955, ptr %960, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #4
  %961 = load double, ptr %18, align 8, !tbaa !10
  %962 = fneg double %961
  %963 = load double, ptr %18, align 8, !tbaa !10
  %964 = fmul double %962, %963
  %965 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %966 = load ptr, ptr %965, align 8, !tbaa !26
  %967 = load double, ptr %23, align 8, !tbaa !10
  %968 = invoke noundef double %966(double noundef %967)
          to label %969 unwind label %978

969:                                              ; preds = %959
  %970 = fmul double %964, %968
  call void @llvm.lifetime.start.p0(i64 8, ptr %91) #4
  %971 = load i32, ptr %87, align 4, !tbaa !12
  %972 = sext i32 %971 to i64
  store i64 %972, ptr %91, align 8, !tbaa !14
  %973 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 8 dereferenceable(8) %91)
          to label %974 unwind label %994

974:                                              ; preds = %969
  store double %970, ptr %973, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %91) #4
  br label %975

975:                                              ; preds = %974
  %976 = load i32, ptr %87, align 4, !tbaa !12
  %977 = add nsw i32 %976, 1
  store i32 %977, ptr %87, align 4, !tbaa !12
  br label %895, !llvm.loop !32

978:                                              ; preds = %959, %945, %930, %913
  %979 = landingpad { ptr, i32 }
          cleanup
  %980 = extractvalue { ptr, i32 } %979, 0
  store ptr %980, ptr %20, align 8
  %981 = extractvalue { ptr, i32 } %979, 1
  store i32 %981, ptr %21, align 4
  br label %998

982:                                              ; preds = %922
  %983 = landingpad { ptr, i32 }
          cleanup
  %984 = extractvalue { ptr, i32 } %983, 0
  store ptr %984, ptr %20, align 8
  %985 = extractvalue { ptr, i32 } %983, 1
  store i32 %985, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %88) #4
  br label %998

986:                                              ; preds = %939
  %987 = landingpad { ptr, i32 }
          cleanup
  %988 = extractvalue { ptr, i32 } %987, 0
  store ptr %988, ptr %20, align 8
  %989 = extractvalue { ptr, i32 } %987, 1
  store i32 %989, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %89) #4
  br label %998

990:                                              ; preds = %952
  %991 = landingpad { ptr, i32 }
          cleanup
  %992 = extractvalue { ptr, i32 } %991, 0
  store ptr %992, ptr %20, align 8
  %993 = extractvalue { ptr, i32 } %991, 1
  store i32 %993, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %90) #4
  br label %998

994:                                              ; preds = %969
  %995 = landingpad { ptr, i32 }
          cleanup
  %996 = extractvalue { ptr, i32 } %995, 0
  store ptr %996, ptr %20, align 8
  %997 = extractvalue { ptr, i32 } %995, 1
  store i32 %997, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %91) #4
  br label %998

998:                                              ; preds = %994, %990, %986, %982, %978
  call void @llvm.lifetime.end.p0(i64 4, ptr %87) #4
  br label %1223

999:                                              ; preds = %900
  %1000 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1001 = load ptr, ptr %1000, align 8, !tbaa !18
  %1002 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %92) #4
  store i64 0, ptr %92, align 8, !tbaa !14
  %1003 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1002, ptr noundef nonnull align 8 dereferenceable(8) %92)
          to label %1004 unwind label %1119

1004:                                             ; preds = %999
  %1005 = load double, ptr %1003, align 8, !tbaa !10
  %1006 = load double, ptr %18, align 8, !tbaa !10
  %1007 = fadd double %1005, %1006
  %1008 = invoke noundef double %1001(double noundef %1007)
          to label %1009 unwind label %1119

1009:                                             ; preds = %1004
  %1010 = load double, ptr %18, align 8, !tbaa !10
  %1011 = fmul double %1008, %1010
  %1012 = fdiv double %1011, 2.000000e+00
  %1013 = fadd double 1.000000e+00, %1012
  %1014 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 7
  %1015 = load ptr, ptr %1014, align 8, !tbaa !29
  %1016 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %93) #4
  store i64 0, ptr %93, align 8, !tbaa !14
  %1017 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1016, ptr noundef nonnull align 8 dereferenceable(8) %93)
          to label %1018 unwind label %1123

1018:                                             ; preds = %1009
  %1019 = load double, ptr %1017, align 8, !tbaa !10
  %1020 = invoke noundef double %1015(double noundef %1019, double noundef 0.000000e+00)
          to label %1021 unwind label %1123

1021:                                             ; preds = %1018
  call void @llvm.lifetime.start.p0(i64 8, ptr %94) #4
  store i64 0, ptr %94, align 8, !tbaa !14
  %1022 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 8 dereferenceable(8) %94)
          to label %1023 unwind label %1127

1023:                                             ; preds = %1021
  %1024 = load double, ptr %1022, align 8, !tbaa !10
  %1025 = call double @llvm.fmuladd.f64(double %1013, double %1020, double %1024)
  store double %1025, ptr %1022, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %94) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %93) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %92) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %95) #4
  %1026 = load i32, ptr %15, align 4, !tbaa !12
  %1027 = sub nsw i32 %1026, 2
  %1028 = sext i32 %1027 to i64
  store i64 %1028, ptr %95, align 8, !tbaa !14
  %1029 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %95)
          to label %1030 unwind label %1133

1030:                                             ; preds = %1023
  %1031 = getelementptr inbounds double, ptr %1029, i64 0
  store double -2.000000e+00, ptr %1031, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %95) #4
  %1032 = load double, ptr %18, align 8, !tbaa !10
  %1033 = load double, ptr %18, align 8, !tbaa !10
  %1034 = fmul double %1032, %1033
  %1035 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %1036 = load ptr, ptr %1035, align 8, !tbaa !25
  %1037 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %96) #4
  %1038 = load i32, ptr %15, align 4, !tbaa !12
  %1039 = sub nsw i32 %1038, 1
  %1040 = sext i32 %1039 to i64
  store i64 %1040, ptr %96, align 8, !tbaa !14
  %1041 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1037, ptr noundef nonnull align 8 dereferenceable(8) %96)
          to label %1042 unwind label %1137

1042:                                             ; preds = %1030
  %1043 = load double, ptr %1041, align 8, !tbaa !10
  %1044 = invoke noundef double %1036(double noundef %1043)
          to label %1045 unwind label %1137

1045:                                             ; preds = %1042
  %1046 = fneg double %1034
  %1047 = call double @llvm.fmuladd.f64(double %1046, double %1044, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %97) #4
  %1048 = load i32, ptr %15, align 4, !tbaa !12
  %1049 = sub nsw i32 %1048, 2
  %1050 = sext i32 %1049 to i64
  store i64 %1050, ptr %97, align 8, !tbaa !14
  %1051 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %97)
          to label %1052 unwind label %1141

1052:                                             ; preds = %1045
  %1053 = getelementptr inbounds double, ptr %1051, i64 1
  store double %1047, ptr %1053, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %97) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %96) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %98) #4
  %1054 = load i32, ptr %15, align 4, !tbaa !12
  %1055 = sub nsw i32 %1054, 2
  %1056 = sext i32 %1055 to i64
  store i64 %1056, ptr %98, align 8, !tbaa !14
  %1057 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(8) %98)
          to label %1058 unwind label %1146

1058:                                             ; preds = %1052
  %1059 = getelementptr inbounds double, ptr %1057, i64 2
  store double 0.000000e+00, ptr %1059, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %98) #4
  %1060 = load double, ptr %18, align 8, !tbaa !10
  %1061 = fneg double %1060
  %1062 = load double, ptr %18, align 8, !tbaa !10
  %1063 = fmul double %1061, %1062
  %1064 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %1065 = load ptr, ptr %1064, align 8, !tbaa !26
  %1066 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %99) #4
  %1067 = load i32, ptr %15, align 4, !tbaa !12
  %1068 = sub nsw i32 %1067, 1
  %1069 = sext i32 %1068 to i64
  store i64 %1069, ptr %99, align 8, !tbaa !14
  %1070 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1066, ptr noundef nonnull align 8 dereferenceable(8) %99)
          to label %1071 unwind label %1150

1071:                                             ; preds = %1058
  %1072 = load double, ptr %1070, align 8, !tbaa !10
  %1073 = invoke noundef double %1065(double noundef %1072)
          to label %1074 unwind label %1150

1074:                                             ; preds = %1071
  %1075 = load double, ptr %18, align 8, !tbaa !10
  %1076 = fmul double 2.000000e+00, %1075
  %1077 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 8
  %1078 = load ptr, ptr %1077, align 8, !tbaa !30
  %1079 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %100) #4
  %1080 = load i32, ptr %15, align 4, !tbaa !12
  %1081 = sub nsw i32 %1080, 1
  %1082 = sext i32 %1081 to i64
  store i64 %1082, ptr %100, align 8, !tbaa !14
  %1083 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1079, ptr noundef nonnull align 8 dereferenceable(8) %100)
          to label %1084 unwind label %1154

1084:                                             ; preds = %1074
  %1085 = load double, ptr %1083, align 8, !tbaa !10
  %1086 = invoke noundef double %1078(double noundef %1085, double noundef 0.000000e+00)
          to label %1087 unwind label %1154

1087:                                             ; preds = %1084
  %1088 = fmul double %1076, %1086
  %1089 = load double, ptr %18, align 8, !tbaa !10
  %1090 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1091 = load ptr, ptr %1090, align 8, !tbaa !18
  %1092 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %101) #4
  %1093 = load i32, ptr %15, align 4, !tbaa !12
  %1094 = sub nsw i32 %1093, 1
  %1095 = sext i32 %1094 to i64
  store i64 %1095, ptr %101, align 8, !tbaa !14
  %1096 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1092, ptr noundef nonnull align 8 dereferenceable(8) %101)
          to label %1097 unwind label %1158

1097:                                             ; preds = %1087
  %1098 = load double, ptr %1096, align 8, !tbaa !10
  %1099 = invoke noundef double %1091(double noundef %1098)
          to label %1100 unwind label %1158

1100:                                             ; preds = %1097
  %1101 = fmul double %1089, %1099
  %1102 = fdiv double %1101, 2.000000e+00
  %1103 = fadd double %1102, 1.000000e+00
  %1104 = fmul double %1088, %1103
  %1105 = call double @llvm.fmuladd.f64(double %1063, double %1073, double %1104)
  call void @llvm.lifetime.start.p0(i64 8, ptr %102) #4
  %1106 = load i32, ptr %15, align 4, !tbaa !12
  %1107 = sub nsw i32 %1106, 2
  %1108 = sext i32 %1107 to i64
  store i64 %1108, ptr %102, align 8, !tbaa !14
  %1109 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 8 dereferenceable(8) %102)
          to label %1110 unwind label %1162

1110:                                             ; preds = %1100
  store double %1105, ptr %1109, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %102) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %101) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %100) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %99) #4
  %1111 = load i8, ptr %11, align 1, !tbaa !9
  %1112 = zext i8 %1111 to i32
  %1113 = and i32 %1112, 32
  %1114 = icmp ne i32 %1113, 0
  br i1 %1114, label %1115, label %1178

1115:                                             ; preds = %1110
  call void @llvm.lifetime.start.p0(i64 24, ptr %103) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %103, ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(24) %83)
          to label %1116 unwind label %1169

1116:                                             ; preds = %1115
  %1117 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %85, ptr noundef nonnull align 8 dereferenceable(24) %103)
          to label %1118 unwind label %1173

1118:                                             ; preds = %1116
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %103) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %103) #4
  br label %1210

1119:                                             ; preds = %1004, %999
  %1120 = landingpad { ptr, i32 }
          cleanup
  %1121 = extractvalue { ptr, i32 } %1120, 0
  store ptr %1121, ptr %20, align 8
  %1122 = extractvalue { ptr, i32 } %1120, 1
  store i32 %1122, ptr %21, align 4
  br label %1132

1123:                                             ; preds = %1018, %1009
  %1124 = landingpad { ptr, i32 }
          cleanup
  %1125 = extractvalue { ptr, i32 } %1124, 0
  store ptr %1125, ptr %20, align 8
  %1126 = extractvalue { ptr, i32 } %1124, 1
  store i32 %1126, ptr %21, align 4
  br label %1131

1127:                                             ; preds = %1021
  %1128 = landingpad { ptr, i32 }
          cleanup
  %1129 = extractvalue { ptr, i32 } %1128, 0
  store ptr %1129, ptr %20, align 8
  %1130 = extractvalue { ptr, i32 } %1128, 1
  store i32 %1130, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %94) #4
  br label %1131

1131:                                             ; preds = %1127, %1123
  call void @llvm.lifetime.end.p0(i64 8, ptr %93) #4
  br label %1132

1132:                                             ; preds = %1131, %1119
  call void @llvm.lifetime.end.p0(i64 8, ptr %92) #4
  br label %1223

1133:                                             ; preds = %1023
  %1134 = landingpad { ptr, i32 }
          cleanup
  %1135 = extractvalue { ptr, i32 } %1134, 0
  store ptr %1135, ptr %20, align 8
  %1136 = extractvalue { ptr, i32 } %1134, 1
  store i32 %1136, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %95) #4
  br label %1223

1137:                                             ; preds = %1042, %1030
  %1138 = landingpad { ptr, i32 }
          cleanup
  %1139 = extractvalue { ptr, i32 } %1138, 0
  store ptr %1139, ptr %20, align 8
  %1140 = extractvalue { ptr, i32 } %1138, 1
  store i32 %1140, ptr %21, align 4
  br label %1145

1141:                                             ; preds = %1045
  %1142 = landingpad { ptr, i32 }
          cleanup
  %1143 = extractvalue { ptr, i32 } %1142, 0
  store ptr %1143, ptr %20, align 8
  %1144 = extractvalue { ptr, i32 } %1142, 1
  store i32 %1144, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %97) #4
  br label %1145

1145:                                             ; preds = %1141, %1137
  call void @llvm.lifetime.end.p0(i64 8, ptr %96) #4
  br label %1223

1146:                                             ; preds = %1052
  %1147 = landingpad { ptr, i32 }
          cleanup
  %1148 = extractvalue { ptr, i32 } %1147, 0
  store ptr %1148, ptr %20, align 8
  %1149 = extractvalue { ptr, i32 } %1147, 1
  store i32 %1149, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %98) #4
  br label %1223

1150:                                             ; preds = %1071, %1058
  %1151 = landingpad { ptr, i32 }
          cleanup
  %1152 = extractvalue { ptr, i32 } %1151, 0
  store ptr %1152, ptr %20, align 8
  %1153 = extractvalue { ptr, i32 } %1151, 1
  store i32 %1153, ptr %21, align 4
  br label %1168

1154:                                             ; preds = %1084, %1074
  %1155 = landingpad { ptr, i32 }
          cleanup
  %1156 = extractvalue { ptr, i32 } %1155, 0
  store ptr %1156, ptr %20, align 8
  %1157 = extractvalue { ptr, i32 } %1155, 1
  store i32 %1157, ptr %21, align 4
  br label %1167

1158:                                             ; preds = %1097, %1087
  %1159 = landingpad { ptr, i32 }
          cleanup
  %1160 = extractvalue { ptr, i32 } %1159, 0
  store ptr %1160, ptr %20, align 8
  %1161 = extractvalue { ptr, i32 } %1159, 1
  store i32 %1161, ptr %21, align 4
  br label %1166

1162:                                             ; preds = %1100
  %1163 = landingpad { ptr, i32 }
          cleanup
  %1164 = extractvalue { ptr, i32 } %1163, 0
  store ptr %1164, ptr %20, align 8
  %1165 = extractvalue { ptr, i32 } %1163, 1
  store i32 %1165, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %102) #4
  br label %1166

1166:                                             ; preds = %1162, %1158
  call void @llvm.lifetime.end.p0(i64 8, ptr %101) #4
  br label %1167

1167:                                             ; preds = %1166, %1154
  call void @llvm.lifetime.end.p0(i64 8, ptr %100) #4
  br label %1168

1168:                                             ; preds = %1167, %1150
  call void @llvm.lifetime.end.p0(i64 8, ptr %99) #4
  br label %1223

1169:                                             ; preds = %1115
  %1170 = landingpad { ptr, i32 }
          cleanup
  %1171 = extractvalue { ptr, i32 } %1170, 0
  store ptr %1171, ptr %20, align 8
  %1172 = extractvalue { ptr, i32 } %1170, 1
  store i32 %1172, ptr %21, align 4
  br label %1177

1173:                                             ; preds = %1116
  %1174 = landingpad { ptr, i32 }
          cleanup
  %1175 = extractvalue { ptr, i32 } %1174, 0
  store ptr %1175, ptr %20, align 8
  %1176 = extractvalue { ptr, i32 } %1174, 1
  store i32 %1176, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %103) #4
  br label %1177

1177:                                             ; preds = %1173, %1169
  call void @llvm.lifetime.end.p0(i64 24, ptr %103) #4
  br label %1223

1178:                                             ; preds = %1110
  %1179 = load i8, ptr %11, align 1, !tbaa !9
  %1180 = zext i8 %1179 to i32
  %1181 = and i32 %1180, 64
  %1182 = icmp ne i32 %1181, 0
  br i1 %1182, label %1183, label %1196

1183:                                             ; preds = %1178
  call void @llvm.lifetime.start.p0(i64 24, ptr %104) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %104, ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(24) %83, ptr noundef nonnull align 8 dereferenceable(8) %14)
          to label %1184 unwind label %1187

1184:                                             ; preds = %1183
  %1185 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %85, ptr noundef nonnull align 8 dereferenceable(24) %104)
          to label %1186 unwind label %1191

1186:                                             ; preds = %1184
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %104) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %104) #4
  br label %1209

1187:                                             ; preds = %1183
  %1188 = landingpad { ptr, i32 }
          cleanup
  %1189 = extractvalue { ptr, i32 } %1188, 0
  store ptr %1189, ptr %20, align 8
  %1190 = extractvalue { ptr, i32 } %1188, 1
  store i32 %1190, ptr %21, align 4
  br label %1195

1191:                                             ; preds = %1184
  %1192 = landingpad { ptr, i32 }
          cleanup
  %1193 = extractvalue { ptr, i32 } %1192, 0
  store ptr %1193, ptr %20, align 8
  %1194 = extractvalue { ptr, i32 } %1192, 1
  store i32 %1194, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %104) #4
  br label %1195

1195:                                             ; preds = %1191, %1187
  call void @llvm.lifetime.end.p0(i64 24, ptr %104) #4
  br label %1223

1196:                                             ; preds = %1178
  call void @llvm.lifetime.start.p0(i64 24, ptr %105) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %105, ptr noundef nonnull align 8 dereferenceable(40) %80, ptr noundef nonnull align 8 dereferenceable(24) %83)
          to label %1197 unwind label %1200

1197:                                             ; preds = %1196
  %1198 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %85, ptr noundef nonnull align 8 dereferenceable(24) %105)
          to label %1199 unwind label %1204

1199:                                             ; preds = %1197
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %105) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %105) #4
  br label %1209

1200:                                             ; preds = %1196
  %1201 = landingpad { ptr, i32 }
          cleanup
  %1202 = extractvalue { ptr, i32 } %1201, 0
  store ptr %1202, ptr %20, align 8
  %1203 = extractvalue { ptr, i32 } %1201, 1
  store i32 %1203, ptr %21, align 4
  br label %1208

1204:                                             ; preds = %1197
  %1205 = landingpad { ptr, i32 }
          cleanup
  %1206 = extractvalue { ptr, i32 } %1205, 0
  store ptr %1206, ptr %20, align 8
  %1207 = extractvalue { ptr, i32 } %1205, 1
  store i32 %1207, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %105) #4
  br label %1208

1208:                                             ; preds = %1204, %1200
  call void @llvm.lifetime.end.p0(i64 24, ptr %105) #4
  br label %1223

1209:                                             ; preds = %1199, %1186
  br label %1210

1210:                                             ; preds = %1209, %1118
  %1211 = load ptr, ptr %13, align 8, !tbaa !5
  %1212 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %1211)
          to label %1213 unwind label %1215

1213:                                             ; preds = %1210
  call void @llvm.lifetime.start.p0(i64 8, ptr %106) #4
  store i64 1, ptr %106, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %106, ptr noundef nonnull align 8 dereferenceable(24) %85)
          to label %1214 unwind label %1219

1214:                                             ; preds = %1213
  call void @llvm.lifetime.end.p0(i64 8, ptr %106) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %85) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %85) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %83) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %83) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %80) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %80) #4
  br label %1227

1215:                                             ; preds = %1210
  %1216 = landingpad { ptr, i32 }
          cleanup
  %1217 = extractvalue { ptr, i32 } %1216, 0
  store ptr %1217, ptr %20, align 8
  %1218 = extractvalue { ptr, i32 } %1216, 1
  store i32 %1218, ptr %21, align 4
  br label %1223

1219:                                             ; preds = %1213
  %1220 = landingpad { ptr, i32 }
          cleanup
  %1221 = extractvalue { ptr, i32 } %1220, 0
  store ptr %1221, ptr %20, align 8
  %1222 = extractvalue { ptr, i32 } %1220, 1
  store i32 %1222, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %106) #4
  br label %1223

1223:                                             ; preds = %1219, %1215, %1208, %1195, %1177, %1168, %1146, %1145, %1133, %1132, %998
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %85) #4
  br label %1224

1224:                                             ; preds = %1223, %909
  call void @llvm.lifetime.end.p0(i64 24, ptr %85) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %83) #4
  br label %1225

1225:                                             ; preds = %1224, %905
  call void @llvm.lifetime.end.p0(i64 24, ptr %83) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %80) #4
  br label %1226

1226:                                             ; preds = %1225, %901
  call void @llvm.lifetime.end.p0(i64 40, ptr %80) #4
  br label %1568

1227:                                             ; preds = %1214, %877, %872
  %1228 = load i8, ptr %11, align 1, !tbaa !9
  %1229 = zext i8 %1228 to i32
  %1230 = and i32 %1229, 16
  %1231 = icmp eq i32 %1230, 16
  br i1 %1231, label %1232, label %1566

1232:                                             ; preds = %1227
  %1233 = load i8, ptr %11, align 1, !tbaa !9
  %1234 = zext i8 %1233 to i32
  %1235 = and i32 %1234, 2
  %1236 = icmp eq i32 %1235, 2
  br i1 %1236, label %1237, label %1566

1237:                                             ; preds = %1232
  call void @llvm.lifetime.start.p0(i64 40, ptr %107) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %108) #4
  %1238 = load i32, ptr %15, align 4, !tbaa !12
  %1239 = sub nsw i32 %1238, 1
  %1240 = sext i32 %1239 to i64
  store i64 %1240, ptr %108, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %109) #4
  store i64 3, ptr %109, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %108, ptr noundef nonnull align 8 dereferenceable(8) %109)
          to label %1241 unwind label %1317

1241:                                             ; preds = %1237
  call void @llvm.lifetime.end.p0(i64 8, ptr %109) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %108) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %110) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %111) #4
  %1242 = load i32, ptr %15, align 4, !tbaa !12
  %1243 = sub nsw i32 %1242, 1
  %1244 = sext i32 %1243 to i64
  store i64 %1244, ptr %111, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %110, ptr noundef nonnull align 8 dereferenceable(8) %111)
          to label %1245 unwind label %1321

1245:                                             ; preds = %1241
  call void @llvm.lifetime.end.p0(i64 8, ptr %111) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr %112) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %113) #4
  %1246 = load i32, ptr %15, align 4, !tbaa !12
  %1247 = sub nsw i32 %1246, 1
  %1248 = sext i32 %1247 to i64
  store i64 %1248, ptr %113, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %112, ptr noundef nonnull align 8 dereferenceable(8) %113)
          to label %1249 unwind label %1325

1249:                                             ; preds = %1245
  call void @llvm.lifetime.end.p0(i64 8, ptr %113) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %114) #4
  store i64 0, ptr %114, align 8, !tbaa !14
  %1250 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %114)
          to label %1251 unwind label %1329

1251:                                             ; preds = %1249
  %1252 = getelementptr inbounds double, ptr %1250, i64 0
  store double 0.000000e+00, ptr %1252, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %114) #4
  %1253 = load double, ptr %18, align 8, !tbaa !10
  %1254 = load double, ptr %18, align 8, !tbaa !10
  %1255 = fmul double %1253, %1254
  %1256 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %1257 = load ptr, ptr %1256, align 8, !tbaa !25
  %1258 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %115) #4
  store i64 0, ptr %115, align 8, !tbaa !14
  %1259 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1258, ptr noundef nonnull align 8 dereferenceable(8) %115)
          to label %1260 unwind label %1333

1260:                                             ; preds = %1251
  %1261 = load double, ptr %1259, align 8, !tbaa !10
  %1262 = invoke noundef double %1257(double noundef %1261)
          to label %1263 unwind label %1333

1263:                                             ; preds = %1260
  %1264 = fneg double %1255
  %1265 = call double @llvm.fmuladd.f64(double %1264, double %1262, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %116) #4
  store i64 0, ptr %116, align 8, !tbaa !14
  %1266 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %116)
          to label %1267 unwind label %1337

1267:                                             ; preds = %1263
  %1268 = getelementptr inbounds double, ptr %1266, i64 1
  store double %1265, ptr %1268, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %116) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %115) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %117) #4
  store i64 0, ptr %117, align 8, !tbaa !14
  %1269 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %117)
          to label %1270 unwind label %1342

1270:                                             ; preds = %1267
  %1271 = getelementptr inbounds double, ptr %1269, i64 2
  store double -2.000000e+00, ptr %1271, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %117) #4
  %1272 = load double, ptr %18, align 8, !tbaa !10
  %1273 = fneg double %1272
  %1274 = load double, ptr %18, align 8, !tbaa !10
  %1275 = fmul double %1273, %1274
  %1276 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %1277 = load ptr, ptr %1276, align 8, !tbaa !26
  %1278 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %118) #4
  store i64 0, ptr %118, align 8, !tbaa !14
  %1279 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1278, ptr noundef nonnull align 8 dereferenceable(8) %118)
          to label %1280 unwind label %1346

1280:                                             ; preds = %1270
  %1281 = load double, ptr %1279, align 8, !tbaa !10
  %1282 = invoke noundef double %1277(double noundef %1281)
          to label %1283 unwind label %1346

1283:                                             ; preds = %1280
  %1284 = load double, ptr %18, align 8, !tbaa !10
  %1285 = fmul double 2.000000e+00, %1284
  %1286 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 7
  %1287 = load ptr, ptr %1286, align 8, !tbaa !29
  %1288 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %119) #4
  store i64 0, ptr %119, align 8, !tbaa !14
  %1289 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1288, ptr noundef nonnull align 8 dereferenceable(8) %119)
          to label %1290 unwind label %1350

1290:                                             ; preds = %1283
  %1291 = load double, ptr %1289, align 8, !tbaa !10
  %1292 = invoke noundef double %1287(double noundef %1291, double noundef 0.000000e+00)
          to label %1293 unwind label %1350

1293:                                             ; preds = %1290
  %1294 = fmul double %1285, %1292
  %1295 = load double, ptr %18, align 8, !tbaa !10
  %1296 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1297 = load ptr, ptr %1296, align 8, !tbaa !18
  %1298 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %120) #4
  store i64 0, ptr %120, align 8, !tbaa !14
  %1299 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1298, ptr noundef nonnull align 8 dereferenceable(8) %120)
          to label %1300 unwind label %1354

1300:                                             ; preds = %1293
  %1301 = load double, ptr %1299, align 8, !tbaa !10
  %1302 = invoke noundef double %1297(double noundef %1301)
          to label %1303 unwind label %1354

1303:                                             ; preds = %1300
  %1304 = fmul double %1295, %1302
  %1305 = fdiv double %1304, 2.000000e+00
  %1306 = fsub double %1305, 1.000000e+00
  %1307 = fmul double %1294, %1306
  %1308 = call double @llvm.fmuladd.f64(double %1275, double %1282, double %1307)
  call void @llvm.lifetime.start.p0(i64 8, ptr %121) #4
  store i64 0, ptr %121, align 8, !tbaa !14
  %1309 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %110, ptr noundef nonnull align 8 dereferenceable(8) %121)
          to label %1310 unwind label %1358

1310:                                             ; preds = %1303
  store double %1308, ptr %1309, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %121) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %120) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %119) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %118) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %122) #4
  store i32 1, ptr %122, align 4, !tbaa !12
  br label %1311

1311:                                             ; preds = %1426, %1310
  %1312 = load i32, ptr %122, align 4, !tbaa !12
  %1313 = load i32, ptr %15, align 4, !tbaa !12
  %1314 = sub nsw i32 %1313, 2
  %1315 = icmp slt i32 %1312, %1314
  br i1 %1315, label %1365, label %1316

1316:                                             ; preds = %1311
  call void @llvm.lifetime.end.p0(i64 4, ptr %122) #4
  br label %1450

1317:                                             ; preds = %1237
  %1318 = landingpad { ptr, i32 }
          cleanup
  %1319 = extractvalue { ptr, i32 } %1318, 0
  store ptr %1319, ptr %20, align 8
  %1320 = extractvalue { ptr, i32 } %1318, 1
  store i32 %1320, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %109) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %108) #4
  br label %1565

1321:                                             ; preds = %1241
  %1322 = landingpad { ptr, i32 }
          cleanup
  %1323 = extractvalue { ptr, i32 } %1322, 0
  store ptr %1323, ptr %20, align 8
  %1324 = extractvalue { ptr, i32 } %1322, 1
  store i32 %1324, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %111) #4
  br label %1564

1325:                                             ; preds = %1245
  %1326 = landingpad { ptr, i32 }
          cleanup
  %1327 = extractvalue { ptr, i32 } %1326, 0
  store ptr %1327, ptr %20, align 8
  %1328 = extractvalue { ptr, i32 } %1326, 1
  store i32 %1328, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %113) #4
  br label %1563

1329:                                             ; preds = %1249
  %1330 = landingpad { ptr, i32 }
          cleanup
  %1331 = extractvalue { ptr, i32 } %1330, 0
  store ptr %1331, ptr %20, align 8
  %1332 = extractvalue { ptr, i32 } %1330, 1
  store i32 %1332, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %114) #4
  br label %1562

1333:                                             ; preds = %1260, %1251
  %1334 = landingpad { ptr, i32 }
          cleanup
  %1335 = extractvalue { ptr, i32 } %1334, 0
  store ptr %1335, ptr %20, align 8
  %1336 = extractvalue { ptr, i32 } %1334, 1
  store i32 %1336, ptr %21, align 4
  br label %1341

1337:                                             ; preds = %1263
  %1338 = landingpad { ptr, i32 }
          cleanup
  %1339 = extractvalue { ptr, i32 } %1338, 0
  store ptr %1339, ptr %20, align 8
  %1340 = extractvalue { ptr, i32 } %1338, 1
  store i32 %1340, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %116) #4
  br label %1341

1341:                                             ; preds = %1337, %1333
  call void @llvm.lifetime.end.p0(i64 8, ptr %115) #4
  br label %1562

1342:                                             ; preds = %1267
  %1343 = landingpad { ptr, i32 }
          cleanup
  %1344 = extractvalue { ptr, i32 } %1343, 0
  store ptr %1344, ptr %20, align 8
  %1345 = extractvalue { ptr, i32 } %1343, 1
  store i32 %1345, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %117) #4
  br label %1562

1346:                                             ; preds = %1280, %1270
  %1347 = landingpad { ptr, i32 }
          cleanup
  %1348 = extractvalue { ptr, i32 } %1347, 0
  store ptr %1348, ptr %20, align 8
  %1349 = extractvalue { ptr, i32 } %1347, 1
  store i32 %1349, ptr %21, align 4
  br label %1364

1350:                                             ; preds = %1290, %1283
  %1351 = landingpad { ptr, i32 }
          cleanup
  %1352 = extractvalue { ptr, i32 } %1351, 0
  store ptr %1352, ptr %20, align 8
  %1353 = extractvalue { ptr, i32 } %1351, 1
  store i32 %1353, ptr %21, align 4
  br label %1363

1354:                                             ; preds = %1300, %1293
  %1355 = landingpad { ptr, i32 }
          cleanup
  %1356 = extractvalue { ptr, i32 } %1355, 0
  store ptr %1356, ptr %20, align 8
  %1357 = extractvalue { ptr, i32 } %1355, 1
  store i32 %1357, ptr %21, align 4
  br label %1362

1358:                                             ; preds = %1303
  %1359 = landingpad { ptr, i32 }
          cleanup
  %1360 = extractvalue { ptr, i32 } %1359, 0
  store ptr %1360, ptr %20, align 8
  %1361 = extractvalue { ptr, i32 } %1359, 1
  store i32 %1361, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %121) #4
  br label %1362

1362:                                             ; preds = %1358, %1354
  call void @llvm.lifetime.end.p0(i64 8, ptr %120) #4
  br label %1363

1363:                                             ; preds = %1362, %1350
  call void @llvm.lifetime.end.p0(i64 8, ptr %119) #4
  br label %1364

1364:                                             ; preds = %1363, %1346
  call void @llvm.lifetime.end.p0(i64 8, ptr %118) #4
  br label %1562

1365:                                             ; preds = %1311
  %1366 = load double, ptr %18, align 8, !tbaa !10
  %1367 = load double, ptr %23, align 8, !tbaa !10
  %1368 = fadd double %1367, %1366
  store double %1368, ptr %23, align 8, !tbaa !10
  %1369 = load double, ptr %18, align 8, !tbaa !10
  %1370 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1371 = load ptr, ptr %1370, align 8, !tbaa !18
  %1372 = load double, ptr %23, align 8, !tbaa !10
  %1373 = invoke noundef double %1371(double noundef %1372)
          to label %1374 unwind label %1429

1374:                                             ; preds = %1365
  %1375 = fmul double %1369, %1373
  %1376 = fdiv double %1375, 2.000000e+00
  %1377 = fsub double -1.000000e+00, %1376
  call void @llvm.lifetime.start.p0(i64 8, ptr %123) #4
  %1378 = load i32, ptr %122, align 4, !tbaa !12
  %1379 = sext i32 %1378 to i64
  store i64 %1379, ptr %123, align 8, !tbaa !14
  %1380 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %123)
          to label %1381 unwind label %1433

1381:                                             ; preds = %1374
  %1382 = getelementptr inbounds double, ptr %1380, i64 0
  store double %1377, ptr %1382, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %123) #4
  %1383 = load double, ptr %18, align 8, !tbaa !10
  %1384 = load double, ptr %18, align 8, !tbaa !10
  %1385 = fmul double %1383, %1384
  %1386 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 5
  %1387 = load ptr, ptr %1386, align 8, !tbaa !25
  %1388 = load double, ptr %23, align 8, !tbaa !10
  %1389 = invoke noundef double %1387(double noundef %1388)
          to label %1390 unwind label %1429

1390:                                             ; preds = %1381
  %1391 = fneg double %1385
  %1392 = call double @llvm.fmuladd.f64(double %1391, double %1389, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr %124) #4
  %1393 = load i32, ptr %122, align 4, !tbaa !12
  %1394 = sext i32 %1393 to i64
  store i64 %1394, ptr %124, align 8, !tbaa !14
  %1395 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %124)
          to label %1396 unwind label %1437

1396:                                             ; preds = %1390
  %1397 = getelementptr inbounds double, ptr %1395, i64 1
  store double %1392, ptr %1397, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %124) #4
  %1398 = load double, ptr %18, align 8, !tbaa !10
  %1399 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1400 = load ptr, ptr %1399, align 8, !tbaa !18
  %1401 = load double, ptr %23, align 8, !tbaa !10
  %1402 = invoke noundef double %1400(double noundef %1401)
          to label %1403 unwind label %1429

1403:                                             ; preds = %1396
  %1404 = fmul double %1398, %1402
  %1405 = fdiv double %1404, 2.000000e+00
  %1406 = fsub double %1405, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr %125) #4
  %1407 = load i32, ptr %122, align 4, !tbaa !12
  %1408 = sext i32 %1407 to i64
  store i64 %1408, ptr %125, align 8, !tbaa !14
  %1409 = invoke noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(8) %125)
          to label %1410 unwind label %1441

1410:                                             ; preds = %1403
  %1411 = getelementptr inbounds double, ptr %1409, i64 2
  store double %1406, ptr %1411, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %125) #4
  %1412 = load double, ptr %18, align 8, !tbaa !10
  %1413 = fneg double %1412
  %1414 = load double, ptr %18, align 8, !tbaa !10
  %1415 = fmul double %1413, %1414
  %1416 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 6
  %1417 = load ptr, ptr %1416, align 8, !tbaa !26
  %1418 = load double, ptr %23, align 8, !tbaa !10
  %1419 = invoke noundef double %1417(double noundef %1418)
          to label %1420 unwind label %1429

1420:                                             ; preds = %1410
  %1421 = fmul double %1415, %1419
  call void @llvm.lifetime.start.p0(i64 8, ptr %126) #4
  %1422 = load i32, ptr %122, align 4, !tbaa !12
  %1423 = sext i32 %1422 to i64
  store i64 %1423, ptr %126, align 8, !tbaa !14
  %1424 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %110, ptr noundef nonnull align 8 dereferenceable(8) %126)
          to label %1425 unwind label %1445

1425:                                             ; preds = %1420
  store double %1421, ptr %1424, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %126) #4
  br label %1426

1426:                                             ; preds = %1425
  %1427 = load i32, ptr %122, align 4, !tbaa !12
  %1428 = add nsw i32 %1427, 1
  store i32 %1428, ptr %122, align 4, !tbaa !12
  br label %1311, !llvm.loop !33

1429:                                             ; preds = %1410, %1396, %1381, %1365
  %1430 = landingpad { ptr, i32 }
          cleanup
  %1431 = extractvalue { ptr, i32 } %1430, 0
  store ptr %1431, ptr %20, align 8
  %1432 = extractvalue { ptr, i32 } %1430, 1
  store i32 %1432, ptr %21, align 4
  br label %1449

1433:                                             ; preds = %1374
  %1434 = landingpad { ptr, i32 }
          cleanup
  %1435 = extractvalue { ptr, i32 } %1434, 0
  store ptr %1435, ptr %20, align 8
  %1436 = extractvalue { ptr, i32 } %1434, 1
  store i32 %1436, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %123) #4
  br label %1449

1437:                                             ; preds = %1390
  %1438 = landingpad { ptr, i32 }
          cleanup
  %1439 = extractvalue { ptr, i32 } %1438, 0
  store ptr %1439, ptr %20, align 8
  %1440 = extractvalue { ptr, i32 } %1438, 1
  store i32 %1440, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %124) #4
  br label %1449

1441:                                             ; preds = %1403
  %1442 = landingpad { ptr, i32 }
          cleanup
  %1443 = extractvalue { ptr, i32 } %1442, 0
  store ptr %1443, ptr %20, align 8
  %1444 = extractvalue { ptr, i32 } %1442, 1
  store i32 %1444, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %125) #4
  br label %1449

1445:                                             ; preds = %1420
  %1446 = landingpad { ptr, i32 }
          cleanup
  %1447 = extractvalue { ptr, i32 } %1446, 0
  store ptr %1447, ptr %20, align 8
  %1448 = extractvalue { ptr, i32 } %1446, 1
  store i32 %1448, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %126) #4
  br label %1449

1449:                                             ; preds = %1445, %1441, %1437, %1433, %1429
  call void @llvm.lifetime.end.p0(i64 4, ptr %122) #4
  br label %1562

1450:                                             ; preds = %1316
  %1451 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 4
  %1452 = load ptr, ptr %1451, align 8, !tbaa !18
  %1453 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %127) #4
  %1454 = load i32, ptr %15, align 4, !tbaa !12
  %1455 = sub nsw i32 %1454, 1
  %1456 = sext i32 %1455 to i64
  store i64 %1456, ptr %127, align 8, !tbaa !14
  %1457 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1453, ptr noundef nonnull align 8 dereferenceable(8) %127)
          to label %1458 unwind label %1494

1458:                                             ; preds = %1450
  %1459 = load double, ptr %1457, align 8, !tbaa !10
  %1460 = load double, ptr %18, align 8, !tbaa !10
  %1461 = fsub double %1459, %1460
  %1462 = invoke noundef double %1452(double noundef %1461)
          to label %1463 unwind label %1494

1463:                                             ; preds = %1458
  %1464 = load double, ptr %18, align 8, !tbaa !10
  %1465 = fmul double %1462, %1464
  %1466 = fdiv double %1465, 2.000000e+00
  %1467 = fsub double 1.000000e+00, %1466
  %1468 = getelementptr inbounds %"class.cda::math::differential_equations::EDP", ptr %134, i32 0, i32 8
  %1469 = load ptr, ptr %1468, align 8, !tbaa !30
  %1470 = load ptr, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %128) #4
  %1471 = load i32, ptr %15, align 4, !tbaa !12
  %1472 = sub nsw i32 %1471, 1
  %1473 = sext i32 %1472 to i64
  store i64 %1473, ptr %128, align 8, !tbaa !14
  %1474 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %1470, ptr noundef nonnull align 8 dereferenceable(8) %128)
          to label %1475 unwind label %1498

1475:                                             ; preds = %1463
  %1476 = load double, ptr %1474, align 8, !tbaa !10
  %1477 = invoke noundef double %1469(double noundef %1476, double noundef 0.000000e+00)
          to label %1478 unwind label %1498

1478:                                             ; preds = %1475
  call void @llvm.lifetime.start.p0(i64 8, ptr %129) #4
  %1479 = load i32, ptr %15, align 4, !tbaa !12
  %1480 = sub nsw i32 %1479, 2
  %1481 = sext i32 %1480 to i64
  store i64 %1481, ptr %129, align 8, !tbaa !14
  %1482 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %110, ptr noundef nonnull align 8 dereferenceable(8) %129)
          to label %1483 unwind label %1502

1483:                                             ; preds = %1478
  %1484 = load double, ptr %1482, align 8, !tbaa !10
  %1485 = call double @llvm.fmuladd.f64(double %1467, double %1477, double %1484)
  store double %1485, ptr %1482, align 8, !tbaa !10
  call void @llvm.lifetime.end.p0(i64 8, ptr %129) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %128) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %127) #4
  %1486 = load i8, ptr %11, align 1, !tbaa !9
  %1487 = zext i8 %1486 to i32
  %1488 = and i32 %1487, 32
  %1489 = icmp ne i32 %1488, 0
  br i1 %1489, label %1490, label %1517

1490:                                             ; preds = %1483
  call void @llvm.lifetime.start.p0(i64 24, ptr %130) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %130, ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(24) %110)
          to label %1491 unwind label %1508

1491:                                             ; preds = %1490
  %1492 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %112, ptr noundef nonnull align 8 dereferenceable(24) %130)
          to label %1493 unwind label %1512

1493:                                             ; preds = %1491
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %130) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %130) #4
  br label %1549

1494:                                             ; preds = %1458, %1450
  %1495 = landingpad { ptr, i32 }
          cleanup
  %1496 = extractvalue { ptr, i32 } %1495, 0
  store ptr %1496, ptr %20, align 8
  %1497 = extractvalue { ptr, i32 } %1495, 1
  store i32 %1497, ptr %21, align 4
  br label %1507

1498:                                             ; preds = %1475, %1463
  %1499 = landingpad { ptr, i32 }
          cleanup
  %1500 = extractvalue { ptr, i32 } %1499, 0
  store ptr %1500, ptr %20, align 8
  %1501 = extractvalue { ptr, i32 } %1499, 1
  store i32 %1501, ptr %21, align 4
  br label %1506

1502:                                             ; preds = %1478
  %1503 = landingpad { ptr, i32 }
          cleanup
  %1504 = extractvalue { ptr, i32 } %1503, 0
  store ptr %1504, ptr %20, align 8
  %1505 = extractvalue { ptr, i32 } %1503, 1
  store i32 %1505, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %129) #4
  br label %1506

1506:                                             ; preds = %1502, %1498
  call void @llvm.lifetime.end.p0(i64 8, ptr %128) #4
  br label %1507

1507:                                             ; preds = %1506, %1494
  call void @llvm.lifetime.end.p0(i64 8, ptr %127) #4
  br label %1562

1508:                                             ; preds = %1490
  %1509 = landingpad { ptr, i32 }
          cleanup
  %1510 = extractvalue { ptr, i32 } %1509, 0
  store ptr %1510, ptr %20, align 8
  %1511 = extractvalue { ptr, i32 } %1509, 1
  store i32 %1511, ptr %21, align 4
  br label %1516

1512:                                             ; preds = %1491
  %1513 = landingpad { ptr, i32 }
          cleanup
  %1514 = extractvalue { ptr, i32 } %1513, 0
  store ptr %1514, ptr %20, align 8
  %1515 = extractvalue { ptr, i32 } %1513, 1
  store i32 %1515, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %130) #4
  br label %1516

1516:                                             ; preds = %1512, %1508
  call void @llvm.lifetime.end.p0(i64 24, ptr %130) #4
  br label %1562

1517:                                             ; preds = %1483
  %1518 = load i8, ptr %11, align 1, !tbaa !9
  %1519 = zext i8 %1518 to i32
  %1520 = and i32 %1519, 64
  %1521 = icmp ne i32 %1520, 0
  br i1 %1521, label %1522, label %1535

1522:                                             ; preds = %1517
  call void @llvm.lifetime.start.p0(i64 24, ptr %131) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %131, ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(24) %110, ptr noundef nonnull align 8 dereferenceable(8) %14)
          to label %1523 unwind label %1526

1523:                                             ; preds = %1522
  %1524 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %112, ptr noundef nonnull align 8 dereferenceable(24) %131)
          to label %1525 unwind label %1530

1525:                                             ; preds = %1523
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %131) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %131) #4
  br label %1548

1526:                                             ; preds = %1522
  %1527 = landingpad { ptr, i32 }
          cleanup
  %1528 = extractvalue { ptr, i32 } %1527, 0
  store ptr %1528, ptr %20, align 8
  %1529 = extractvalue { ptr, i32 } %1527, 1
  store i32 %1529, ptr %21, align 4
  br label %1534

1530:                                             ; preds = %1523
  %1531 = landingpad { ptr, i32 }
          cleanup
  %1532 = extractvalue { ptr, i32 } %1531, 0
  store ptr %1532, ptr %20, align 8
  %1533 = extractvalue { ptr, i32 } %1531, 1
  store i32 %1533, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %131) #4
  br label %1534

1534:                                             ; preds = %1530, %1526
  call void @llvm.lifetime.end.p0(i64 24, ptr %131) #4
  br label %1562

1535:                                             ; preds = %1517
  call void @llvm.lifetime.start.p0(i64 24, ptr %132) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind writable sret(%"class.cda::math::containers::Vector") align 8 %132, ptr noundef nonnull align 8 dereferenceable(40) %107, ptr noundef nonnull align 8 dereferenceable(24) %110)
          to label %1536 unwind label %1539

1536:                                             ; preds = %1535
  %1537 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %112, ptr noundef nonnull align 8 dereferenceable(24) %132)
          to label %1538 unwind label %1543

1538:                                             ; preds = %1536
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %132) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %132) #4
  br label %1548

1539:                                             ; preds = %1535
  %1540 = landingpad { ptr, i32 }
          cleanup
  %1541 = extractvalue { ptr, i32 } %1540, 0
  store ptr %1541, ptr %20, align 8
  %1542 = extractvalue { ptr, i32 } %1540, 1
  store i32 %1542, ptr %21, align 4
  br label %1547

1543:                                             ; preds = %1536
  %1544 = landingpad { ptr, i32 }
          cleanup
  %1545 = extractvalue { ptr, i32 } %1544, 0
  store ptr %1545, ptr %20, align 8
  %1546 = extractvalue { ptr, i32 } %1544, 1
  store i32 %1546, ptr %21, align 4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %132) #4
  br label %1547

1547:                                             ; preds = %1543, %1539
  call void @llvm.lifetime.end.p0(i64 24, ptr %132) #4
  br label %1562

1548:                                             ; preds = %1538, %1525
  br label %1549

1549:                                             ; preds = %1548, %1493
  %1550 = load ptr, ptr %13, align 8, !tbaa !5
  %1551 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %1550)
          to label %1552 unwind label %1554

1552:                                             ; preds = %1549
  call void @llvm.lifetime.start.p0(i64 8, ptr %133) #4
  store i64 0, ptr %133, align 8, !tbaa !14
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %133, ptr noundef nonnull align 8 dereferenceable(24) %112)
          to label %1553 unwind label %1558

1553:                                             ; preds = %1552
  call void @llvm.lifetime.end.p0(i64 8, ptr %133) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %112) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %112) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %110) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %110) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %107) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr %107) #4
  br label %1566

1554:                                             ; preds = %1549
  %1555 = landingpad { ptr, i32 }
          cleanup
  %1556 = extractvalue { ptr, i32 } %1555, 0
  store ptr %1556, ptr %20, align 8
  %1557 = extractvalue { ptr, i32 } %1555, 1
  store i32 %1557, ptr %21, align 4
  br label %1562

1558:                                             ; preds = %1552
  %1559 = landingpad { ptr, i32 }
          cleanup
  %1560 = extractvalue { ptr, i32 } %1559, 0
  store ptr %1560, ptr %20, align 8
  %1561 = extractvalue { ptr, i32 } %1559, 1
  store i32 %1561, ptr %21, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %133) #4
  br label %1562

1562:                                             ; preds = %1558, %1554, %1547, %1534, %1516, %1507, %1449, %1364, %1342, %1341, %1329
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %112) #4
  br label %1563

1563:                                             ; preds = %1562, %1325
  call void @llvm.lifetime.end.p0(i64 24, ptr %112) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %110) #4
  br label %1564

1564:                                             ; preds = %1563, %1321
  call void @llvm.lifetime.end.p0(i64 24, ptr %110) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %107) #4
  br label %1565

1565:                                             ; preds = %1564, %1317
  call void @llvm.lifetime.end.p0(i64 40, ptr %107) #4
  br label %1568

1566:                                             ; preds = %1553, %1232, %1227
  store i1 true, ptr %16, align 1
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  %1567 = load i1, ptr %16, align 1
  br i1 %1567, label %1571, label %1570

1568:                                             ; preds = %1565, %1226, %871, %468, %214, %202
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #4
  br label %1569

1569:                                             ; preds = %1568, %201
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %0) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  br label %1572

1570:                                             ; preds = %1566
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %0) #4
  br label %1571

1571:                                             ; preds = %1570, %1566
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  ret void

1572:                                             ; preds = %1569
  %1573 = load ptr, ptr %20, align 8
  %1574 = load i32, ptr %21, align 4
  %1575 = insertvalue { ptr, i32 } poison, ptr %1573, 0
  %1576 = insertvalue { ptr, i32 } %1575, i32 %1574, 1
  resume { ptr, i32 } %1576
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #1 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdE6resizeERKmRKb(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 1 dereferenceable(1)) #1 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(8)) #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 uwtable
declare dso_local void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(24)) #1

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8)) #1

; Function Attrs: mustprogress uwtable
declare dso_local noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(24)) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(24)) #1 align 2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"double", !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"long", !7, i64 0}
!16 = !{!17, !17, i64 0}
!17 = !{!"bool", !7, i64 0}
!18 = !{!19, !6, i64 136}
!19 = !{!"_ZTSN3cda4math22differential_equations3EDPE", !20, i64 0, !21, i64 24, !22, i64 64, !23, i64 104, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !11, i64 240, !11, i64 248, !6, i64 256, !6, i64 264, !11, i64 272}
!20 = !{!"_ZTSN3cda4math10containers6VectorIdEE", !15, i64 0, !6, i64 8, !6, i64 16}
!21 = !{!"_ZTSN3cda4math10containers6MatrixIdEE", !15, i64 0, !15, i64 8, !15, i64 16, !6, i64 24, !6, i64 32}
!22 = !{!"_ZTSN3cda4math10containers6MatrixIbEE", !15, i64 0, !15, i64 8, !15, i64 16, !6, i64 24, !6, i64 32}
!23 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !24, i64 0, !15, i64 8, !7, i64 16}
!24 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !6, i64 0}
!25 = !{!19, !6, i64 144}
!26 = !{!19, !6, i64 152}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!19, !6, i64 160}
!30 = !{!19, !6, i64 168}
!31 = distinct !{!31, !28}
!32 = distinct !{!32, !28}
!33 = distinct !{!33, !28}


; 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.cda::math::containers::Vector" = type { i64, ptr, ptr }
%"class.cda::math::containers::Matrix" = type { i64, i64, i64, ptr, ptr }

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

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
define dso_local void @_ZN3cda4math22differential_equations3EDP12solveDIF_FINEhhRNS0_10containers6VectorIdEES6_d(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8 %0, ptr nocapture noundef nonnull readonly align 8 dereferenceable(280) %1, i8 noundef zeroext %2, i8 noundef zeroext %3, ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(24) %5, double noundef %6) local_unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %8 = alloca double, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca i8, align 1
  %15 = alloca %"class.cda::math::containers::Matrix", align 8
  %16 = alloca i64, align 8
  %17 = alloca i64, align 8
  %18 = alloca %"class.cda::math::containers::Vector", align 8
  %19 = alloca i64, align 8
  %20 = alloca %"class.cda::math::containers::Vector", align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i64, align 8
  %24 = alloca i64, align 8
  %25 = alloca i64, align 8
  %26 = alloca i64, align 8
  %27 = alloca i64, align 8
  %28 = alloca i64, align 8
  %29 = alloca i64, align 8
  %30 = alloca i64, align 8
  %31 = alloca i64, align 8
  %32 = alloca %"class.cda::math::containers::Vector", align 8
  %33 = alloca %"class.cda::math::containers::Vector", align 8
  %34 = alloca %"class.cda::math::containers::Vector", align 8
  %35 = alloca i64, align 8
  %36 = alloca %"class.cda::math::containers::Matrix", align 8
  %37 = alloca i64, align 8
  %38 = alloca i64, align 8
  %39 = alloca %"class.cda::math::containers::Vector", align 8
  %40 = alloca i64, align 8
  %41 = alloca %"class.cda::math::containers::Vector", align 8
  %42 = alloca i64, align 8
  %43 = alloca i64, align 8
  %44 = alloca i64, align 8
  %45 = alloca i64, align 8
  %46 = alloca i64, align 8
  %47 = alloca i64, align 8
  %48 = alloca i64, align 8
  %49 = alloca i64, align 8
  %50 = alloca i64, align 8
  %51 = alloca i64, align 8
  %52 = alloca i64, align 8
  %53 = alloca i64, align 8
  %54 = alloca i64, align 8
  %55 = alloca i64, align 8
  %56 = alloca i64, align 8
  %57 = alloca i64, align 8
  %58 = alloca i64, align 8
  %59 = alloca i64, align 8
  %60 = alloca i64, align 8
  %61 = alloca i64, align 8
  %62 = alloca i64, align 8
  %63 = alloca %"class.cda::math::containers::Vector", align 8
  %64 = alloca %"class.cda::math::containers::Matrix", align 8
  %65 = alloca i64, align 8
  %66 = alloca i64, align 8
  %67 = alloca %"class.cda::math::containers::Vector", align 8
  %68 = alloca i64, align 8
  %69 = alloca %"class.cda::math::containers::Vector", align 8
  %70 = alloca i64, align 8
  %71 = alloca i64, align 8
  %72 = alloca i64, align 8
  %73 = alloca i64, align 8
  %74 = alloca i64, align 8
  %75 = alloca i64, align 8
  %76 = alloca i64, align 8
  %77 = alloca i64, align 8
  %78 = alloca i64, align 8
  %79 = alloca i64, align 8
  %80 = alloca i64, align 8
  %81 = alloca i64, align 8
  %82 = alloca i64, align 8
  %83 = alloca i64, align 8
  %84 = alloca i64, align 8
  %85 = alloca i64, align 8
  %86 = alloca %"class.cda::math::containers::Vector", align 8
  %87 = alloca i64, align 8
  %88 = alloca %"class.cda::math::containers::Matrix", align 8
  %89 = alloca i64, align 8
  %90 = alloca i64, align 8
  %91 = alloca %"class.cda::math::containers::Vector", align 8
  %92 = alloca i64, align 8
  %93 = alloca %"class.cda::math::containers::Vector", align 8
  %94 = alloca i64, align 8
  %95 = alloca i64, align 8
  %96 = alloca i64, align 8
  %97 = alloca i64, align 8
  %98 = alloca i64, align 8
  %99 = alloca i64, align 8
  %100 = alloca i64, align 8
  %101 = alloca i64, align 8
  %102 = alloca i64, align 8
  %103 = alloca i64, align 8
  %104 = alloca i64, align 8
  %105 = alloca i64, align 8
  %106 = alloca i64, align 8
  %107 = alloca i64, align 8
  %108 = alloca i64, align 8
  %109 = alloca i64, align 8
  %110 = alloca %"class.cda::math::containers::Vector", align 8
  %111 = alloca %"class.cda::math::containers::Vector", align 8
  %112 = alloca %"class.cda::math::containers::Vector", align 8
  %113 = alloca i64, align 8
  store double %6, ptr %8, align 8, !tbaa !5
  %114 = tail call noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %4)
  %115 = trunc i64 %114 to i32
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %9) #4
  %sext = shl i64 %114, 32
  %116 = ashr exact i64 %sext, 32
  store i64 %116, ptr %9, align 8, !tbaa !9
  call void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %9)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %9) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #4
  %117 = add i32 %115, -1
  %118 = sext i32 %117 to i64
  store i64 %118, ptr %10, align 8, !tbaa !9
  %119 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %10)
  %120 = load double, ptr %119, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #4
  store i64 0, ptr %11, align 8, !tbaa !9
  %121 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %11)
  %122 = load double, ptr %121, align 8, !tbaa !5
  %123 = fsub double %120, %122
  %124 = sitofp i32 %117 to double
  %125 = fdiv double %123, %124
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #4
  store i64 0, ptr %12, align 8, !tbaa !9
  %126 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %12)
  %127 = load double, ptr %126, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #4
  %128 = call noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %4)
  store i64 %128, ptr %13, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %14) #4
  store i8 1, ptr %14, align 1, !tbaa !11
  invoke void @_ZN3cda4math10containers6VectorIdE6resizeERKmRKb(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %13, ptr noundef nonnull align 1 dereferenceable(1) %14)
          to label %129 unwind label %149

129:                                              ; preds = %7
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #4
  %130 = and i8 %2, 3
  %or.cond.not = icmp eq i8 %130, 3
  br i1 %or.cond.not, label %131, label %._crit_edge339

._crit_edge339:                                   ; preds = %129
  %.pre = zext i8 %3 to i32
  %.pre340 = and i32 %.pre, 32
  br label %261

131:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %16) #4
  %132 = add i32 %115, -2
  %133 = sext i32 %132 to i64
  store i64 %133, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %17) #4
  store i64 3, ptr %17, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(8) %16, ptr noundef nonnull align 8 dereferenceable(8) %17)
          to label %134 unwind label %151

134:                                              ; preds = %131
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %18) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %19) #4
  store i64 %133, ptr %19, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %18, ptr noundef nonnull align 8 dereferenceable(8) %19)
          to label %135 unwind label %153

135:                                              ; preds = %134
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %20) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %21) #4
  store i64 %133, ptr %21, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %20, ptr noundef nonnull align 8 dereferenceable(8) %21)
          to label %136 unwind label %155

136:                                              ; preds = %135
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %21) #4
  %137 = icmp sgt i32 %115, 2
  br i1 %137, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %136
  %138 = getelementptr inbounds i8, ptr %1, i64 136
  %139 = getelementptr inbounds i8, ptr %1, i64 144
  %140 = fneg double %125
  %141 = fmul double %125, %140
  %142 = getelementptr inbounds i8, ptr %1, i64 152
  %wide.trip.count = zext nneg i32 %132 to i64
  br label %157

._crit_edge:                                      ; preds = %183, %136
  %.0200.lcssa = phi double [ %127, %136 ], [ %158, %183 ]
  %143 = getelementptr inbounds i8, ptr %1, i64 136
  %144 = load ptr, ptr %143, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %26) #4
  store i64 0, ptr %26, align 8, !tbaa !9
  %145 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %26)
  %146 = load double, ptr %145, align 8, !tbaa !5
  %147 = fadd double %125, %146
  %148 = invoke noundef double %144(double noundef %147)
          to label %188 unwind label %225

149:                                              ; preds = %7
  %150 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %14) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #4
  br label %695

151:                                              ; preds = %131
  %152 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %16) #4
  br label %260

153:                                              ; preds = %134
  %154 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %19) #4
  br label %259

155:                                              ; preds = %135
  %156 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %21) #4
  br label %258

157:                                              ; preds = %.lr.ph, %183
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %183 ]
  %.0200299 = phi double [ %127, %.lr.ph ], [ %158, %183 ]
  %158 = fadd double %125, %.0200299
  %159 = load ptr, ptr %138, align 8, !tbaa !13
  %160 = invoke noundef double %159(double noundef %158)
          to label %161 unwind label %186

161:                                              ; preds = %157
  %162 = fmul double %125, %160
  %163 = fmul double %162, 5.000000e-01
  %164 = fadd double %163, 1.000000e+00
  %165 = fneg double %164
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %22) #4
  store i64 %indvars.iv, ptr %22, align 8, !tbaa !9
  %166 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(8) %22)
  store double %165, ptr %166, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %22) #4
  %167 = load ptr, ptr %139, align 8, !tbaa !21
  %168 = invoke noundef double %167(double noundef %158)
          to label %169 unwind label %186

169:                                              ; preds = %161
  %170 = call double @llvm.fmuladd.f64(double %141, double %168, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %23) #4
  store i64 %indvars.iv, ptr %23, align 8, !tbaa !9
  %171 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(8) %23)
  %172 = getelementptr inbounds i8, ptr %171, i64 8
  store double %170, ptr %172, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %23) #4
  %173 = load ptr, ptr %138, align 8, !tbaa !13
  %174 = invoke noundef double %173(double noundef %158)
          to label %175 unwind label %186

175:                                              ; preds = %169
  %176 = fmul double %125, %174
  %177 = fmul double %176, 5.000000e-01
  %178 = fadd double %177, -1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %24) #4
  store i64 %indvars.iv, ptr %24, align 8, !tbaa !9
  %179 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(8) %24)
  %180 = getelementptr inbounds i8, ptr %179, i64 16
  store double %178, ptr %180, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %24) #4
  %181 = load ptr, ptr %142, align 8, !tbaa !22
  %182 = invoke noundef double %181(double noundef %158)
          to label %183 unwind label %186

183:                                              ; preds = %175
  %184 = fmul double %141, %182
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %25) #4
  store i64 %indvars.iv, ptr %25, align 8, !tbaa !9
  %185 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %18, ptr noundef nonnull align 8 dereferenceable(8) %25)
  store double %184, ptr %185, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %25) #4
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %157, !llvm.loop !23

186:                                              ; preds = %175, %169, %161, %157
  %187 = landingpad { ptr, i32 }
          cleanup
  br label %257

188:                                              ; preds = %._crit_edge
  %189 = getelementptr inbounds i8, ptr %1, i64 160
  %190 = load ptr, ptr %189, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %27) #4
  store i64 0, ptr %27, align 8, !tbaa !9
  %191 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %27)
  %192 = load double, ptr %191, align 8, !tbaa !5
  %193 = invoke noundef double %190(double noundef %192, double noundef 0.000000e+00)
          to label %194 unwind label %227

194:                                              ; preds = %188
  %195 = fmul double %125, %148
  %196 = fmul double %195, 5.000000e-01
  %197 = fadd double %196, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %28) #4
  store i64 0, ptr %28, align 8, !tbaa !9
  %198 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %18, ptr noundef nonnull align 8 dereferenceable(8) %28)
  %199 = load double, ptr %198, align 8, !tbaa !5
  %200 = call double @llvm.fmuladd.f64(double %197, double %193, double %199)
  store double %200, ptr %198, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %26) #4
  %201 = load ptr, ptr %143, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %29) #4
  store i64 %118, ptr %29, align 8, !tbaa !9
  %202 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %29)
  %203 = load double, ptr %202, align 8, !tbaa !5
  %204 = fsub double %203, %125
  %205 = invoke noundef double %201(double noundef %204)
          to label %206 unwind label %230

206:                                              ; preds = %194
  %207 = getelementptr inbounds i8, ptr %1, i64 168
  %208 = load ptr, ptr %207, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %30) #4
  store i64 %118, ptr %30, align 8, !tbaa !9
  %209 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %30)
  %210 = load double, ptr %209, align 8, !tbaa !5
  %211 = invoke noundef double %208(double noundef %210, double noundef 0.000000e+00)
          to label %212 unwind label %232

212:                                              ; preds = %206
  %213 = fmul double %125, %205
  %214 = fmul double %213, 5.000000e-01
  %215 = fsub double 1.000000e+00, %214
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %31) #4
  %sext243 = add i64 %sext, -12884901888
  %216 = ashr exact i64 %sext243, 32
  store i64 %216, ptr %31, align 8, !tbaa !9
  %217 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %18, ptr noundef nonnull align 8 dereferenceable(8) %31)
  %218 = load double, ptr %217, align 8, !tbaa !5
  %219 = call double @llvm.fmuladd.f64(double %215, double %211, double %218)
  store double %219, ptr %217, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %29) #4
  %220 = zext i8 %3 to i32
  %221 = and i32 %220, 32
  %.not244 = icmp eq i32 %221, 0
  br i1 %.not244, label %237, label %222

222:                                              ; preds = %212
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %32) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %32, ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(24) %18)
          to label %223 unwind label %235

223:                                              ; preds = %222
  %224 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %20, ptr noundef nonnull align 8 dereferenceable(24) %32)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %32) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %32) #4
  br label %249

225:                                              ; preds = %._crit_edge
  %226 = landingpad { ptr, i32 }
          cleanup
  br label %229

227:                                              ; preds = %188
  %228 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %27) #4
  br label %229

229:                                              ; preds = %227, %225
  %.pn = phi { ptr, i32 } [ %228, %227 ], [ %226, %225 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %26) #4
  br label %257

230:                                              ; preds = %194
  %231 = landingpad { ptr, i32 }
          cleanup
  br label %234

232:                                              ; preds = %206
  %233 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %30) #4
  br label %234

234:                                              ; preds = %232, %230
  %.pn241 = phi { ptr, i32 } [ %233, %232 ], [ %231, %230 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %29) #4
  br label %257

235:                                              ; preds = %222
  %236 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %32) #4
  br label %257

237:                                              ; preds = %212
  %238 = and i32 %220, 64
  %.not245 = icmp eq i32 %238, 0
  br i1 %.not245, label %244, label %239

239:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %33) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %33, ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(24) %18, ptr noundef nonnull align 8 dereferenceable(8) %8)
          to label %240 unwind label %242

240:                                              ; preds = %239
  %241 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %20, ptr noundef nonnull align 8 dereferenceable(24) %33)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %33) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %33) #4
  br label %249

242:                                              ; preds = %239
  %243 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %33) #4
  br label %257

244:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %34) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %34, ptr noundef nonnull align 8 dereferenceable(40) %15, ptr noundef nonnull align 8 dereferenceable(24) %18)
          to label %245 unwind label %247

245:                                              ; preds = %244
  %246 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %20, ptr noundef nonnull align 8 dereferenceable(24) %34)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %34) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %34) #4
  br label %249

247:                                              ; preds = %244
  %248 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %34) #4
  br label %257

249:                                              ; preds = %240, %245, %223
  %250 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %5)
          to label %251 unwind label %253

251:                                              ; preds = %249
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %35) #4
  store i64 1, ptr %35, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %35, ptr noundef nonnull align 8 dereferenceable(24) %20)
          to label %252 unwind label %255

252:                                              ; preds = %251
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %20) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %20) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %18) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %18) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %15) #4
  br label %261

253:                                              ; preds = %249
  %254 = landingpad { ptr, i32 }
          cleanup
  br label %257

255:                                              ; preds = %251
  %256 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %35) #4
  br label %257

257:                                              ; preds = %255, %253, %247, %242, %235, %234, %229, %186
  %.pn284 = phi { ptr, i32 } [ %187, %186 ], [ %256, %255 ], [ %254, %253 ], [ %236, %235 ], [ %243, %242 ], [ %248, %247 ], [ %.pn241, %234 ], [ %.pn, %229 ]
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %20) #4
  br label %258

258:                                              ; preds = %257, %155
  %.pn284.pn = phi { ptr, i32 } [ %.pn284, %257 ], [ %156, %155 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %20) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %18) #4
  br label %259

259:                                              ; preds = %258, %153
  %.pn284.pn.pn = phi { ptr, i32 } [ %.pn284.pn, %258 ], [ %154, %153 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %18) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %15) #4
  br label %260

260:                                              ; preds = %259, %151
  %.pn284.pn.pn.pn = phi { ptr, i32 } [ %.pn284.pn.pn, %259 ], [ %152, %151 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %15) #4
  br label %695

261:                                              ; preds = %._crit_edge339, %252
  %.pre-phi341 = phi i32 [ %.pre340, %._crit_edge339 ], [ %221, %252 ]
  %.pre-phi = phi i32 [ %.pre, %._crit_edge339 ], [ %220, %252 ]
  %.1 = phi double [ %127, %._crit_edge339 ], [ %.0200.lcssa, %252 ]
  %.not247 = icmp eq i32 %.pre-phi341, 0
  %262 = and i32 %.pre-phi, 48
  %or.cond290.not = icmp eq i32 %262, 48
  br i1 %or.cond290.not, label %263, label %410

263:                                              ; preds = %261
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %36) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %37) #4
  store i64 %116, ptr %37, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %38) #4
  store i64 3, ptr %38, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %37, ptr noundef nonnull align 8 dereferenceable(8) %38)
          to label %264 unwind label %313

264:                                              ; preds = %263
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %37) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %39) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %40) #4
  store i64 %116, ptr %40, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %39, ptr noundef nonnull align 8 dereferenceable(8) %40)
          to label %265 unwind label %315

265:                                              ; preds = %264
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %40) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %41) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %42) #4
  store i64 %116, ptr %42, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %41, ptr noundef nonnull align 8 dereferenceable(8) %42)
          to label %266 unwind label %317

266:                                              ; preds = %265
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %42) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %43) #4
  store i64 0, ptr %43, align 8, !tbaa !9
  %267 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %43)
  store double 0.000000e+00, ptr %267, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %43) #4
  %268 = getelementptr inbounds i8, ptr %1, i64 144
  %269 = load ptr, ptr %268, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %44) #4
  store i64 0, ptr %44, align 8, !tbaa !9
  %270 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %44)
  %271 = load double, ptr %270, align 8, !tbaa !5
  %272 = invoke noundef double %269(double noundef %271)
          to label %273 unwind label %319

273:                                              ; preds = %266
  %274 = fneg double %125
  %275 = fmul double %125, %274
  %276 = call double @llvm.fmuladd.f64(double %275, double %272, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %45) #4
  store i64 0, ptr %45, align 8, !tbaa !9
  %277 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %45)
  %278 = getelementptr inbounds i8, ptr %277, i64 8
  store double %276, ptr %278, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %45) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %44) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %46) #4
  store i64 0, ptr %46, align 8, !tbaa !9
  %279 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %46)
  %280 = getelementptr inbounds i8, ptr %279, i64 16
  store double -2.000000e+00, ptr %280, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %46) #4
  %281 = getelementptr inbounds i8, ptr %1, i64 152
  %282 = load ptr, ptr %281, align 8, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %47) #4
  store i64 0, ptr %47, align 8, !tbaa !9
  %283 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %47)
  %284 = load double, ptr %283, align 8, !tbaa !5
  %285 = invoke noundef double %282(double noundef %284)
          to label %286 unwind label %321

286:                                              ; preds = %273
  %287 = fmul double %125, 2.000000e+00
  %288 = getelementptr inbounds i8, ptr %1, i64 160
  %289 = load ptr, ptr %288, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %48) #4
  store i64 0, ptr %48, align 8, !tbaa !9
  %290 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %48)
  %291 = load double, ptr %290, align 8, !tbaa !5
  %292 = invoke noundef double %289(double noundef %291, double noundef 0.000000e+00)
          to label %293 unwind label %323

293:                                              ; preds = %286
  %294 = getelementptr inbounds i8, ptr %1, i64 136
  %295 = load ptr, ptr %294, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %49) #4
  store i64 0, ptr %49, align 8, !tbaa !9
  %296 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %49)
  %297 = load double, ptr %296, align 8, !tbaa !5
  %298 = invoke noundef double %295(double noundef %297)
          to label %299 unwind label %325

299:                                              ; preds = %293
  %300 = fmul double %287, %292
  %301 = fmul double %125, %298
  %302 = fmul double %301, 5.000000e-01
  %303 = fadd double %302, -1.000000e+00
  %304 = fmul double %300, %303
  %305 = call double @llvm.fmuladd.f64(double %275, double %285, double %304)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %50) #4
  store i64 0, ptr %50, align 8, !tbaa !9
  %306 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %39, ptr noundef nonnull align 8 dereferenceable(8) %50)
  store double %305, ptr %306, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %50) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %49) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %48) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %47) #4
  %307 = icmp sgt i32 %115, 2
  br i1 %307, label %.lr.ph304.preheader, label %._crit_edge305

.lr.ph304.preheader:                              ; preds = %299
  %wide.trip.count327 = zext nneg i32 %117 to i64
  br label %.lr.ph304

._crit_edge305:                                   ; preds = %354, %299
  %.2.lcssa = phi double [ %.1, %299 ], [ %329, %354 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %55) #4
  store i64 %118, ptr %55, align 8, !tbaa !9
  %308 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %55)
  store double -2.000000e+00, ptr %308, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %55) #4
  %309 = load ptr, ptr %268, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %56) #4
  store i64 %118, ptr %56, align 8, !tbaa !9
  %310 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %56)
  %311 = load double, ptr %310, align 8, !tbaa !5
  %312 = invoke noundef double %309(double noundef %311)
          to label %359 unwind label %391

313:                                              ; preds = %263
  %314 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %38) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %37) #4
  br label %409

315:                                              ; preds = %264
  %316 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %40) #4
  br label %408

317:                                              ; preds = %265
  %318 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %42) #4
  br label %407

319:                                              ; preds = %266
  %320 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %44) #4
  br label %406

321:                                              ; preds = %273
  %322 = landingpad { ptr, i32 }
          cleanup
  br label %328

323:                                              ; preds = %286
  %324 = landingpad { ptr, i32 }
          cleanup
  br label %327

325:                                              ; preds = %293
  %326 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %49) #4
  br label %327

327:                                              ; preds = %325, %323
  %.pn248 = phi { ptr, i32 } [ %326, %325 ], [ %324, %323 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %48) #4
  br label %328

328:                                              ; preds = %327, %321
  %.pn248.pn = phi { ptr, i32 } [ %.pn248, %327 ], [ %322, %321 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %47) #4
  br label %406

.lr.ph304:                                        ; preds = %.lr.ph304.preheader, %354
  %indvars.iv324 = phi i64 [ 1, %.lr.ph304.preheader ], [ %indvars.iv.next325, %354 ]
  %.2301 = phi double [ %.1, %.lr.ph304.preheader ], [ %329, %354 ]
  %329 = fadd double %125, %.2301
  %330 = load ptr, ptr %294, align 8, !tbaa !13
  %331 = invoke noundef double %330(double noundef %329)
          to label %332 unwind label %357

332:                                              ; preds = %.lr.ph304
  %333 = fmul double %125, %331
  %334 = fmul double %333, 5.000000e-01
  %335 = fadd double %334, 1.000000e+00
  %336 = fneg double %335
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %51) #4
  store i64 %indvars.iv324, ptr %51, align 8, !tbaa !9
  %337 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %51)
  store double %336, ptr %337, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %51) #4
  %338 = load ptr, ptr %268, align 8, !tbaa !21
  %339 = invoke noundef double %338(double noundef %329)
          to label %340 unwind label %357

340:                                              ; preds = %332
  %341 = call double @llvm.fmuladd.f64(double %275, double %339, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %52) #4
  store i64 %indvars.iv324, ptr %52, align 8, !tbaa !9
  %342 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %52)
  %343 = getelementptr inbounds i8, ptr %342, i64 8
  store double %341, ptr %343, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %52) #4
  %344 = load ptr, ptr %294, align 8, !tbaa !13
  %345 = invoke noundef double %344(double noundef %329)
          to label %346 unwind label %357

346:                                              ; preds = %340
  %347 = fmul double %125, %345
  %348 = fmul double %347, 5.000000e-01
  %349 = fadd double %348, -1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %53) #4
  store i64 %indvars.iv324, ptr %53, align 8, !tbaa !9
  %350 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %53)
  %351 = getelementptr inbounds i8, ptr %350, i64 16
  store double %349, ptr %351, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %53) #4
  %352 = load ptr, ptr %281, align 8, !tbaa !22
  %353 = invoke noundef double %352(double noundef %329)
          to label %354 unwind label %357

354:                                              ; preds = %346
  %355 = fmul double %275, %353
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %54) #4
  store i64 %indvars.iv324, ptr %54, align 8, !tbaa !9
  %356 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %39, ptr noundef nonnull align 8 dereferenceable(8) %54)
  store double %355, ptr %356, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %54) #4
  %indvars.iv.next325 = add nuw nsw i64 %indvars.iv324, 1
  %exitcond328.not = icmp eq i64 %indvars.iv.next325, %wide.trip.count327
  br i1 %exitcond328.not, label %._crit_edge305, label %.lr.ph304, !llvm.loop !27

357:                                              ; preds = %346, %340, %332, %.lr.ph304
  %358 = landingpad { ptr, i32 }
          cleanup
  br label %406

359:                                              ; preds = %._crit_edge305
  %360 = call double @llvm.fmuladd.f64(double %275, double %312, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %57) #4
  store i64 %118, ptr %57, align 8, !tbaa !9
  %361 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %57)
  %362 = getelementptr inbounds i8, ptr %361, i64 8
  store double %360, ptr %362, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %57) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %56) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %58) #4
  store i64 %118, ptr %58, align 8, !tbaa !9
  %363 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(8) %58)
  %364 = getelementptr inbounds i8, ptr %363, i64 16
  store double 0.000000e+00, ptr %364, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %58) #4
  %365 = load ptr, ptr %281, align 8, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %59) #4
  store i64 %118, ptr %59, align 8, !tbaa !9
  %366 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %59)
  %367 = load double, ptr %366, align 8, !tbaa !5
  %368 = invoke noundef double %365(double noundef %367)
          to label %369 unwind label %393

369:                                              ; preds = %359
  %370 = getelementptr inbounds i8, ptr %1, i64 168
  %371 = load ptr, ptr %370, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %60) #4
  store i64 %118, ptr %60, align 8, !tbaa !9
  %372 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %60)
  %373 = load double, ptr %372, align 8, !tbaa !5
  %374 = invoke noundef double %371(double noundef %373, double noundef 0.000000e+00)
          to label %375 unwind label %395

375:                                              ; preds = %369
  %376 = load ptr, ptr %294, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %61) #4
  store i64 %118, ptr %61, align 8, !tbaa !9
  %377 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %61)
  %378 = load double, ptr %377, align 8, !tbaa !5
  %379 = invoke noundef double %376(double noundef %378)
          to label %380 unwind label %397

380:                                              ; preds = %375
  %381 = fmul double %287, %374
  %382 = fmul double %125, %379
  %383 = fmul double %382, 5.000000e-01
  %384 = fadd double %383, 1.000000e+00
  %385 = fmul double %381, %384
  %386 = call double @llvm.fmuladd.f64(double %275, double %368, double %385)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %62) #4
  store i64 %118, ptr %62, align 8, !tbaa !9
  %387 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %39, ptr noundef nonnull align 8 dereferenceable(8) %62)
  store double %386, ptr %387, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %62) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %61) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %60) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %59) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %63) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %63, ptr noundef nonnull align 8 dereferenceable(40) %36, ptr noundef nonnull align 8 dereferenceable(24) %39)
          to label %388 unwind label %401

388:                                              ; preds = %380
  %389 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %41, ptr noundef nonnull align 8 dereferenceable(24) %63)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %63) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %63) #4
  %390 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %41)
          to label %403 unwind label %404

391:                                              ; preds = %._crit_edge305
  %392 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %56) #4
  br label %406

393:                                              ; preds = %359
  %394 = landingpad { ptr, i32 }
          cleanup
  br label %400

395:                                              ; preds = %369
  %396 = landingpad { ptr, i32 }
          cleanup
  br label %399

397:                                              ; preds = %375
  %398 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %61) #4
  br label %399

399:                                              ; preds = %397, %395
  %.pn251 = phi { ptr, i32 } [ %398, %397 ], [ %396, %395 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %60) #4
  br label %400

400:                                              ; preds = %399, %393
  %.pn251.pn = phi { ptr, i32 } [ %.pn251, %399 ], [ %394, %393 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %59) #4
  br label %406

401:                                              ; preds = %380
  %402 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %63) #4
  br label %406

403:                                              ; preds = %388
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %41) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %41) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %39) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %39) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %36) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %36) #4
  br label %410

404:                                              ; preds = %388
  %405 = landingpad { ptr, i32 }
          cleanup
  br label %406

406:                                              ; preds = %404, %401, %400, %391, %357, %328, %319
  %.pn279 = phi { ptr, i32 } [ %358, %357 ], [ %405, %404 ], [ %402, %401 ], [ %.pn251.pn, %400 ], [ %392, %391 ], [ %.pn248.pn, %328 ], [ %320, %319 ]
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %41) #4
  br label %407

407:                                              ; preds = %406, %317
  %.pn279.pn = phi { ptr, i32 } [ %.pn279, %406 ], [ %318, %317 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %41) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %39) #4
  br label %408

408:                                              ; preds = %407, %315
  %.pn279.pn.pn = phi { ptr, i32 } [ %.pn279.pn, %407 ], [ %316, %315 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %39) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %36) #4
  br label %409

409:                                              ; preds = %408, %313
  %.pn279.pn.pn.pn = phi { ptr, i32 } [ %.pn279.pn.pn, %408 ], [ %314, %313 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %36) #4
  br label %695

410:                                              ; preds = %403, %261
  %.3 = phi double [ %.2.lcssa, %403 ], [ %.1, %261 ]
  %411 = and i32 %.pre-phi, 33
  %or.cond291.not = icmp eq i32 %411, 33
  br i1 %or.cond291.not, label %412, label %549

412:                                              ; preds = %410
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %64) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %65) #4
  store i64 %118, ptr %65, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %66) #4
  store i64 3, ptr %66, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %65, ptr noundef nonnull align 8 dereferenceable(8) %66)
          to label %413 unwind label %429

413:                                              ; preds = %412
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %66) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %65) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %67) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %68) #4
  store i64 %118, ptr %68, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %67, ptr noundef nonnull align 8 dereferenceable(8) %68)
          to label %414 unwind label %431

414:                                              ; preds = %413
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %68) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %69) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %70) #4
  store i64 %118, ptr %70, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %69, ptr noundef nonnull align 8 dereferenceable(8) %70)
          to label %415 unwind label %433

415:                                              ; preds = %414
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %70) #4
  %416 = add i32 %115, -2
  %417 = icmp sgt i32 %115, 2
  br i1 %417, label %.lr.ph310, label %._crit_edge311

.lr.ph310:                                        ; preds = %415
  %418 = getelementptr inbounds i8, ptr %1, i64 136
  %419 = getelementptr inbounds i8, ptr %1, i64 144
  %420 = fneg double %125
  %421 = fmul double %125, %420
  %422 = getelementptr inbounds i8, ptr %1, i64 152
  %wide.trip.count332 = zext nneg i32 %416 to i64
  br label %435

._crit_edge311:                                   ; preds = %461, %415
  %.4.lcssa = phi double [ %.3, %415 ], [ %436, %461 ]
  %423 = getelementptr inbounds i8, ptr %1, i64 136
  %424 = load ptr, ptr %423, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %75) #4
  store i64 0, ptr %75, align 8, !tbaa !9
  %425 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %75)
  %426 = load double, ptr %425, align 8, !tbaa !5
  %427 = fadd double %125, %426
  %428 = invoke noundef double %424(double noundef %427)
          to label %466 unwind label %522

429:                                              ; preds = %412
  %430 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %66) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %65) #4
  br label %548

431:                                              ; preds = %413
  %432 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %68) #4
  br label %547

433:                                              ; preds = %414
  %434 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %70) #4
  br label %546

435:                                              ; preds = %.lr.ph310, %461
  %indvars.iv329 = phi i64 [ 0, %.lr.ph310 ], [ %indvars.iv.next330, %461 ]
  %.4307 = phi double [ %.3, %.lr.ph310 ], [ %436, %461 ]
  %436 = fadd double %125, %.4307
  %437 = load ptr, ptr %418, align 8, !tbaa !13
  %438 = invoke noundef double %437(double noundef %436)
          to label %439 unwind label %464

439:                                              ; preds = %435
  %440 = fmul double %125, %438
  %441 = fmul double %440, 5.000000e-01
  %442 = fadd double %441, 1.000000e+00
  %443 = fneg double %442
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %71) #4
  store i64 %indvars.iv329, ptr %71, align 8, !tbaa !9
  %444 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %71)
  store double %443, ptr %444, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %71) #4
  %445 = load ptr, ptr %419, align 8, !tbaa !21
  %446 = invoke noundef double %445(double noundef %436)
          to label %447 unwind label %464

447:                                              ; preds = %439
  %448 = call double @llvm.fmuladd.f64(double %421, double %446, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %72) #4
  store i64 %indvars.iv329, ptr %72, align 8, !tbaa !9
  %449 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %72)
  %450 = getelementptr inbounds i8, ptr %449, i64 8
  store double %448, ptr %450, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %72) #4
  %451 = load ptr, ptr %418, align 8, !tbaa !13
  %452 = invoke noundef double %451(double noundef %436)
          to label %453 unwind label %464

453:                                              ; preds = %447
  %454 = fmul double %125, %452
  %455 = fmul double %454, 5.000000e-01
  %456 = fadd double %455, -1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %73) #4
  store i64 %indvars.iv329, ptr %73, align 8, !tbaa !9
  %457 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %73)
  %458 = getelementptr inbounds i8, ptr %457, i64 16
  store double %456, ptr %458, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %73) #4
  %459 = load ptr, ptr %422, align 8, !tbaa !22
  %460 = invoke noundef double %459(double noundef %436)
          to label %461 unwind label %464

461:                                              ; preds = %453
  %462 = fmul double %421, %460
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %74) #4
  store i64 %indvars.iv329, ptr %74, align 8, !tbaa !9
  %463 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %67, ptr noundef nonnull align 8 dereferenceable(8) %74)
  store double %462, ptr %463, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %74) #4
  %indvars.iv.next330 = add nuw nsw i64 %indvars.iv329, 1
  %exitcond333.not = icmp eq i64 %indvars.iv.next330, %wide.trip.count332
  br i1 %exitcond333.not, label %._crit_edge311, label %435, !llvm.loop !28

464:                                              ; preds = %453, %447, %439, %435
  %465 = landingpad { ptr, i32 }
          cleanup
  br label %545

466:                                              ; preds = %._crit_edge311
  %467 = getelementptr inbounds i8, ptr %1, i64 160
  %468 = load ptr, ptr %467, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %76) #4
  store i64 0, ptr %76, align 8, !tbaa !9
  %469 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %76)
  %470 = load double, ptr %469, align 8, !tbaa !5
  %471 = invoke noundef double %468(double noundef %470, double noundef 0.000000e+00)
          to label %472 unwind label %524

472:                                              ; preds = %466
  %473 = fmul double %125, %428
  %474 = fmul double %473, 5.000000e-01
  %475 = fadd double %474, 1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %77) #4
  store i64 0, ptr %77, align 8, !tbaa !9
  %476 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %67, ptr noundef nonnull align 8 dereferenceable(8) %77)
  %477 = load double, ptr %476, align 8, !tbaa !5
  %478 = call double @llvm.fmuladd.f64(double %475, double %471, double %477)
  store double %478, ptr %476, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %77) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %76) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %75) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %78) #4
  %479 = sext i32 %416 to i64
  store i64 %479, ptr %78, align 8, !tbaa !9
  %480 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %78)
  store double -2.000000e+00, ptr %480, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %78) #4
  %481 = getelementptr inbounds i8, ptr %1, i64 144
  %482 = load ptr, ptr %481, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %79) #4
  store i64 %118, ptr %79, align 8, !tbaa !9
  %483 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %79)
  %484 = load double, ptr %483, align 8, !tbaa !5
  %485 = invoke noundef double %482(double noundef %484)
          to label %486 unwind label %527

486:                                              ; preds = %472
  %487 = fneg double %125
  %488 = fmul double %125, %487
  %489 = call double @llvm.fmuladd.f64(double %488, double %485, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %80) #4
  store i64 %479, ptr %80, align 8, !tbaa !9
  %490 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %80)
  %491 = getelementptr inbounds i8, ptr %490, i64 8
  store double %489, ptr %491, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %80) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %79) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %81) #4
  store i64 %479, ptr %81, align 8, !tbaa !9
  %492 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(8) %81)
  %493 = getelementptr inbounds i8, ptr %492, i64 16
  store double 0.000000e+00, ptr %493, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %81) #4
  %494 = getelementptr inbounds i8, ptr %1, i64 152
  %495 = load ptr, ptr %494, align 8, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %82) #4
  store i64 %118, ptr %82, align 8, !tbaa !9
  %496 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %82)
  %497 = load double, ptr %496, align 8, !tbaa !5
  %498 = invoke noundef double %495(double noundef %497)
          to label %499 unwind label %529

499:                                              ; preds = %486
  %500 = getelementptr inbounds i8, ptr %1, i64 168
  %501 = load ptr, ptr %500, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %83) #4
  store i64 %118, ptr %83, align 8, !tbaa !9
  %502 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %83)
  %503 = load double, ptr %502, align 8, !tbaa !5
  %504 = invoke noundef double %501(double noundef %503, double noundef 0.000000e+00)
          to label %505 unwind label %531

505:                                              ; preds = %499
  %506 = load ptr, ptr %423, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %84) #4
  store i64 %118, ptr %84, align 8, !tbaa !9
  %507 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %84)
  %508 = load double, ptr %507, align 8, !tbaa !5
  %509 = invoke noundef double %506(double noundef %508)
          to label %510 unwind label %533

510:                                              ; preds = %505
  %511 = fmul double %125, 2.000000e+00
  %512 = fmul double %511, %504
  %513 = fmul double %125, %509
  %514 = fmul double %513, 5.000000e-01
  %515 = fadd double %514, 1.000000e+00
  %516 = fmul double %512, %515
  %517 = call double @llvm.fmuladd.f64(double %488, double %498, double %516)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %85) #4
  store i64 %479, ptr %85, align 8, !tbaa !9
  %518 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %67, ptr noundef nonnull align 8 dereferenceable(8) %85)
  store double %517, ptr %518, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %85) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %84) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %83) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %82) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %86) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %86, ptr noundef nonnull align 8 dereferenceable(40) %64, ptr noundef nonnull align 8 dereferenceable(24) %67)
          to label %519 unwind label %537

519:                                              ; preds = %510
  %520 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %69, ptr noundef nonnull align 8 dereferenceable(24) %86)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %86) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %86) #4
  %521 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %5)
          to label %539 unwind label %541

522:                                              ; preds = %._crit_edge311
  %523 = landingpad { ptr, i32 }
          cleanup
  br label %526

524:                                              ; preds = %466
  %525 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %76) #4
  br label %526

526:                                              ; preds = %524, %522
  %.pn256 = phi { ptr, i32 } [ %525, %524 ], [ %523, %522 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %75) #4
  br label %545

527:                                              ; preds = %472
  %528 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %79) #4
  br label %545

529:                                              ; preds = %486
  %530 = landingpad { ptr, i32 }
          cleanup
  br label %536

531:                                              ; preds = %499
  %532 = landingpad { ptr, i32 }
          cleanup
  br label %535

533:                                              ; preds = %505
  %534 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %84) #4
  br label %535

535:                                              ; preds = %533, %531
  %.pn258 = phi { ptr, i32 } [ %534, %533 ], [ %532, %531 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %83) #4
  br label %536

536:                                              ; preds = %535, %529
  %.pn258.pn = phi { ptr, i32 } [ %.pn258, %535 ], [ %530, %529 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %82) #4
  br label %545

537:                                              ; preds = %510
  %538 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %86) #4
  br label %545

539:                                              ; preds = %519
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %87) #4
  store i64 1, ptr %87, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %87, ptr noundef nonnull align 8 dereferenceable(24) %69)
          to label %540 unwind label %543

540:                                              ; preds = %539
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %87) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %69) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %69) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %67) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %67) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %64) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %64) #4
  br label %549

541:                                              ; preds = %519
  %542 = landingpad { ptr, i32 }
          cleanup
  br label %545

543:                                              ; preds = %539
  %544 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %87) #4
  br label %545

545:                                              ; preds = %543, %541, %537, %536, %527, %526, %464
  %.pn274 = phi { ptr, i32 } [ %465, %464 ], [ %544, %543 ], [ %542, %541 ], [ %538, %537 ], [ %.pn258.pn, %536 ], [ %528, %527 ], [ %.pn256, %526 ]
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %69) #4
  br label %546

546:                                              ; preds = %545, %433
  %.pn274.pn = phi { ptr, i32 } [ %.pn274, %545 ], [ %434, %433 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %69) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %67) #4
  br label %547

547:                                              ; preds = %546, %431
  %.pn274.pn.pn = phi { ptr, i32 } [ %.pn274.pn, %546 ], [ %432, %431 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %67) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %64) #4
  br label %548

548:                                              ; preds = %547, %429
  %.pn274.pn.pn.pn = phi { ptr, i32 } [ %.pn274.pn.pn, %547 ], [ %430, %429 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %64) #4
  br label %695

549:                                              ; preds = %540, %410
  %.5 = phi double [ %.4.lcssa, %540 ], [ %.3, %410 ]
  %550 = and i32 %.pre-phi, 18
  %or.cond292.not = icmp eq i32 %550, 18
  br i1 %or.cond292.not, label %551, label %696

551:                                              ; preds = %549
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %88) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %89) #4
  store i64 %118, ptr %89, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %90) #4
  store i64 3, ptr %90, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6MatrixIdEC2ERKmS5_(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %89, ptr noundef nonnull align 8 dereferenceable(8) %90)
          to label %552 unwind label %602

552:                                              ; preds = %551
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %90) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %89) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %91) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %92) #4
  store i64 %118, ptr %92, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %91, ptr noundef nonnull align 8 dereferenceable(8) %92)
          to label %553 unwind label %604

553:                                              ; preds = %552
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %92) #4
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %93) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %94) #4
  store i64 %118, ptr %94, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24) %93, ptr noundef nonnull align 8 dereferenceable(8) %94)
          to label %554 unwind label %606

554:                                              ; preds = %553
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %94) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %95) #4
  store i64 0, ptr %95, align 8, !tbaa !9
  %555 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %95)
  store double 0.000000e+00, ptr %555, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %95) #4
  %556 = getelementptr inbounds i8, ptr %1, i64 144
  %557 = load ptr, ptr %556, align 8, !tbaa !21
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %96) #4
  store i64 0, ptr %96, align 8, !tbaa !9
  %558 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %96)
  %559 = load double, ptr %558, align 8, !tbaa !5
  %560 = invoke noundef double %557(double noundef %559)
          to label %561 unwind label %608

561:                                              ; preds = %554
  %562 = fneg double %125
  %563 = fmul double %125, %562
  %564 = call double @llvm.fmuladd.f64(double %563, double %560, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %97) #4
  store i64 0, ptr %97, align 8, !tbaa !9
  %565 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %97)
  %566 = getelementptr inbounds i8, ptr %565, i64 8
  store double %564, ptr %566, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %97) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %96) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %98) #4
  store i64 0, ptr %98, align 8, !tbaa !9
  %567 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %98)
  %568 = getelementptr inbounds i8, ptr %567, i64 16
  store double -2.000000e+00, ptr %568, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %98) #4
  %569 = getelementptr inbounds i8, ptr %1, i64 152
  %570 = load ptr, ptr %569, align 8, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %99) #4
  store i64 0, ptr %99, align 8, !tbaa !9
  %571 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %99)
  %572 = load double, ptr %571, align 8, !tbaa !5
  %573 = invoke noundef double %570(double noundef %572)
          to label %574 unwind label %610

574:                                              ; preds = %561
  %575 = getelementptr inbounds i8, ptr %1, i64 160
  %576 = load ptr, ptr %575, align 8, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %100) #4
  store i64 0, ptr %100, align 8, !tbaa !9
  %577 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %100)
  %578 = load double, ptr %577, align 8, !tbaa !5
  %579 = invoke noundef double %576(double noundef %578, double noundef 0.000000e+00)
          to label %580 unwind label %612

580:                                              ; preds = %574
  %581 = getelementptr inbounds i8, ptr %1, i64 136
  %582 = load ptr, ptr %581, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %101) #4
  store i64 0, ptr %101, align 8, !tbaa !9
  %583 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %101)
  %584 = load double, ptr %583, align 8, !tbaa !5
  %585 = invoke noundef double %582(double noundef %584)
          to label %586 unwind label %614

586:                                              ; preds = %580
  %587 = fmul double %125, 2.000000e+00
  %588 = fmul double %587, %579
  %589 = fmul double %125, %585
  %590 = fmul double %589, 5.000000e-01
  %591 = fadd double %590, -1.000000e+00
  %592 = fmul double %588, %591
  %593 = call double @llvm.fmuladd.f64(double %563, double %573, double %592)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %102) #4
  store i64 0, ptr %102, align 8, !tbaa !9
  %594 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %91, ptr noundef nonnull align 8 dereferenceable(8) %102)
  store double %593, ptr %594, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %102) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %101) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %100) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %99) #4
  %595 = add i32 %115, -2
  %596 = icmp sgt i32 %115, 3
  br i1 %596, label %.lr.ph317.preheader, label %._crit_edge318

.lr.ph317.preheader:                              ; preds = %586
  %wide.trip.count337 = zext nneg i32 %595 to i64
  br label %.lr.ph317

._crit_edge318:                                   ; preds = %642, %586
  %597 = load ptr, ptr %581, align 8, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %107) #4
  store i64 %118, ptr %107, align 8, !tbaa !9
  %598 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %107)
  %599 = load double, ptr %598, align 8, !tbaa !5
  %600 = fsub double %599, %125
  %601 = invoke noundef double %597(double noundef %600)
          to label %647 unwind label %664

602:                                              ; preds = %551
  %603 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %90) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %89) #4
  br label %694

604:                                              ; preds = %552
  %605 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %92) #4
  br label %693

606:                                              ; preds = %553
  %607 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %94) #4
  br label %692

608:                                              ; preds = %554
  %609 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %96) #4
  br label %691

610:                                              ; preds = %561
  %611 = landingpad { ptr, i32 }
          cleanup
  br label %617

612:                                              ; preds = %574
  %613 = landingpad { ptr, i32 }
          cleanup
  br label %616

614:                                              ; preds = %580
  %615 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %101) #4
  br label %616

616:                                              ; preds = %614, %612
  %.pn262 = phi { ptr, i32 } [ %615, %614 ], [ %613, %612 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %100) #4
  br label %617

617:                                              ; preds = %616, %610
  %.pn262.pn = phi { ptr, i32 } [ %.pn262, %616 ], [ %611, %610 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %99) #4
  br label %691

.lr.ph317:                                        ; preds = %.lr.ph317.preheader, %642
  %indvars.iv334 = phi i64 [ 1, %.lr.ph317.preheader ], [ %indvars.iv.next335, %642 ]
  %.6314 = phi double [ %.5, %.lr.ph317.preheader ], [ %618, %642 ]
  %618 = fadd double %125, %.6314
  %619 = load ptr, ptr %581, align 8, !tbaa !13
  %620 = invoke noundef double %619(double noundef %618)
          to label %621 unwind label %645

621:                                              ; preds = %.lr.ph317
  %622 = fmul double %125, %620
  %623 = fmul double %622, 5.000000e-01
  %624 = fsub double -1.000000e+00, %623
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %103) #4
  store i64 %indvars.iv334, ptr %103, align 8, !tbaa !9
  %625 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %103)
  store double %624, ptr %625, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %103) #4
  %626 = load ptr, ptr %556, align 8, !tbaa !21
  %627 = invoke noundef double %626(double noundef %618)
          to label %628 unwind label %645

628:                                              ; preds = %621
  %629 = call double @llvm.fmuladd.f64(double %563, double %627, double 2.000000e+00)
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %104) #4
  store i64 %indvars.iv334, ptr %104, align 8, !tbaa !9
  %630 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %104)
  %631 = getelementptr inbounds i8, ptr %630, i64 8
  store double %629, ptr %631, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %104) #4
  %632 = load ptr, ptr %581, align 8, !tbaa !13
  %633 = invoke noundef double %632(double noundef %618)
          to label %634 unwind label %645

634:                                              ; preds = %628
  %635 = fmul double %125, %633
  %636 = fmul double %635, 5.000000e-01
  %637 = fadd double %636, -1.000000e+00
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %105) #4
  store i64 %indvars.iv334, ptr %105, align 8, !tbaa !9
  %638 = call noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(8) %105)
  %639 = getelementptr inbounds i8, ptr %638, i64 16
  store double %637, ptr %639, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %105) #4
  %640 = load ptr, ptr %569, align 8, !tbaa !22
  %641 = invoke noundef double %640(double noundef %618)
          to label %642 unwind label %645

642:                                              ; preds = %634
  %643 = fmul double %563, %641
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %106) #4
  store i64 %indvars.iv334, ptr %106, align 8, !tbaa !9
  %644 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %91, ptr noundef nonnull align 8 dereferenceable(8) %106)
  store double %643, ptr %644, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %106) #4
  %indvars.iv.next335 = add nuw nsw i64 %indvars.iv334, 1
  %exitcond338.not = icmp eq i64 %indvars.iv.next335, %wide.trip.count337
  br i1 %exitcond338.not, label %._crit_edge318, label %.lr.ph317, !llvm.loop !29

645:                                              ; preds = %634, %628, %621, %.lr.ph317
  %646 = landingpad { ptr, i32 }
          cleanup
  br label %691

647:                                              ; preds = %._crit_edge318
  %648 = getelementptr inbounds i8, ptr %1, i64 168
  %649 = load ptr, ptr %648, align 8, !tbaa !26
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %108) #4
  store i64 %118, ptr %108, align 8, !tbaa !9
  %650 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %4, ptr noundef nonnull align 8 dereferenceable(8) %108)
  %651 = load double, ptr %650, align 8, !tbaa !5
  %652 = invoke noundef double %649(double noundef %651, double noundef 0.000000e+00)
          to label %653 unwind label %666

653:                                              ; preds = %647
  %654 = fmul double %125, %601
  %655 = fmul double %654, 5.000000e-01
  %656 = fsub double 1.000000e+00, %655
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %109) #4
  %657 = sext i32 %595 to i64
  store i64 %657, ptr %109, align 8, !tbaa !9
  %658 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZN3cda4math10containers6VectorIdEixERKm(ptr noundef nonnull align 8 dereferenceable(24) %91, ptr noundef nonnull align 8 dereferenceable(8) %109)
  %659 = load double, ptr %658, align 8, !tbaa !5
  %660 = call double @llvm.fmuladd.f64(double %656, double %652, double %659)
  store double %660, ptr %658, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %109) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %108) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %107) #4
  br i1 %.not247, label %671, label %661

661:                                              ; preds = %653
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %110) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %110, ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(24) %91)
          to label %662 unwind label %669

662:                                              ; preds = %661
  %663 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %93, ptr noundef nonnull align 8 dereferenceable(24) %110)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %110) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %110) #4
  br label %683

664:                                              ; preds = %._crit_edge318
  %665 = landingpad { ptr, i32 }
          cleanup
  br label %668

666:                                              ; preds = %647
  %667 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %108) #4
  br label %668

668:                                              ; preds = %666, %664
  %.pn265 = phi { ptr, i32 } [ %667, %666 ], [ %665, %664 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %107) #4
  br label %691

669:                                              ; preds = %661
  %670 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %110) #4
  br label %691

671:                                              ; preds = %653
  %672 = and i32 %.pre-phi, 64
  %.not268 = icmp eq i32 %672, 0
  br i1 %.not268, label %678, label %673

673:                                              ; preds = %671
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %111) #4
  invoke void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %111, ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(24) %91, ptr noundef nonnull align 8 dereferenceable(8) %8)
          to label %674 unwind label %676

674:                                              ; preds = %673
  %675 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %93, ptr noundef nonnull align 8 dereferenceable(24) %111)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %111) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %111) #4
  br label %683

676:                                              ; preds = %673
  %677 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %111) #4
  br label %691

678:                                              ; preds = %671
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %112) #4
  invoke void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind nonnull writable sret(%"class.cda::math::containers::Vector") align 8 %112, ptr noundef nonnull align 8 dereferenceable(40) %88, ptr noundef nonnull align 8 dereferenceable(24) %91)
          to label %679 unwind label %681

679:                                              ; preds = %678
  %680 = call noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSEOS3_(ptr noundef nonnull align 8 dereferenceable(24) %93, ptr noundef nonnull align 8 dereferenceable(24) %112)
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %112) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %112) #4
  br label %683

681:                                              ; preds = %678
  %682 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %112) #4
  br label %691

683:                                              ; preds = %674, %679, %662
  %684 = invoke noundef nonnull align 8 dereferenceable(24) ptr @_ZN3cda4math10containers6VectorIdEaSERKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %5)
          to label %685 unwind label %687

685:                                              ; preds = %683
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %113) #4
  store i64 0, ptr %113, align 8, !tbaa !9
  invoke void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(8) %113, ptr noundef nonnull align 8 dereferenceable(24) %93)
          to label %686 unwind label %689

686:                                              ; preds = %685
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %113) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %93) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %93) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %91) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %91) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %88) #4
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %88) #4
  br label %696

687:                                              ; preds = %683
  %688 = landingpad { ptr, i32 }
          cleanup
  br label %691

689:                                              ; preds = %685
  %690 = landingpad { ptr, i32 }
          cleanup
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %113) #4
  br label %691

691:                                              ; preds = %689, %687, %681, %676, %669, %668, %645, %617, %608
  %.pn269 = phi { ptr, i32 } [ %646, %645 ], [ %690, %689 ], [ %688, %687 ], [ %670, %669 ], [ %677, %676 ], [ %682, %681 ], [ %.pn265, %668 ], [ %.pn262.pn, %617 ], [ %609, %608 ]
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %93) #4
  br label %692

692:                                              ; preds = %691, %606
  %.pn269.pn = phi { ptr, i32 } [ %.pn269, %691 ], [ %607, %606 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %93) #4
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %91) #4
  br label %693

693:                                              ; preds = %692, %604
  %.pn269.pn.pn = phi { ptr, i32 } [ %.pn269.pn, %692 ], [ %605, %604 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %91) #4
  call void @_ZN3cda4math10containers6MatrixIdED2Ev(ptr noundef nonnull align 8 dereferenceable(40) %88) #4
  br label %694

694:                                              ; preds = %693, %602
  %.pn269.pn.pn.pn = phi { ptr, i32 } [ %.pn269.pn.pn, %693 ], [ %603, %602 ]
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %88) #4
  br label %695

695:                                              ; preds = %694, %548, %409, %260, %149
  %.pn284.pn.pn.pn.pn = phi { ptr, i32 } [ %.pn284.pn.pn.pn, %260 ], [ %.pn279.pn.pn.pn, %409 ], [ %.pn274.pn.pn.pn, %548 ], [ %.pn269.pn.pn.pn, %694 ], [ %150, %149 ]
  call void @_ZN3cda4math10containers6VectorIdED2Ev(ptr noundef nonnull align 8 dereferenceable(24) %0) #4
  resume { ptr, i32 } %.pn284.pn.pn.pn.pn

696:                                              ; preds = %549, %686
  ret void
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNK3cda4math10containers6VectorIdE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdEC2ERKm(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8)) unnamed_addr #1 align 2

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdE6resizeERKmRKb(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 1 dereferenceable(1)) local_unnamed_addr #1 align 2

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef ptr @_ZN3cda4math10containers6MatrixIdEixERKm(ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(8)) 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 uwtable
declare dso_local void @_ZN3cda4math9equations7systems6linear15solve_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #1

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

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math9equations7systems6linear28solve_gauss_seidel_3diagonalIdEENS0_10containers6VectorIT_EERKNS5_6MatrixIS7_EERKS8_RKd(ptr dead_on_unwind noalias writable sret(%"class.cda::math::containers::Vector") align 8, ptr noundef nonnull align 8 dereferenceable(40), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #1

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN3cda4math10containers6VectorIdE3setERKmRKS3_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #1 align 2

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"double", !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, !12, i64 0}
!12 = !{!"bool", !7, i64 0}
!13 = !{!14, !16, i64 136}
!14 = !{!"_ZTSN3cda4math22differential_equations3EDPE", !15, i64 0, !17, i64 24, !18, i64 64, !19, i64 104, !16, i64 136, !16, i64 144, !16, i64 152, !16, i64 160, !16, i64 168, !16, i64 176, !16, i64 184, !16, i64 192, !16, i64 200, !16, i64 208, !16, i64 216, !16, i64 224, !16, i64 232, !6, i64 240, !6, i64 248, !16, i64 256, !16, i64 264, !6, i64 272}
!15 = !{!"_ZTSN3cda4math10containers6VectorIdEE", !10, i64 0, !16, i64 8, !16, i64 16}
!16 = !{!"any pointer", !7, i64 0}
!17 = !{!"_ZTSN3cda4math10containers6MatrixIdEE", !10, i64 0, !10, i64 8, !10, i64 16, !16, i64 24, !16, i64 32}
!18 = !{!"_ZTSN3cda4math10containers6MatrixIbEE", !10, i64 0, !10, i64 8, !10, i64 16, !16, i64 24, !16, i64 32}
!19 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", !20, i64 0, !10, i64 8, !7, i64 16}
!20 = !{!"_ZTSNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_Alloc_hiderE", !16, i64 0}
!21 = !{!14, !16, i64 144}
!22 = !{!14, !16, i64 152}
!23 = distinct !{!23, !24}
!24 = !{!"llvm.loop.mustprogress"}
!25 = !{!14, !16, i64 160}
!26 = !{!14, !16, i64 168}
!27 = distinct !{!27, !24}
!28 = distinct !{!28, !24}
!29 = distinct !{!29, !24}


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