; LLVM IR from SourangshuGhosh/Fluid-Simulation-for-Computer-Graphics :: src (pressuresolver)

; 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.VectorXd = type { %"class.std::vector" }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl" }
%"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl" = type { %"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl_data" }
%"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%struct.GridIndex = type { i32, i32, i32 }
%class.PressureSolver = type { i32, i32, i32, double, double, double, i32, double, i32, ptr, ptr, ptr, ptr, %class.GridIndexKeyMap }
%class.GridIndexKeyMap = type <{ i32, i32, i32, [4 x i8], %"class.std::vector.5", i32, [4 x i8] }>
%"class.std::vector.5" = type { %"struct.std::_Vector_base.6" }
%"struct.std::_Vector_base.6" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl" = type { %"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" }
%"struct.std::_Vector_base<int, std::allocator<int>>::_Vector_impl_data" = type { ptr, ptr, ptr }
%struct.MatrixCell = type { i8, i8, i8, 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
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef) #1 align 2

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #3

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40)) #4 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40), i32 noundef) #5 align 2

; Function Attrs: inlinehint mustprogress uwtable
declare dso_local noundef i32 @_ZN14PressureSolver18_GridToVectorIndexEiii(ptr noundef nonnull align 8 dereferenceable(144), i32 noundef, i32 noundef, i32 noundef) #5 align 2

declare noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44), i32 noundef, i32 noundef, i32 noundef) #6

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14PressureSolver20_applyPreconditionerER18MatrixCoefficientsR8VectorXdS3_S3_(ptr noundef nonnull align 8 dereferenceable(144) %0, ptr noundef nonnull align 8 dereferenceable(24) %1, ptr noundef nonnull align 8 dereferenceable(24) %2, ptr noundef nonnull align 8 dereferenceable(24) %3, ptr noundef nonnull align 8 dereferenceable(24) %4) #1 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca double, align 8
  %12 = alloca double, align 8
  %13 = alloca %class.VectorXd, align 8
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca %struct.GridIndex, align 4
  %19 = alloca { i64, i32 }, align 8
  %20 = alloca i32, align 4
  %21 = alloca %struct.GridIndex, align 4
  %22 = alloca { i64, i32 }, align 8
  %23 = alloca i32, align 4
  %24 = alloca %struct.GridIndex, align 4
  %25 = alloca { i64, i32 }, align 8
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca double, align 8
  %31 = alloca double, align 8
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca double, align 8
  %38 = alloca double, align 8
  %39 = alloca double, align 8
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca %struct.GridIndex, align 4
  %43 = alloca { i64, i32 }, align 8
  %44 = alloca i32, align 4
  %45 = alloca %struct.GridIndex, align 4
  %46 = alloca { i64, i32 }, align 8
  %47 = alloca i32, align 4
  %48 = alloca %struct.GridIndex, align 4
  %49 = alloca { i64, i32 }, align 8
  %50 = alloca i32, align 4
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca i32, align 4
  %54 = alloca double, align 8
  %55 = alloca double, align 8
  %56 = alloca double, align 8
  %57 = alloca double, align 8
  %58 = alloca double, align 8
  %59 = alloca double, align 8
  %60 = alloca double, align 8
  %61 = alloca double, align 8
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  store ptr %4, ptr %10, align 8, !tbaa !5
  %62 = load ptr, ptr %6, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  %63 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 5
  %64 = load double, ptr %63, align 8, !tbaa !9
  %65 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 4
  %66 = load double, ptr %65, align 8, !tbaa !18
  %67 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 3
  %68 = load double, ptr %67, align 8, !tbaa !19
  %69 = fmul double %66, %68
  %70 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 3
  %71 = load double, ptr %70, align 8, !tbaa !19
  %72 = fmul double %69, %71
  %73 = fdiv double %64, %72
  store double %73, ptr %11, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %74 = load double, ptr %11, align 8, !tbaa !20
  %75 = fneg double %74
  store double %75, ptr %12, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 24, ptr %13) #7
  %76 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 6
  %77 = load i32, ptr %76, align 8, !tbaa !21
  call void @_ZN8VectorXdC1Ei(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %77)
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  store i32 0, ptr %14, align 4, !tbaa !22
  br label %78

78:                                               ; preds = %279, %5
  %79 = load i32, ptr %14, align 4, !tbaa !22
  %80 = zext i32 %79 to i64
  %81 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %82 = load ptr, ptr %81, align 8, !tbaa !23
  %83 = invoke noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40) %82)
          to label %84 unwind label %87

84:                                               ; preds = %78
  %85 = icmp ult i64 %80, %83
  br i1 %85, label %91, label %86

86:                                               ; preds = %84
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  br label %297

87:                                               ; preds = %78
  %88 = landingpad { ptr, i32 }
          cleanup
  %89 = extractvalue { ptr, i32 } %88, 0
  store ptr %89, ptr %15, align 8
  %90 = extractvalue { ptr, i32 } %88, 1
  store i32 %90, ptr %16, align 4
  br label %296

91:                                               ; preds = %84
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %18) #7
  %92 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %93 = load ptr, ptr %92, align 8, !tbaa !23
  %94 = load i32, ptr %14, align 4, !tbaa !22
  %95 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %93, i32 noundef %94)
          to label %96 unwind label %160

96:                                               ; preds = %91
  store { i64, i32 } %95, ptr %19, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %18, ptr align 8 %19, i64 12, i1 false)
  %97 = getelementptr inbounds %struct.GridIndex, ptr %18, i32 0, i32 0
  %98 = load i32, ptr %97, align 4, !tbaa !24
  call void @llvm.lifetime.end.p0(i64 12, ptr %18) #7
  store i32 %98, ptr %17, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %21) #7
  %99 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %100 = load ptr, ptr %99, align 8, !tbaa !23
  %101 = load i32, ptr %14, align 4, !tbaa !22
  %102 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %100, i32 noundef %101)
          to label %103 unwind label %164

103:                                              ; preds = %96
  store { i64, i32 } %102, ptr %22, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %21, ptr align 8 %22, i64 12, i1 false)
  %104 = getelementptr inbounds %struct.GridIndex, ptr %21, i32 0, i32 1
  %105 = load i32, ptr %104, align 4, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 12, ptr %21) #7
  store i32 %105, ptr %20, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %24) #7
  %106 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %107 = load ptr, ptr %106, align 8, !tbaa !23
  %108 = load i32, ptr %14, align 4, !tbaa !22
  %109 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %107, i32 noundef %108)
          to label %110 unwind label %168

110:                                              ; preds = %103
  store { i64, i32 } %109, ptr %25, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %24, ptr align 8 %25, i64 12, i1 false)
  %111 = getelementptr inbounds %struct.GridIndex, ptr %24, i32 0, i32 2
  %112 = load i32, ptr %111, align 4, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 12, ptr %24) #7
  store i32 %112, ptr %23, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  %113 = load i32, ptr %17, align 4, !tbaa !22
  %114 = load i32, ptr %20, align 4, !tbaa !22
  %115 = load i32, ptr %23, align 4, !tbaa !22
  %116 = invoke noundef i32 @_ZN14PressureSolver18_GridToVectorIndexEiii(ptr noundef nonnull align 8 dereferenceable(144) %62, i32 noundef %113, i32 noundef %114, i32 noundef %115)
          to label %117 unwind label %172

117:                                              ; preds = %110
  store i32 %116, ptr %26, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #7
  %118 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %119 = load i32, ptr %17, align 4, !tbaa !22
  %120 = sub nsw i32 %119, 1
  %121 = load i32, ptr %20, align 4, !tbaa !22
  %122 = load i32, ptr %23, align 4, !tbaa !22
  %123 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %118, i32 noundef %120, i32 noundef %121, i32 noundef %122)
          to label %124 unwind label %176

124:                                              ; preds = %117
  store i32 %123, ptr %27, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  %125 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %126 = load i32, ptr %17, align 4, !tbaa !22
  %127 = load i32, ptr %20, align 4, !tbaa !22
  %128 = sub nsw i32 %127, 1
  %129 = load i32, ptr %23, align 4, !tbaa !22
  %130 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %125, i32 noundef %126, i32 noundef %128, i32 noundef %129)
          to label %131 unwind label %180

131:                                              ; preds = %124
  store i32 %130, ptr %28, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  %132 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %133 = load i32, ptr %17, align 4, !tbaa !22
  %134 = load i32, ptr %20, align 4, !tbaa !22
  %135 = load i32, ptr %23, align 4, !tbaa !22
  %136 = sub nsw i32 %135, 1
  %137 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %132, i32 noundef %133, i32 noundef %134, i32 noundef %136)
          to label %138 unwind label %184

138:                                              ; preds = %131
  store i32 %137, ptr %29, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #7
  store double 0.000000e+00, ptr %30, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #7
  store double 0.000000e+00, ptr %31, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  store double 0.000000e+00, ptr %32, align 8, !tbaa !20
  %139 = load i32, ptr %27, align 4, !tbaa !22
  %140 = icmp ne i32 %139, -1
  br i1 %140, label %141, label %192

141:                                              ; preds = %138
  %142 = load ptr, ptr %7, align 8, !tbaa !5
  %143 = load i32, ptr %27, align 4, !tbaa !22
  %144 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %142, i32 noundef %143)
          to label %145 unwind label %188

145:                                              ; preds = %141
  %146 = getelementptr inbounds %struct.MatrixCell, ptr %144, i32 0, i32 1
  %147 = load i8, ptr %146, align 1, !tbaa !28
  %148 = sitofp i8 %147 to double
  %149 = load double, ptr %12, align 8, !tbaa !20
  %150 = fmul double %148, %149
  store double %150, ptr %30, align 8, !tbaa !20
  %151 = load ptr, ptr %8, align 8, !tbaa !5
  %152 = load i32, ptr %27, align 4, !tbaa !22
  %153 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %151, i32 noundef %152)
          to label %154 unwind label %188

154:                                              ; preds = %145
  %155 = load double, ptr %153, align 8, !tbaa !20
  store double %155, ptr %31, align 8, !tbaa !20
  %156 = load i32, ptr %27, align 4, !tbaa !22
  %157 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %156)
          to label %158 unwind label %188

158:                                              ; preds = %154
  %159 = load double, ptr %157, align 8, !tbaa !20
  store double %159, ptr %32, align 8, !tbaa !20
  br label %192

160:                                              ; preds = %91
  %161 = landingpad { ptr, i32 }
          cleanup
  %162 = extractvalue { ptr, i32 } %161, 0
  store ptr %162, ptr %15, align 8
  %163 = extractvalue { ptr, i32 } %161, 1
  store i32 %163, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %18) #7
  br label %295

164:                                              ; preds = %96
  %165 = landingpad { ptr, i32 }
          cleanup
  %166 = extractvalue { ptr, i32 } %165, 0
  store ptr %166, ptr %15, align 8
  %167 = extractvalue { ptr, i32 } %165, 1
  store i32 %167, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %21) #7
  br label %294

168:                                              ; preds = %103
  %169 = landingpad { ptr, i32 }
          cleanup
  %170 = extractvalue { ptr, i32 } %169, 0
  store ptr %170, ptr %15, align 8
  %171 = extractvalue { ptr, i32 } %169, 1
  store i32 %171, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %24) #7
  br label %293

172:                                              ; preds = %110
  %173 = landingpad { ptr, i32 }
          cleanup
  %174 = extractvalue { ptr, i32 } %173, 0
  store ptr %174, ptr %15, align 8
  %175 = extractvalue { ptr, i32 } %173, 1
  store i32 %175, ptr %16, align 4
  br label %292

176:                                              ; preds = %117
  %177 = landingpad { ptr, i32 }
          cleanup
  %178 = extractvalue { ptr, i32 } %177, 0
  store ptr %178, ptr %15, align 8
  %179 = extractvalue { ptr, i32 } %177, 1
  store i32 %179, ptr %16, align 4
  br label %291

180:                                              ; preds = %124
  %181 = landingpad { ptr, i32 }
          cleanup
  %182 = extractvalue { ptr, i32 } %181, 0
  store ptr %182, ptr %15, align 8
  %183 = extractvalue { ptr, i32 } %181, 1
  store i32 %183, ptr %16, align 4
  br label %290

184:                                              ; preds = %131
  %185 = landingpad { ptr, i32 }
          cleanup
  %186 = extractvalue { ptr, i32 } %185, 0
  store ptr %186, ptr %15, align 8
  %187 = extractvalue { ptr, i32 } %185, 1
  store i32 %187, ptr %16, align 4
  br label %289

188:                                              ; preds = %154, %145, %141
  %189 = landingpad { ptr, i32 }
          cleanup
  %190 = extractvalue { ptr, i32 } %189, 0
  store ptr %190, ptr %15, align 8
  %191 = extractvalue { ptr, i32 } %189, 1
  store i32 %191, ptr %16, align 4
  br label %288

192:                                              ; preds = %158, %138
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #7
  store double 0.000000e+00, ptr %33, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #7
  store double 0.000000e+00, ptr %34, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #7
  store double 0.000000e+00, ptr %35, align 8, !tbaa !20
  %193 = load i32, ptr %28, align 4, !tbaa !22
  %194 = icmp ne i32 %193, -1
  br i1 %194, label %195, label %218

195:                                              ; preds = %192
  %196 = load ptr, ptr %7, align 8, !tbaa !5
  %197 = load i32, ptr %28, align 4, !tbaa !22
  %198 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %196, i32 noundef %197)
          to label %199 unwind label %214

199:                                              ; preds = %195
  %200 = getelementptr inbounds %struct.MatrixCell, ptr %198, i32 0, i32 2
  %201 = load i8, ptr %200, align 1, !tbaa !30
  %202 = sitofp i8 %201 to double
  %203 = load double, ptr %12, align 8, !tbaa !20
  %204 = fmul double %202, %203
  store double %204, ptr %33, align 8, !tbaa !20
  %205 = load ptr, ptr %8, align 8, !tbaa !5
  %206 = load i32, ptr %28, align 4, !tbaa !22
  %207 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %205, i32 noundef %206)
          to label %208 unwind label %214

208:                                              ; preds = %199
  %209 = load double, ptr %207, align 8, !tbaa !20
  store double %209, ptr %34, align 8, !tbaa !20
  %210 = load i32, ptr %28, align 4, !tbaa !22
  %211 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %210)
          to label %212 unwind label %214

212:                                              ; preds = %208
  %213 = load double, ptr %211, align 8, !tbaa !20
  store double %213, ptr %35, align 8, !tbaa !20
  br label %218

214:                                              ; preds = %208, %199, %195
  %215 = landingpad { ptr, i32 }
          cleanup
  %216 = extractvalue { ptr, i32 } %215, 0
  store ptr %216, ptr %15, align 8
  %217 = extractvalue { ptr, i32 } %215, 1
  store i32 %217, ptr %16, align 4
  br label %287

218:                                              ; preds = %212, %192
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #7
  store double 0.000000e+00, ptr %36, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #7
  store double 0.000000e+00, ptr %37, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #7
  store double 0.000000e+00, ptr %38, align 8, !tbaa !20
  %219 = load i32, ptr %29, align 4, !tbaa !22
  %220 = icmp ne i32 %219, -1
  br i1 %220, label %221, label %244

221:                                              ; preds = %218
  %222 = load ptr, ptr %7, align 8, !tbaa !5
  %223 = load i32, ptr %29, align 4, !tbaa !22
  %224 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %222, i32 noundef %223)
          to label %225 unwind label %240

225:                                              ; preds = %221
  %226 = getelementptr inbounds %struct.MatrixCell, ptr %224, i32 0, i32 3
  %227 = load i8, ptr %226, align 1, !tbaa !31
  %228 = sitofp i8 %227 to double
  %229 = load double, ptr %12, align 8, !tbaa !20
  %230 = fmul double %228, %229
  store double %230, ptr %36, align 8, !tbaa !20
  %231 = load ptr, ptr %8, align 8, !tbaa !5
  %232 = load i32, ptr %29, align 4, !tbaa !22
  %233 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %231, i32 noundef %232)
          to label %234 unwind label %240

234:                                              ; preds = %225
  %235 = load double, ptr %233, align 8, !tbaa !20
  store double %235, ptr %37, align 8, !tbaa !20
  %236 = load i32, ptr %29, align 4, !tbaa !22
  %237 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %236)
          to label %238 unwind label %240

238:                                              ; preds = %234
  %239 = load double, ptr %237, align 8, !tbaa !20
  store double %239, ptr %38, align 8, !tbaa !20
  br label %244

240:                                              ; preds = %234, %225, %221
  %241 = landingpad { ptr, i32 }
          cleanup
  %242 = extractvalue { ptr, i32 } %241, 0
  store ptr %242, ptr %15, align 8
  %243 = extractvalue { ptr, i32 } %241, 1
  store i32 %243, ptr %16, align 4
  br label %286

244:                                              ; preds = %238, %218
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #7
  %245 = load ptr, ptr %9, align 8, !tbaa !5
  %246 = load i32, ptr %26, align 4, !tbaa !22
  %247 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %245, i32 noundef %246)
          to label %248 unwind label %282

248:                                              ; preds = %244
  %249 = load double, ptr %247, align 8, !tbaa !20
  %250 = load double, ptr %30, align 8, !tbaa !20
  %251 = load double, ptr %31, align 8, !tbaa !20
  %252 = fmul double %250, %251
  %253 = load double, ptr %32, align 8, !tbaa !20
  %254 = fneg double %252
  %255 = call double @llvm.fmuladd.f64(double %254, double %253, double %249)
  %256 = load double, ptr %33, align 8, !tbaa !20
  %257 = load double, ptr %34, align 8, !tbaa !20
  %258 = fmul double %256, %257
  %259 = load double, ptr %35, align 8, !tbaa !20
  %260 = fneg double %258
  %261 = call double @llvm.fmuladd.f64(double %260, double %259, double %255)
  %262 = load double, ptr %36, align 8, !tbaa !20
  %263 = load double, ptr %37, align 8, !tbaa !20
  %264 = fmul double %262, %263
  %265 = load double, ptr %38, align 8, !tbaa !20
  %266 = fneg double %264
  %267 = call double @llvm.fmuladd.f64(double %266, double %265, double %261)
  store double %267, ptr %39, align 8, !tbaa !20
  %268 = load double, ptr %39, align 8, !tbaa !20
  %269 = load ptr, ptr %8, align 8, !tbaa !5
  %270 = load i32, ptr %26, align 4, !tbaa !22
  %271 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %269, i32 noundef %270)
          to label %272 unwind label %282

272:                                              ; preds = %248
  %273 = load double, ptr %271, align 8, !tbaa !20
  %274 = fmul double %268, %273
  store double %274, ptr %39, align 8, !tbaa !20
  %275 = load double, ptr %39, align 8, !tbaa !20
  %276 = load i32, ptr %26, align 4, !tbaa !22
  %277 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %276)
          to label %278 unwind label %282

278:                                              ; preds = %272
  store double %275, ptr %277, align 8, !tbaa !20
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  br label %279

279:                                              ; preds = %278
  %280 = load i32, ptr %14, align 4, !tbaa !22
  %281 = add i32 %280, 1
  store i32 %281, ptr %14, align 4, !tbaa !22
  br label %78, !llvm.loop !32

282:                                              ; preds = %272, %248, %244
  %283 = landingpad { ptr, i32 }
          cleanup
  %284 = extractvalue { ptr, i32 } %283, 0
  store ptr %284, ptr %15, align 8
  %285 = extractvalue { ptr, i32 } %283, 1
  store i32 %285, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #7
  br label %286

286:                                              ; preds = %282, %240
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #7
  br label %287

287:                                              ; preds = %286, %214
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #7
  br label %288

288:                                              ; preds = %287, %188
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #7
  br label %289

289:                                              ; preds = %288, %184
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  br label %290

290:                                              ; preds = %289, %180
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  br label %291

291:                                              ; preds = %290, %176
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #7
  br label %292

292:                                              ; preds = %291, %172
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  br label %293

293:                                              ; preds = %292, %168
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  br label %294

294:                                              ; preds = %293, %164
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  br label %295

295:                                              ; preds = %294, %160
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  br label %296

296:                                              ; preds = %295, %87
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  br label %534

297:                                              ; preds = %86
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #7
  %298 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %299 = load ptr, ptr %298, align 8, !tbaa !23
  %300 = invoke noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40) %299)
          to label %301 unwind label %308

301:                                              ; preds = %297
  %302 = trunc i64 %300 to i32
  %303 = sub nsw i32 %302, 1
  store i32 %303, ptr %40, align 4, !tbaa !22
  br label %304

304:                                              ; preds = %455, %301
  %305 = load i32, ptr %40, align 4, !tbaa !22
  %306 = icmp sge i32 %305, 0
  br i1 %306, label %312, label %307

307:                                              ; preds = %304
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  br label %533

308:                                              ; preds = %297
  %309 = landingpad { ptr, i32 }
          cleanup
  %310 = extractvalue { ptr, i32 } %309, 0
  store ptr %310, ptr %15, align 8
  %311 = extractvalue { ptr, i32 } %309, 1
  store i32 %311, ptr %16, align 4
  br label %532

312:                                              ; preds = %304
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %42) #7
  %313 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %314 = load ptr, ptr %313, align 8, !tbaa !23
  %315 = load i32, ptr %40, align 4, !tbaa !22
  %316 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %314, i32 noundef %315)
          to label %317 unwind label %458

317:                                              ; preds = %312
  store { i64, i32 } %316, ptr %43, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %42, ptr align 8 %43, i64 12, i1 false)
  %318 = getelementptr inbounds %struct.GridIndex, ptr %42, i32 0, i32 0
  %319 = load i32, ptr %318, align 4, !tbaa !24
  call void @llvm.lifetime.end.p0(i64 12, ptr %42) #7
  store i32 %319, ptr %41, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %45) #7
  %320 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %321 = load ptr, ptr %320, align 8, !tbaa !23
  %322 = load i32, ptr %40, align 4, !tbaa !22
  %323 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %321, i32 noundef %322)
          to label %324 unwind label %462

324:                                              ; preds = %317
  store { i64, i32 } %323, ptr %46, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %45, ptr align 8 %46, i64 12, i1 false)
  %325 = getelementptr inbounds %struct.GridIndex, ptr %45, i32 0, i32 1
  %326 = load i32, ptr %325, align 4, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 12, ptr %45) #7
  store i32 %326, ptr %44, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #7
  call void @llvm.lifetime.start.p0(i64 12, ptr %48) #7
  %327 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 9
  %328 = load ptr, ptr %327, align 8, !tbaa !23
  %329 = load i32, ptr %40, align 4, !tbaa !22
  %330 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %328, i32 noundef %329)
          to label %331 unwind label %466

331:                                              ; preds = %324
  store { i64, i32 } %330, ptr %49, align 8
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %48, ptr align 8 %49, i64 12, i1 false)
  %332 = getelementptr inbounds %struct.GridIndex, ptr %48, i32 0, i32 2
  %333 = load i32, ptr %332, align 4, !tbaa !27
  call void @llvm.lifetime.end.p0(i64 12, ptr %48) #7
  store i32 %333, ptr %47, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #7
  %334 = load i32, ptr %41, align 4, !tbaa !22
  %335 = load i32, ptr %44, align 4, !tbaa !22
  %336 = load i32, ptr %47, align 4, !tbaa !22
  %337 = invoke noundef i32 @_ZN14PressureSolver18_GridToVectorIndexEiii(ptr noundef nonnull align 8 dereferenceable(144) %62, i32 noundef %334, i32 noundef %335, i32 noundef %336)
          to label %338 unwind label %470

338:                                              ; preds = %331
  store i32 %337, ptr %50, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #7
  %339 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %340 = load i32, ptr %41, align 4, !tbaa !22
  %341 = add nsw i32 %340, 1
  %342 = load i32, ptr %44, align 4, !tbaa !22
  %343 = load i32, ptr %47, align 4, !tbaa !22
  %344 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %339, i32 noundef %341, i32 noundef %342, i32 noundef %343)
          to label %345 unwind label %474

345:                                              ; preds = %338
  store i32 %344, ptr %51, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #7
  %346 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %347 = load i32, ptr %41, align 4, !tbaa !22
  %348 = load i32, ptr %44, align 4, !tbaa !22
  %349 = add nsw i32 %348, 1
  %350 = load i32, ptr %47, align 4, !tbaa !22
  %351 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %346, i32 noundef %347, i32 noundef %349, i32 noundef %350)
          to label %352 unwind label %478

352:                                              ; preds = %345
  store i32 %351, ptr %52, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %53) #7
  %353 = getelementptr inbounds %class.PressureSolver, ptr %62, i32 0, i32 13
  %354 = load i32, ptr %41, align 4, !tbaa !22
  %355 = load i32, ptr %44, align 4, !tbaa !22
  %356 = load i32, ptr %47, align 4, !tbaa !22
  %357 = add nsw i32 %356, 1
  %358 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %353, i32 noundef %354, i32 noundef %355, i32 noundef %357)
          to label %359 unwind label %482

359:                                              ; preds = %352
  store i32 %358, ptr %53, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #7
  %360 = load i32, ptr %51, align 4, !tbaa !22
  %361 = icmp ne i32 %360, -1
  br i1 %361, label %362, label %368

362:                                              ; preds = %359
  %363 = load ptr, ptr %10, align 8, !tbaa !5
  %364 = load i32, ptr %51, align 4, !tbaa !22
  %365 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %363, i32 noundef %364)
          to label %366 unwind label %486

366:                                              ; preds = %362
  %367 = load double, ptr %365, align 8, !tbaa !20
  br label %369

368:                                              ; preds = %359
  br label %369

369:                                              ; preds = %368, %366
  %370 = phi double [ %367, %366 ], [ 0.000000e+00, %368 ]
  store double %370, ptr %54, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #7
  %371 = load i32, ptr %52, align 4, !tbaa !22
  %372 = icmp ne i32 %371, -1
  br i1 %372, label %373, label %379

373:                                              ; preds = %369
  %374 = load ptr, ptr %10, align 8, !tbaa !5
  %375 = load i32, ptr %52, align 4, !tbaa !22
  %376 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %374, i32 noundef %375)
          to label %377 unwind label %490

377:                                              ; preds = %373
  %378 = load double, ptr %376, align 8, !tbaa !20
  br label %380

379:                                              ; preds = %369
  br label %380

380:                                              ; preds = %379, %377
  %381 = phi double [ %378, %377 ], [ 0.000000e+00, %379 ]
  store double %381, ptr %55, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #7
  %382 = load i32, ptr %53, align 4, !tbaa !22
  %383 = icmp ne i32 %382, -1
  br i1 %383, label %384, label %390

384:                                              ; preds = %380
  %385 = load ptr, ptr %10, align 8, !tbaa !5
  %386 = load i32, ptr %53, align 4, !tbaa !22
  %387 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %385, i32 noundef %386)
          to label %388 unwind label %494

388:                                              ; preds = %384
  %389 = load double, ptr %387, align 8, !tbaa !20
  br label %391

390:                                              ; preds = %380
  br label %391

391:                                              ; preds = %390, %388
  %392 = phi double [ %389, %388 ], [ 0.000000e+00, %390 ]
  store double %392, ptr %56, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %57) #7
  %393 = load ptr, ptr %7, align 8, !tbaa !5
  %394 = load i32, ptr %50, align 4, !tbaa !22
  %395 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %393, i32 noundef %394)
          to label %396 unwind label %498

396:                                              ; preds = %391
  %397 = getelementptr inbounds %struct.MatrixCell, ptr %395, i32 0, i32 1
  %398 = load i8, ptr %397, align 1, !tbaa !28
  %399 = sitofp i8 %398 to double
  %400 = load double, ptr %12, align 8, !tbaa !20
  %401 = fmul double %399, %400
  store double %401, ptr %57, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #7
  %402 = load ptr, ptr %7, align 8, !tbaa !5
  %403 = load i32, ptr %50, align 4, !tbaa !22
  %404 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %402, i32 noundef %403)
          to label %405 unwind label %502

405:                                              ; preds = %396
  %406 = getelementptr inbounds %struct.MatrixCell, ptr %404, i32 0, i32 2
  %407 = load i8, ptr %406, align 1, !tbaa !30
  %408 = sitofp i8 %407 to double
  %409 = load double, ptr %12, align 8, !tbaa !20
  %410 = fmul double %408, %409
  store double %410, ptr %58, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %59) #7
  %411 = load ptr, ptr %7, align 8, !tbaa !5
  %412 = load i32, ptr %50, align 4, !tbaa !22
  %413 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %411, i32 noundef %412)
          to label %414 unwind label %506

414:                                              ; preds = %405
  %415 = getelementptr inbounds %struct.MatrixCell, ptr %413, i32 0, i32 3
  %416 = load i8, ptr %415, align 1, !tbaa !31
  %417 = sitofp i8 %416 to double
  %418 = load double, ptr %12, align 8, !tbaa !20
  %419 = fmul double %417, %418
  store double %419, ptr %59, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #7
  %420 = load ptr, ptr %8, align 8, !tbaa !5
  %421 = load i32, ptr %50, align 4, !tbaa !22
  %422 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %420, i32 noundef %421)
          to label %423 unwind label %510

423:                                              ; preds = %414
  %424 = load double, ptr %422, align 8, !tbaa !20
  store double %424, ptr %60, align 8, !tbaa !20
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #7
  %425 = load i32, ptr %50, align 4, !tbaa !22
  %426 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %13, i32 noundef %425)
          to label %427 unwind label %514

427:                                              ; preds = %423
  %428 = load double, ptr %426, align 8, !tbaa !20
  %429 = load double, ptr %57, align 8, !tbaa !20
  %430 = load double, ptr %60, align 8, !tbaa !20
  %431 = fmul double %429, %430
  %432 = load double, ptr %54, align 8, !tbaa !20
  %433 = fneg double %431
  %434 = call double @llvm.fmuladd.f64(double %433, double %432, double %428)
  %435 = load double, ptr %58, align 8, !tbaa !20
  %436 = load double, ptr %60, align 8, !tbaa !20
  %437 = fmul double %435, %436
  %438 = load double, ptr %55, align 8, !tbaa !20
  %439 = fneg double %437
  %440 = call double @llvm.fmuladd.f64(double %439, double %438, double %434)
  %441 = load double, ptr %59, align 8, !tbaa !20
  %442 = load double, ptr %60, align 8, !tbaa !20
  %443 = fmul double %441, %442
  %444 = load double, ptr %56, align 8, !tbaa !20
  %445 = fneg double %443
  %446 = call double @llvm.fmuladd.f64(double %445, double %444, double %440)
  store double %446, ptr %61, align 8, !tbaa !20
  %447 = load double, ptr %61, align 8, !tbaa !20
  %448 = load double, ptr %60, align 8, !tbaa !20
  %449 = fmul double %447, %448
  store double %449, ptr %61, align 8, !tbaa !20
  %450 = load double, ptr %61, align 8, !tbaa !20
  %451 = load ptr, ptr %10, align 8, !tbaa !5
  %452 = load i32, ptr %50, align 4, !tbaa !22
  %453 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %451, i32 noundef %452)
          to label %454 unwind label %514

454:                                              ; preds = %427
  store double %450, ptr %453, align 8, !tbaa !20
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #7
  br label %455

455:                                              ; preds = %454
  %456 = load i32, ptr %40, align 4, !tbaa !22
  %457 = add nsw i32 %456, -1
  store i32 %457, ptr %40, align 4, !tbaa !22
  br label %304, !llvm.loop !34

458:                                              ; preds = %312
  %459 = landingpad { ptr, i32 }
          cleanup
  %460 = extractvalue { ptr, i32 } %459, 0
  store ptr %460, ptr %15, align 8
  %461 = extractvalue { ptr, i32 } %459, 1
  store i32 %461, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %42) #7
  br label %531

462:                                              ; preds = %317
  %463 = landingpad { ptr, i32 }
          cleanup
  %464 = extractvalue { ptr, i32 } %463, 0
  store ptr %464, ptr %15, align 8
  %465 = extractvalue { ptr, i32 } %463, 1
  store i32 %465, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %45) #7
  br label %530

466:                                              ; preds = %324
  %467 = landingpad { ptr, i32 }
          cleanup
  %468 = extractvalue { ptr, i32 } %467, 0
  store ptr %468, ptr %15, align 8
  %469 = extractvalue { ptr, i32 } %467, 1
  store i32 %469, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 12, ptr %48) #7
  br label %529

470:                                              ; preds = %331
  %471 = landingpad { ptr, i32 }
          cleanup
  %472 = extractvalue { ptr, i32 } %471, 0
  store ptr %472, ptr %15, align 8
  %473 = extractvalue { ptr, i32 } %471, 1
  store i32 %473, ptr %16, align 4
  br label %528

474:                                              ; preds = %338
  %475 = landingpad { ptr, i32 }
          cleanup
  %476 = extractvalue { ptr, i32 } %475, 0
  store ptr %476, ptr %15, align 8
  %477 = extractvalue { ptr, i32 } %475, 1
  store i32 %477, ptr %16, align 4
  br label %527

478:                                              ; preds = %345
  %479 = landingpad { ptr, i32 }
          cleanup
  %480 = extractvalue { ptr, i32 } %479, 0
  store ptr %480, ptr %15, align 8
  %481 = extractvalue { ptr, i32 } %479, 1
  store i32 %481, ptr %16, align 4
  br label %526

482:                                              ; preds = %352
  %483 = landingpad { ptr, i32 }
          cleanup
  %484 = extractvalue { ptr, i32 } %483, 0
  store ptr %484, ptr %15, align 8
  %485 = extractvalue { ptr, i32 } %483, 1
  store i32 %485, ptr %16, align 4
  br label %525

486:                                              ; preds = %362
  %487 = landingpad { ptr, i32 }
          cleanup
  %488 = extractvalue { ptr, i32 } %487, 0
  store ptr %488, ptr %15, align 8
  %489 = extractvalue { ptr, i32 } %487, 1
  store i32 %489, ptr %16, align 4
  br label %524

490:                                              ; preds = %373
  %491 = landingpad { ptr, i32 }
          cleanup
  %492 = extractvalue { ptr, i32 } %491, 0
  store ptr %492, ptr %15, align 8
  %493 = extractvalue { ptr, i32 } %491, 1
  store i32 %493, ptr %16, align 4
  br label %523

494:                                              ; preds = %384
  %495 = landingpad { ptr, i32 }
          cleanup
  %496 = extractvalue { ptr, i32 } %495, 0
  store ptr %496, ptr %15, align 8
  %497 = extractvalue { ptr, i32 } %495, 1
  store i32 %497, ptr %16, align 4
  br label %522

498:                                              ; preds = %391
  %499 = landingpad { ptr, i32 }
          cleanup
  %500 = extractvalue { ptr, i32 } %499, 0
  store ptr %500, ptr %15, align 8
  %501 = extractvalue { ptr, i32 } %499, 1
  store i32 %501, ptr %16, align 4
  br label %521

502:                                              ; preds = %396
  %503 = landingpad { ptr, i32 }
          cleanup
  %504 = extractvalue { ptr, i32 } %503, 0
  store ptr %504, ptr %15, align 8
  %505 = extractvalue { ptr, i32 } %503, 1
  store i32 %505, ptr %16, align 4
  br label %520

506:                                              ; preds = %405
  %507 = landingpad { ptr, i32 }
          cleanup
  %508 = extractvalue { ptr, i32 } %507, 0
  store ptr %508, ptr %15, align 8
  %509 = extractvalue { ptr, i32 } %507, 1
  store i32 %509, ptr %16, align 4
  br label %519

510:                                              ; preds = %414
  %511 = landingpad { ptr, i32 }
          cleanup
  %512 = extractvalue { ptr, i32 } %511, 0
  store ptr %512, ptr %15, align 8
  %513 = extractvalue { ptr, i32 } %511, 1
  store i32 %513, ptr %16, align 4
  br label %518

514:                                              ; preds = %427, %423
  %515 = landingpad { ptr, i32 }
          cleanup
  %516 = extractvalue { ptr, i32 } %515, 0
  store ptr %516, ptr %15, align 8
  %517 = extractvalue { ptr, i32 } %515, 1
  store i32 %517, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #7
  br label %518

518:                                              ; preds = %514, %510
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #7
  br label %519

519:                                              ; preds = %518, %506
  call void @llvm.lifetime.end.p0(i64 8, ptr %59) #7
  br label %520

520:                                              ; preds = %519, %502
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #7
  br label %521

521:                                              ; preds = %520, %498
  call void @llvm.lifetime.end.p0(i64 8, ptr %57) #7
  br label %522

522:                                              ; preds = %521, %494
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #7
  br label %523

523:                                              ; preds = %522, %490
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #7
  br label %524

524:                                              ; preds = %523, %486
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #7
  br label %525

525:                                              ; preds = %524, %482
  call void @llvm.lifetime.end.p0(i64 4, ptr %53) #7
  br label %526

526:                                              ; preds = %525, %478
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #7
  br label %527

527:                                              ; preds = %526, %474
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #7
  br label %528

528:                                              ; preds = %527, %470
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #7
  br label %529

529:                                              ; preds = %528, %466
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #7
  br label %530

530:                                              ; preds = %529, %462
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #7
  br label %531

531:                                              ; preds = %530, %458
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #7
  br label %532

532:                                              ; preds = %531, %308
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #7
  br label %534

533:                                              ; preds = %307
  call void @_ZN8VectorXdD1Ev(ptr noundef nonnull align 8 dereferenceable(24) %13) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  ret void

534:                                              ; preds = %532, %296
  call void @_ZN8VectorXdD1Ev(ptr noundef nonnull align 8 dereferenceable(24) %13) #7
  call void @llvm.lifetime.end.p0(i64 24, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  br label %535

535:                                              ; preds = %534
  %536 = load ptr, ptr %15, align 8
  %537 = load i32, ptr %16, align 4
  %538 = insertvalue { ptr, i32 } poison, ptr %536, 0
  %539 = insertvalue { ptr, i32 } %538, i32 %537, 1
  resume { ptr, i32 } %539
}

declare void @_ZN8VectorXdC1Ei(ptr, i32)

declare void @_ZN8VectorXdD1Ev(ptr)

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !12, i64 32}
!10 = !{!"_ZTS14PressureSolver", !11, i64 0, !11, i64 4, !11, i64 8, !12, i64 16, !12, i64 24, !12, i64 32, !11, i64 40, !12, i64 48, !11, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !13, i64 96}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!"_ZTS15GridIndexKeyMap", !11, i64 0, !11, i64 4, !11, i64 8, !14, i64 16, !11, i64 40}
!14 = !{!"_ZTSSt6vectorIiSaIiEE", !15, i64 0}
!15 = !{!"_ZTSSt12_Vector_baseIiSaIiEE", !16, i64 0}
!16 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE12_Vector_implE", !17, i64 0}
!17 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE17_Vector_impl_dataE", !6, i64 0, !6, i64 8, !6, i64 16}
!18 = !{!10, !12, i64 24}
!19 = !{!10, !12, i64 16}
!20 = !{!12, !12, i64 0}
!21 = !{!10, !11, i64 40}
!22 = !{!11, !11, i64 0}
!23 = !{!10, !6, i64 64}
!24 = !{!25, !11, i64 0}
!25 = !{!"_ZTS9GridIndex", !11, i64 0, !11, i64 4, !11, i64 8}
!26 = !{!25, !11, i64 4}
!27 = !{!25, !11, i64 8}
!28 = !{!29, !7, i64 1}
!29 = !{!"_ZTS10MatrixCell", !7, i64 0, !7, i64 1, !7, i64 2, !7, i64 3}
!30 = !{!29, !7, i64 2}
!31 = !{!29, !7, i64 3}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = distinct !{!34, !33}


; 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.VectorXd = type { %"class.std::vector" }
%"class.std::vector" = type { %"struct.std::_Vector_base" }
%"struct.std::_Vector_base" = type { %"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl" }
%"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl" = type { %"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl_data" }
%"struct.std::_Vector_base<double, std::allocator<double>>::_Vector_impl_data" = type { ptr, 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
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24), i32 noundef) local_unnamed_addr #1 align 2

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40)) local_unnamed_addr #3 align 2

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

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

declare noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44), i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN14PressureSolver20_applyPreconditionerER18MatrixCoefficientsR8VectorXdS3_S3_(ptr noundef nonnull align 8 dereferenceable(144) %0, ptr noundef nonnull align 8 dereferenceable(24) %1, ptr noundef nonnull align 8 dereferenceable(24) %2, ptr noundef nonnull align 8 dereferenceable(24) %3, ptr noundef nonnull align 8 dereferenceable(24) %4) local_unnamed_addr #1 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca %class.VectorXd, align 8
  %7 = getelementptr inbounds i8, ptr %0, i64 32
  %8 = load double, ptr %7, align 8, !tbaa !5
  %9 = getelementptr inbounds i8, ptr %0, i64 24
  %10 = load double, ptr %9, align 8, !tbaa !17
  %11 = getelementptr inbounds i8, ptr %0, i64 16
  %12 = load double, ptr %11, align 8, !tbaa !18
  %13 = fmul double %10, %12
  %14 = fmul double %12, %13
  %15 = fneg double %8
  %16 = fdiv double %15, %14
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %6) #6
  %17 = getelementptr inbounds i8, ptr %0, i64 40
  %18 = load i32, ptr %17, align 8, !tbaa !19
  call void @_ZN8VectorXdC1Ei(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %18)
  %19 = getelementptr inbounds i8, ptr %0, i64 64
  %20 = load ptr, ptr %19, align 8, !tbaa !20
  %21 = call noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40) %20)
  %.not229 = icmp eq i64 %21, 0
  br i1 %.not229, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %5
  %22 = getelementptr inbounds i8, ptr %0, i64 96
  br label %29

._crit_edge:                                      ; preds = %119, %5
  %23 = load ptr, ptr %19, align 8, !tbaa !20
  %24 = call noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40) %23)
  %25 = trunc i64 %24 to i32
  %26 = icmp sgt i32 %25, 0
  br i1 %26, label %.lr.ph227, label %._crit_edge228

.lr.ph227:                                        ; preds = %._crit_edge
  %27 = getelementptr inbounds i8, ptr %0, i64 96
  %28 = fneg double %16
  br label %137

29:                                               ; preds = %.lr.ph, %119
  %.0223 = phi i32 [ 0, %.lr.ph ], [ %130, %119 ]
  %30 = load ptr, ptr %19, align 8, !tbaa !20
  %31 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %30, i32 noundef %.0223)
          to label %32 unwind label %63

32:                                               ; preds = %29
  %.fca.0.extract98 = extractvalue { i64, i32 } %31, 0
  %.sroa.0102.0.extract.trunc = trunc i64 %.fca.0.extract98 to i32
  %33 = load ptr, ptr %19, align 8, !tbaa !20
  %34 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %33, i32 noundef %.0223)
          to label %35 unwind label %65

35:                                               ; preds = %32
  %.fca.0.extract88 = extractvalue { i64, i32 } %34, 0
  %.sroa.092.4.extract.shift = lshr i64 %.fca.0.extract88, 32
  %.sroa.092.4.extract.trunc = trunc nuw i64 %.sroa.092.4.extract.shift to i32
  %36 = load ptr, ptr %19, align 8, !tbaa !20
  %37 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %36, i32 noundef %.0223)
          to label %38 unwind label %67

38:                                               ; preds = %35
  %.fca.1.extract79 = extractvalue { i64, i32 } %37, 1
  %39 = invoke noundef i32 @_ZN14PressureSolver18_GridToVectorIndexEiii(ptr noundef nonnull align 8 dereferenceable(144) %0, i32 noundef %.sroa.0102.0.extract.trunc, i32 noundef %.sroa.092.4.extract.trunc, i32 noundef %.fca.1.extract79)
          to label %40 unwind label %69

40:                                               ; preds = %38
  %41 = add nsw i32 %.sroa.0102.0.extract.trunc, -1
  %42 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %22, i32 noundef %41, i32 noundef %.sroa.092.4.extract.trunc, i32 noundef %.fca.1.extract79)
          to label %43 unwind label %71

43:                                               ; preds = %40
  %44 = add nsw i32 %.sroa.092.4.extract.trunc, -1
  %45 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %22, i32 noundef %.sroa.0102.0.extract.trunc, i32 noundef %44, i32 noundef %.fca.1.extract79)
          to label %46 unwind label %73

46:                                               ; preds = %43
  %47 = add nsw i32 %.fca.1.extract79, -1
  %48 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %22, i32 noundef %.sroa.0102.0.extract.trunc, i32 noundef %.sroa.092.4.extract.trunc, i32 noundef %47)
          to label %49 unwind label %75

49:                                               ; preds = %46
  %.not197 = icmp eq i32 %42, -1
  br i1 %.not197, label %79, label %50

50:                                               ; preds = %49
  %51 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %42)
          to label %52 unwind label %77

52:                                               ; preds = %50
  %53 = getelementptr inbounds i8, ptr %51, i64 1
  %54 = load i8, ptr %53, align 1, !tbaa !21
  %55 = sitofp i8 %54 to double
  %56 = fmul double %16, %55
  %57 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %2, i32 noundef %42)
          to label %58 unwind label %77

58:                                               ; preds = %52
  %59 = load double, ptr %57, align 8, !tbaa !23
  %60 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %42)
          to label %61 unwind label %77

61:                                               ; preds = %58
  %62 = load double, ptr %60, align 8, !tbaa !23
  br label %79

63:                                               ; preds = %29
  %64 = landingpad { ptr, i32 }
          cleanup
  br label %240

65:                                               ; preds = %32
  %66 = landingpad { ptr, i32 }
          cleanup
  br label %240

67:                                               ; preds = %35
  %68 = landingpad { ptr, i32 }
          cleanup
  br label %240

69:                                               ; preds = %38
  %70 = landingpad { ptr, i32 }
          cleanup
  br label %240

71:                                               ; preds = %40
  %72 = landingpad { ptr, i32 }
          cleanup
  br label %240

73:                                               ; preds = %43
  %74 = landingpad { ptr, i32 }
          cleanup
  br label %240

75:                                               ; preds = %46
  %76 = landingpad { ptr, i32 }
          cleanup
  br label %240

77:                                               ; preds = %58, %52, %50
  %78 = landingpad { ptr, i32 }
          cleanup
  br label %240

79:                                               ; preds = %61, %49
  %.0167 = phi double [ %62, %61 ], [ 0.000000e+00, %49 ]
  %.0166 = phi double [ %59, %61 ], [ 0.000000e+00, %49 ]
  %.0165 = phi double [ %56, %61 ], [ 0.000000e+00, %49 ]
  %.not198 = icmp eq i32 %45, -1
  br i1 %.not198, label %95, label %80

80:                                               ; preds = %79
  %81 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %45)
          to label %82 unwind label %93

82:                                               ; preds = %80
  %83 = getelementptr inbounds i8, ptr %81, i64 2
  %84 = load i8, ptr %83, align 1, !tbaa !24
  %85 = sitofp i8 %84 to double
  %86 = fmul double %16, %85
  %87 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %2, i32 noundef %45)
          to label %88 unwind label %93

88:                                               ; preds = %82
  %89 = load double, ptr %87, align 8, !tbaa !23
  %90 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %45)
          to label %91 unwind label %93

91:                                               ; preds = %88
  %92 = load double, ptr %90, align 8, !tbaa !23
  br label %95

93:                                               ; preds = %88, %82, %80
  %94 = landingpad { ptr, i32 }
          cleanup
  br label %240

95:                                               ; preds = %91, %79
  %.0170 = phi double [ %92, %91 ], [ 0.000000e+00, %79 ]
  %.0169 = phi double [ %89, %91 ], [ 0.000000e+00, %79 ]
  %.0168 = phi double [ %86, %91 ], [ 0.000000e+00, %79 ]
  %.not199 = icmp eq i32 %48, -1
  br i1 %.not199, label %111, label %96

96:                                               ; preds = %95
  %97 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %48)
          to label %98 unwind label %109

98:                                               ; preds = %96
  %99 = getelementptr inbounds i8, ptr %97, i64 3
  %100 = load i8, ptr %99, align 1, !tbaa !25
  %101 = sitofp i8 %100 to double
  %102 = fmul double %16, %101
  %103 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %2, i32 noundef %48)
          to label %104 unwind label %109

104:                                              ; preds = %98
  %105 = load double, ptr %103, align 8, !tbaa !23
  %106 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %48)
          to label %107 unwind label %109

107:                                              ; preds = %104
  %108 = load double, ptr %106, align 8, !tbaa !23
  br label %111

109:                                              ; preds = %104, %98, %96
  %110 = landingpad { ptr, i32 }
          cleanup
  br label %240

111:                                              ; preds = %107, %95
  %.0173 = phi double [ %108, %107 ], [ 0.000000e+00, %95 ]
  %.0172 = phi double [ %105, %107 ], [ 0.000000e+00, %95 ]
  %.0171 = phi double [ %102, %107 ], [ 0.000000e+00, %95 ]
  %112 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %3, i32 noundef %39)
          to label %113 unwind label %135

113:                                              ; preds = %111
  %114 = load double, ptr %112, align 8, !tbaa !23
  %115 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %2, i32 noundef %39)
          to label %116 unwind label %135

116:                                              ; preds = %113
  %117 = load double, ptr %115, align 8, !tbaa !23
  %118 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %39)
          to label %119 unwind label %135

119:                                              ; preds = %116
  %120 = fneg double %.0171
  %121 = fmul double %.0172, %120
  %122 = fneg double %.0168
  %123 = fmul double %.0169, %122
  %124 = fneg double %.0165
  %125 = fmul double %.0166, %124
  %126 = call double @llvm.fmuladd.f64(double %125, double %.0167, double %114)
  %127 = call double @llvm.fmuladd.f64(double %123, double %.0170, double %126)
  %128 = call double @llvm.fmuladd.f64(double %121, double %.0173, double %127)
  %129 = fmul double %128, %117
  store double %129, ptr %118, align 8, !tbaa !23
  %130 = add i32 %.0223, 1
  %131 = zext i32 %130 to i64
  %132 = load ptr, ptr %19, align 8, !tbaa !20
  %133 = call noundef i64 @_ZN15GridIndexVector4sizeEv(ptr noundef nonnull align 8 dereferenceable(40) %132)
  %134 = icmp ugt i64 %133, %131
  br i1 %134, label %29, label %._crit_edge, !llvm.loop !26

135:                                              ; preds = %116, %113, %111
  %136 = landingpad { ptr, i32 }
          cleanup
  br label %240

._crit_edge228:                                   ; preds = %198, %._crit_edge
  call void @_ZN8VectorXdD1Ev(ptr noundef nonnull align 8 dereferenceable(24) %6) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %6) #6
  ret void

137:                                              ; preds = %.lr.ph227, %198
  %.0174225.in = phi i32 [ %25, %.lr.ph227 ], [ %.0174225, %198 ]
  %.0174225 = add nsw i32 %.0174225.in, -1
  %138 = load ptr, ptr %19, align 8, !tbaa !20
  %139 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %138, i32 noundef %.0174225)
          to label %140 unwind label %210

140:                                              ; preds = %137
  %.fca.0.extract37 = extractvalue { i64, i32 } %139, 0
  %.sroa.041.0.extract.trunc = trunc i64 %.fca.0.extract37 to i32
  %141 = load ptr, ptr %19, align 8, !tbaa !20
  %142 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %141, i32 noundef %.0174225)
          to label %143 unwind label %212

143:                                              ; preds = %140
  %.fca.0.extract28 = extractvalue { i64, i32 } %142, 0
  %.sroa.032.4.extract.shift = lshr i64 %.fca.0.extract28, 32
  %.sroa.032.4.extract.trunc = trunc nuw i64 %.sroa.032.4.extract.shift to i32
  %144 = load ptr, ptr %19, align 8, !tbaa !20
  %145 = invoke { i64, i32 } @_ZN15GridIndexVector2atEi(ptr noundef nonnull align 8 dereferenceable(40) %144, i32 noundef %.0174225)
          to label %146 unwind label %214

146:                                              ; preds = %143
  %.fca.1.extract = extractvalue { i64, i32 } %145, 1
  %147 = invoke noundef i32 @_ZN14PressureSolver18_GridToVectorIndexEiii(ptr noundef nonnull align 8 dereferenceable(144) %0, i32 noundef %.sroa.041.0.extract.trunc, i32 noundef %.sroa.032.4.extract.trunc, i32 noundef %.fca.1.extract)
          to label %148 unwind label %216

148:                                              ; preds = %146
  %149 = add nsw i32 %.sroa.041.0.extract.trunc, 1
  %150 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %27, i32 noundef %149, i32 noundef %.sroa.032.4.extract.trunc, i32 noundef %.fca.1.extract)
          to label %151 unwind label %218

151:                                              ; preds = %148
  %152 = add nsw i32 %.sroa.032.4.extract.trunc, 1
  %153 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %27, i32 noundef %.sroa.041.0.extract.trunc, i32 noundef %152, i32 noundef %.fca.1.extract)
          to label %154 unwind label %220

154:                                              ; preds = %151
  %155 = add nsw i32 %.fca.1.extract, 1
  %156 = invoke noundef i32 @_ZN15GridIndexKeyMap4findEiii(ptr noundef nonnull align 8 dereferenceable(44) %27, i32 noundef %.sroa.041.0.extract.trunc, i32 noundef %.sroa.032.4.extract.trunc, i32 noundef %155)
          to label %157 unwind label %222

157:                                              ; preds = %154
  %.not = icmp eq i32 %150, -1
  br i1 %.not, label %162, label %158

158:                                              ; preds = %157
  %159 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %4, i32 noundef %150)
          to label %160 unwind label %224

160:                                              ; preds = %158
  %161 = load double, ptr %159, align 8, !tbaa !23
  br label %162

162:                                              ; preds = %157, %160
  %163 = phi double [ %161, %160 ], [ 0.000000e+00, %157 ]
  %.not181 = icmp eq i32 %153, -1
  br i1 %.not181, label %168, label %164

164:                                              ; preds = %162
  %165 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %4, i32 noundef %153)
          to label %166 unwind label %226

166:                                              ; preds = %164
  %167 = load double, ptr %165, align 8, !tbaa !23
  br label %168

168:                                              ; preds = %162, %166
  %169 = phi double [ %167, %166 ], [ 0.000000e+00, %162 ]
  %.not182 = icmp eq i32 %156, -1
  br i1 %.not182, label %174, label %170

170:                                              ; preds = %168
  %171 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %4, i32 noundef %156)
          to label %172 unwind label %228

172:                                              ; preds = %170
  %173 = load double, ptr %171, align 8, !tbaa !23
  br label %174

174:                                              ; preds = %168, %172
  %175 = phi double [ %173, %172 ], [ 0.000000e+00, %168 ]
  %176 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %147)
          to label %177 unwind label %230

177:                                              ; preds = %174
  %178 = getelementptr inbounds i8, ptr %176, i64 1
  %179 = load i8, ptr %178, align 1, !tbaa !21
  %180 = sitofp i8 %179 to double
  %181 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %147)
          to label %182 unwind label %232

182:                                              ; preds = %177
  %183 = getelementptr inbounds i8, ptr %181, i64 2
  %184 = load i8, ptr %183, align 1, !tbaa !24
  %185 = sitofp i8 %184 to double
  %186 = invoke noundef nonnull align 1 dereferenceable(4) ptr @_ZN18MatrixCoefficientsixEi(ptr noundef nonnull align 8 dereferenceable(24) %1, i32 noundef %147)
          to label %187 unwind label %234

187:                                              ; preds = %182
  %188 = getelementptr inbounds i8, ptr %186, i64 3
  %189 = load i8, ptr %188, align 1, !tbaa !25
  %190 = sitofp i8 %189 to double
  %191 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %2, i32 noundef %147)
          to label %192 unwind label %236

192:                                              ; preds = %187
  %193 = load double, ptr %191, align 8, !tbaa !23
  %194 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %6, i32 noundef %147)
          to label %195 unwind label %238

195:                                              ; preds = %192
  %196 = load double, ptr %194, align 8, !tbaa !23
  %197 = invoke noundef nonnull align 8 dereferenceable(8) ptr @_ZN8VectorXdixEi(ptr noundef nonnull align 8 dereferenceable(24) %4, i32 noundef %147)
          to label %198 unwind label %238

198:                                              ; preds = %195
  %199 = fmul double %28, %190
  %200 = fmul double %199, %193
  %201 = fmul double %28, %185
  %202 = fmul double %201, %193
  %203 = fmul double %28, %180
  %204 = fmul double %203, %193
  %205 = call double @llvm.fmuladd.f64(double %204, double %163, double %196)
  %206 = call double @llvm.fmuladd.f64(double %202, double %169, double %205)
  %207 = call double @llvm.fmuladd.f64(double %200, double %175, double %206)
  %208 = fmul double %193, %207
  store double %208, ptr %197, align 8, !tbaa !23
  %209 = icmp ugt i32 %.0174225.in, 1
  br i1 %209, label %137, label %._crit_edge228, !llvm.loop !28

210:                                              ; preds = %137
  %211 = landingpad { ptr, i32 }
          cleanup
  br label %240

212:                                              ; preds = %140
  %213 = landingpad { ptr, i32 }
          cleanup
  br label %240

214:                                              ; preds = %143
  %215 = landingpad { ptr, i32 }
          cleanup
  br label %240

216:                                              ; preds = %146
  %217 = landingpad { ptr, i32 }
          cleanup
  br label %240

218:                                              ; preds = %148
  %219 = landingpad { ptr, i32 }
          cleanup
  br label %240

220:                                              ; preds = %151
  %221 = landingpad { ptr, i32 }
          cleanup
  br label %240

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

224:                                              ; preds = %158
  %225 = landingpad { ptr, i32 }
          cleanup
  br label %240

226:                                              ; preds = %164
  %227 = landingpad { ptr, i32 }
          cleanup
  br label %240

228:                                              ; preds = %170
  %229 = landingpad { ptr, i32 }
          cleanup
  br label %240

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

232:                                              ; preds = %177
  %233 = landingpad { ptr, i32 }
          cleanup
  br label %240

234:                                              ; preds = %182
  %235 = landingpad { ptr, i32 }
          cleanup
  br label %240

236:                                              ; preds = %187
  %237 = landingpad { ptr, i32 }
          cleanup
  br label %240

238:                                              ; preds = %195, %192
  %239 = landingpad { ptr, i32 }
          cleanup
  br label %240

240:                                              ; preds = %210, %214, %218, %222, %226, %230, %234, %238, %236, %232, %228, %224, %220, %216, %212, %63, %67, %71, %75, %93, %135, %109, %77, %73, %69, %65
  %.pn200.pn.pn.pn.pn.pn.pn.pn.pn.pn.pn = phi { ptr, i32 } [ %64, %63 ], [ %66, %65 ], [ %68, %67 ], [ %70, %69 ], [ %72, %71 ], [ %74, %73 ], [ %76, %75 ], [ %78, %77 ], [ %94, %93 ], [ %136, %135 ], [ %110, %109 ], [ %211, %210 ], [ %213, %212 ], [ %215, %214 ], [ %217, %216 ], [ %219, %218 ], [ %221, %220 ], [ %223, %222 ], [ %225, %224 ], [ %227, %226 ], [ %229, %228 ], [ %231, %230 ], [ %233, %232 ], [ %235, %234 ], [ %239, %238 ], [ %237, %236 ]
  call void @_ZN8VectorXdD1Ev(ptr noundef nonnull align 8 dereferenceable(24) %6) #6
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %6) #6
  resume { ptr, i32 } %.pn200.pn.pn.pn.pn.pn.pn.pn.pn.pn.pn
}

declare void @_ZN8VectorXdC1Ei(ptr, i32) local_unnamed_addr

declare void @_ZN8VectorXdD1Ev(ptr) local_unnamed_addr

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

!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, !10, i64 32}
!6 = !{!"_ZTS14PressureSolver", !7, i64 0, !7, i64 4, !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !7, i64 40, !10, i64 48, !7, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !11, i64 88, !12, i64 96}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"double", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"_ZTS15GridIndexKeyMap", !7, i64 0, !7, i64 4, !7, i64 8, !13, i64 16, !7, i64 40}
!13 = !{!"_ZTSSt6vectorIiSaIiEE", !14, i64 0}
!14 = !{!"_ZTSSt12_Vector_baseIiSaIiEE", !15, i64 0}
!15 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE12_Vector_implE", !16, i64 0}
!16 = !{!"_ZTSNSt12_Vector_baseIiSaIiEE17_Vector_impl_dataE", !11, i64 0, !11, i64 8, !11, i64 16}
!17 = !{!6, !10, i64 24}
!18 = !{!6, !10, i64 16}
!19 = !{!6, !7, i64 40}
!20 = !{!6, !11, i64 64}
!21 = !{!22, !8, i64 1}
!22 = !{!"_ZTS10MatrixCell", !8, i64 0, !8, i64 1, !8, i64 2, !8, i64 3}
!23 = !{!10, !10, i64 0}
!24 = !{!22, !8, i64 2}
!25 = !{!22, !8, i64 3}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = distinct !{!28, !27}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SROAPass,SimplifyCFGPass