; LLVM IR from robotic-vision-lab/Cloud-Object-Recognition-Engine :: 3rdparty/libsvm/svm.ll (ZN6Solver5SolveEiRK7QMatrixPKdPKaPddddPNS_12SolutionInfoEi)

; 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.Solver = type <{ ptr, i32, [4 x i8], ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, ptr, ptr, ptr, i32, i8, [3 x i8] }>
%"struct.Solver::SolutionInfo" = type { double, double, double, double, double }

@.str.1 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [2 x i8], align 1
@stderr = external global ptr, align 8
@.str.3 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [36 x i8], align 1

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #1

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) #2

; Function Attrs: nobuiltin nounwind
declare void @_ZdaPv(ptr noundef) #3

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

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117)) #4 align 2

; Function Attrs: mustprogress uwtable
declare hidden void @_ZL4infoPKcz(ptr noundef, ...) #4

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN6Solver5SolveEiRK7QMatrixPKdPKaPddddPNS_12SolutionInfoEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %1, ptr noundef nonnull align 8 dereferenceable(8) %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, double noundef %6, double noundef %7, double noundef %8, ptr noundef %9, i32 noundef %10) #4 align 2 {
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca double, align 8
  %21 = alloca ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca ptr, align 8
  %27 = alloca double, align 8
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca ptr, align 8
  %36 = alloca ptr, align 8
  %37 = alloca double, align 8
  %38 = alloca double, align 8
  %39 = alloca double, align 8
  %40 = alloca double, align 8
  %41 = alloca double, align 8
  %42 = alloca double, align 8
  %43 = alloca double, align 8
  %44 = alloca double, align 8
  %45 = alloca double, align 8
  %46 = alloca double, align 8
  %47 = alloca double, align 8
  %48 = alloca double, align 8
  %49 = alloca i32, align 4
  %50 = alloca i8, align 1
  %51 = alloca i8, align 1
  %52 = alloca i32, align 4
  %53 = alloca double, align 8
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  store ptr %0, ptr %12, align 8, !tbaa !5
  store i32 %1, ptr %13, align 4, !tbaa !9
  store ptr %2, ptr %14, align 8, !tbaa !5
  store ptr %3, ptr %15, align 8, !tbaa !5
  store ptr %4, ptr %16, align 8, !tbaa !5
  store ptr %5, ptr %17, align 8, !tbaa !5
  store double %6, ptr %18, align 8, !tbaa !11
  store double %7, ptr %19, align 8, !tbaa !11
  store double %8, ptr %20, align 8, !tbaa !11
  store ptr %9, ptr %21, align 8, !tbaa !5
  store i32 %10, ptr %22, align 4, !tbaa !9
  %56 = load ptr, ptr %12, align 8
  %57 = load i32, ptr %13, align 4, !tbaa !9
  %58 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 15
  store i32 %57, ptr %58, align 8, !tbaa !13
  %59 = load ptr, ptr %14, align 8, !tbaa !5
  %60 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 7
  store ptr %59, ptr %60, align 8, !tbaa !16
  %61 = load ptr, ptr %14, align 8, !tbaa !5
  %62 = load ptr, ptr %61, align 8, !tbaa !17
  %63 = getelementptr inbounds ptr, ptr %62, i64 1
  %64 = load ptr, ptr %63, align 8
  %65 = call noundef ptr %64(ptr noundef nonnull align 8 dereferenceable(8) %61)
  %66 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 8
  store ptr %65, ptr %66, align 8, !tbaa !19
  %67 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 12
  %68 = load ptr, ptr %15, align 8, !tbaa !5
  %69 = load i32, ptr %13, align 4, !tbaa !9
  call void @_ZL5cloneIKddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %67, ptr noundef %68, i32 noundef %69)
  %70 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 3
  %71 = load ptr, ptr %16, align 8, !tbaa !5
  %72 = load i32, ptr %13, align 4, !tbaa !9
  call void @_ZL5cloneIKaaEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %70, ptr noundef %71, i32 noundef %72)
  %73 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %74 = load ptr, ptr %17, align 8, !tbaa !5
  %75 = load i32, ptr %13, align 4, !tbaa !9
  call void @_ZL5cloneIddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %73, ptr noundef %74, i32 noundef %75)
  %76 = load double, ptr %18, align 8, !tbaa !11
  %77 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 10
  store double %76, ptr %77, align 8, !tbaa !20
  %78 = load double, ptr %19, align 8, !tbaa !11
  %79 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 11
  store double %78, ptr %79, align 8, !tbaa !21
  %80 = load double, ptr %20, align 8, !tbaa !11
  %81 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 9
  store double %80, ptr %81, align 8, !tbaa !22
  %82 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 16
  store i8 0, ptr %82, align 4, !tbaa !23
  %83 = load i32, ptr %13, align 4, !tbaa !9
  %84 = sext i32 %83 to i64
  %85 = call noalias noundef nonnull ptr @_Znam(i64 noundef %84) #9
  %86 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 5
  store ptr %85, ptr %86, align 8, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #10
  store i32 0, ptr %23, align 4, !tbaa !9
  br label %87

87:                                               ; preds = %94, %11
  %88 = load i32, ptr %23, align 4, !tbaa !9
  %89 = load i32, ptr %13, align 4, !tbaa !9
  %90 = icmp slt i32 %88, %89
  br i1 %90, label %92, label %91

91:                                               ; preds = %87
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #10
  br label %97

92:                                               ; preds = %87
  %93 = load i32, ptr %23, align 4, !tbaa !9
  call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %93)
  br label %94

94:                                               ; preds = %92
  %95 = load i32, ptr %23, align 4, !tbaa !9
  %96 = add nsw i32 %95, 1
  store i32 %96, ptr %23, align 4, !tbaa !9
  br label %87, !llvm.loop !25

97:                                               ; preds = %91
  %98 = load i32, ptr %13, align 4, !tbaa !9
  %99 = sext i32 %98 to i64
  %100 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %99, i64 4)
  %101 = extractvalue { i64, i1 } %100, 1
  %102 = extractvalue { i64, i1 } %100, 0
  %103 = select i1 %101, i64 -1, i64 %102
  %104 = call noalias noundef nonnull ptr @_Znam(i64 noundef %103) #9
  %105 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 13
  store ptr %104, ptr %105, align 8, !tbaa !27
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #10
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %106

106:                                              ; preds = %118, %97
  %107 = load i32, ptr %24, align 4, !tbaa !9
  %108 = load i32, ptr %13, align 4, !tbaa !9
  %109 = icmp slt i32 %107, %108
  br i1 %109, label %111, label %110

110:                                              ; preds = %106
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #10
  br label %121

111:                                              ; preds = %106
  %112 = load i32, ptr %24, align 4, !tbaa !9
  %113 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 13
  %114 = load ptr, ptr %113, align 8, !tbaa !27
  %115 = load i32, ptr %24, align 4, !tbaa !9
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds i32, ptr %114, i64 %116
  store i32 %112, ptr %117, align 4, !tbaa !9
  br label %118

118:                                              ; preds = %111
  %119 = load i32, ptr %24, align 4, !tbaa !9
  %120 = add nsw i32 %119, 1
  store i32 %120, ptr %24, align 4, !tbaa !9
  br label %106, !llvm.loop !28

121:                                              ; preds = %110
  %122 = load i32, ptr %13, align 4, !tbaa !9
  %123 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  store i32 %122, ptr %123, align 8, !tbaa !29
  %124 = load i32, ptr %13, align 4, !tbaa !9
  %125 = sext i32 %124 to i64
  %126 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %125, i64 8)
  %127 = extractvalue { i64, i1 } %126, 1
  %128 = extractvalue { i64, i1 } %126, 0
  %129 = select i1 %127, i64 -1, i64 %128
  %130 = call noalias noundef nonnull ptr @_Znam(i64 noundef %129) #9
  %131 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  store ptr %130, ptr %131, align 8, !tbaa !30
  %132 = load i32, ptr %13, align 4, !tbaa !9
  %133 = sext i32 %132 to i64
  %134 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %133, i64 8)
  %135 = extractvalue { i64, i1 } %134, 1
  %136 = extractvalue { i64, i1 } %134, 0
  %137 = select i1 %135, i64 -1, i64 %136
  %138 = call noalias noundef nonnull ptr @_Znam(i64 noundef %137) #9
  %139 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  store ptr %138, ptr %139, align 8, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #10
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %140

140:                                              ; preds = %161, %121
  %141 = load i32, ptr %25, align 4, !tbaa !9
  %142 = load i32, ptr %13, align 4, !tbaa !9
  %143 = icmp slt i32 %141, %142
  br i1 %143, label %144, label %164

144:                                              ; preds = %140
  %145 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 12
  %146 = load ptr, ptr %145, align 8, !tbaa !32
  %147 = load i32, ptr %25, align 4, !tbaa !9
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds double, ptr %146, i64 %148
  %150 = load double, ptr %149, align 8, !tbaa !11
  %151 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %152 = load ptr, ptr %151, align 8, !tbaa !30
  %153 = load i32, ptr %25, align 4, !tbaa !9
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %152, i64 %154
  store double %150, ptr %155, align 8, !tbaa !11
  %156 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %157 = load ptr, ptr %156, align 8, !tbaa !31
  %158 = load i32, ptr %25, align 4, !tbaa !9
  %159 = sext i32 %158 to i64
  %160 = getelementptr inbounds double, ptr %157, i64 %159
  store double 0.000000e+00, ptr %160, align 8, !tbaa !11
  br label %161

161:                                              ; preds = %144
  %162 = load i32, ptr %25, align 4, !tbaa !9
  %163 = add nsw i32 %162, 1
  store i32 %163, ptr %25, align 4, !tbaa !9
  br label %140, !llvm.loop !33

164:                                              ; preds = %140
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %165

165:                                              ; preds = %238, %164
  %166 = load i32, ptr %25, align 4, !tbaa !9
  %167 = load i32, ptr %13, align 4, !tbaa !9
  %168 = icmp slt i32 %166, %167
  br i1 %168, label %169, label %241

169:                                              ; preds = %165
  %170 = load i32, ptr %25, align 4, !tbaa !9
  %171 = call noundef zeroext i1 @_ZN6Solver14is_lower_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %170)
  br i1 %171, label %237, label %172

172:                                              ; preds = %169
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #10
  %173 = load ptr, ptr %14, align 8, !tbaa !5
  %174 = load i32, ptr %25, align 4, !tbaa !9
  %175 = load i32, ptr %13, align 4, !tbaa !9
  %176 = load ptr, ptr %173, align 8, !tbaa !17
  %177 = getelementptr inbounds ptr, ptr %176, i64 0
  %178 = load ptr, ptr %177, align 8
  %179 = call noundef ptr %178(ptr noundef nonnull align 8 dereferenceable(8) %173, i32 noundef %174, i32 noundef %175)
  store ptr %179, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #10
  %180 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %181 = load ptr, ptr %180, align 8, !tbaa !34
  %182 = load i32, ptr %25, align 4, !tbaa !9
  %183 = sext i32 %182 to i64
  %184 = getelementptr inbounds double, ptr %181, i64 %183
  %185 = load double, ptr %184, align 8, !tbaa !11
  store double %185, ptr %27, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #10
  store i32 0, ptr %28, align 4, !tbaa !9
  br label %186

186:                                              ; preds = %205, %172
  %187 = load i32, ptr %28, align 4, !tbaa !9
  %188 = load i32, ptr %13, align 4, !tbaa !9
  %189 = icmp slt i32 %187, %188
  br i1 %189, label %190, label %208

190:                                              ; preds = %186
  %191 = load double, ptr %27, align 8, !tbaa !11
  %192 = load ptr, ptr %26, align 8, !tbaa !5
  %193 = load i32, ptr %28, align 4, !tbaa !9
  %194 = sext i32 %193 to i64
  %195 = getelementptr inbounds float, ptr %192, i64 %194
  %196 = load float, ptr %195, align 4, !tbaa !35
  %197 = fpext float %196 to double
  %198 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %199 = load ptr, ptr %198, align 8, !tbaa !30
  %200 = load i32, ptr %28, align 4, !tbaa !9
  %201 = sext i32 %200 to i64
  %202 = getelementptr inbounds double, ptr %199, i64 %201
  %203 = load double, ptr %202, align 8, !tbaa !11
  %204 = call double @llvm.fmuladd.f64(double %191, double %197, double %203)
  store double %204, ptr %202, align 8, !tbaa !11
  br label %205

205:                                              ; preds = %190
  %206 = load i32, ptr %28, align 4, !tbaa !9
  %207 = add nsw i32 %206, 1
  store i32 %207, ptr %28, align 4, !tbaa !9
  br label %186, !llvm.loop !37

208:                                              ; preds = %186
  %209 = load i32, ptr %25, align 4, !tbaa !9
  %210 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %209)
  br i1 %210, label %211, label %236

211:                                              ; preds = %208
  store i32 0, ptr %28, align 4, !tbaa !9
  br label %212

212:                                              ; preds = %232, %211
  %213 = load i32, ptr %28, align 4, !tbaa !9
  %214 = load i32, ptr %13, align 4, !tbaa !9
  %215 = icmp slt i32 %213, %214
  br i1 %215, label %216, label %235

216:                                              ; preds = %212
  %217 = load i32, ptr %25, align 4, !tbaa !9
  %218 = call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %217)
  %219 = load ptr, ptr %26, align 8, !tbaa !5
  %220 = load i32, ptr %28, align 4, !tbaa !9
  %221 = sext i32 %220 to i64
  %222 = getelementptr inbounds float, ptr %219, i64 %221
  %223 = load float, ptr %222, align 4, !tbaa !35
  %224 = fpext float %223 to double
  %225 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %226 = load ptr, ptr %225, align 8, !tbaa !31
  %227 = load i32, ptr %28, align 4, !tbaa !9
  %228 = sext i32 %227 to i64
  %229 = getelementptr inbounds double, ptr %226, i64 %228
  %230 = load double, ptr %229, align 8, !tbaa !11
  %231 = call double @llvm.fmuladd.f64(double %218, double %224, double %230)
  store double %231, ptr %229, align 8, !tbaa !11
  br label %232

232:                                              ; preds = %216
  %233 = load i32, ptr %28, align 4, !tbaa !9
  %234 = add nsw i32 %233, 1
  store i32 %234, ptr %28, align 4, !tbaa !9
  br label %212, !llvm.loop !38

235:                                              ; preds = %212
  br label %236

236:                                              ; preds = %235, %208
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #10
  br label %237

237:                                              ; preds = %236, %169
  br label %238

238:                                              ; preds = %237
  %239 = load i32, ptr %25, align 4, !tbaa !9
  %240 = add nsw i32 %239, 1
  store i32 %240, ptr %25, align 4, !tbaa !9
  br label %165, !llvm.loop !39

241:                                              ; preds = %165
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #10
  store i32 0, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #10
  %242 = load i32, ptr %13, align 4, !tbaa !9
  %243 = icmp sgt i32 %242, 21474836
  br i1 %243, label %244, label %245

244:                                              ; preds = %241
  br label %248

245:                                              ; preds = %241
  %246 = load i32, ptr %13, align 4, !tbaa !9
  %247 = mul nsw i32 100, %246
  br label %248

248:                                              ; preds = %245, %244
  %249 = phi i32 [ 2147483647, %244 ], [ %247, %245 ]
  %250 = call noundef i32 @_ZL3maxIiET_S0_S0_(i32 noundef 10000000, i32 noundef %249)
  store i32 %250, ptr %30, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #10
  %251 = load i32, ptr %13, align 4, !tbaa !9
  %252 = call noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef %251, i32 noundef 1000)
  %253 = add nsw i32 %252, 1
  store i32 %253, ptr %31, align 4, !tbaa !9
  br label %254

254:                                              ; preds = %879, %248
  %255 = load i32, ptr %29, align 4, !tbaa !9
  %256 = load i32, ptr %30, align 4, !tbaa !9
  %257 = icmp slt i32 %255, %256
  br i1 %257, label %258, label %880

258:                                              ; preds = %254
  %259 = load i32, ptr %31, align 4, !tbaa !9
  %260 = add nsw i32 %259, -1
  store i32 %260, ptr %31, align 4, !tbaa !9
  %261 = icmp eq i32 %260, 0
  br i1 %261, label %262, label %272

262:                                              ; preds = %258
  %263 = load i32, ptr %13, align 4, !tbaa !9
  %264 = call noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef %263, i32 noundef 1000)
  store i32 %264, ptr %31, align 4, !tbaa !9
  %265 = load i32, ptr %22, align 4, !tbaa !9
  %266 = icmp ne i32 %265, 0
  br i1 %266, label %267, label %271

267:                                              ; preds = %262
  %268 = load ptr, ptr %56, align 8, !tbaa !17
  %269 = getelementptr inbounds ptr, ptr %268, i64 4
  %270 = load ptr, ptr %269, align 8
  call void %270(ptr noundef nonnull align 8 dereferenceable(117) %56)
  br label %271

271:                                              ; preds = %267, %262
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef @.str.1)
  br label %272

272:                                              ; preds = %271, %258
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #10
  %273 = load ptr, ptr %56, align 8, !tbaa !17
  %274 = getelementptr inbounds ptr, ptr %273, i64 2
  %275 = load ptr, ptr %274, align 8
  %276 = call noundef i32 %275(ptr noundef nonnull align 8 dereferenceable(117) %56, ptr noundef nonnull align 4 dereferenceable(4) %32, ptr noundef nonnull align 4 dereferenceable(4) %33)
  %277 = icmp ne i32 %276, 0
  br i1 %277, label %278, label %289

278:                                              ; preds = %272
  call void @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117) %56)
  %279 = load i32, ptr %13, align 4, !tbaa !9
  %280 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  store i32 %279, ptr %280, align 8, !tbaa !29
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef @.str.2)
  %281 = load ptr, ptr %56, align 8, !tbaa !17
  %282 = getelementptr inbounds ptr, ptr %281, i64 2
  %283 = load ptr, ptr %282, align 8
  %284 = call noundef i32 %283(ptr noundef nonnull align 8 dereferenceable(117) %56, ptr noundef nonnull align 4 dereferenceable(4) %32, ptr noundef nonnull align 4 dereferenceable(4) %33)
  %285 = icmp ne i32 %284, 0
  br i1 %285, label %286, label %287

286:                                              ; preds = %278
  store i32 21, ptr %34, align 4
  br label %877

287:                                              ; preds = %278
  store i32 1, ptr %31, align 4, !tbaa !9
  br label %288

288:                                              ; preds = %287
  br label %289

289:                                              ; preds = %288, %272
  %290 = load i32, ptr %29, align 4, !tbaa !9
  %291 = add nsw i32 %290, 1
  store i32 %291, ptr %29, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #10
  %292 = load ptr, ptr %14, align 8, !tbaa !5
  %293 = load i32, ptr %32, align 4, !tbaa !9
  %294 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  %295 = load i32, ptr %294, align 8, !tbaa !29
  %296 = load ptr, ptr %292, align 8, !tbaa !17
  %297 = getelementptr inbounds ptr, ptr %296, i64 0
  %298 = load ptr, ptr %297, align 8
  %299 = call noundef ptr %298(ptr noundef nonnull align 8 dereferenceable(8) %292, i32 noundef %293, i32 noundef %295)
  store ptr %299, ptr %35, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #10
  %300 = load ptr, ptr %14, align 8, !tbaa !5
  %301 = load i32, ptr %33, align 4, !tbaa !9
  %302 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  %303 = load i32, ptr %302, align 8, !tbaa !29
  %304 = load ptr, ptr %300, align 8, !tbaa !17
  %305 = getelementptr inbounds ptr, ptr %304, i64 0
  %306 = load ptr, ptr %305, align 8
  %307 = call noundef ptr %306(ptr noundef nonnull align 8 dereferenceable(8) %300, i32 noundef %301, i32 noundef %303)
  store ptr %307, ptr %36, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #10
  %308 = load i32, ptr %32, align 4, !tbaa !9
  %309 = call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %308)
  store double %309, ptr %37, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #10
  %310 = load i32, ptr %33, align 4, !tbaa !9
  %311 = call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %310)
  store double %311, ptr %38, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #10
  %312 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %313 = load ptr, ptr %312, align 8, !tbaa !34
  %314 = load i32, ptr %32, align 4, !tbaa !9
  %315 = sext i32 %314 to i64
  %316 = getelementptr inbounds double, ptr %313, i64 %315
  %317 = load double, ptr %316, align 8, !tbaa !11
  store double %317, ptr %39, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #10
  %318 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %319 = load ptr, ptr %318, align 8, !tbaa !34
  %320 = load i32, ptr %33, align 4, !tbaa !9
  %321 = sext i32 %320 to i64
  %322 = getelementptr inbounds double, ptr %319, i64 %321
  %323 = load double, ptr %322, align 8, !tbaa !11
  store double %323, ptr %40, align 8, !tbaa !11
  %324 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 3
  %325 = load ptr, ptr %324, align 8, !tbaa !40
  %326 = load i32, ptr %32, align 4, !tbaa !9
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds i8, ptr %325, i64 %327
  %329 = load i8, ptr %328, align 1, !tbaa !41
  %330 = sext i8 %329 to i32
  %331 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 3
  %332 = load ptr, ptr %331, align 8, !tbaa !40
  %333 = load i32, ptr %33, align 4, !tbaa !9
  %334 = sext i32 %333 to i64
  %335 = getelementptr inbounds i8, ptr %332, i64 %334
  %336 = load i8, ptr %335, align 1, !tbaa !41
  %337 = sext i8 %336 to i32
  %338 = icmp ne i32 %330, %337
  br i1 %338, label %339, label %512

339:                                              ; preds = %289
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #10
  %340 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 8
  %341 = load ptr, ptr %340, align 8, !tbaa !19
  %342 = load i32, ptr %32, align 4, !tbaa !9
  %343 = sext i32 %342 to i64
  %344 = getelementptr inbounds double, ptr %341, i64 %343
  %345 = load double, ptr %344, align 8, !tbaa !11
  %346 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 8
  %347 = load ptr, ptr %346, align 8, !tbaa !19
  %348 = load i32, ptr %33, align 4, !tbaa !9
  %349 = sext i32 %348 to i64
  %350 = getelementptr inbounds double, ptr %347, i64 %349
  %351 = load double, ptr %350, align 8, !tbaa !11
  %352 = fadd double %345, %351
  %353 = load ptr, ptr %35, align 8, !tbaa !5
  %354 = load i32, ptr %33, align 4, !tbaa !9
  %355 = sext i32 %354 to i64
  %356 = getelementptr inbounds float, ptr %353, i64 %355
  %357 = load float, ptr %356, align 4, !tbaa !35
  %358 = fmul float 2.000000e+00, %357
  %359 = fpext float %358 to double
  %360 = fadd double %352, %359
  store double %360, ptr %41, align 8, !tbaa !11
  %361 = load double, ptr %41, align 8, !tbaa !11
  %362 = fcmp ole double %361, 0.000000e+00
  br i1 %362, label %363, label %364

363:                                              ; preds = %339
  store double 0x3D719799812DEA11, ptr %41, align 8, !tbaa !11
  br label %364

364:                                              ; preds = %363, %339
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #10
  %365 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %366 = load ptr, ptr %365, align 8, !tbaa !30
  %367 = load i32, ptr %32, align 4, !tbaa !9
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds double, ptr %366, i64 %368
  %370 = load double, ptr %369, align 8, !tbaa !11
  %371 = fneg double %370
  %372 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %373 = load ptr, ptr %372, align 8, !tbaa !30
  %374 = load i32, ptr %33, align 4, !tbaa !9
  %375 = sext i32 %374 to i64
  %376 = getelementptr inbounds double, ptr %373, i64 %375
  %377 = load double, ptr %376, align 8, !tbaa !11
  %378 = fsub double %371, %377
  %379 = load double, ptr %41, align 8, !tbaa !11
  %380 = fdiv double %378, %379
  store double %380, ptr %42, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %43) #10
  %381 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %382 = load ptr, ptr %381, align 8, !tbaa !34
  %383 = load i32, ptr %32, align 4, !tbaa !9
  %384 = sext i32 %383 to i64
  %385 = getelementptr inbounds double, ptr %382, i64 %384
  %386 = load double, ptr %385, align 8, !tbaa !11
  %387 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %388 = load ptr, ptr %387, align 8, !tbaa !34
  %389 = load i32, ptr %33, align 4, !tbaa !9
  %390 = sext i32 %389 to i64
  %391 = getelementptr inbounds double, ptr %388, i64 %390
  %392 = load double, ptr %391, align 8, !tbaa !11
  %393 = fsub double %386, %392
  store double %393, ptr %43, align 8, !tbaa !11
  %394 = load double, ptr %42, align 8, !tbaa !11
  %395 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %396 = load ptr, ptr %395, align 8, !tbaa !34
  %397 = load i32, ptr %32, align 4, !tbaa !9
  %398 = sext i32 %397 to i64
  %399 = getelementptr inbounds double, ptr %396, i64 %398
  %400 = load double, ptr %399, align 8, !tbaa !11
  %401 = fadd double %400, %394
  store double %401, ptr %399, align 8, !tbaa !11
  %402 = load double, ptr %42, align 8, !tbaa !11
  %403 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %404 = load ptr, ptr %403, align 8, !tbaa !34
  %405 = load i32, ptr %33, align 4, !tbaa !9
  %406 = sext i32 %405 to i64
  %407 = getelementptr inbounds double, ptr %404, i64 %406
  %408 = load double, ptr %407, align 8, !tbaa !11
  %409 = fadd double %408, %402
  store double %409, ptr %407, align 8, !tbaa !11
  %410 = load double, ptr %43, align 8, !tbaa !11
  %411 = fcmp ogt double %410, 0.000000e+00
  br i1 %411, label %412, label %433

412:                                              ; preds = %364
  %413 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %414 = load ptr, ptr %413, align 8, !tbaa !34
  %415 = load i32, ptr %33, align 4, !tbaa !9
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds double, ptr %414, i64 %416
  %418 = load double, ptr %417, align 8, !tbaa !11
  %419 = fcmp olt double %418, 0.000000e+00
  br i1 %419, label %420, label %432

420:                                              ; preds = %412
  %421 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %422 = load ptr, ptr %421, align 8, !tbaa !34
  %423 = load i32, ptr %33, align 4, !tbaa !9
  %424 = sext i32 %423 to i64
  %425 = getelementptr inbounds double, ptr %422, i64 %424
  store double 0.000000e+00, ptr %425, align 8, !tbaa !11
  %426 = load double, ptr %43, align 8, !tbaa !11
  %427 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %428 = load ptr, ptr %427, align 8, !tbaa !34
  %429 = load i32, ptr %32, align 4, !tbaa !9
  %430 = sext i32 %429 to i64
  %431 = getelementptr inbounds double, ptr %428, i64 %430
  store double %426, ptr %431, align 8, !tbaa !11
  br label %432

432:                                              ; preds = %420, %412
  br label %455

433:                                              ; preds = %364
  %434 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %435 = load ptr, ptr %434, align 8, !tbaa !34
  %436 = load i32, ptr %32, align 4, !tbaa !9
  %437 = sext i32 %436 to i64
  %438 = getelementptr inbounds double, ptr %435, i64 %437
  %439 = load double, ptr %438, align 8, !tbaa !11
  %440 = fcmp olt double %439, 0.000000e+00
  br i1 %440, label %441, label %454

441:                                              ; preds = %433
  %442 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %443 = load ptr, ptr %442, align 8, !tbaa !34
  %444 = load i32, ptr %32, align 4, !tbaa !9
  %445 = sext i32 %444 to i64
  %446 = getelementptr inbounds double, ptr %443, i64 %445
  store double 0.000000e+00, ptr %446, align 8, !tbaa !11
  %447 = load double, ptr %43, align 8, !tbaa !11
  %448 = fneg double %447
  %449 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %450 = load ptr, ptr %449, align 8, !tbaa !34
  %451 = load i32, ptr %33, align 4, !tbaa !9
  %452 = sext i32 %451 to i64
  %453 = getelementptr inbounds double, ptr %450, i64 %452
  store double %448, ptr %453, align 8, !tbaa !11
  br label %454

454:                                              ; preds = %441, %433
  br label %455

455:                                              ; preds = %454, %432
  %456 = load double, ptr %43, align 8, !tbaa !11
  %457 = load double, ptr %37, align 8, !tbaa !11
  %458 = load double, ptr %38, align 8, !tbaa !11
  %459 = fsub double %457, %458
  %460 = fcmp ogt double %456, %459
  br i1 %460, label %461, label %486

461:                                              ; preds = %455
  %462 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %463 = load ptr, ptr %462, align 8, !tbaa !34
  %464 = load i32, ptr %32, align 4, !tbaa !9
  %465 = sext i32 %464 to i64
  %466 = getelementptr inbounds double, ptr %463, i64 %465
  %467 = load double, ptr %466, align 8, !tbaa !11
  %468 = load double, ptr %37, align 8, !tbaa !11
  %469 = fcmp ogt double %467, %468
  br i1 %469, label %470, label %485

470:                                              ; preds = %461
  %471 = load double, ptr %37, align 8, !tbaa !11
  %472 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %473 = load ptr, ptr %472, align 8, !tbaa !34
  %474 = load i32, ptr %32, align 4, !tbaa !9
  %475 = sext i32 %474 to i64
  %476 = getelementptr inbounds double, ptr %473, i64 %475
  store double %471, ptr %476, align 8, !tbaa !11
  %477 = load double, ptr %37, align 8, !tbaa !11
  %478 = load double, ptr %43, align 8, !tbaa !11
  %479 = fsub double %477, %478
  %480 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %481 = load ptr, ptr %480, align 8, !tbaa !34
  %482 = load i32, ptr %33, align 4, !tbaa !9
  %483 = sext i32 %482 to i64
  %484 = getelementptr inbounds double, ptr %481, i64 %483
  store double %479, ptr %484, align 8, !tbaa !11
  br label %485

485:                                              ; preds = %470, %461
  br label %511

486:                                              ; preds = %455
  %487 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %488 = load ptr, ptr %487, align 8, !tbaa !34
  %489 = load i32, ptr %33, align 4, !tbaa !9
  %490 = sext i32 %489 to i64
  %491 = getelementptr inbounds double, ptr %488, i64 %490
  %492 = load double, ptr %491, align 8, !tbaa !11
  %493 = load double, ptr %38, align 8, !tbaa !11
  %494 = fcmp ogt double %492, %493
  br i1 %494, label %495, label %510

495:                                              ; preds = %486
  %496 = load double, ptr %38, align 8, !tbaa !11
  %497 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %498 = load ptr, ptr %497, align 8, !tbaa !34
  %499 = load i32, ptr %33, align 4, !tbaa !9
  %500 = sext i32 %499 to i64
  %501 = getelementptr inbounds double, ptr %498, i64 %500
  store double %496, ptr %501, align 8, !tbaa !11
  %502 = load double, ptr %38, align 8, !tbaa !11
  %503 = load double, ptr %43, align 8, !tbaa !11
  %504 = fadd double %502, %503
  %505 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %506 = load ptr, ptr %505, align 8, !tbaa !34
  %507 = load i32, ptr %32, align 4, !tbaa !9
  %508 = sext i32 %507 to i64
  %509 = getelementptr inbounds double, ptr %506, i64 %508
  store double %504, ptr %509, align 8, !tbaa !11
  br label %510

510:                                              ; preds = %495, %486
  br label %511

511:                                              ; preds = %510, %485
  call void @llvm.lifetime.end.p0(i64 8, ptr %43) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #10
  br label %682

512:                                              ; preds = %289
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #10
  %513 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 8
  %514 = load ptr, ptr %513, align 8, !tbaa !19
  %515 = load i32, ptr %32, align 4, !tbaa !9
  %516 = sext i32 %515 to i64
  %517 = getelementptr inbounds double, ptr %514, i64 %516
  %518 = load double, ptr %517, align 8, !tbaa !11
  %519 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 8
  %520 = load ptr, ptr %519, align 8, !tbaa !19
  %521 = load i32, ptr %33, align 4, !tbaa !9
  %522 = sext i32 %521 to i64
  %523 = getelementptr inbounds double, ptr %520, i64 %522
  %524 = load double, ptr %523, align 8, !tbaa !11
  %525 = fadd double %518, %524
  %526 = load ptr, ptr %35, align 8, !tbaa !5
  %527 = load i32, ptr %33, align 4, !tbaa !9
  %528 = sext i32 %527 to i64
  %529 = getelementptr inbounds float, ptr %526, i64 %528
  %530 = load float, ptr %529, align 4, !tbaa !35
  %531 = fmul float 2.000000e+00, %530
  %532 = fpext float %531 to double
  %533 = fsub double %525, %532
  store double %533, ptr %44, align 8, !tbaa !11
  %534 = load double, ptr %44, align 8, !tbaa !11
  %535 = fcmp ole double %534, 0.000000e+00
  br i1 %535, label %536, label %537

536:                                              ; preds = %512
  store double 0x3D719799812DEA11, ptr %44, align 8, !tbaa !11
  br label %537

537:                                              ; preds = %536, %512
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #10
  %538 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %539 = load ptr, ptr %538, align 8, !tbaa !30
  %540 = load i32, ptr %32, align 4, !tbaa !9
  %541 = sext i32 %540 to i64
  %542 = getelementptr inbounds double, ptr %539, i64 %541
  %543 = load double, ptr %542, align 8, !tbaa !11
  %544 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %545 = load ptr, ptr %544, align 8, !tbaa !30
  %546 = load i32, ptr %33, align 4, !tbaa !9
  %547 = sext i32 %546 to i64
  %548 = getelementptr inbounds double, ptr %545, i64 %547
  %549 = load double, ptr %548, align 8, !tbaa !11
  %550 = fsub double %543, %549
  %551 = load double, ptr %44, align 8, !tbaa !11
  %552 = fdiv double %550, %551
  store double %552, ptr %45, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #10
  %553 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %554 = load ptr, ptr %553, align 8, !tbaa !34
  %555 = load i32, ptr %32, align 4, !tbaa !9
  %556 = sext i32 %555 to i64
  %557 = getelementptr inbounds double, ptr %554, i64 %556
  %558 = load double, ptr %557, align 8, !tbaa !11
  %559 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %560 = load ptr, ptr %559, align 8, !tbaa !34
  %561 = load i32, ptr %33, align 4, !tbaa !9
  %562 = sext i32 %561 to i64
  %563 = getelementptr inbounds double, ptr %560, i64 %562
  %564 = load double, ptr %563, align 8, !tbaa !11
  %565 = fadd double %558, %564
  store double %565, ptr %46, align 8, !tbaa !11
  %566 = load double, ptr %45, align 8, !tbaa !11
  %567 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %568 = load ptr, ptr %567, align 8, !tbaa !34
  %569 = load i32, ptr %32, align 4, !tbaa !9
  %570 = sext i32 %569 to i64
  %571 = getelementptr inbounds double, ptr %568, i64 %570
  %572 = load double, ptr %571, align 8, !tbaa !11
  %573 = fsub double %572, %566
  store double %573, ptr %571, align 8, !tbaa !11
  %574 = load double, ptr %45, align 8, !tbaa !11
  %575 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %576 = load ptr, ptr %575, align 8, !tbaa !34
  %577 = load i32, ptr %33, align 4, !tbaa !9
  %578 = sext i32 %577 to i64
  %579 = getelementptr inbounds double, ptr %576, i64 %578
  %580 = load double, ptr %579, align 8, !tbaa !11
  %581 = fadd double %580, %574
  store double %581, ptr %579, align 8, !tbaa !11
  %582 = load double, ptr %46, align 8, !tbaa !11
  %583 = load double, ptr %37, align 8, !tbaa !11
  %584 = fcmp ogt double %582, %583
  br i1 %584, label %585, label %610

585:                                              ; preds = %537
  %586 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %587 = load ptr, ptr %586, align 8, !tbaa !34
  %588 = load i32, ptr %32, align 4, !tbaa !9
  %589 = sext i32 %588 to i64
  %590 = getelementptr inbounds double, ptr %587, i64 %589
  %591 = load double, ptr %590, align 8, !tbaa !11
  %592 = load double, ptr %37, align 8, !tbaa !11
  %593 = fcmp ogt double %591, %592
  br i1 %593, label %594, label %609

594:                                              ; preds = %585
  %595 = load double, ptr %37, align 8, !tbaa !11
  %596 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %597 = load ptr, ptr %596, align 8, !tbaa !34
  %598 = load i32, ptr %32, align 4, !tbaa !9
  %599 = sext i32 %598 to i64
  %600 = getelementptr inbounds double, ptr %597, i64 %599
  store double %595, ptr %600, align 8, !tbaa !11
  %601 = load double, ptr %46, align 8, !tbaa !11
  %602 = load double, ptr %37, align 8, !tbaa !11
  %603 = fsub double %601, %602
  %604 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %605 = load ptr, ptr %604, align 8, !tbaa !34
  %606 = load i32, ptr %33, align 4, !tbaa !9
  %607 = sext i32 %606 to i64
  %608 = getelementptr inbounds double, ptr %605, i64 %607
  store double %603, ptr %608, align 8, !tbaa !11
  br label %609

609:                                              ; preds = %594, %585
  br label %631

610:                                              ; preds = %537
  %611 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %612 = load ptr, ptr %611, align 8, !tbaa !34
  %613 = load i32, ptr %33, align 4, !tbaa !9
  %614 = sext i32 %613 to i64
  %615 = getelementptr inbounds double, ptr %612, i64 %614
  %616 = load double, ptr %615, align 8, !tbaa !11
  %617 = fcmp olt double %616, 0.000000e+00
  br i1 %617, label %618, label %630

618:                                              ; preds = %610
  %619 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %620 = load ptr, ptr %619, align 8, !tbaa !34
  %621 = load i32, ptr %33, align 4, !tbaa !9
  %622 = sext i32 %621 to i64
  %623 = getelementptr inbounds double, ptr %620, i64 %622
  store double 0.000000e+00, ptr %623, align 8, !tbaa !11
  %624 = load double, ptr %46, align 8, !tbaa !11
  %625 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %626 = load ptr, ptr %625, align 8, !tbaa !34
  %627 = load i32, ptr %32, align 4, !tbaa !9
  %628 = sext i32 %627 to i64
  %629 = getelementptr inbounds double, ptr %626, i64 %628
  store double %624, ptr %629, align 8, !tbaa !11
  br label %630

630:                                              ; preds = %618, %610
  br label %631

631:                                              ; preds = %630, %609
  %632 = load double, ptr %46, align 8, !tbaa !11
  %633 = load double, ptr %38, align 8, !tbaa !11
  %634 = fcmp ogt double %632, %633
  br i1 %634, label %635, label %660

635:                                              ; preds = %631
  %636 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %637 = load ptr, ptr %636, align 8, !tbaa !34
  %638 = load i32, ptr %33, align 4, !tbaa !9
  %639 = sext i32 %638 to i64
  %640 = getelementptr inbounds double, ptr %637, i64 %639
  %641 = load double, ptr %640, align 8, !tbaa !11
  %642 = load double, ptr %38, align 8, !tbaa !11
  %643 = fcmp ogt double %641, %642
  br i1 %643, label %644, label %659

644:                                              ; preds = %635
  %645 = load double, ptr %38, align 8, !tbaa !11
  %646 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %647 = load ptr, ptr %646, align 8, !tbaa !34
  %648 = load i32, ptr %33, align 4, !tbaa !9
  %649 = sext i32 %648 to i64
  %650 = getelementptr inbounds double, ptr %647, i64 %649
  store double %645, ptr %650, align 8, !tbaa !11
  %651 = load double, ptr %46, align 8, !tbaa !11
  %652 = load double, ptr %38, align 8, !tbaa !11
  %653 = fsub double %651, %652
  %654 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %655 = load ptr, ptr %654, align 8, !tbaa !34
  %656 = load i32, ptr %32, align 4, !tbaa !9
  %657 = sext i32 %656 to i64
  %658 = getelementptr inbounds double, ptr %655, i64 %657
  store double %653, ptr %658, align 8, !tbaa !11
  br label %659

659:                                              ; preds = %644, %635
  br label %681

660:                                              ; preds = %631
  %661 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %662 = load ptr, ptr %661, align 8, !tbaa !34
  %663 = load i32, ptr %32, align 4, !tbaa !9
  %664 = sext i32 %663 to i64
  %665 = getelementptr inbounds double, ptr %662, i64 %664
  %666 = load double, ptr %665, align 8, !tbaa !11
  %667 = fcmp olt double %666, 0.000000e+00
  br i1 %667, label %668, label %680

668:                                              ; preds = %660
  %669 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %670 = load ptr, ptr %669, align 8, !tbaa !34
  %671 = load i32, ptr %32, align 4, !tbaa !9
  %672 = sext i32 %671 to i64
  %673 = getelementptr inbounds double, ptr %670, i64 %672
  store double 0.000000e+00, ptr %673, align 8, !tbaa !11
  %674 = load double, ptr %46, align 8, !tbaa !11
  %675 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %676 = load ptr, ptr %675, align 8, !tbaa !34
  %677 = load i32, ptr %33, align 4, !tbaa !9
  %678 = sext i32 %677 to i64
  %679 = getelementptr inbounds double, ptr %676, i64 %678
  store double %674, ptr %679, align 8, !tbaa !11
  br label %680

680:                                              ; preds = %668, %660
  br label %681

681:                                              ; preds = %680, %659
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #10
  br label %682

682:                                              ; preds = %681, %511
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #10
  %683 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %684 = load ptr, ptr %683, align 8, !tbaa !34
  %685 = load i32, ptr %32, align 4, !tbaa !9
  %686 = sext i32 %685 to i64
  %687 = getelementptr inbounds double, ptr %684, i64 %686
  %688 = load double, ptr %687, align 8, !tbaa !11
  %689 = load double, ptr %39, align 8, !tbaa !11
  %690 = fsub double %688, %689
  store double %690, ptr %47, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #10
  %691 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %692 = load ptr, ptr %691, align 8, !tbaa !34
  %693 = load i32, ptr %33, align 4, !tbaa !9
  %694 = sext i32 %693 to i64
  %695 = getelementptr inbounds double, ptr %692, i64 %694
  %696 = load double, ptr %695, align 8, !tbaa !11
  %697 = load double, ptr %40, align 8, !tbaa !11
  %698 = fsub double %696, %697
  store double %698, ptr %48, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #10
  store i32 0, ptr %49, align 4, !tbaa !9
  br label %699

699:                                              ; preds = %729, %682
  %700 = load i32, ptr %49, align 4, !tbaa !9
  %701 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  %702 = load i32, ptr %701, align 8, !tbaa !29
  %703 = icmp slt i32 %700, %702
  br i1 %703, label %705, label %704

704:                                              ; preds = %699
  store i32 22, ptr %34, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #10
  br label %732

705:                                              ; preds = %699
  %706 = load ptr, ptr %35, align 8, !tbaa !5
  %707 = load i32, ptr %49, align 4, !tbaa !9
  %708 = sext i32 %707 to i64
  %709 = getelementptr inbounds float, ptr %706, i64 %708
  %710 = load float, ptr %709, align 4, !tbaa !35
  %711 = fpext float %710 to double
  %712 = load double, ptr %47, align 8, !tbaa !11
  %713 = load ptr, ptr %36, align 8, !tbaa !5
  %714 = load i32, ptr %49, align 4, !tbaa !9
  %715 = sext i32 %714 to i64
  %716 = getelementptr inbounds float, ptr %713, i64 %715
  %717 = load float, ptr %716, align 4, !tbaa !35
  %718 = fpext float %717 to double
  %719 = load double, ptr %48, align 8, !tbaa !11
  %720 = fmul double %718, %719
  %721 = call double @llvm.fmuladd.f64(double %711, double %712, double %720)
  %722 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %723 = load ptr, ptr %722, align 8, !tbaa !30
  %724 = load i32, ptr %49, align 4, !tbaa !9
  %725 = sext i32 %724 to i64
  %726 = getelementptr inbounds double, ptr %723, i64 %725
  %727 = load double, ptr %726, align 8, !tbaa !11
  %728 = fadd double %727, %721
  store double %728, ptr %726, align 8, !tbaa !11
  br label %729

729:                                              ; preds = %705
  %730 = load i32, ptr %49, align 4, !tbaa !9
  %731 = add nsw i32 %730, 1
  store i32 %731, ptr %49, align 4, !tbaa !9
  br label %699, !llvm.loop !42

732:                                              ; preds = %704
  call void @llvm.lifetime.start.p0(i64 1, ptr %50) #10
  %733 = load i32, ptr %32, align 4, !tbaa !9
  %734 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %733)
  %735 = zext i1 %734 to i8
  store i8 %735, ptr %50, align 1, !tbaa !43
  call void @llvm.lifetime.start.p0(i64 1, ptr %51) #10
  %736 = load i32, ptr %33, align 4, !tbaa !9
  %737 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %736)
  %738 = zext i1 %737 to i8
  store i8 %738, ptr %51, align 1, !tbaa !43
  %739 = load i32, ptr %32, align 4, !tbaa !9
  call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %739)
  %740 = load i32, ptr %33, align 4, !tbaa !9
  call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %740)
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #10
  %741 = load i8, ptr %50, align 1, !tbaa !43, !range !44, !noundef !45
  %742 = trunc i8 %741 to i1
  %743 = zext i1 %742 to i32
  %744 = load i32, ptr %32, align 4, !tbaa !9
  %745 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %744)
  %746 = zext i1 %745 to i32
  %747 = icmp ne i32 %743, %746
  br i1 %747, label %748, label %808

748:                                              ; preds = %732
  %749 = load ptr, ptr %14, align 8, !tbaa !5
  %750 = load i32, ptr %32, align 4, !tbaa !9
  %751 = load i32, ptr %13, align 4, !tbaa !9
  %752 = load ptr, ptr %749, align 8, !tbaa !17
  %753 = getelementptr inbounds ptr, ptr %752, i64 0
  %754 = load ptr, ptr %753, align 8
  %755 = call noundef ptr %754(ptr noundef nonnull align 8 dereferenceable(8) %749, i32 noundef %750, i32 noundef %751)
  store ptr %755, ptr %35, align 8, !tbaa !5
  %756 = load i8, ptr %50, align 1, !tbaa !43, !range !44, !noundef !45
  %757 = trunc i8 %756 to i1
  br i1 %757, label %758, label %783

758:                                              ; preds = %748
  store i32 0, ptr %52, align 4, !tbaa !9
  br label %759

759:                                              ; preds = %779, %758
  %760 = load i32, ptr %52, align 4, !tbaa !9
  %761 = load i32, ptr %13, align 4, !tbaa !9
  %762 = icmp slt i32 %760, %761
  br i1 %762, label %763, label %782

763:                                              ; preds = %759
  %764 = load double, ptr %37, align 8, !tbaa !11
  %765 = load ptr, ptr %35, align 8, !tbaa !5
  %766 = load i32, ptr %52, align 4, !tbaa !9
  %767 = sext i32 %766 to i64
  %768 = getelementptr inbounds float, ptr %765, i64 %767
  %769 = load float, ptr %768, align 4, !tbaa !35
  %770 = fpext float %769 to double
  %771 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %772 = load ptr, ptr %771, align 8, !tbaa !31
  %773 = load i32, ptr %52, align 4, !tbaa !9
  %774 = sext i32 %773 to i64
  %775 = getelementptr inbounds double, ptr %772, i64 %774
  %776 = load double, ptr %775, align 8, !tbaa !11
  %777 = fneg double %764
  %778 = call double @llvm.fmuladd.f64(double %777, double %770, double %776)
  store double %778, ptr %775, align 8, !tbaa !11
  br label %779

779:                                              ; preds = %763
  %780 = load i32, ptr %52, align 4, !tbaa !9
  %781 = add nsw i32 %780, 1
  store i32 %781, ptr %52, align 4, !tbaa !9
  br label %759, !llvm.loop !46

782:                                              ; preds = %759
  br label %807

783:                                              ; preds = %748
  store i32 0, ptr %52, align 4, !tbaa !9
  br label %784

784:                                              ; preds = %803, %783
  %785 = load i32, ptr %52, align 4, !tbaa !9
  %786 = load i32, ptr %13, align 4, !tbaa !9
  %787 = icmp slt i32 %785, %786
  br i1 %787, label %788, label %806

788:                                              ; preds = %784
  %789 = load double, ptr %37, align 8, !tbaa !11
  %790 = load ptr, ptr %35, align 8, !tbaa !5
  %791 = load i32, ptr %52, align 4, !tbaa !9
  %792 = sext i32 %791 to i64
  %793 = getelementptr inbounds float, ptr %790, i64 %792
  %794 = load float, ptr %793, align 4, !tbaa !35
  %795 = fpext float %794 to double
  %796 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %797 = load ptr, ptr %796, align 8, !tbaa !31
  %798 = load i32, ptr %52, align 4, !tbaa !9
  %799 = sext i32 %798 to i64
  %800 = getelementptr inbounds double, ptr %797, i64 %799
  %801 = load double, ptr %800, align 8, !tbaa !11
  %802 = call double @llvm.fmuladd.f64(double %789, double %795, double %801)
  store double %802, ptr %800, align 8, !tbaa !11
  br label %803

803:                                              ; preds = %788
  %804 = load i32, ptr %52, align 4, !tbaa !9
  %805 = add nsw i32 %804, 1
  store i32 %805, ptr %52, align 4, !tbaa !9
  br label %784, !llvm.loop !47

806:                                              ; preds = %784
  br label %807

807:                                              ; preds = %806, %782
  br label %808

808:                                              ; preds = %807, %732
  %809 = load i8, ptr %51, align 1, !tbaa !43, !range !44, !noundef !45
  %810 = trunc i8 %809 to i1
  %811 = zext i1 %810 to i32
  %812 = load i32, ptr %33, align 4, !tbaa !9
  %813 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %56, i32 noundef %812)
  %814 = zext i1 %813 to i32
  %815 = icmp ne i32 %811, %814
  br i1 %815, label %816, label %876

816:                                              ; preds = %808
  %817 = load ptr, ptr %14, align 8, !tbaa !5
  %818 = load i32, ptr %33, align 4, !tbaa !9
  %819 = load i32, ptr %13, align 4, !tbaa !9
  %820 = load ptr, ptr %817, align 8, !tbaa !17
  %821 = getelementptr inbounds ptr, ptr %820, i64 0
  %822 = load ptr, ptr %821, align 8
  %823 = call noundef ptr %822(ptr noundef nonnull align 8 dereferenceable(8) %817, i32 noundef %818, i32 noundef %819)
  store ptr %823, ptr %36, align 8, !tbaa !5
  %824 = load i8, ptr %51, align 1, !tbaa !43, !range !44, !noundef !45
  %825 = trunc i8 %824 to i1
  br i1 %825, label %826, label %851

826:                                              ; preds = %816
  store i32 0, ptr %52, align 4, !tbaa !9
  br label %827

827:                                              ; preds = %847, %826
  %828 = load i32, ptr %52, align 4, !tbaa !9
  %829 = load i32, ptr %13, align 4, !tbaa !9
  %830 = icmp slt i32 %828, %829
  br i1 %830, label %831, label %850

831:                                              ; preds = %827
  %832 = load double, ptr %38, align 8, !tbaa !11
  %833 = load ptr, ptr %36, align 8, !tbaa !5
  %834 = load i32, ptr %52, align 4, !tbaa !9
  %835 = sext i32 %834 to i64
  %836 = getelementptr inbounds float, ptr %833, i64 %835
  %837 = load float, ptr %836, align 4, !tbaa !35
  %838 = fpext float %837 to double
  %839 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %840 = load ptr, ptr %839, align 8, !tbaa !31
  %841 = load i32, ptr %52, align 4, !tbaa !9
  %842 = sext i32 %841 to i64
  %843 = getelementptr inbounds double, ptr %840, i64 %842
  %844 = load double, ptr %843, align 8, !tbaa !11
  %845 = fneg double %832
  %846 = call double @llvm.fmuladd.f64(double %845, double %838, double %844)
  store double %846, ptr %843, align 8, !tbaa !11
  br label %847

847:                                              ; preds = %831
  %848 = load i32, ptr %52, align 4, !tbaa !9
  %849 = add nsw i32 %848, 1
  store i32 %849, ptr %52, align 4, !tbaa !9
  br label %827, !llvm.loop !48

850:                                              ; preds = %827
  br label %875

851:                                              ; preds = %816
  store i32 0, ptr %52, align 4, !tbaa !9
  br label %852

852:                                              ; preds = %871, %851
  %853 = load i32, ptr %52, align 4, !tbaa !9
  %854 = load i32, ptr %13, align 4, !tbaa !9
  %855 = icmp slt i32 %853, %854
  br i1 %855, label %856, label %874

856:                                              ; preds = %852
  %857 = load double, ptr %38, align 8, !tbaa !11
  %858 = load ptr, ptr %36, align 8, !tbaa !5
  %859 = load i32, ptr %52, align 4, !tbaa !9
  %860 = sext i32 %859 to i64
  %861 = getelementptr inbounds float, ptr %858, i64 %860
  %862 = load float, ptr %861, align 4, !tbaa !35
  %863 = fpext float %862 to double
  %864 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %865 = load ptr, ptr %864, align 8, !tbaa !31
  %866 = load i32, ptr %52, align 4, !tbaa !9
  %867 = sext i32 %866 to i64
  %868 = getelementptr inbounds double, ptr %865, i64 %867
  %869 = load double, ptr %868, align 8, !tbaa !11
  %870 = call double @llvm.fmuladd.f64(double %857, double %863, double %869)
  store double %870, ptr %868, align 8, !tbaa !11
  br label %871

871:                                              ; preds = %856
  %872 = load i32, ptr %52, align 4, !tbaa !9
  %873 = add nsw i32 %872, 1
  store i32 %873, ptr %52, align 4, !tbaa !9
  br label %852, !llvm.loop !49

874:                                              ; preds = %852
  br label %875

875:                                              ; preds = %874, %850
  br label %876

876:                                              ; preds = %875, %808
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #10
  call void @llvm.lifetime.end.p0(i64 1, ptr %51) #10
  call void @llvm.lifetime.end.p0(i64 1, ptr %50) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #10
  store i32 0, ptr %34, align 4
  br label %877

877:                                              ; preds = %876, %286
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #10
  %878 = load i32, ptr %34, align 4
  switch i32 %878, label %1003 [
    i32 0, label %879
    i32 21, label %880
  ]

879:                                              ; preds = %877
  br label %254, !llvm.loop !50

880:                                              ; preds = %877, %254
  %881 = load i32, ptr %29, align 4, !tbaa !9
  %882 = load i32, ptr %30, align 4, !tbaa !9
  %883 = icmp sge i32 %881, %882
  br i1 %883, label %884, label %895

884:                                              ; preds = %880
  %885 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  %886 = load i32, ptr %885, align 8, !tbaa !29
  %887 = load i32, ptr %13, align 4, !tbaa !9
  %888 = icmp slt i32 %886, %887
  br i1 %888, label %889, label %892

889:                                              ; preds = %884
  call void @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117) %56)
  %890 = load i32, ptr %13, align 4, !tbaa !9
  %891 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 1
  store i32 %890, ptr %891, align 8, !tbaa !29
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef @.str.2)
  br label %892

892:                                              ; preds = %889, %884
  %893 = load ptr, ptr @stderr, align 8, !tbaa !5
  %894 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %893, ptr noundef @.str.3) #10
  br label %895

895:                                              ; preds = %892, %880
  %896 = load ptr, ptr %56, align 8, !tbaa !17
  %897 = getelementptr inbounds ptr, ptr %896, i64 3
  %898 = load ptr, ptr %897, align 8
  %899 = call noundef double %898(ptr noundef nonnull align 8 dereferenceable(117) %56)
  %900 = load ptr, ptr %21, align 8, !tbaa !5
  %901 = getelementptr inbounds %"struct.Solver::SolutionInfo", ptr %900, i32 0, i32 1
  store double %899, ptr %901, align 8, !tbaa !51
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #10
  store double 0.000000e+00, ptr %53, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #10
  store i32 0, ptr %54, align 4, !tbaa !9
  br label %902

902:                                              ; preds = %928, %895
  %903 = load i32, ptr %54, align 4, !tbaa !9
  %904 = load i32, ptr %13, align 4, !tbaa !9
  %905 = icmp slt i32 %903, %904
  br i1 %905, label %906, label %931

906:                                              ; preds = %902
  %907 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %908 = load ptr, ptr %907, align 8, !tbaa !34
  %909 = load i32, ptr %54, align 4, !tbaa !9
  %910 = sext i32 %909 to i64
  %911 = getelementptr inbounds double, ptr %908, i64 %910
  %912 = load double, ptr %911, align 8, !tbaa !11
  %913 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %914 = load ptr, ptr %913, align 8, !tbaa !30
  %915 = load i32, ptr %54, align 4, !tbaa !9
  %916 = sext i32 %915 to i64
  %917 = getelementptr inbounds double, ptr %914, i64 %916
  %918 = load double, ptr %917, align 8, !tbaa !11
  %919 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 12
  %920 = load ptr, ptr %919, align 8, !tbaa !32
  %921 = load i32, ptr %54, align 4, !tbaa !9
  %922 = sext i32 %921 to i64
  %923 = getelementptr inbounds double, ptr %920, i64 %922
  %924 = load double, ptr %923, align 8, !tbaa !11
  %925 = fadd double %918, %924
  %926 = load double, ptr %53, align 8, !tbaa !11
  %927 = call double @llvm.fmuladd.f64(double %912, double %925, double %926)
  store double %927, ptr %53, align 8, !tbaa !11
  br label %928

928:                                              ; preds = %906
  %929 = load i32, ptr %54, align 4, !tbaa !9
  %930 = add nsw i32 %929, 1
  store i32 %930, ptr %54, align 4, !tbaa !9
  br label %902, !llvm.loop !53

931:                                              ; preds = %902
  %932 = load double, ptr %53, align 8, !tbaa !11
  %933 = fdiv double %932, 2.000000e+00
  %934 = load ptr, ptr %21, align 8, !tbaa !5
  %935 = getelementptr inbounds %"struct.Solver::SolutionInfo", ptr %934, i32 0, i32 0
  store double %933, ptr %935, align 8, !tbaa !54
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #10
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #10
  store i32 0, ptr %55, align 4, !tbaa !9
  br label %936

936:                                              ; preds = %957, %931
  %937 = load i32, ptr %55, align 4, !tbaa !9
  %938 = load i32, ptr %13, align 4, !tbaa !9
  %939 = icmp slt i32 %937, %938
  br i1 %939, label %941, label %940

940:                                              ; preds = %936
  store i32 40, ptr %34, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #10
  br label %960

941:                                              ; preds = %936
  %942 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %943 = load ptr, ptr %942, align 8, !tbaa !34
  %944 = load i32, ptr %55, align 4, !tbaa !9
  %945 = sext i32 %944 to i64
  %946 = getelementptr inbounds double, ptr %943, i64 %945
  %947 = load double, ptr %946, align 8, !tbaa !11
  %948 = load ptr, ptr %17, align 8, !tbaa !5
  %949 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 13
  %950 = load ptr, ptr %949, align 8, !tbaa !27
  %951 = load i32, ptr %55, align 4, !tbaa !9
  %952 = sext i32 %951 to i64
  %953 = getelementptr inbounds i32, ptr %950, i64 %952
  %954 = load i32, ptr %953, align 4, !tbaa !9
  %955 = sext i32 %954 to i64
  %956 = getelementptr inbounds double, ptr %948, i64 %955
  store double %947, ptr %956, align 8, !tbaa !11
  br label %957

957:                                              ; preds = %941
  %958 = load i32, ptr %55, align 4, !tbaa !9
  %959 = add nsw i32 %958, 1
  store i32 %959, ptr %55, align 4, !tbaa !9
  br label %936, !llvm.loop !55

960:                                              ; preds = %940
  %961 = load double, ptr %18, align 8, !tbaa !11
  %962 = load ptr, ptr %21, align 8, !tbaa !5
  %963 = getelementptr inbounds %"struct.Solver::SolutionInfo", ptr %962, i32 0, i32 2
  store double %961, ptr %963, align 8, !tbaa !56
  %964 = load double, ptr %19, align 8, !tbaa !11
  %965 = load ptr, ptr %21, align 8, !tbaa !5
  %966 = getelementptr inbounds %"struct.Solver::SolutionInfo", ptr %965, i32 0, i32 3
  store double %964, ptr %966, align 8, !tbaa !57
  %967 = load i32, ptr %29, align 4, !tbaa !9
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef @.str.4, i32 noundef %967)
  %968 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 12
  %969 = load ptr, ptr %968, align 8, !tbaa !32
  %970 = icmp eq ptr %969, null
  br i1 %970, label %972, label %971

971:                                              ; preds = %960
  call void @_ZdaPv(ptr noundef %969) #11
  br label %972

972:                                              ; preds = %971, %960
  %973 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 3
  %974 = load ptr, ptr %973, align 8, !tbaa !40
  %975 = icmp eq ptr %974, null
  br i1 %975, label %977, label %976

976:                                              ; preds = %972
  call void @_ZdaPv(ptr noundef %974) #11
  br label %977

977:                                              ; preds = %976, %972
  %978 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 6
  %979 = load ptr, ptr %978, align 8, !tbaa !34
  %980 = icmp eq ptr %979, null
  br i1 %980, label %982, label %981

981:                                              ; preds = %977
  call void @_ZdaPv(ptr noundef %979) #11
  br label %982

982:                                              ; preds = %981, %977
  %983 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 5
  %984 = load ptr, ptr %983, align 8, !tbaa !24
  %985 = icmp eq ptr %984, null
  br i1 %985, label %987, label %986

986:                                              ; preds = %982
  call void @_ZdaPv(ptr noundef %984) #11
  br label %987

987:                                              ; preds = %986, %982
  %988 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 13
  %989 = load ptr, ptr %988, align 8, !tbaa !27
  %990 = icmp eq ptr %989, null
  br i1 %990, label %992, label %991

991:                                              ; preds = %987
  call void @_ZdaPv(ptr noundef %989) #11
  br label %992

992:                                              ; preds = %991, %987
  %993 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 4
  %994 = load ptr, ptr %993, align 8, !tbaa !30
  %995 = icmp eq ptr %994, null
  br i1 %995, label %997, label %996

996:                                              ; preds = %992
  call void @_ZdaPv(ptr noundef %994) #11
  br label %997

997:                                              ; preds = %996, %992
  %998 = getelementptr inbounds %class.Solver, ptr %56, i32 0, i32 14
  %999 = load ptr, ptr %998, align 8, !tbaa !31
  %1000 = icmp eq ptr %999, null
  br i1 %1000, label %1002, label %1001

1001:                                             ; preds = %997
  call void @_ZdaPv(ptr noundef %999) #11
  br label %1002

1002:                                             ; preds = %1001, %997
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #10
  ret void

1003:                                             ; preds = %877
  unreachable
}

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIKddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) #5

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIKaaEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) #5

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) #5

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZN6Solver14is_lower_boundEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL3maxIiET_S0_S0_(i32 noundef, i32 noundef) #7

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef, i32 noundef) #7

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #8

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !10, i64 112}
!14 = !{!"_ZTS6Solver", !10, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !12, i64 64, !12, i64 72, !12, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !10, i64 112, !15, i64 116}
!15 = !{!"bool", !7, i64 0}
!16 = !{!14, !6, i64 48}
!17 = !{!18, !18, i64 0}
!18 = !{!"vtable pointer", !8, i64 0}
!19 = !{!14, !6, i64 56}
!20 = !{!14, !12, i64 72}
!21 = !{!14, !12, i64 80}
!22 = !{!14, !12, i64 64}
!23 = !{!14, !15, i64 116}
!24 = !{!14, !6, i64 32}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!14, !6, i64 96}
!28 = distinct !{!28, !26}
!29 = !{!14, !10, i64 8}
!30 = !{!14, !6, i64 24}
!31 = !{!14, !6, i64 104}
!32 = !{!14, !6, i64 88}
!33 = distinct !{!33, !26}
!34 = !{!14, !6, i64 40}
!35 = !{!36, !36, i64 0}
!36 = !{!"float", !7, i64 0}
!37 = distinct !{!37, !26}
!38 = distinct !{!38, !26}
!39 = distinct !{!39, !26}
!40 = !{!14, !6, i64 16}
!41 = !{!7, !7, i64 0}
!42 = distinct !{!42, !26}
!43 = !{!15, !15, i64 0}
!44 = !{i8 0, i8 2}
!45 = !{}
!46 = distinct !{!46, !26}
!47 = distinct !{!47, !26}
!48 = distinct !{!48, !26}
!49 = distinct !{!49, !26}
!50 = distinct !{!50, !26}
!51 = !{!52, !12, i64 8}
!52 = !{!"_ZTSN6Solver12SolutionInfoE", !12, i64 0, !12, i64 8, !12, i64 16, !12, i64 24, !12, i64 32}
!53 = distinct !{!53, !26}
!54 = !{!52, !12, i64 0}
!55 = distinct !{!55, !26}
!56 = !{!52, !12, i64 16}
!57 = !{!52, !12, i64 24}


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

@.str.1 = external hidden unnamed_addr constant [2 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [2 x i8], align 1
@stderr = external local_unnamed_addr global ptr, align 8
@.str.3 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [36 x i8], align 1

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

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

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) local_unnamed_addr #1

; Function Attrs: nobuiltin nounwind
declare void @_ZdaPv(ptr noundef) local_unnamed_addr #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 @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117)) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress uwtable
declare hidden void @_ZL4infoPKcz(ptr noundef, ...) local_unnamed_addr #4

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN6Solver5SolveEiRK7QMatrixPKdPKaPddddPNS_12SolutionInfoEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %1, ptr noundef nonnull align 8 dereferenceable(8) %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, double noundef %6, double noundef %7, double noundef %8, ptr nocapture noundef writeonly %9, i32 noundef %10) local_unnamed_addr #4 align 2 {
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = getelementptr inbounds i8, ptr %0, i64 112
  store i32 %1, ptr %14, align 8, !tbaa !5
  %15 = getelementptr inbounds i8, ptr %0, i64 48
  store ptr %2, ptr %15, align 8, !tbaa !13
  %16 = load ptr, ptr %2, align 8, !tbaa !14
  %17 = getelementptr inbounds i8, ptr %16, i64 8
  %18 = load ptr, ptr %17, align 8
  %19 = tail call noundef ptr %18(ptr noundef nonnull align 8 dereferenceable(8) %2)
  %20 = getelementptr inbounds i8, ptr %0, i64 56
  store ptr %19, ptr %20, align 8, !tbaa !16
  %21 = getelementptr inbounds i8, ptr %0, i64 88
  tail call void @_ZL5cloneIKddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %21, ptr noundef %3, i32 noundef %1)
  %22 = getelementptr inbounds i8, ptr %0, i64 16
  tail call void @_ZL5cloneIKaaEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %22, ptr noundef %4, i32 noundef %1)
  %23 = getelementptr inbounds i8, ptr %0, i64 40
  tail call void @_ZL5cloneIddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8) %23, ptr noundef %5, i32 noundef %1)
  %24 = getelementptr inbounds i8, ptr %0, i64 72
  store double %6, ptr %24, align 8, !tbaa !17
  %25 = getelementptr inbounds i8, ptr %0, i64 80
  store double %7, ptr %25, align 8, !tbaa !18
  %26 = getelementptr inbounds i8, ptr %0, i64 64
  store double %8, ptr %26, align 8, !tbaa !19
  %27 = getelementptr inbounds i8, ptr %0, i64 116
  store i8 0, ptr %27, align 4, !tbaa !20
  %28 = sext i32 %1 to i64
  %29 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %28) #10
  %30 = getelementptr inbounds i8, ptr %0, i64 32
  store ptr %29, ptr %30, align 8, !tbaa !21
  %31 = icmp sgt i32 %1, 0
  br i1 %31, label %.lr.ph, label %._crit_edge

._crit_edge:                                      ; preds = %.lr.ph, %11
  %32 = icmp slt i32 %1, 0
  %33 = shl nsw i64 %28, 2
  %34 = select i1 %32, i64 -1, i64 %33
  %35 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %34) #10
  %36 = getelementptr inbounds i8, ptr %0, i64 96
  store ptr %35, ptr %36, align 8, !tbaa !22
  br i1 %31, label %.lr.ph246.preheader, label %._crit_edge247

.lr.ph246.preheader:                              ; preds = %._crit_edge
  %wide.trip.count = zext nneg i32 %1 to i64
  %min.iters.check = icmp ult i32 %1, 8
  br i1 %min.iters.check, label %.lr.ph246.preheader484, label %vector.ph

.lr.ph246.preheader484:                           ; preds = %middle.block, %.lr.ph246.preheader
  %indvars.iv.ph = phi i64 [ 0, %.lr.ph246.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph246

vector.ph:                                        ; preds = %.lr.ph246.preheader
  %n.vec = and i64 %wide.trip.count, 2147483640
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.ind = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %vector.ph ], [ %vec.ind.next, %vector.body ]
  %step.add = add <4 x i32> %vec.ind, <i32 4, i32 4, i32 4, i32 4>
  %37 = getelementptr inbounds i32, ptr %35, i64 %index
  %38 = getelementptr inbounds i8, ptr %37, i64 16
  store <4 x i32> %vec.ind, ptr %37, align 4, !tbaa !23
  store <4 x i32> %step.add, ptr %38, align 4, !tbaa !23
  %index.next = add nuw i64 %index, 8
  %vec.ind.next = add <4 x i32> %vec.ind, <i32 8, i32 8, i32 8, i32 8>
  %39 = icmp eq i64 %index.next, %n.vec
  br i1 %39, label %middle.block, label %vector.body, !llvm.loop !24

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %._crit_edge247, label %.lr.ph246.preheader484

.lr.ph:                                           ; preds = %11, %.lr.ph
  %.0181243 = phi i32 [ %40, %.lr.ph ], [ 0, %11 ]
  tail call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %.0181243)
  %40 = add nuw nsw i32 %.0181243, 1
  %exitcond.not = icmp eq i32 %40, %1
  br i1 %exitcond.not, label %._crit_edge, label %.lr.ph, !llvm.loop !28

._crit_edge247:                                   ; preds = %.lr.ph246, %middle.block, %._crit_edge
  %41 = getelementptr inbounds i8, ptr %0, i64 8
  store i32 %1, ptr %41, align 8, !tbaa !29
  %42 = shl nsw i64 %28, 3
  %43 = select i1 %32, i64 -1, i64 %42
  %44 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %43) #10
  %45 = ptrtoint ptr %44 to i64
  %46 = getelementptr inbounds i8, ptr %0, i64 24
  store ptr %44, ptr %46, align 8, !tbaa !30
  %47 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %43) #10
  %48 = ptrtoint ptr %47 to i64
  %49 = getelementptr inbounds i8, ptr %0, i64 104
  store ptr %47, ptr %49, align 8, !tbaa !31
  br i1 %31, label %.lr.ph250, label %._crit_edge259

.lr.ph250:                                        ; preds = %._crit_edge247
  %50 = load ptr, ptr %21, align 8, !tbaa !32
  %wide.trip.count297 = zext nneg i32 %1 to i64
  %min.iters.check367 = icmp ult i32 %1, 14
  br i1 %min.iters.check367, label %scalar.ph366.preheader, label %vector.memcheck

scalar.ph366.preheader:                           ; preds = %middle.block365, %vector.memcheck, %.lr.ph250
  %indvars.iv294.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph250 ], [ %n.vec370, %middle.block365 ]
  %xtraiter = and i64 %wide.trip.count297, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %scalar.ph366.prol.loopexit, label %scalar.ph366.prol

scalar.ph366.prol:                                ; preds = %scalar.ph366.preheader, %scalar.ph366.prol
  %indvars.iv294.prol = phi i64 [ %indvars.iv.next295.prol, %scalar.ph366.prol ], [ %indvars.iv294.ph, %scalar.ph366.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph366.prol ], [ 0, %scalar.ph366.preheader ]
  %51 = getelementptr inbounds double, ptr %50, i64 %indvars.iv294.prol
  %52 = load double, ptr %51, align 8, !tbaa !33
  %53 = getelementptr inbounds double, ptr %44, i64 %indvars.iv294.prol
  store double %52, ptr %53, align 8, !tbaa !33
  %54 = getelementptr inbounds double, ptr %47, i64 %indvars.iv294.prol
  store double 0.000000e+00, ptr %54, align 8, !tbaa !33
  %indvars.iv.next295.prol = add nuw nsw i64 %indvars.iv294.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %scalar.ph366.prol.loopexit, label %scalar.ph366.prol, !llvm.loop !34

scalar.ph366.prol.loopexit:                       ; preds = %scalar.ph366.prol, %scalar.ph366.preheader
  %indvars.iv294.unr = phi i64 [ %indvars.iv294.ph, %scalar.ph366.preheader ], [ %indvars.iv.next295.prol, %scalar.ph366.prol ]
  %55 = sub nsw i64 %indvars.iv294.ph, %wide.trip.count297
  %56 = icmp ugt i64 %55, -4
  br i1 %56, label %.preheader240, label %scalar.ph366

vector.memcheck:                                  ; preds = %.lr.ph250
  %57 = ptrtoint ptr %50 to i64
  %58 = sub i64 %48, %45
  %diff.check = icmp ult i64 %58, 32
  %59 = sub i64 %45, %57
  %diff.check362 = icmp ult i64 %59, 32
  %conflict.rdx = or i1 %diff.check, %diff.check362
  %60 = sub i64 %48, %57
  %diff.check363 = icmp ult i64 %60, 32
  %conflict.rdx364 = or i1 %conflict.rdx, %diff.check363
  br i1 %conflict.rdx364, label %scalar.ph366.preheader, label %vector.ph368

vector.ph368:                                     ; preds = %vector.memcheck
  %n.vec370 = and i64 %wide.trip.count297, 2147483644
  br label %vector.body372

vector.body372:                                   ; preds = %vector.body372, %vector.ph368
  %index373 = phi i64 [ 0, %vector.ph368 ], [ %index.next375, %vector.body372 ]
  %61 = getelementptr inbounds double, ptr %50, i64 %index373
  %62 = getelementptr inbounds i8, ptr %61, i64 16
  %wide.load = load <2 x double>, ptr %61, align 8, !tbaa !33
  %wide.load374 = load <2 x double>, ptr %62, align 8, !tbaa !33
  %63 = getelementptr inbounds double, ptr %44, i64 %index373
  %64 = getelementptr inbounds i8, ptr %63, i64 16
  store <2 x double> %wide.load, ptr %63, align 8, !tbaa !33
  store <2 x double> %wide.load374, ptr %64, align 8, !tbaa !33
  %65 = getelementptr inbounds double, ptr %47, i64 %index373
  %66 = getelementptr inbounds i8, ptr %65, i64 16
  store <2 x double> zeroinitializer, ptr %65, align 8, !tbaa !33
  store <2 x double> zeroinitializer, ptr %66, align 8, !tbaa !33
  %index.next375 = add nuw i64 %index373, 4
  %67 = icmp eq i64 %index.next375, %n.vec370
  br i1 %67, label %middle.block365, label %vector.body372, !llvm.loop !36

middle.block365:                                  ; preds = %vector.body372
  %cmp.n376 = icmp eq i64 %n.vec370, %wide.trip.count297
  br i1 %cmp.n376, label %.preheader240, label %scalar.ph366.preheader

.lr.ph246:                                        ; preds = %.lr.ph246.preheader484, %.lr.ph246
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph246 ], [ %indvars.iv.ph, %.lr.ph246.preheader484 ]
  %68 = getelementptr inbounds i32, ptr %35, i64 %indvars.iv
  %69 = trunc nuw nsw i64 %indvars.iv to i32
  store i32 %69, ptr %68, align 4, !tbaa !23
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond293.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond293.not, label %._crit_edge247, label %.lr.ph246, !llvm.loop !37

.preheader240:                                    ; preds = %scalar.ph366.prol.loopexit, %scalar.ph366, %middle.block365
  br i1 %31, label %.lr.ph258, label %._crit_edge259

.lr.ph258:                                        ; preds = %.preheader240
  %wide.trip.count312 = zext nneg i32 %1 to i64
  %min.iters.check379 = icmp ult i32 %1, 4
  %n.vec382 = and i64 %wide.trip.count297, 2147483644
  %cmp.n391 = icmp eq i64 %n.vec382, %wide.trip.count297
  br label %86

scalar.ph366:                                     ; preds = %scalar.ph366.prol.loopexit, %scalar.ph366
  %indvars.iv294 = phi i64 [ %indvars.iv.next295.3, %scalar.ph366 ], [ %indvars.iv294.unr, %scalar.ph366.prol.loopexit ]
  %70 = getelementptr inbounds double, ptr %50, i64 %indvars.iv294
  %71 = load double, ptr %70, align 8, !tbaa !33
  %72 = getelementptr inbounds double, ptr %44, i64 %indvars.iv294
  store double %71, ptr %72, align 8, !tbaa !33
  %73 = getelementptr inbounds double, ptr %47, i64 %indvars.iv294
  store double 0.000000e+00, ptr %73, align 8, !tbaa !33
  %indvars.iv.next295 = add nuw nsw i64 %indvars.iv294, 1
  %74 = getelementptr inbounds double, ptr %50, i64 %indvars.iv.next295
  %75 = load double, ptr %74, align 8, !tbaa !33
  %76 = getelementptr inbounds double, ptr %44, i64 %indvars.iv.next295
  store double %75, ptr %76, align 8, !tbaa !33
  %77 = getelementptr inbounds double, ptr %47, i64 %indvars.iv.next295
  store double 0.000000e+00, ptr %77, align 8, !tbaa !33
  %indvars.iv.next295.1 = add nuw nsw i64 %indvars.iv294, 2
  %78 = getelementptr inbounds double, ptr %50, i64 %indvars.iv.next295.1
  %79 = load double, ptr %78, align 8, !tbaa !33
  %80 = getelementptr inbounds double, ptr %44, i64 %indvars.iv.next295.1
  store double %79, ptr %80, align 8, !tbaa !33
  %81 = getelementptr inbounds double, ptr %47, i64 %indvars.iv.next295.1
  store double 0.000000e+00, ptr %81, align 8, !tbaa !33
  %indvars.iv.next295.2 = add nuw nsw i64 %indvars.iv294, 3
  %82 = getelementptr inbounds double, ptr %50, i64 %indvars.iv.next295.2
  %83 = load double, ptr %82, align 8, !tbaa !33
  %84 = getelementptr inbounds double, ptr %44, i64 %indvars.iv.next295.2
  store double %83, ptr %84, align 8, !tbaa !33
  %85 = getelementptr inbounds double, ptr %47, i64 %indvars.iv.next295.2
  store double 0.000000e+00, ptr %85, align 8, !tbaa !33
  %indvars.iv.next295.3 = add nuw nsw i64 %indvars.iv294, 4
  %exitcond298.not.3 = icmp eq i64 %indvars.iv.next295.3, %wide.trip.count297
  br i1 %exitcond298.not.3, label %.preheader240, label %scalar.ph366, !llvm.loop !38

86:                                               ; preds = %.lr.ph258, %.loopexit239
  %indvars.iv309 = phi i64 [ 0, %.lr.ph258 ], [ %indvars.iv.next310, %.loopexit239 ]
  %87 = trunc nuw nsw i64 %indvars.iv309 to i32
  %88 = tail call noundef zeroext i1 @_ZN6Solver14is_lower_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %87)
  br i1 %88, label %.loopexit239, label %.lr.ph253

.lr.ph253:                                        ; preds = %86
  %89 = load ptr, ptr %2, align 8, !tbaa !14
  %90 = load ptr, ptr %89, align 8
  %91 = tail call noundef ptr %90(ptr noundef nonnull align 8 dereferenceable(8) %2, i32 noundef %87, i32 noundef %1)
  %92 = load ptr, ptr %23, align 8, !tbaa !39
  %93 = getelementptr inbounds double, ptr %92, i64 %indvars.iv309
  %94 = load double, ptr %93, align 8, !tbaa !33
  %95 = load ptr, ptr %46, align 8, !tbaa !30
  br i1 %min.iters.check379, label %scalar.ph378.preheader, label %vector.ph380

vector.ph380:                                     ; preds = %.lr.ph253
  %broadcast.splatinsert = insertelement <2 x double> poison, double %94, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body384

vector.body384:                                   ; preds = %vector.body384, %vector.ph380
  %index385 = phi i64 [ 0, %vector.ph380 ], [ %index.next390, %vector.body384 ]
  %96 = getelementptr inbounds float, ptr %91, i64 %index385
  %97 = getelementptr inbounds i8, ptr %96, i64 8
  %wide.load386 = load <2 x float>, ptr %96, align 4, !tbaa !40
  %wide.load387 = load <2 x float>, ptr %97, align 4, !tbaa !40
  %98 = fpext <2 x float> %wide.load386 to <2 x double>
  %99 = fpext <2 x float> %wide.load387 to <2 x double>
  %100 = getelementptr inbounds double, ptr %95, i64 %index385
  %101 = getelementptr inbounds i8, ptr %100, i64 16
  %wide.load388 = load <2 x double>, ptr %100, align 8, !tbaa !33
  %wide.load389 = load <2 x double>, ptr %101, align 8, !tbaa !33
  %102 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %98, <2 x double> %wide.load388)
  %103 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %99, <2 x double> %wide.load389)
  store <2 x double> %102, ptr %100, align 8, !tbaa !33
  store <2 x double> %103, ptr %101, align 8, !tbaa !33
  %index.next390 = add nuw i64 %index385, 4
  %104 = icmp eq i64 %index.next390, %n.vec382
  br i1 %104, label %middle.block377, label %vector.body384, !llvm.loop !42

middle.block377:                                  ; preds = %vector.body384
  br i1 %cmp.n391, label %._crit_edge254, label %scalar.ph378.preheader

scalar.ph378.preheader:                           ; preds = %middle.block377, %.lr.ph253
  %indvars.iv299.ph = phi i64 [ 0, %.lr.ph253 ], [ %n.vec382, %middle.block377 ]
  br label %scalar.ph378

scalar.ph378:                                     ; preds = %scalar.ph378.preheader, %scalar.ph378
  %indvars.iv299 = phi i64 [ %indvars.iv.next300, %scalar.ph378 ], [ %indvars.iv299.ph, %scalar.ph378.preheader ]
  %105 = getelementptr inbounds float, ptr %91, i64 %indvars.iv299
  %106 = load float, ptr %105, align 4, !tbaa !40
  %107 = fpext float %106 to double
  %108 = getelementptr inbounds double, ptr %95, i64 %indvars.iv299
  %109 = load double, ptr %108, align 8, !tbaa !33
  %110 = tail call double @llvm.fmuladd.f64(double %94, double %107, double %109)
  store double %110, ptr %108, align 8, !tbaa !33
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %exitcond303.not = icmp eq i64 %indvars.iv.next300, %wide.trip.count312
  br i1 %exitcond303.not, label %._crit_edge254, label %scalar.ph378, !llvm.loop !43

._crit_edge254:                                   ; preds = %scalar.ph378, %middle.block377
  %111 = tail call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %87)
  br i1 %111, label %.lr.ph256, label %.loopexit239

.lr.ph256:                                        ; preds = %._crit_edge254, %.lr.ph256
  %indvars.iv304 = phi i64 [ %indvars.iv.next305, %.lr.ph256 ], [ 0, %._crit_edge254 ]
  %112 = tail call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %87)
  %113 = getelementptr inbounds float, ptr %91, i64 %indvars.iv304
  %114 = load float, ptr %113, align 4, !tbaa !40
  %115 = fpext float %114 to double
  %116 = load ptr, ptr %49, align 8, !tbaa !31
  %117 = getelementptr inbounds double, ptr %116, i64 %indvars.iv304
  %118 = load double, ptr %117, align 8, !tbaa !33
  %119 = tail call double @llvm.fmuladd.f64(double %112, double %115, double %118)
  store double %119, ptr %117, align 8, !tbaa !33
  %indvars.iv.next305 = add nuw nsw i64 %indvars.iv304, 1
  %exitcond308.not = icmp eq i64 %indvars.iv.next305, %wide.trip.count312
  br i1 %exitcond308.not, label %.loopexit239, label %.lr.ph256, !llvm.loop !44

.loopexit239:                                     ; preds = %.lr.ph256, %._crit_edge254, %86
  %indvars.iv.next310 = add nuw nsw i64 %indvars.iv309, 1
  %exitcond313.not = icmp eq i64 %indvars.iv.next310, %wide.trip.count312
  br i1 %exitcond313.not, label %._crit_edge259, label %86, !llvm.loop !45

._crit_edge259:                                   ; preds = %.loopexit239, %._crit_edge247, %.preheader240
  %120 = icmp sgt i32 %1, 21474836
  %121 = mul nsw i32 %1, 100
  %122 = select i1 %120, i32 2147483647, i32 %121
  %123 = tail call noundef i32 @_ZL3maxIiET_S0_S0_(i32 noundef 10000000, i32 noundef %122)
  %124 = tail call noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef %1, i32 noundef 1000)
  %125 = icmp sgt i32 %123, 0
  br i1 %125, label %.lr.ph275, label %.loopexit237

.lr.ph275:                                        ; preds = %._crit_edge259
  %126 = add nsw i32 %124, 1
  %.not = icmp eq i32 %10, 0
  %wide.trip.count322 = zext i32 %1 to i64
  %wide.trip.count327 = zext nneg i32 %1 to i64
  %wide.trip.count332 = zext nneg i32 %1 to i64
  %wide.trip.count337 = zext nneg i32 %1 to i64
  %min.iters.check445 = icmp ult i32 %1, 4
  %n.vec448 = and i64 %wide.trip.count322, 2147483644
  %cmp.n459 = icmp eq i64 %n.vec448, %wide.trip.count322
  %min.iters.check428 = icmp ult i32 %1, 4
  %n.vec431 = and i64 %wide.trip.count322, 2147483644
  %cmp.n442 = icmp eq i64 %n.vec431, %wide.trip.count322
  %min.iters.check411 = icmp ult i32 %1, 4
  %n.vec414 = and i64 %wide.trip.count322, 2147483644
  %cmp.n425 = icmp eq i64 %n.vec414, %wide.trip.count322
  %min.iters.check394 = icmp ult i32 %1, 4
  %n.vec397 = and i64 %wide.trip.count322, 2147483644
  %cmp.n408 = icmp eq i64 %n.vec397, %wide.trip.count322
  br label %127

127:                                              ; preds = %.lr.ph275, %.loopexit
  %.0188273 = phi i32 [ 0, %.lr.ph275 ], [ %148, %.loopexit ]
  %.0191272 = phi i32 [ %126, %.lr.ph275 ], [ %.2193, %.loopexit ]
  %128 = add nsw i32 %.0191272, -1
  %129 = icmp eq i32 %128, 0
  br i1 %129, label %130, label %137

130:                                              ; preds = %127
  %131 = call noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef %1, i32 noundef 1000)
  br i1 %.not, label %136, label %132

132:                                              ; preds = %130
  %133 = load ptr, ptr %0, align 8, !tbaa !14
  %134 = getelementptr inbounds i8, ptr %133, i64 32
  %135 = load ptr, ptr %134, align 8
  call void %135(ptr noundef nonnull align 8 dereferenceable(117) %0)
  br label %136

136:                                              ; preds = %132, %130
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef nonnull @.str.1)
  br label %137

137:                                              ; preds = %136, %127
  %.1192 = phi i32 [ %131, %136 ], [ %128, %127 ]
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %12) #11
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %13) #11
  %138 = load ptr, ptr %0, align 8, !tbaa !14
  %139 = getelementptr inbounds i8, ptr %138, i64 16
  %140 = load ptr, ptr %139, align 8
  %141 = call noundef i32 %140(ptr noundef nonnull align 8 dereferenceable(117) %0, ptr noundef nonnull align 4 dereferenceable(4) %12, ptr noundef nonnull align 4 dereferenceable(4) %13)
  %.not221 = icmp eq i32 %141, 0
  br i1 %.not221, label %147, label %142

142:                                              ; preds = %137
  call void @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117) %0)
  store i32 %1, ptr %41, align 8, !tbaa !29
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef nonnull @.str.2)
  %143 = load ptr, ptr %0, align 8, !tbaa !14
  %144 = getelementptr inbounds i8, ptr %143, i64 16
  %145 = load ptr, ptr %144, align 8
  %146 = call noundef i32 %145(ptr noundef nonnull align 8 dereferenceable(117) %0, ptr noundef nonnull align 4 dereferenceable(4) %12, ptr noundef nonnull align 4 dereferenceable(4) %13)
  %.not222 = icmp eq i32 %146, 0
  br i1 %.not222, label %147, label %.thread

.thread:                                          ; preds = %142
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #11
  br label %.loopexit237

147:                                              ; preds = %142, %137
  %.2193 = phi i32 [ %.1192, %137 ], [ 1, %142 ]
  %148 = add nuw nsw i32 %.0188273, 1
  %149 = load i32, ptr %12, align 4, !tbaa !23
  %150 = load i32, ptr %41, align 8, !tbaa !29
  %151 = load ptr, ptr %2, align 8, !tbaa !14
  %152 = load ptr, ptr %151, align 8
  %153 = call noundef ptr %152(ptr noundef nonnull align 8 dereferenceable(8) %2, i32 noundef %149, i32 noundef %150)
  %154 = load i32, ptr %13, align 4, !tbaa !23
  %155 = load i32, ptr %41, align 8, !tbaa !29
  %156 = load ptr, ptr %2, align 8, !tbaa !14
  %157 = load ptr, ptr %156, align 8
  %158 = call noundef ptr %157(ptr noundef nonnull align 8 dereferenceable(8) %2, i32 noundef %154, i32 noundef %155)
  %159 = load i32, ptr %12, align 4, !tbaa !23
  %160 = call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %159)
  %161 = load i32, ptr %13, align 4, !tbaa !23
  %162 = call noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %161)
  %163 = load ptr, ptr %23, align 8, !tbaa !39
  %164 = load i32, ptr %12, align 4, !tbaa !23
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds double, ptr %163, i64 %165
  %167 = load double, ptr %166, align 8, !tbaa !33
  %168 = load i32, ptr %13, align 4, !tbaa !23
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds double, ptr %163, i64 %169
  %171 = load double, ptr %170, align 8, !tbaa !33
  %172 = load ptr, ptr %22, align 8, !tbaa !46
  %173 = getelementptr inbounds i8, ptr %172, i64 %165
  %174 = load i8, ptr %173, align 1, !tbaa !47
  %175 = getelementptr inbounds i8, ptr %172, i64 %169
  %176 = load i8, ptr %175, align 1, !tbaa !47
  %.not223 = icmp eq i8 %174, %176
  %177 = load ptr, ptr %20, align 8, !tbaa !16
  %178 = getelementptr inbounds double, ptr %177, i64 %165
  %179 = load double, ptr %178, align 8, !tbaa !33
  %180 = getelementptr inbounds double, ptr %177, i64 %169
  %181 = load double, ptr %180, align 8, !tbaa !33
  %182 = fadd double %179, %181
  %183 = getelementptr inbounds float, ptr %153, i64 %169
  %184 = load float, ptr %183, align 4, !tbaa !40
  %185 = fmul float %184, 2.000000e+00
  %186 = fpext float %185 to double
  %187 = load ptr, ptr %46, align 8, !tbaa !30
  %188 = getelementptr inbounds double, ptr %187, i64 %165
  %189 = load double, ptr %188, align 8, !tbaa !33
  br i1 %.not223, label %224, label %190

190:                                              ; preds = %147
  %191 = fadd double %182, %186
  %192 = fcmp ugt double %191, 0.000000e+00
  %.0197 = select i1 %192, double %191, double 0x3D719799812DEA11
  %193 = fneg double %189
  %194 = getelementptr inbounds double, ptr %187, i64 %169
  %195 = load double, ptr %194, align 8, !tbaa !33
  %196 = fsub double %193, %195
  %197 = fdiv double %196, %.0197
  %198 = fsub double %167, %171
  %199 = fadd double %167, %197
  store double %199, ptr %166, align 8, !tbaa !33
  %200 = load double, ptr %170, align 8, !tbaa !33
  %201 = fadd double %200, %197
  store double %201, ptr %170, align 8, !tbaa !33
  %202 = fcmp ogt double %198, 0.000000e+00
  br i1 %202, label %203, label %206

203:                                              ; preds = %190
  %204 = fcmp olt double %201, 0.000000e+00
  br i1 %204, label %205, label %211

205:                                              ; preds = %203
  store double 0.000000e+00, ptr %170, align 8, !tbaa !33
  store double %198, ptr %166, align 8, !tbaa !33
  br label %211

206:                                              ; preds = %190
  %207 = load double, ptr %166, align 8, !tbaa !33
  %208 = fcmp olt double %207, 0.000000e+00
  br i1 %208, label %209, label %211

209:                                              ; preds = %206
  store double 0.000000e+00, ptr %166, align 8, !tbaa !33
  %210 = fneg double %198
  store double %210, ptr %170, align 8, !tbaa !33
  br label %211

211:                                              ; preds = %206, %209, %203, %205
  %212 = fsub double %160, %162
  %213 = fcmp ogt double %198, %212
  br i1 %213, label %214, label %219

214:                                              ; preds = %211
  %215 = load double, ptr %166, align 8, !tbaa !33
  %216 = fcmp ogt double %215, %160
  br i1 %216, label %217, label %255

217:                                              ; preds = %214
  store double %160, ptr %166, align 8, !tbaa !33
  %218 = fsub double %160, %198
  store double %218, ptr %170, align 8, !tbaa !33
  br label %255

219:                                              ; preds = %211
  %220 = load double, ptr %170, align 8, !tbaa !33
  %221 = fcmp ogt double %220, %162
  br i1 %221, label %222, label %255

222:                                              ; preds = %219
  store double %162, ptr %170, align 8, !tbaa !33
  %223 = fadd double %162, %198
  store double %223, ptr %166, align 8, !tbaa !33
  br label %255

224:                                              ; preds = %147
  %225 = fsub double %182, %186
  %226 = fcmp ugt double %225, 0.000000e+00
  %.0195 = select i1 %226, double %225, double 0x3D719799812DEA11
  %227 = getelementptr inbounds double, ptr %187, i64 %169
  %228 = load double, ptr %227, align 8, !tbaa !33
  %229 = fsub double %189, %228
  %230 = fdiv double %229, %.0195
  %231 = fadd double %167, %171
  %232 = fsub double %167, %230
  store double %232, ptr %166, align 8, !tbaa !33
  %233 = load double, ptr %170, align 8, !tbaa !33
  %234 = fadd double %233, %230
  store double %234, ptr %170, align 8, !tbaa !33
  %235 = fcmp ogt double %231, %160
  br i1 %235, label %236, label %241

236:                                              ; preds = %224
  %237 = load double, ptr %166, align 8, !tbaa !33
  %238 = fcmp ogt double %237, %160
  br i1 %238, label %239, label %244

239:                                              ; preds = %236
  store double %160, ptr %166, align 8, !tbaa !33
  %240 = fsub double %231, %160
  store double %240, ptr %170, align 8, !tbaa !33
  br label %244

241:                                              ; preds = %224
  %242 = fcmp olt double %234, 0.000000e+00
  br i1 %242, label %243, label %244

243:                                              ; preds = %241
  store double 0.000000e+00, ptr %170, align 8, !tbaa !33
  store double %231, ptr %166, align 8, !tbaa !33
  br label %244

244:                                              ; preds = %241, %243, %236, %239
  %245 = fcmp ogt double %231, %162
  br i1 %245, label %246, label %251

246:                                              ; preds = %244
  %247 = load double, ptr %170, align 8, !tbaa !33
  %248 = fcmp ogt double %247, %162
  br i1 %248, label %249, label %255

249:                                              ; preds = %246
  store double %162, ptr %170, align 8, !tbaa !33
  %250 = fsub double %231, %162
  store double %250, ptr %166, align 8, !tbaa !33
  br label %255

251:                                              ; preds = %244
  %252 = load double, ptr %166, align 8, !tbaa !33
  %253 = fcmp olt double %252, 0.000000e+00
  br i1 %253, label %254, label %255

254:                                              ; preds = %251
  store double 0.000000e+00, ptr %166, align 8, !tbaa !33
  store double %231, ptr %170, align 8, !tbaa !33
  br label %255

255:                                              ; preds = %249, %246, %254, %251, %217, %214, %222, %219
  %256 = load double, ptr %166, align 8, !tbaa !33
  %257 = fsub double %256, %167
  %258 = load double, ptr %170, align 8, !tbaa !33
  %259 = fsub double %258, %171
  %260 = load i32, ptr %41, align 8, !tbaa !29
  %261 = icmp sgt i32 %260, 0
  br i1 %261, label %.lr.ph262, label %._crit_edge263

.lr.ph262:                                        ; preds = %255
  %wide.trip.count317 = zext nneg i32 %260 to i64
  %min.iters.check462 = icmp ult i32 %260, 4
  br i1 %min.iters.check462, label %scalar.ph461.preheader, label %vector.ph463

scalar.ph461.preheader:                           ; preds = %middle.block460, %.lr.ph262
  %indvars.iv314.ph = phi i64 [ 0, %.lr.ph262 ], [ %n.vec465, %middle.block460 ]
  br label %scalar.ph461

vector.ph463:                                     ; preds = %.lr.ph262
  %n.vec465 = and i64 %wide.trip.count317, 2147483644
  %broadcast.splatinsert473 = insertelement <2 x double> poison, double %259, i64 0
  %broadcast.splat474 = shufflevector <2 x double> %broadcast.splatinsert473, <2 x double> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert475 = insertelement <2 x double> poison, double %257, i64 0
  %broadcast.splat476 = shufflevector <2 x double> %broadcast.splatinsert475, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body467

vector.body467:                                   ; preds = %vector.body467, %vector.ph463
  %index468 = phi i64 [ 0, %vector.ph463 ], [ %index.next479, %vector.body467 ]
  %262 = getelementptr inbounds float, ptr %153, i64 %index468
  %263 = getelementptr inbounds i8, ptr %262, i64 8
  %wide.load469 = load <2 x float>, ptr %262, align 4, !tbaa !40
  %wide.load470 = load <2 x float>, ptr %263, align 4, !tbaa !40
  %264 = fpext <2 x float> %wide.load469 to <2 x double>
  %265 = fpext <2 x float> %wide.load470 to <2 x double>
  %266 = getelementptr inbounds float, ptr %158, i64 %index468
  %267 = getelementptr inbounds i8, ptr %266, i64 8
  %wide.load471 = load <2 x float>, ptr %266, align 4, !tbaa !40
  %wide.load472 = load <2 x float>, ptr %267, align 4, !tbaa !40
  %268 = fpext <2 x float> %wide.load471 to <2 x double>
  %269 = fpext <2 x float> %wide.load472 to <2 x double>
  %270 = fmul <2 x double> %broadcast.splat474, %268
  %271 = fmul <2 x double> %broadcast.splat474, %269
  %272 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %264, <2 x double> %broadcast.splat476, <2 x double> %270)
  %273 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %265, <2 x double> %broadcast.splat476, <2 x double> %271)
  %274 = getelementptr inbounds double, ptr %187, i64 %index468
  %275 = getelementptr inbounds i8, ptr %274, i64 16
  %wide.load477 = load <2 x double>, ptr %274, align 8, !tbaa !33
  %wide.load478 = load <2 x double>, ptr %275, align 8, !tbaa !33
  %276 = fadd <2 x double> %wide.load477, %272
  %277 = fadd <2 x double> %wide.load478, %273
  store <2 x double> %276, ptr %274, align 8, !tbaa !33
  store <2 x double> %277, ptr %275, align 8, !tbaa !33
  %index.next479 = add nuw i64 %index468, 4
  %278 = icmp eq i64 %index.next479, %n.vec465
  br i1 %278, label %middle.block460, label %vector.body467, !llvm.loop !48

middle.block460:                                  ; preds = %vector.body467
  %cmp.n480 = icmp eq i64 %n.vec465, %wide.trip.count317
  br i1 %cmp.n480, label %._crit_edge263, label %scalar.ph461.preheader

._crit_edge263:                                   ; preds = %scalar.ph461, %middle.block460, %255
  %279 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %164)
  %280 = load i32, ptr %13, align 4, !tbaa !23
  %281 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %280)
  %282 = load i32, ptr %12, align 4, !tbaa !23
  call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %282)
  %283 = load i32, ptr %13, align 4, !tbaa !23
  call void @_ZN6Solver19update_alpha_statusEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %283)
  %284 = load i32, ptr %12, align 4, !tbaa !23
  %285 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %284)
  %286 = xor i1 %279, %285
  br i1 %286, label %298, label %.loopexit234

scalar.ph461:                                     ; preds = %scalar.ph461.preheader, %scalar.ph461
  %indvars.iv314 = phi i64 [ %indvars.iv.next315, %scalar.ph461 ], [ %indvars.iv314.ph, %scalar.ph461.preheader ]
  %287 = getelementptr inbounds float, ptr %153, i64 %indvars.iv314
  %288 = load float, ptr %287, align 4, !tbaa !40
  %289 = fpext float %288 to double
  %290 = getelementptr inbounds float, ptr %158, i64 %indvars.iv314
  %291 = load float, ptr %290, align 4, !tbaa !40
  %292 = fpext float %291 to double
  %293 = fmul double %259, %292
  %294 = call double @llvm.fmuladd.f64(double %289, double %257, double %293)
  %295 = getelementptr inbounds double, ptr %187, i64 %indvars.iv314
  %296 = load double, ptr %295, align 8, !tbaa !33
  %297 = fadd double %296, %294
  store double %297, ptr %295, align 8, !tbaa !33
  %indvars.iv.next315 = add nuw nsw i64 %indvars.iv314, 1
  %exitcond318.not = icmp eq i64 %indvars.iv.next315, %wide.trip.count317
  br i1 %exitcond318.not, label %._crit_edge263, label %scalar.ph461, !llvm.loop !49

298:                                              ; preds = %._crit_edge263
  %299 = load i32, ptr %12, align 4, !tbaa !23
  %300 = load ptr, ptr %2, align 8, !tbaa !14
  %301 = load ptr, ptr %300, align 8
  %302 = call noundef ptr %301(ptr noundef nonnull align 8 dereferenceable(8) %2, i32 noundef %299, i32 noundef %1)
  br i1 %279, label %.preheader233, label %.preheader235

.preheader235:                                    ; preds = %298
  br i1 %31, label %.lr.ph265, label %.loopexit234

.lr.ph265:                                        ; preds = %.preheader235
  %303 = load ptr, ptr %49, align 8, !tbaa !31
  br i1 %min.iters.check445, label %scalar.ph444.preheader, label %vector.ph446

scalar.ph444.preheader:                           ; preds = %middle.block443, %.lr.ph265
  %indvars.iv319.ph = phi i64 [ 0, %.lr.ph265 ], [ %n.vec448, %middle.block443 ]
  br label %scalar.ph444

vector.ph446:                                     ; preds = %.lr.ph265
  %broadcast.splatinsert456 = insertelement <2 x double> poison, double %160, i64 0
  %broadcast.splat457 = shufflevector <2 x double> %broadcast.splatinsert456, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body450

vector.body450:                                   ; preds = %vector.body450, %vector.ph446
  %index451 = phi i64 [ 0, %vector.ph446 ], [ %index.next458, %vector.body450 ]
  %304 = getelementptr inbounds float, ptr %302, i64 %index451
  %305 = getelementptr inbounds i8, ptr %304, i64 8
  %wide.load452 = load <2 x float>, ptr %304, align 4, !tbaa !40
  %wide.load453 = load <2 x float>, ptr %305, align 4, !tbaa !40
  %306 = fpext <2 x float> %wide.load452 to <2 x double>
  %307 = fpext <2 x float> %wide.load453 to <2 x double>
  %308 = getelementptr inbounds double, ptr %303, i64 %index451
  %309 = getelementptr inbounds i8, ptr %308, i64 16
  %wide.load454 = load <2 x double>, ptr %308, align 8, !tbaa !33
  %wide.load455 = load <2 x double>, ptr %309, align 8, !tbaa !33
  %310 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat457, <2 x double> %306, <2 x double> %wide.load454)
  %311 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat457, <2 x double> %307, <2 x double> %wide.load455)
  store <2 x double> %310, ptr %308, align 8, !tbaa !33
  store <2 x double> %311, ptr %309, align 8, !tbaa !33
  %index.next458 = add nuw i64 %index451, 4
  %312 = icmp eq i64 %index.next458, %n.vec448
  br i1 %312, label %middle.block443, label %vector.body450, !llvm.loop !50

middle.block443:                                  ; preds = %vector.body450
  br i1 %cmp.n459, label %.loopexit234, label %scalar.ph444.preheader

.preheader233:                                    ; preds = %298
  br i1 %31, label %.lr.ph267, label %.loopexit234

.lr.ph267:                                        ; preds = %.preheader233
  %313 = load ptr, ptr %49, align 8, !tbaa !31
  %314 = fneg double %160
  br i1 %min.iters.check428, label %scalar.ph427.preheader, label %vector.ph429

vector.ph429:                                     ; preds = %.lr.ph267
  %broadcast.splatinsert439 = insertelement <2 x double> poison, double %314, i64 0
  %broadcast.splat440 = shufflevector <2 x double> %broadcast.splatinsert439, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body433

vector.body433:                                   ; preds = %vector.body433, %vector.ph429
  %index434 = phi i64 [ 0, %vector.ph429 ], [ %index.next441, %vector.body433 ]
  %315 = getelementptr inbounds float, ptr %302, i64 %index434
  %316 = getelementptr inbounds i8, ptr %315, i64 8
  %wide.load435 = load <2 x float>, ptr %315, align 4, !tbaa !40
  %wide.load436 = load <2 x float>, ptr %316, align 4, !tbaa !40
  %317 = fpext <2 x float> %wide.load435 to <2 x double>
  %318 = fpext <2 x float> %wide.load436 to <2 x double>
  %319 = getelementptr inbounds double, ptr %313, i64 %index434
  %320 = getelementptr inbounds i8, ptr %319, i64 16
  %wide.load437 = load <2 x double>, ptr %319, align 8, !tbaa !33
  %wide.load438 = load <2 x double>, ptr %320, align 8, !tbaa !33
  %321 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat440, <2 x double> %317, <2 x double> %wide.load437)
  %322 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat440, <2 x double> %318, <2 x double> %wide.load438)
  store <2 x double> %321, ptr %319, align 8, !tbaa !33
  store <2 x double> %322, ptr %320, align 8, !tbaa !33
  %index.next441 = add nuw i64 %index434, 4
  %323 = icmp eq i64 %index.next441, %n.vec431
  br i1 %323, label %middle.block426, label %vector.body433, !llvm.loop !51

middle.block426:                                  ; preds = %vector.body433
  br i1 %cmp.n442, label %.loopexit234, label %scalar.ph427.preheader

scalar.ph427.preheader:                           ; preds = %middle.block426, %.lr.ph267
  %indvars.iv324.ph = phi i64 [ 0, %.lr.ph267 ], [ %n.vec431, %middle.block426 ]
  br label %scalar.ph427

scalar.ph427:                                     ; preds = %scalar.ph427.preheader, %scalar.ph427
  %indvars.iv324 = phi i64 [ %indvars.iv.next325, %scalar.ph427 ], [ %indvars.iv324.ph, %scalar.ph427.preheader ]
  %324 = getelementptr inbounds float, ptr %302, i64 %indvars.iv324
  %325 = load float, ptr %324, align 4, !tbaa !40
  %326 = fpext float %325 to double
  %327 = getelementptr inbounds double, ptr %313, i64 %indvars.iv324
  %328 = load double, ptr %327, align 8, !tbaa !33
  %329 = call double @llvm.fmuladd.f64(double %314, double %326, double %328)
  store double %329, ptr %327, align 8, !tbaa !33
  %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 %.loopexit234, label %scalar.ph427, !llvm.loop !52

scalar.ph444:                                     ; preds = %scalar.ph444.preheader, %scalar.ph444
  %indvars.iv319 = phi i64 [ %indvars.iv.next320, %scalar.ph444 ], [ %indvars.iv319.ph, %scalar.ph444.preheader ]
  %330 = getelementptr inbounds float, ptr %302, i64 %indvars.iv319
  %331 = load float, ptr %330, align 4, !tbaa !40
  %332 = fpext float %331 to double
  %333 = getelementptr inbounds double, ptr %303, i64 %indvars.iv319
  %334 = load double, ptr %333, align 8, !tbaa !33
  %335 = call double @llvm.fmuladd.f64(double %160, double %332, double %334)
  store double %335, ptr %333, align 8, !tbaa !33
  %indvars.iv.next320 = add nuw nsw i64 %indvars.iv319, 1
  %exitcond323.not = icmp eq i64 %indvars.iv.next320, %wide.trip.count322
  br i1 %exitcond323.not, label %.loopexit234, label %scalar.ph444, !llvm.loop !53

.loopexit234:                                     ; preds = %scalar.ph444, %scalar.ph427, %middle.block443, %middle.block426, %.preheader235, %.preheader233, %._crit_edge263
  %336 = load i32, ptr %13, align 4, !tbaa !23
  %337 = call noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117) %0, i32 noundef %336)
  %338 = xor i1 %281, %337
  br i1 %338, label %339, label %.loopexit

339:                                              ; preds = %.loopexit234
  %340 = load i32, ptr %13, align 4, !tbaa !23
  %341 = load ptr, ptr %2, align 8, !tbaa !14
  %342 = load ptr, ptr %341, align 8
  %343 = call noundef ptr %342(ptr noundef nonnull align 8 dereferenceable(8) %2, i32 noundef %340, i32 noundef %1)
  br i1 %281, label %.preheader, label %.preheader231

.preheader231:                                    ; preds = %339
  br i1 %31, label %.lr.ph269, label %.loopexit

.lr.ph269:                                        ; preds = %.preheader231
  %344 = load ptr, ptr %49, align 8, !tbaa !31
  br i1 %min.iters.check411, label %scalar.ph410.preheader, label %vector.ph412

scalar.ph410.preheader:                           ; preds = %middle.block409, %.lr.ph269
  %indvars.iv329.ph = phi i64 [ 0, %.lr.ph269 ], [ %n.vec414, %middle.block409 ]
  br label %scalar.ph410

vector.ph412:                                     ; preds = %.lr.ph269
  %broadcast.splatinsert422 = insertelement <2 x double> poison, double %162, i64 0
  %broadcast.splat423 = shufflevector <2 x double> %broadcast.splatinsert422, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body416

vector.body416:                                   ; preds = %vector.body416, %vector.ph412
  %index417 = phi i64 [ 0, %vector.ph412 ], [ %index.next424, %vector.body416 ]
  %345 = getelementptr inbounds float, ptr %343, i64 %index417
  %346 = getelementptr inbounds i8, ptr %345, i64 8
  %wide.load418 = load <2 x float>, ptr %345, align 4, !tbaa !40
  %wide.load419 = load <2 x float>, ptr %346, align 4, !tbaa !40
  %347 = fpext <2 x float> %wide.load418 to <2 x double>
  %348 = fpext <2 x float> %wide.load419 to <2 x double>
  %349 = getelementptr inbounds double, ptr %344, i64 %index417
  %350 = getelementptr inbounds i8, ptr %349, i64 16
  %wide.load420 = load <2 x double>, ptr %349, align 8, !tbaa !33
  %wide.load421 = load <2 x double>, ptr %350, align 8, !tbaa !33
  %351 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat423, <2 x double> %347, <2 x double> %wide.load420)
  %352 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat423, <2 x double> %348, <2 x double> %wide.load421)
  store <2 x double> %351, ptr %349, align 8, !tbaa !33
  store <2 x double> %352, ptr %350, align 8, !tbaa !33
  %index.next424 = add nuw i64 %index417, 4
  %353 = icmp eq i64 %index.next424, %n.vec414
  br i1 %353, label %middle.block409, label %vector.body416, !llvm.loop !54

middle.block409:                                  ; preds = %vector.body416
  br i1 %cmp.n425, label %.loopexit, label %scalar.ph410.preheader

.preheader:                                       ; preds = %339
  br i1 %31, label %.lr.ph271, label %.loopexit

.lr.ph271:                                        ; preds = %.preheader
  %354 = load ptr, ptr %49, align 8, !tbaa !31
  %355 = fneg double %162
  br i1 %min.iters.check394, label %scalar.ph393.preheader, label %vector.ph395

vector.ph395:                                     ; preds = %.lr.ph271
  %broadcast.splatinsert405 = insertelement <2 x double> poison, double %355, i64 0
  %broadcast.splat406 = shufflevector <2 x double> %broadcast.splatinsert405, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body399

vector.body399:                                   ; preds = %vector.body399, %vector.ph395
  %index400 = phi i64 [ 0, %vector.ph395 ], [ %index.next407, %vector.body399 ]
  %356 = getelementptr inbounds float, ptr %343, i64 %index400
  %357 = getelementptr inbounds i8, ptr %356, i64 8
  %wide.load401 = load <2 x float>, ptr %356, align 4, !tbaa !40
  %wide.load402 = load <2 x float>, ptr %357, align 4, !tbaa !40
  %358 = fpext <2 x float> %wide.load401 to <2 x double>
  %359 = fpext <2 x float> %wide.load402 to <2 x double>
  %360 = getelementptr inbounds double, ptr %354, i64 %index400
  %361 = getelementptr inbounds i8, ptr %360, i64 16
  %wide.load403 = load <2 x double>, ptr %360, align 8, !tbaa !33
  %wide.load404 = load <2 x double>, ptr %361, align 8, !tbaa !33
  %362 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat406, <2 x double> %358, <2 x double> %wide.load403)
  %363 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat406, <2 x double> %359, <2 x double> %wide.load404)
  store <2 x double> %362, ptr %360, align 8, !tbaa !33
  store <2 x double> %363, ptr %361, align 8, !tbaa !33
  %index.next407 = add nuw i64 %index400, 4
  %364 = icmp eq i64 %index.next407, %n.vec397
  br i1 %364, label %middle.block392, label %vector.body399, !llvm.loop !55

middle.block392:                                  ; preds = %vector.body399
  br i1 %cmp.n408, label %.loopexit, label %scalar.ph393.preheader

scalar.ph393.preheader:                           ; preds = %middle.block392, %.lr.ph271
  %indvars.iv334.ph = phi i64 [ 0, %.lr.ph271 ], [ %n.vec397, %middle.block392 ]
  br label %scalar.ph393

scalar.ph393:                                     ; preds = %scalar.ph393.preheader, %scalar.ph393
  %indvars.iv334 = phi i64 [ %indvars.iv.next335, %scalar.ph393 ], [ %indvars.iv334.ph, %scalar.ph393.preheader ]
  %365 = getelementptr inbounds float, ptr %343, i64 %indvars.iv334
  %366 = load float, ptr %365, align 4, !tbaa !40
  %367 = fpext float %366 to double
  %368 = getelementptr inbounds double, ptr %354, i64 %indvars.iv334
  %369 = load double, ptr %368, align 8, !tbaa !33
  %370 = call double @llvm.fmuladd.f64(double %355, double %367, double %369)
  store double %370, ptr %368, align 8, !tbaa !33
  %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 %.loopexit, label %scalar.ph393, !llvm.loop !56

scalar.ph410:                                     ; preds = %scalar.ph410.preheader, %scalar.ph410
  %indvars.iv329 = phi i64 [ %indvars.iv.next330, %scalar.ph410 ], [ %indvars.iv329.ph, %scalar.ph410.preheader ]
  %371 = getelementptr inbounds float, ptr %343, i64 %indvars.iv329
  %372 = load float, ptr %371, align 4, !tbaa !40
  %373 = fpext float %372 to double
  %374 = getelementptr inbounds double, ptr %344, i64 %indvars.iv329
  %375 = load double, ptr %374, align 8, !tbaa !33
  %376 = call double @llvm.fmuladd.f64(double %162, double %373, double %375)
  store double %376, ptr %374, align 8, !tbaa !33
  %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 %.loopexit, label %scalar.ph410, !llvm.loop !57

.loopexit:                                        ; preds = %scalar.ph410, %scalar.ph393, %middle.block409, %middle.block392, %.preheader231, %.preheader, %.loopexit234
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %13) #11
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %12) #11
  %exitcond339.not = icmp eq i32 %148, %123
  br i1 %exitcond339.not, label %.loopexit237.thread, label %127

.loopexit237:                                     ; preds = %._crit_edge259, %.thread
  %.0188242 = phi i32 [ %.0188273, %.thread ], [ 0, %._crit_edge259 ]
  %.not226 = icmp slt i32 %.0188242, %123
  br i1 %.not226, label %383, label %.loopexit237.thread

.loopexit237.thread:                              ; preds = %.loopexit, %.loopexit237
  %.0188242352 = phi i32 [ %.0188242, %.loopexit237 ], [ %123, %.loopexit ]
  %377 = load i32, ptr %41, align 8, !tbaa !29
  %378 = icmp slt i32 %377, %1
  br i1 %378, label %379, label %380

379:                                              ; preds = %.loopexit237.thread
  call void @_ZN6Solver20reconstruct_gradientEv(ptr noundef nonnull align 8 dereferenceable(117) %0)
  store i32 %1, ptr %41, align 8, !tbaa !29
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef nonnull @.str.2)
  br label %380

380:                                              ; preds = %379, %.loopexit237.thread
  %381 = load ptr, ptr @stderr, align 8, !tbaa !58
  %382 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %381, ptr noundef nonnull @.str.3) #12
  br label %383

383:                                              ; preds = %380, %.loopexit237
  %.0188242353 = phi i32 [ %.0188242352, %380 ], [ %.0188242, %.loopexit237 ]
  %384 = load ptr, ptr %0, align 8, !tbaa !14
  %385 = getelementptr inbounds i8, ptr %384, i64 24
  %386 = load ptr, ptr %385, align 8
  %387 = call noundef double %386(ptr noundef nonnull align 8 dereferenceable(117) %0)
  %388 = getelementptr inbounds i8, ptr %9, i64 8
  store double %387, ptr %388, align 8, !tbaa !59
  br i1 %31, label %.lr.ph279, label %._crit_edge280.thread

._crit_edge280.thread:                            ; preds = %383
  store double 0.000000e+00, ptr %9, align 8, !tbaa !61
  br label %._crit_edge285

.lr.ph279:                                        ; preds = %383
  %389 = load ptr, ptr %23, align 8, !tbaa !39
  %390 = load ptr, ptr %46, align 8, !tbaa !30
  %391 = load ptr, ptr %21, align 8, !tbaa !32
  %wide.trip.count343 = zext nneg i32 %1 to i64
  %xtraiter485 = and i64 %wide.trip.count343, 1
  %392 = icmp eq i32 %1, 1
  br i1 %392, label %._crit_edge280.unr-lcssa, label %.lr.ph279.new

.lr.ph279.new:                                    ; preds = %.lr.ph279
  %unroll_iter = and i64 %wide.trip.count343, 2147483646
  br label %393

393:                                              ; preds = %393, %.lr.ph279.new
  %indvars.iv340 = phi i64 [ 0, %.lr.ph279.new ], [ %indvars.iv.next341.1, %393 ]
  %.0179276 = phi double [ 0.000000e+00, %.lr.ph279.new ], [ %409, %393 ]
  %niter = phi i64 [ 0, %.lr.ph279.new ], [ %niter.next.1, %393 ]
  %394 = getelementptr inbounds double, ptr %389, i64 %indvars.iv340
  %395 = load double, ptr %394, align 8, !tbaa !33
  %396 = getelementptr inbounds double, ptr %390, i64 %indvars.iv340
  %397 = load double, ptr %396, align 8, !tbaa !33
  %398 = getelementptr inbounds double, ptr %391, i64 %indvars.iv340
  %399 = load double, ptr %398, align 8, !tbaa !33
  %400 = fadd double %397, %399
  %401 = call double @llvm.fmuladd.f64(double %395, double %400, double %.0179276)
  %indvars.iv.next341 = or disjoint i64 %indvars.iv340, 1
  %402 = getelementptr inbounds double, ptr %389, i64 %indvars.iv.next341
  %403 = load double, ptr %402, align 8, !tbaa !33
  %404 = getelementptr inbounds double, ptr %390, i64 %indvars.iv.next341
  %405 = load double, ptr %404, align 8, !tbaa !33
  %406 = getelementptr inbounds double, ptr %391, i64 %indvars.iv.next341
  %407 = load double, ptr %406, align 8, !tbaa !33
  %408 = fadd double %405, %407
  %409 = call double @llvm.fmuladd.f64(double %403, double %408, double %401)
  %indvars.iv.next341.1 = add nuw nsw i64 %indvars.iv340, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge280.unr-lcssa, label %393, !llvm.loop !62

._crit_edge280.unr-lcssa:                         ; preds = %393, %.lr.ph279
  %.lcssa.ph = phi double [ poison, %.lr.ph279 ], [ %409, %393 ]
  %indvars.iv340.unr = phi i64 [ 0, %.lr.ph279 ], [ %indvars.iv.next341.1, %393 ]
  %.0179276.unr = phi double [ 0.000000e+00, %.lr.ph279 ], [ %409, %393 ]
  %lcmp.mod486.not = icmp eq i64 %xtraiter485, 0
  br i1 %lcmp.mod486.not, label %._crit_edge280, label %._crit_edge280.epilog-lcssa

._crit_edge280.epilog-lcssa:                      ; preds = %._crit_edge280.unr-lcssa
  %410 = getelementptr inbounds double, ptr %389, i64 %indvars.iv340.unr
  %411 = load double, ptr %410, align 8, !tbaa !33
  %412 = getelementptr inbounds double, ptr %390, i64 %indvars.iv340.unr
  %413 = load double, ptr %412, align 8, !tbaa !33
  %414 = getelementptr inbounds double, ptr %391, i64 %indvars.iv340.unr
  %415 = load double, ptr %414, align 8, !tbaa !33
  %416 = fadd double %413, %415
  %417 = call double @llvm.fmuladd.f64(double %411, double %416, double %.0179276.unr)
  br label %._crit_edge280

._crit_edge280:                                   ; preds = %._crit_edge280.unr-lcssa, %._crit_edge280.epilog-lcssa
  %.lcssa = phi double [ %.lcssa.ph, %._crit_edge280.unr-lcssa ], [ %417, %._crit_edge280.epilog-lcssa ]
  %418 = fmul double %.lcssa, 5.000000e-01
  store double %418, ptr %9, align 8, !tbaa !61
  br i1 %31, label %.lr.ph284, label %._crit_edge285

.lr.ph284:                                        ; preds = %._crit_edge280
  %419 = load ptr, ptr %23, align 8, !tbaa !39
  %420 = load ptr, ptr %36, align 8, !tbaa !22
  %xtraiter489 = and i64 %wide.trip.count343, 3
  %421 = icmp ult i32 %1, 4
  br i1 %421, label %._crit_edge285.loopexit.unr-lcssa, label %.lr.ph284.new

.lr.ph284.new:                                    ; preds = %.lr.ph284
  %unroll_iter491 = and i64 %wide.trip.count343, 2147483644
  br label %432

._crit_edge285.loopexit.unr-lcssa:                ; preds = %432, %.lr.ph284
  %indvars.iv345.unr = phi i64 [ 0, %.lr.ph284 ], [ %indvars.iv.next346.3, %432 ]
  %lcmp.mod490.not = icmp eq i64 %xtraiter489, 0
  br i1 %lcmp.mod490.not, label %._crit_edge285, label %.epil.preheader488

.epil.preheader488:                               ; preds = %._crit_edge285.loopexit.unr-lcssa, %.epil.preheader488
  %indvars.iv345.epil = phi i64 [ %indvars.iv.next346.epil, %.epil.preheader488 ], [ %indvars.iv345.unr, %._crit_edge285.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader488 ], [ 0, %._crit_edge285.loopexit.unr-lcssa ]
  %422 = getelementptr inbounds double, ptr %419, i64 %indvars.iv345.epil
  %423 = load double, ptr %422, align 8, !tbaa !33
  %424 = getelementptr inbounds i32, ptr %420, i64 %indvars.iv345.epil
  %425 = load i32, ptr %424, align 4, !tbaa !23
  %426 = sext i32 %425 to i64
  %427 = getelementptr inbounds double, ptr %5, i64 %426
  store double %423, ptr %427, align 8, !tbaa !33
  %indvars.iv.next346.epil = add nuw nsw i64 %indvars.iv345.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter489
  br i1 %epil.iter.cmp.not, label %._crit_edge285, label %.epil.preheader488, !llvm.loop !63

._crit_edge285:                                   ; preds = %._crit_edge285.loopexit.unr-lcssa, %.epil.preheader488, %._crit_edge280.thread, %._crit_edge280
  %428 = getelementptr inbounds i8, ptr %9, i64 16
  store double %6, ptr %428, align 8, !tbaa !64
  %429 = getelementptr inbounds i8, ptr %9, i64 24
  store double %7, ptr %429, align 8, !tbaa !65
  call void (ptr, ...) @_ZL4infoPKcz(ptr noundef nonnull @.str.4, i32 noundef %.0188242353)
  %430 = load ptr, ptr %21, align 8, !tbaa !32
  %431 = icmp eq ptr %430, null
  br i1 %431, label %458, label %457

432:                                              ; preds = %432, %.lr.ph284.new
  %indvars.iv345 = phi i64 [ 0, %.lr.ph284.new ], [ %indvars.iv.next346.3, %432 ]
  %niter492 = phi i64 [ 0, %.lr.ph284.new ], [ %niter492.next.3, %432 ]
  %433 = getelementptr inbounds double, ptr %419, i64 %indvars.iv345
  %434 = load double, ptr %433, align 8, !tbaa !33
  %435 = getelementptr inbounds i32, ptr %420, i64 %indvars.iv345
  %436 = load i32, ptr %435, align 4, !tbaa !23
  %437 = sext i32 %436 to i64
  %438 = getelementptr inbounds double, ptr %5, i64 %437
  store double %434, ptr %438, align 8, !tbaa !33
  %indvars.iv.next346 = or disjoint i64 %indvars.iv345, 1
  %439 = getelementptr inbounds double, ptr %419, i64 %indvars.iv.next346
  %440 = load double, ptr %439, align 8, !tbaa !33
  %441 = getelementptr inbounds i32, ptr %420, i64 %indvars.iv.next346
  %442 = load i32, ptr %441, align 4, !tbaa !23
  %443 = sext i32 %442 to i64
  %444 = getelementptr inbounds double, ptr %5, i64 %443
  store double %440, ptr %444, align 8, !tbaa !33
  %indvars.iv.next346.1 = or disjoint i64 %indvars.iv345, 2
  %445 = getelementptr inbounds double, ptr %419, i64 %indvars.iv.next346.1
  %446 = load double, ptr %445, align 8, !tbaa !33
  %447 = getelementptr inbounds i32, ptr %420, i64 %indvars.iv.next346.1
  %448 = load i32, ptr %447, align 4, !tbaa !23
  %449 = sext i32 %448 to i64
  %450 = getelementptr inbounds double, ptr %5, i64 %449
  store double %446, ptr %450, align 8, !tbaa !33
  %indvars.iv.next346.2 = or disjoint i64 %indvars.iv345, 3
  %451 = getelementptr inbounds double, ptr %419, i64 %indvars.iv.next346.2
  %452 = load double, ptr %451, align 8, !tbaa !33
  %453 = getelementptr inbounds i32, ptr %420, i64 %indvars.iv.next346.2
  %454 = load i32, ptr %453, align 4, !tbaa !23
  %455 = sext i32 %454 to i64
  %456 = getelementptr inbounds double, ptr %5, i64 %455
  store double %452, ptr %456, align 8, !tbaa !33
  %indvars.iv.next346.3 = add nuw nsw i64 %indvars.iv345, 4
  %niter492.next.3 = add i64 %niter492, 4
  %niter492.ncmp.3 = icmp eq i64 %niter492.next.3, %unroll_iter491
  br i1 %niter492.ncmp.3, label %._crit_edge285.loopexit.unr-lcssa, label %432, !llvm.loop !66

457:                                              ; preds = %._crit_edge285
  call void @_ZdaPv(ptr noundef nonnull %430) #13
  br label %458

458:                                              ; preds = %457, %._crit_edge285
  %459 = load ptr, ptr %22, align 8, !tbaa !46
  %460 = icmp eq ptr %459, null
  br i1 %460, label %462, label %461

461:                                              ; preds = %458
  call void @_ZdaPv(ptr noundef nonnull %459) #13
  br label %462

462:                                              ; preds = %461, %458
  %463 = load ptr, ptr %23, align 8, !tbaa !39
  %464 = icmp eq ptr %463, null
  br i1 %464, label %466, label %465

465:                                              ; preds = %462
  call void @_ZdaPv(ptr noundef nonnull %463) #13
  br label %466

466:                                              ; preds = %465, %462
  %467 = load ptr, ptr %30, align 8, !tbaa !21
  %468 = icmp eq ptr %467, null
  br i1 %468, label %470, label %469

469:                                              ; preds = %466
  call void @_ZdaPv(ptr noundef nonnull %467) #13
  br label %470

470:                                              ; preds = %469, %466
  %471 = load ptr, ptr %36, align 8, !tbaa !22
  %472 = icmp eq ptr %471, null
  br i1 %472, label %474, label %473

473:                                              ; preds = %470
  call void @_ZdaPv(ptr noundef nonnull %471) #13
  br label %474

474:                                              ; preds = %473, %470
  %475 = load ptr, ptr %46, align 8, !tbaa !30
  %476 = icmp eq ptr %475, null
  br i1 %476, label %478, label %477

477:                                              ; preds = %474
  call void @_ZdaPv(ptr noundef nonnull %475) #13
  br label %478

478:                                              ; preds = %477, %474
  %479 = load ptr, ptr %49, align 8, !tbaa !31
  %480 = icmp eq ptr %479, null
  br i1 %480, label %482, label %481

481:                                              ; preds = %478
  call void @_ZdaPv(ptr noundef nonnull %479) #13
  br label %482

482:                                              ; preds = %481, %478
  ret void
}

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIKddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIKaaEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress uwtable
declare hidden void @_ZL5cloneIddEvRPT0_PT_i(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef, i32 noundef) local_unnamed_addr #5

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

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZN6Solver14is_lower_boundEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZN6Solver14is_upper_boundEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) local_unnamed_addr #6 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef double @_ZN6Solver5get_CEi(ptr noundef nonnull align 8 dereferenceable(117), i32 noundef) local_unnamed_addr #6 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL3maxIiET_S0_S0_(i32 noundef, i32 noundef) local_unnamed_addr #7

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i32 @_ZL3minIiET_S0_S0_(i32 noundef, i32 noundef) local_unnamed_addr #7

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <2 x double> @llvm.fmuladd.v2f64(<2 x double>, <2 x double>, <2 x double>) #9

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 112}
!6 = !{!"_ZTS6Solver", !7, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !7, i64 112, !12, i64 116}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!"bool", !8, i64 0}
!13 = !{!6, !10, i64 48}
!14 = !{!15, !15, i64 0}
!15 = !{!"vtable pointer", !9, i64 0}
!16 = !{!6, !10, i64 56}
!17 = !{!6, !11, i64 72}
!18 = !{!6, !11, i64 80}
!19 = !{!6, !11, i64 64}
!20 = !{!6, !12, i64 116}
!21 = !{!6, !10, i64 32}
!22 = !{!6, !10, i64 96}
!23 = !{!7, !7, i64 0}
!24 = distinct !{!24, !25, !26, !27}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!"llvm.loop.isvectorized", i32 1}
!27 = !{!"llvm.loop.unroll.runtime.disable"}
!28 = distinct !{!28, !25}
!29 = !{!6, !7, i64 8}
!30 = !{!6, !10, i64 24}
!31 = !{!6, !10, i64 104}
!32 = !{!6, !10, i64 88}
!33 = !{!11, !11, i64 0}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.unroll.disable"}
!36 = distinct !{!36, !25, !26, !27}
!37 = distinct !{!37, !25, !27, !26}
!38 = distinct !{!38, !25, !26}
!39 = !{!6, !10, i64 40}
!40 = !{!41, !41, i64 0}
!41 = !{!"float", !8, i64 0}
!42 = distinct !{!42, !25, !26, !27}
!43 = distinct !{!43, !25, !27, !26}
!44 = distinct !{!44, !25}
!45 = distinct !{!45, !25}
!46 = !{!6, !10, i64 16}
!47 = !{!8, !8, i64 0}
!48 = distinct !{!48, !25, !26, !27}
!49 = distinct !{!49, !25, !27, !26}
!50 = distinct !{!50, !25, !26, !27}
!51 = distinct !{!51, !25, !26, !27}
!52 = distinct !{!52, !25, !27, !26}
!53 = distinct !{!53, !25, !27, !26}
!54 = distinct !{!54, !25, !26, !27}
!55 = distinct !{!55, !25, !26, !27}
!56 = distinct !{!56, !25, !27, !26}
!57 = distinct !{!57, !25, !27, !26}
!58 = !{!10, !10, i64 0}
!59 = !{!60, !11, i64 8}
!60 = !{!"_ZTSN6Solver12SolutionInfoE", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32}
!61 = !{!60, !11, i64 0}
!62 = distinct !{!62, !25}
!63 = distinct !{!63, !35}
!64 = !{!60, !11, i64 16}
!65 = !{!60, !11, i64 24}
!66 = distinct !{!66, !25}


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