; LLVM IR from sourceryinstitute/MORFEUS-Source :: src/FV/src/mesh_optimize/OptMS (SMoptimize)

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

%struct.__SMoptimal = type { i32, i32, i32, i32, i32, i32, i32, double, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, [3 x double], double, double, ptr, ptr, ptr, ptr, [3 x i32], i32 }
%struct.__SMactive = type { i32, i32, ptr, double }

@.str.1 = external hidden unnamed_addr constant [110 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [19 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

declare i32 @SMerror(i32 noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, ptr noundef) #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @SMcheckEquilibrium(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca double, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca [3 x double], align 16
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca double, align 8
  %22 = alloca i32, align 4
  %23 = alloca double, align 8
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.start.p0(i64 24, ptr %16) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %26 = load ptr, ptr %4, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.__SMoptimal, ptr %26, i32 0, i32 0
  %28 = load i32, ptr %27, align 8, !tbaa !9
  store i32 %28, ptr %12, align 4, !tbaa !13
  %29 = load ptr, ptr %4, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.__SMoptimal, ptr %29, i32 0, i32 14
  %31 = load ptr, ptr %30, align 8, !tbaa !14
  %32 = getelementptr inbounds %struct.__SMactive, ptr %31, i32 0, i32 0
  %33 = load i32, ptr %32, align 8, !tbaa !15
  store i32 %33, ptr %9, align 4, !tbaa !13
  %34 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 0, ptr %34, align 4, !tbaa !13
  store i32 -1, ptr %11, align 4, !tbaa !13
  store i32 -1, ptr %10, align 4, !tbaa !13
  %35 = load i32, ptr %9, align 4, !tbaa !13
  %36 = load ptr, ptr %4, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.__SMoptimal, ptr %36, i32 0, i32 9
  %38 = load i32, ptr %37, align 4, !tbaa !17
  %39 = icmp eq i32 %35, %38
  br i1 %39, label %40, label %44

40:                                               ; preds = %2
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 1, ptr %41, align 4, !tbaa !13
  %42 = load ptr, ptr %4, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.__SMoptimal, ptr %42, i32 0, i32 4
  store i32 104, ptr %43, align 8, !tbaa !18
  store i32 0, ptr %6, align 4, !tbaa !13
  store i32 0, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

44:                                               ; preds = %2
  %45 = load i32, ptr %9, align 4, !tbaa !13
  %46 = load ptr, ptr %4, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.__SMoptimal, ptr %46, i32 0, i32 11
  %48 = load ptr, ptr %47, align 8, !tbaa !19
  %49 = load ptr, ptr %4, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.__SMoptimal, ptr %49, i32 0, i32 14
  %51 = load ptr, ptr %50, align 8, !tbaa !14
  %52 = getelementptr inbounds %struct.__SMactive, ptr %51, i32 0, i32 2
  %53 = load ptr, ptr %52, align 8, !tbaa !20
  %54 = load i32, ptr %12, align 4, !tbaa !13
  %55 = call i32 @SMgetActiveDirections(i32 noundef %45, ptr noundef %48, ptr noundef %53, i32 noundef %54, ptr noundef %14)
  store i32 %55, ptr %6, align 4, !tbaa !13
  %56 = load i32, ptr %6, align 4, !tbaa !13
  %57 = icmp ne i32 %56, 0
  br i1 %57, label %58, label %61

58:                                               ; preds = %44
  %59 = load i32, ptr %6, align 4, !tbaa !13
  %60 = call i32 @SMerror(i32 noundef 426, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef %59, i32 noundef 0, ptr noundef null)
  store i32 %60, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

61:                                               ; preds = %44
  store i32 0, ptr %8, align 4, !tbaa !13
  br label %62

62:                                               ; preds = %299, %61
  %63 = load i32, ptr %8, align 4, !tbaa !13
  %64 = load i32, ptr %9, align 4, !tbaa !13
  %65 = icmp slt i32 %63, %64
  br i1 %65, label %66, label %302

66:                                               ; preds = %62
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  %67 = load i32, ptr %12, align 4, !tbaa !13
  %68 = icmp eq i32 %67, 2
  br i1 %68, label %69, label %135

69:                                               ; preds = %66
  %70 = load ptr, ptr %14, align 8, !tbaa !5
  %71 = load i32, ptr %8, align 4, !tbaa !13
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds ptr, ptr %70, i64 %72
  %74 = load ptr, ptr %73, align 8, !tbaa !5
  %75 = getelementptr inbounds double, ptr %74, i64 0
  %76 = load double, ptr %75, align 8, !tbaa !21
  %77 = load ptr, ptr %14, align 8, !tbaa !5
  %78 = load i32, ptr %8, align 4, !tbaa !13
  %79 = sext i32 %78 to i64
  %80 = getelementptr inbounds ptr, ptr %77, i64 %79
  %81 = load ptr, ptr %80, align 8, !tbaa !5
  %82 = getelementptr inbounds double, ptr %81, i64 0
  %83 = load double, ptr %82, align 8, !tbaa !21
  %84 = load ptr, ptr %14, align 8, !tbaa !5
  %85 = load i32, ptr %8, align 4, !tbaa !13
  %86 = sext i32 %85 to i64
  %87 = getelementptr inbounds ptr, ptr %84, i64 %86
  %88 = load ptr, ptr %87, align 8, !tbaa !5
  %89 = getelementptr inbounds double, ptr %88, i64 1
  %90 = load double, ptr %89, align 8, !tbaa !21
  %91 = load ptr, ptr %14, align 8, !tbaa !5
  %92 = load i32, ptr %8, align 4, !tbaa !13
  %93 = sext i32 %92 to i64
  %94 = getelementptr inbounds ptr, ptr %91, i64 %93
  %95 = load ptr, ptr %94, align 8, !tbaa !5
  %96 = getelementptr inbounds double, ptr %95, i64 1
  %97 = load double, ptr %96, align 8, !tbaa !21
  %98 = fmul double %90, %97
  %99 = call double @llvm.fmuladd.f64(double %76, double %83, double %98)
  %100 = call double @sqrt(double noundef %99) #5
  store double %100, ptr %21, align 8, !tbaa !21
  %101 = load double, ptr %21, align 8, !tbaa !21
  %102 = fcmp une double %101, 0.000000e+00
  br i1 %102, label %103, label %134

103:                                              ; preds = %69
  %104 = load ptr, ptr %14, align 8, !tbaa !5
  %105 = load i32, ptr %8, align 4, !tbaa !13
  %106 = sext i32 %105 to i64
  %107 = getelementptr inbounds ptr, ptr %104, i64 %106
  %108 = load ptr, ptr %107, align 8, !tbaa !5
  %109 = getelementptr inbounds double, ptr %108, i64 0
  %110 = load double, ptr %109, align 8, !tbaa !21
  %111 = load double, ptr %21, align 8, !tbaa !21
  %112 = fdiv double %110, %111
  %113 = load ptr, ptr %14, align 8, !tbaa !5
  %114 = load i32, ptr %8, align 4, !tbaa !13
  %115 = sext i32 %114 to i64
  %116 = getelementptr inbounds ptr, ptr %113, i64 %115
  %117 = load ptr, ptr %116, align 8, !tbaa !5
  %118 = getelementptr inbounds double, ptr %117, i64 0
  store double %112, ptr %118, align 8, !tbaa !21
  %119 = load ptr, ptr %14, align 8, !tbaa !5
  %120 = load i32, ptr %8, align 4, !tbaa !13
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds ptr, ptr %119, i64 %121
  %123 = load ptr, ptr %122, align 8, !tbaa !5
  %124 = getelementptr inbounds double, ptr %123, i64 1
  %125 = load double, ptr %124, align 8, !tbaa !21
  %126 = load double, ptr %21, align 8, !tbaa !21
  %127 = fdiv double %125, %126
  %128 = load ptr, ptr %14, align 8, !tbaa !5
  %129 = load i32, ptr %8, align 4, !tbaa !13
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds ptr, ptr %128, i64 %130
  %132 = load ptr, ptr %131, align 8, !tbaa !5
  %133 = getelementptr inbounds double, ptr %132, i64 1
  store double %127, ptr %133, align 8, !tbaa !21
  br label %134

134:                                              ; preds = %103, %69
  br label %298

135:                                              ; preds = %66
  %136 = load i32, ptr %12, align 4, !tbaa !13
  %137 = icmp eq i32 %136, 3
  br i1 %137, label %138, label %234

138:                                              ; preds = %135
  %139 = load ptr, ptr %14, align 8, !tbaa !5
  %140 = load i32, ptr %8, align 4, !tbaa !13
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds ptr, ptr %139, i64 %141
  %143 = load ptr, ptr %142, align 8, !tbaa !5
  %144 = getelementptr inbounds double, ptr %143, i64 0
  %145 = load double, ptr %144, align 8, !tbaa !21
  %146 = load ptr, ptr %14, align 8, !tbaa !5
  %147 = load i32, ptr %8, align 4, !tbaa !13
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds ptr, ptr %146, i64 %148
  %150 = load ptr, ptr %149, align 8, !tbaa !5
  %151 = getelementptr inbounds double, ptr %150, i64 0
  %152 = load double, ptr %151, align 8, !tbaa !21
  %153 = load ptr, ptr %14, align 8, !tbaa !5
  %154 = load i32, ptr %8, align 4, !tbaa !13
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds ptr, ptr %153, i64 %155
  %157 = load ptr, ptr %156, align 8, !tbaa !5
  %158 = getelementptr inbounds double, ptr %157, i64 1
  %159 = load double, ptr %158, align 8, !tbaa !21
  %160 = load ptr, ptr %14, align 8, !tbaa !5
  %161 = load i32, ptr %8, align 4, !tbaa !13
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds ptr, ptr %160, i64 %162
  %164 = load ptr, ptr %163, align 8, !tbaa !5
  %165 = getelementptr inbounds double, ptr %164, i64 1
  %166 = load double, ptr %165, align 8, !tbaa !21
  %167 = fmul double %159, %166
  %168 = call double @llvm.fmuladd.f64(double %145, double %152, double %167)
  %169 = load ptr, ptr %14, align 8, !tbaa !5
  %170 = load i32, ptr %8, align 4, !tbaa !13
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds ptr, ptr %169, i64 %171
  %173 = load ptr, ptr %172, align 8, !tbaa !5
  %174 = getelementptr inbounds double, ptr %173, i64 2
  %175 = load double, ptr %174, align 8, !tbaa !21
  %176 = load ptr, ptr %14, align 8, !tbaa !5
  %177 = load i32, ptr %8, align 4, !tbaa !13
  %178 = sext i32 %177 to i64
  %179 = getelementptr inbounds ptr, ptr %176, i64 %178
  %180 = load ptr, ptr %179, align 8, !tbaa !5
  %181 = getelementptr inbounds double, ptr %180, i64 2
  %182 = load double, ptr %181, align 8, !tbaa !21
  %183 = call double @llvm.fmuladd.f64(double %175, double %182, double %168)
  %184 = call double @sqrt(double noundef %183) #5
  store double %184, ptr %21, align 8, !tbaa !21
  %185 = load double, ptr %21, align 8, !tbaa !21
  %186 = fcmp une double %185, 0.000000e+00
  br i1 %186, label %187, label %233

187:                                              ; preds = %138
  %188 = load ptr, ptr %14, align 8, !tbaa !5
  %189 = load i32, ptr %8, align 4, !tbaa !13
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds ptr, ptr %188, i64 %190
  %192 = load ptr, ptr %191, align 8, !tbaa !5
  %193 = getelementptr inbounds double, ptr %192, i64 0
  %194 = load double, ptr %193, align 8, !tbaa !21
  %195 = load double, ptr %21, align 8, !tbaa !21
  %196 = fdiv double %194, %195
  %197 = load ptr, ptr %14, align 8, !tbaa !5
  %198 = load i32, ptr %8, align 4, !tbaa !13
  %199 = sext i32 %198 to i64
  %200 = getelementptr inbounds ptr, ptr %197, i64 %199
  %201 = load ptr, ptr %200, align 8, !tbaa !5
  %202 = getelementptr inbounds double, ptr %201, i64 0
  store double %196, ptr %202, align 8, !tbaa !21
  %203 = load ptr, ptr %14, align 8, !tbaa !5
  %204 = load i32, ptr %8, align 4, !tbaa !13
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds ptr, ptr %203, i64 %205
  %207 = load ptr, ptr %206, align 8, !tbaa !5
  %208 = getelementptr inbounds double, ptr %207, i64 1
  %209 = load double, ptr %208, align 8, !tbaa !21
  %210 = load double, ptr %21, align 8, !tbaa !21
  %211 = fdiv double %209, %210
  %212 = load ptr, ptr %14, align 8, !tbaa !5
  %213 = load i32, ptr %8, align 4, !tbaa !13
  %214 = sext i32 %213 to i64
  %215 = getelementptr inbounds ptr, ptr %212, i64 %214
  %216 = load ptr, ptr %215, align 8, !tbaa !5
  %217 = getelementptr inbounds double, ptr %216, i64 1
  store double %211, ptr %217, align 8, !tbaa !21
  %218 = load ptr, ptr %14, align 8, !tbaa !5
  %219 = load i32, ptr %8, align 4, !tbaa !13
  %220 = sext i32 %219 to i64
  %221 = getelementptr inbounds ptr, ptr %218, i64 %220
  %222 = load ptr, ptr %221, align 8, !tbaa !5
  %223 = getelementptr inbounds double, ptr %222, i64 2
  %224 = load double, ptr %223, align 8, !tbaa !21
  %225 = load double, ptr %21, align 8, !tbaa !21
  %226 = fdiv double %224, %225
  %227 = load ptr, ptr %14, align 8, !tbaa !5
  %228 = load i32, ptr %8, align 4, !tbaa !13
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds ptr, ptr %227, i64 %229
  %231 = load ptr, ptr %230, align 8, !tbaa !5
  %232 = getelementptr inbounds double, ptr %231, i64 2
  store double %226, ptr %232, align 8, !tbaa !21
  br label %233

233:                                              ; preds = %187, %138
  br label %297

234:                                              ; preds = %135
  store i32 0, ptr %20, align 4, !tbaa !13
  br label %235

235:                                              ; preds = %261, %234
  %236 = load i32, ptr %20, align 4, !tbaa !13
  %237 = load i32, ptr %12, align 4, !tbaa !13
  %238 = icmp slt i32 %236, %237
  br i1 %238, label %239, label %264

239:                                              ; preds = %235
  %240 = load ptr, ptr %14, align 8, !tbaa !5
  %241 = load i32, ptr %8, align 4, !tbaa !13
  %242 = sext i32 %241 to i64
  %243 = getelementptr inbounds ptr, ptr %240, i64 %242
  %244 = load ptr, ptr %243, align 8, !tbaa !5
  %245 = load i32, ptr %20, align 4, !tbaa !13
  %246 = sext i32 %245 to i64
  %247 = getelementptr inbounds double, ptr %244, i64 %246
  %248 = load double, ptr %247, align 8, !tbaa !21
  %249 = load ptr, ptr %14, align 8, !tbaa !5
  %250 = load i32, ptr %8, align 4, !tbaa !13
  %251 = sext i32 %250 to i64
  %252 = getelementptr inbounds ptr, ptr %249, i64 %251
  %253 = load ptr, ptr %252, align 8, !tbaa !5
  %254 = load i32, ptr %20, align 4, !tbaa !13
  %255 = sext i32 %254 to i64
  %256 = getelementptr inbounds double, ptr %253, i64 %255
  %257 = load double, ptr %256, align 8, !tbaa !21
  %258 = fadd double %248, %257
  %259 = load double, ptr %21, align 8, !tbaa !21
  %260 = fadd double %259, %258
  store double %260, ptr %21, align 8, !tbaa !21
  br label %261

261:                                              ; preds = %239
  %262 = load i32, ptr %20, align 4, !tbaa !13
  %263 = add nsw i32 %262, 1
  store i32 %263, ptr %20, align 4, !tbaa !13
  br label %235, !llvm.loop !22

264:                                              ; preds = %235
  %265 = load double, ptr %21, align 8, !tbaa !21
  %266 = fcmp une double %265, 0.000000e+00
  br i1 %266, label %267, label %296

267:                                              ; preds = %264
  store i32 0, ptr %20, align 4, !tbaa !13
  br label %268

268:                                              ; preds = %292, %267
  %269 = load i32, ptr %20, align 4, !tbaa !13
  %270 = load i32, ptr %12, align 4, !tbaa !13
  %271 = icmp slt i32 %269, %270
  br i1 %271, label %272, label %295

272:                                              ; preds = %268
  %273 = load ptr, ptr %14, align 8, !tbaa !5
  %274 = load i32, ptr %8, align 4, !tbaa !13
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds ptr, ptr %273, i64 %275
  %277 = load ptr, ptr %276, align 8, !tbaa !5
  %278 = load i32, ptr %20, align 4, !tbaa !13
  %279 = sext i32 %278 to i64
  %280 = getelementptr inbounds double, ptr %277, i64 %279
  %281 = load double, ptr %280, align 8, !tbaa !21
  %282 = load double, ptr %21, align 8, !tbaa !21
  %283 = fdiv double %281, %282
  %284 = load ptr, ptr %14, align 8, !tbaa !5
  %285 = load i32, ptr %8, align 4, !tbaa !13
  %286 = sext i32 %285 to i64
  %287 = getelementptr inbounds ptr, ptr %284, i64 %286
  %288 = load ptr, ptr %287, align 8, !tbaa !5
  %289 = load i32, ptr %20, align 4, !tbaa !13
  %290 = sext i32 %289 to i64
  %291 = getelementptr inbounds double, ptr %288, i64 %290
  store double %283, ptr %291, align 8, !tbaa !21
  br label %292

292:                                              ; preds = %272
  %293 = load i32, ptr %20, align 4, !tbaa !13
  %294 = add nsw i32 %293, 1
  store i32 %294, ptr %20, align 4, !tbaa !13
  br label %268, !llvm.loop !24

295:                                              ; preds = %268
  br label %296

296:                                              ; preds = %295, %264
  br label %297

297:                                              ; preds = %296, %233
  br label %298

298:                                              ; preds = %297, %134
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  br label %299

299:                                              ; preds = %298
  %300 = load i32, ptr %8, align 4, !tbaa !13
  %301 = add nsw i32 %300, 1
  store i32 %301, ptr %8, align 4, !tbaa !13
  br label %62, !llvm.loop !25

302:                                              ; preds = %62
  %303 = load i32, ptr %12, align 4, !tbaa !13
  %304 = icmp eq i32 %303, 2
  br i1 %304, label %305, label %796

305:                                              ; preds = %302
  %306 = load i32, ptr %9, align 4, !tbaa !13
  %307 = load ptr, ptr %14, align 8, !tbaa !5
  %308 = load ptr, ptr %4, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.__SMoptimal, ptr %308, i32 0, i32 23
  %310 = load ptr, ptr %309, align 8, !tbaa !26
  %311 = load i32, ptr %12, align 4, !tbaa !13
  %312 = call i32 @SMformGrammian(i32 noundef %306, ptr noundef %307, ptr noundef %310, i32 noundef %311)
  store i32 %312, ptr %6, align 4, !tbaa !13
  %313 = load i32, ptr %6, align 4, !tbaa !13
  %314 = icmp ne i32 %313, 0
  br i1 %314, label %315, label %318

315:                                              ; preds = %305
  %316 = load i32, ptr %6, align 4, !tbaa !13
  %317 = call i32 @SMerror(i32 noundef 434, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef %316, i32 noundef 0, ptr noundef null)
  store i32 %317, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

318:                                              ; preds = %305
  %319 = load ptr, ptr %4, align 8, !tbaa !5
  %320 = getelementptr inbounds %struct.__SMoptimal, ptr %319, i32 0, i32 23
  %321 = load ptr, ptr %320, align 8, !tbaa !26
  store ptr %321, ptr %15, align 8, !tbaa !5
  store double 1.000000e+00, ptr %13, align 8, !tbaa !21
  store i32 0, ptr %7, align 4, !tbaa !13
  br label %322

322:                                              ; preds = %410, %318
  %323 = load i32, ptr %7, align 4, !tbaa !13
  %324 = load i32, ptr %9, align 4, !tbaa !13
  %325 = icmp slt i32 %323, %324
  br i1 %325, label %326, label %413

326:                                              ; preds = %322
  %327 = load i32, ptr %7, align 4, !tbaa !13
  %328 = add nsw i32 %327, 1
  store i32 %328, ptr %8, align 4, !tbaa !13
  br label %329

329:                                              ; preds = %406, %326
  %330 = load i32, ptr %8, align 4, !tbaa !13
  %331 = load i32, ptr %9, align 4, !tbaa !13
  %332 = icmp slt i32 %330, %331
  br i1 %332, label %333, label %409

333:                                              ; preds = %329
  %334 = load ptr, ptr %15, align 8, !tbaa !5
  %335 = load i32, ptr %7, align 4, !tbaa !13
  %336 = sext i32 %335 to i64
  %337 = getelementptr inbounds ptr, ptr %334, i64 %336
  %338 = load ptr, ptr %337, align 8, !tbaa !5
  %339 = load i32, ptr %8, align 4, !tbaa !13
  %340 = sext i32 %339 to i64
  %341 = getelementptr inbounds double, ptr %338, i64 %340
  %342 = load double, ptr %341, align 8, !tbaa !21
  %343 = fsub double -1.000000e+00, %342
  %344 = call double @llvm.fabs.f64(double %343)
  %345 = fcmp olt double %344, 1.000000e-08
  br i1 %345, label %346, label %381

346:                                              ; preds = %333
  %347 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 1, ptr %347, align 4, !tbaa !13
  %348 = load ptr, ptr %4, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.__SMoptimal, ptr %348, i32 0, i32 4
  store i32 104, ptr %349, align 8, !tbaa !18
  store i32 0, ptr %7, align 4, !tbaa !13
  br label %350

350:                                              ; preds = %370, %346
  %351 = load i32, ptr %7, align 4, !tbaa !13
  %352 = load i32, ptr %9, align 4, !tbaa !13
  %353 = icmp slt i32 %351, %352
  br i1 %353, label %354, label %373

354:                                              ; preds = %350
  %355 = load ptr, ptr %14, align 8, !tbaa !5
  %356 = load i32, ptr %7, align 4, !tbaa !13
  %357 = sext i32 %356 to i64
  %358 = getelementptr inbounds ptr, ptr %355, i64 %357
  %359 = load ptr, ptr %358, align 8, !tbaa !5
  %360 = icmp eq ptr %359, null
  br i1 %360, label %361, label %363

361:                                              ; preds = %354
  %362 = call i32 @SMerror(i32 noundef 446, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %362, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

363:                                              ; preds = %354
  %364 = load ptr, ptr %14, align 8, !tbaa !5
  %365 = load i32, ptr %7, align 4, !tbaa !13
  %366 = sext i32 %365 to i64
  %367 = getelementptr inbounds ptr, ptr %364, i64 %366
  %368 = load ptr, ptr %367, align 8, !tbaa !5
  call void @free(ptr noundef %368) #5
  br label %369

369:                                              ; preds = %363
  br label %370

370:                                              ; preds = %369
  %371 = load i32, ptr %7, align 4, !tbaa !13
  %372 = add nsw i32 %371, 1
  store i32 %372, ptr %7, align 4, !tbaa !13
  br label %350, !llvm.loop !27

373:                                              ; preds = %350
  %374 = load ptr, ptr %14, align 8, !tbaa !5
  %375 = icmp eq ptr %374, null
  br i1 %375, label %376, label %378

376:                                              ; preds = %373
  %377 = call i32 @SMerror(i32 noundef 447, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %377, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

378:                                              ; preds = %373
  %379 = load ptr, ptr %14, align 8, !tbaa !5
  call void @free(ptr noundef %379) #5
  br label %380

380:                                              ; preds = %378
  store i32 0, ptr %6, align 4, !tbaa !13
  store i32 0, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

381:                                              ; preds = %333
  %382 = load ptr, ptr %15, align 8, !tbaa !5
  %383 = load i32, ptr %7, align 4, !tbaa !13
  %384 = sext i32 %383 to i64
  %385 = getelementptr inbounds ptr, ptr %382, i64 %384
  %386 = load ptr, ptr %385, align 8, !tbaa !5
  %387 = load i32, ptr %8, align 4, !tbaa !13
  %388 = sext i32 %387 to i64
  %389 = getelementptr inbounds double, ptr %386, i64 %388
  %390 = load double, ptr %389, align 8, !tbaa !21
  %391 = load double, ptr %13, align 8, !tbaa !21
  %392 = fcmp olt double %390, %391
  br i1 %392, label %393, label %405

393:                                              ; preds = %381
  %394 = load i32, ptr %7, align 4, !tbaa !13
  store i32 %394, ptr %10, align 4, !tbaa !13
  %395 = load i32, ptr %8, align 4, !tbaa !13
  store i32 %395, ptr %11, align 4, !tbaa !13
  %396 = load ptr, ptr %15, align 8, !tbaa !5
  %397 = load i32, ptr %7, align 4, !tbaa !13
  %398 = sext i32 %397 to i64
  %399 = getelementptr inbounds ptr, ptr %396, i64 %398
  %400 = load ptr, ptr %399, align 8, !tbaa !5
  %401 = load i32, ptr %8, align 4, !tbaa !13
  %402 = sext i32 %401 to i64
  %403 = getelementptr inbounds double, ptr %400, i64 %402
  %404 = load double, ptr %403, align 8, !tbaa !21
  store double %404, ptr %13, align 8, !tbaa !21
  br label %405

405:                                              ; preds = %393, %381
  br label %406

406:                                              ; preds = %405
  %407 = load i32, ptr %8, align 4, !tbaa !13
  %408 = add nsw i32 %407, 1
  store i32 %408, ptr %8, align 4, !tbaa !13
  br label %329, !llvm.loop !28

409:                                              ; preds = %329
  br label %410

410:                                              ; preds = %409
  %411 = load i32, ptr %7, align 4, !tbaa !13
  %412 = add nsw i32 %411, 1
  store i32 %412, ptr %7, align 4, !tbaa !13
  br label %322, !llvm.loop !29

413:                                              ; preds = %322
  %414 = load i32, ptr %10, align 4, !tbaa !13
  %415 = icmp ne i32 %414, -1
  br i1 %415, label %416, label %795

416:                                              ; preds = %413
  %417 = load i32, ptr %11, align 4, !tbaa !13
  %418 = icmp ne i32 %417, -1
  br i1 %418, label %419, label %795

419:                                              ; preds = %416
  store i32 0, ptr %8, align 4, !tbaa !13
  br label %420

420:                                              ; preds = %448, %419
  %421 = load i32, ptr %8, align 4, !tbaa !13
  %422 = load i32, ptr %12, align 4, !tbaa !13
  %423 = icmp slt i32 %421, %422
  br i1 %423, label %424, label %451

424:                                              ; preds = %420
  %425 = load ptr, ptr %14, align 8, !tbaa !5
  %426 = load i32, ptr %10, align 4, !tbaa !13
  %427 = sext i32 %426 to i64
  %428 = getelementptr inbounds ptr, ptr %425, i64 %427
  %429 = load ptr, ptr %428, align 8, !tbaa !5
  %430 = load i32, ptr %8, align 4, !tbaa !13
  %431 = sext i32 %430 to i64
  %432 = getelementptr inbounds double, ptr %429, i64 %431
  %433 = load double, ptr %432, align 8, !tbaa !21
  %434 = load ptr, ptr %14, align 8, !tbaa !5
  %435 = load i32, ptr %11, align 4, !tbaa !13
  %436 = sext i32 %435 to i64
  %437 = getelementptr inbounds ptr, ptr %434, i64 %436
  %438 = load ptr, ptr %437, align 8, !tbaa !5
  %439 = load i32, ptr %8, align 4, !tbaa !13
  %440 = sext i32 %439 to i64
  %441 = getelementptr inbounds double, ptr %438, i64 %440
  %442 = load double, ptr %441, align 8, !tbaa !21
  %443 = fadd double %433, %442
  %444 = fmul double 5.000000e-01, %443
  %445 = load i32, ptr %8, align 4, !tbaa !13
  %446 = sext i32 %445 to i64
  %447 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %446
  store double %444, ptr %447, align 8, !tbaa !21
  br label %448

448:                                              ; preds = %424
  %449 = load i32, ptr %8, align 4, !tbaa !13
  %450 = add nsw i32 %449, 1
  store i32 %450, ptr %8, align 4, !tbaa !13
  br label %420, !llvm.loop !30

451:                                              ; preds = %420
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  %452 = load i32, ptr %12, align 4, !tbaa !13
  %453 = icmp eq i32 %452, 2
  br i1 %453, label %454, label %480

454:                                              ; preds = %451
  %455 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %456 = load double, ptr %455, align 16, !tbaa !21
  %457 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %458 = load double, ptr %457, align 16, !tbaa !21
  %459 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %460 = load double, ptr %459, align 8, !tbaa !21
  %461 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %462 = load double, ptr %461, align 8, !tbaa !21
  %463 = fmul double %460, %462
  %464 = call double @llvm.fmuladd.f64(double %456, double %458, double %463)
  %465 = call double @sqrt(double noundef %464) #5
  store double %465, ptr %23, align 8, !tbaa !21
  %466 = load double, ptr %23, align 8, !tbaa !21
  %467 = fcmp une double %466, 0.000000e+00
  br i1 %467, label %468, label %479

468:                                              ; preds = %454
  %469 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %470 = load double, ptr %469, align 16, !tbaa !21
  %471 = load double, ptr %23, align 8, !tbaa !21
  %472 = fdiv double %470, %471
  %473 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  store double %472, ptr %473, align 16, !tbaa !21
  %474 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %475 = load double, ptr %474, align 8, !tbaa !21
  %476 = load double, ptr %23, align 8, !tbaa !21
  %477 = fdiv double %475, %476
  %478 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  store double %477, ptr %478, align 8, !tbaa !21
  br label %479

479:                                              ; preds = %468, %454
  br label %563

480:                                              ; preds = %451
  %481 = load i32, ptr %12, align 4, !tbaa !13
  %482 = icmp eq i32 %481, 3
  br i1 %482, label %483, label %519

483:                                              ; preds = %480
  %484 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %485 = load double, ptr %484, align 16, !tbaa !21
  %486 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %487 = load double, ptr %486, align 16, !tbaa !21
  %488 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %489 = load double, ptr %488, align 8, !tbaa !21
  %490 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %491 = load double, ptr %490, align 8, !tbaa !21
  %492 = fmul double %489, %491
  %493 = call double @llvm.fmuladd.f64(double %485, double %487, double %492)
  %494 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  %495 = load double, ptr %494, align 16, !tbaa !21
  %496 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  %497 = load double, ptr %496, align 16, !tbaa !21
  %498 = call double @llvm.fmuladd.f64(double %495, double %497, double %493)
  %499 = call double @sqrt(double noundef %498) #5
  store double %499, ptr %23, align 8, !tbaa !21
  %500 = load double, ptr %23, align 8, !tbaa !21
  %501 = fcmp une double %500, 0.000000e+00
  br i1 %501, label %502, label %518

502:                                              ; preds = %483
  %503 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %504 = load double, ptr %503, align 16, !tbaa !21
  %505 = load double, ptr %23, align 8, !tbaa !21
  %506 = fdiv double %504, %505
  %507 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  store double %506, ptr %507, align 16, !tbaa !21
  %508 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %509 = load double, ptr %508, align 8, !tbaa !21
  %510 = load double, ptr %23, align 8, !tbaa !21
  %511 = fdiv double %509, %510
  %512 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  store double %511, ptr %512, align 8, !tbaa !21
  %513 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  %514 = load double, ptr %513, align 16, !tbaa !21
  %515 = load double, ptr %23, align 8, !tbaa !21
  %516 = fdiv double %514, %515
  %517 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  store double %516, ptr %517, align 16, !tbaa !21
  br label %518

518:                                              ; preds = %502, %483
  br label %562

519:                                              ; preds = %480
  store i32 0, ptr %22, align 4, !tbaa !13
  br label %520

520:                                              ; preds = %536, %519
  %521 = load i32, ptr %22, align 4, !tbaa !13
  %522 = load i32, ptr %12, align 4, !tbaa !13
  %523 = icmp slt i32 %521, %522
  br i1 %523, label %524, label %539

524:                                              ; preds = %520
  %525 = load i32, ptr %22, align 4, !tbaa !13
  %526 = sext i32 %525 to i64
  %527 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %526
  %528 = load double, ptr %527, align 8, !tbaa !21
  %529 = load i32, ptr %22, align 4, !tbaa !13
  %530 = sext i32 %529 to i64
  %531 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %530
  %532 = load double, ptr %531, align 8, !tbaa !21
  %533 = fadd double %528, %532
  %534 = load double, ptr %23, align 8, !tbaa !21
  %535 = fadd double %534, %533
  store double %535, ptr %23, align 8, !tbaa !21
  br label %536

536:                                              ; preds = %524
  %537 = load i32, ptr %22, align 4, !tbaa !13
  %538 = add nsw i32 %537, 1
  store i32 %538, ptr %22, align 4, !tbaa !13
  br label %520, !llvm.loop !31

539:                                              ; preds = %520
  %540 = load double, ptr %23, align 8, !tbaa !21
  %541 = fcmp une double %540, 0.000000e+00
  br i1 %541, label %542, label %561

542:                                              ; preds = %539
  store i32 0, ptr %22, align 4, !tbaa !13
  br label %543

543:                                              ; preds = %557, %542
  %544 = load i32, ptr %22, align 4, !tbaa !13
  %545 = load i32, ptr %12, align 4, !tbaa !13
  %546 = icmp slt i32 %544, %545
  br i1 %546, label %547, label %560

547:                                              ; preds = %543
  %548 = load i32, ptr %22, align 4, !tbaa !13
  %549 = sext i32 %548 to i64
  %550 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %549
  %551 = load double, ptr %550, align 8, !tbaa !21
  %552 = load double, ptr %23, align 8, !tbaa !21
  %553 = fdiv double %551, %552
  %554 = load i32, ptr %22, align 4, !tbaa !13
  %555 = sext i32 %554 to i64
  %556 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %555
  store double %553, ptr %556, align 8, !tbaa !21
  br label %557

557:                                              ; preds = %547
  %558 = load i32, ptr %22, align 4, !tbaa !13
  %559 = add nsw i32 %558, 1
  store i32 %559, ptr %22, align 4, !tbaa !13
  br label %543, !llvm.loop !32

560:                                              ; preds = %543
  br label %561

561:                                              ; preds = %560, %539
  br label %562

562:                                              ; preds = %561, %518
  br label %563

563:                                              ; preds = %562, %479
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #5
  %564 = load i32, ptr %12, align 4, !tbaa !13
  %565 = icmp eq i32 %564, 2
  br i1 %565, label %566, label %587

566:                                              ; preds = %563
  %567 = load ptr, ptr %14, align 8, !tbaa !5
  %568 = load i32, ptr %10, align 4, !tbaa !13
  %569 = sext i32 %568 to i64
  %570 = getelementptr inbounds ptr, ptr %567, i64 %569
  %571 = load ptr, ptr %570, align 8, !tbaa !5
  %572 = getelementptr inbounds double, ptr %571, i64 0
  %573 = load double, ptr %572, align 8, !tbaa !21
  %574 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %575 = load double, ptr %574, align 16, !tbaa !21
  %576 = load ptr, ptr %14, align 8, !tbaa !5
  %577 = load i32, ptr %10, align 4, !tbaa !13
  %578 = sext i32 %577 to i64
  %579 = getelementptr inbounds ptr, ptr %576, i64 %578
  %580 = load ptr, ptr %579, align 8, !tbaa !5
  %581 = getelementptr inbounds double, ptr %580, i64 1
  %582 = load double, ptr %581, align 8, !tbaa !21
  %583 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %584 = load double, ptr %583, align 8, !tbaa !21
  %585 = fmul double %582, %584
  %586 = call double @llvm.fmuladd.f64(double %573, double %575, double %585)
  store double %586, ptr %17, align 8, !tbaa !21
  br label %647

587:                                              ; preds = %563
  %588 = load i32, ptr %12, align 4, !tbaa !13
  %589 = icmp eq i32 %588, 3
  br i1 %589, label %590, label %621

590:                                              ; preds = %587
  %591 = load ptr, ptr %14, align 8, !tbaa !5
  %592 = load i32, ptr %10, align 4, !tbaa !13
  %593 = sext i32 %592 to i64
  %594 = getelementptr inbounds ptr, ptr %591, i64 %593
  %595 = load ptr, ptr %594, align 8, !tbaa !5
  %596 = getelementptr inbounds double, ptr %595, i64 0
  %597 = load double, ptr %596, align 8, !tbaa !21
  %598 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %599 = load double, ptr %598, align 16, !tbaa !21
  %600 = load ptr, ptr %14, align 8, !tbaa !5
  %601 = load i32, ptr %10, align 4, !tbaa !13
  %602 = sext i32 %601 to i64
  %603 = getelementptr inbounds ptr, ptr %600, i64 %602
  %604 = load ptr, ptr %603, align 8, !tbaa !5
  %605 = getelementptr inbounds double, ptr %604, i64 1
  %606 = load double, ptr %605, align 8, !tbaa !21
  %607 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %608 = load double, ptr %607, align 8, !tbaa !21
  %609 = fmul double %606, %608
  %610 = call double @llvm.fmuladd.f64(double %597, double %599, double %609)
  %611 = load ptr, ptr %14, align 8, !tbaa !5
  %612 = load i32, ptr %10, align 4, !tbaa !13
  %613 = sext i32 %612 to i64
  %614 = getelementptr inbounds ptr, ptr %611, i64 %613
  %615 = load ptr, ptr %614, align 8, !tbaa !5
  %616 = getelementptr inbounds double, ptr %615, i64 2
  %617 = load double, ptr %616, align 8, !tbaa !21
  %618 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  %619 = load double, ptr %618, align 16, !tbaa !21
  %620 = call double @llvm.fmuladd.f64(double %617, double %619, double %610)
  store double %620, ptr %17, align 8, !tbaa !21
  br label %646

621:                                              ; preds = %587
  store i32 0, ptr %24, align 4, !tbaa !13
  br label %622

622:                                              ; preds = %642, %621
  %623 = load i32, ptr %24, align 4, !tbaa !13
  %624 = load i32, ptr %12, align 4, !tbaa !13
  %625 = icmp slt i32 %623, %624
  br i1 %625, label %626, label %645

626:                                              ; preds = %622
  %627 = load ptr, ptr %14, align 8, !tbaa !5
  %628 = load i32, ptr %10, align 4, !tbaa !13
  %629 = sext i32 %628 to i64
  %630 = getelementptr inbounds ptr, ptr %627, i64 %629
  %631 = load ptr, ptr %630, align 8, !tbaa !5
  %632 = load i32, ptr %24, align 4, !tbaa !13
  %633 = sext i32 %632 to i64
  %634 = getelementptr inbounds double, ptr %631, i64 %633
  %635 = load double, ptr %634, align 8, !tbaa !21
  %636 = load i32, ptr %24, align 4, !tbaa !13
  %637 = sext i32 %636 to i64
  %638 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %637
  %639 = load double, ptr %638, align 8, !tbaa !21
  %640 = load double, ptr %17, align 8, !tbaa !21
  %641 = call double @llvm.fmuladd.f64(double %635, double %639, double %640)
  store double %641, ptr %17, align 8, !tbaa !21
  br label %642

642:                                              ; preds = %626
  %643 = load i32, ptr %24, align 4, !tbaa !13
  %644 = add nsw i32 %643, 1
  store i32 %644, ptr %24, align 4, !tbaa !13
  br label %622, !llvm.loop !33

645:                                              ; preds = %622
  br label %646

646:                                              ; preds = %645, %590
  br label %647

647:                                              ; preds = %646, %566
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #5
  store i32 0, ptr %7, align 4, !tbaa !13
  br label %648

648:                                              ; preds = %791, %647
  %649 = load i32, ptr %7, align 4, !tbaa !13
  %650 = load i32, ptr %9, align 4, !tbaa !13
  %651 = icmp slt i32 %649, %650
  br i1 %651, label %652, label %794

652:                                              ; preds = %648
  %653 = load i32, ptr %7, align 4, !tbaa !13
  %654 = load i32, ptr %10, align 4, !tbaa !13
  %655 = icmp ne i32 %653, %654
  br i1 %655, label %656, label %790

656:                                              ; preds = %652
  %657 = load i32, ptr %7, align 4, !tbaa !13
  %658 = load i32, ptr %11, align 4, !tbaa !13
  %659 = icmp ne i32 %657, %658
  br i1 %659, label %660, label %790

660:                                              ; preds = %656
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #5
  %661 = load i32, ptr %12, align 4, !tbaa !13
  %662 = icmp eq i32 %661, 2
  br i1 %662, label %663, label %684

663:                                              ; preds = %660
  %664 = load ptr, ptr %14, align 8, !tbaa !5
  %665 = load i32, ptr %7, align 4, !tbaa !13
  %666 = sext i32 %665 to i64
  %667 = getelementptr inbounds ptr, ptr %664, i64 %666
  %668 = load ptr, ptr %667, align 8, !tbaa !5
  %669 = getelementptr inbounds double, ptr %668, i64 0
  %670 = load double, ptr %669, align 8, !tbaa !21
  %671 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %672 = load double, ptr %671, align 16, !tbaa !21
  %673 = load ptr, ptr %14, align 8, !tbaa !5
  %674 = load i32, ptr %7, align 4, !tbaa !13
  %675 = sext i32 %674 to i64
  %676 = getelementptr inbounds ptr, ptr %673, i64 %675
  %677 = load ptr, ptr %676, align 8, !tbaa !5
  %678 = getelementptr inbounds double, ptr %677, i64 1
  %679 = load double, ptr %678, align 8, !tbaa !21
  %680 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %681 = load double, ptr %680, align 8, !tbaa !21
  %682 = fmul double %679, %681
  %683 = call double @llvm.fmuladd.f64(double %670, double %672, double %682)
  store double %683, ptr %18, align 8, !tbaa !21
  br label %744

684:                                              ; preds = %660
  %685 = load i32, ptr %12, align 4, !tbaa !13
  %686 = icmp eq i32 %685, 3
  br i1 %686, label %687, label %718

687:                                              ; preds = %684
  %688 = load ptr, ptr %14, align 8, !tbaa !5
  %689 = load i32, ptr %7, align 4, !tbaa !13
  %690 = sext i32 %689 to i64
  %691 = getelementptr inbounds ptr, ptr %688, i64 %690
  %692 = load ptr, ptr %691, align 8, !tbaa !5
  %693 = getelementptr inbounds double, ptr %692, i64 0
  %694 = load double, ptr %693, align 8, !tbaa !21
  %695 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 0
  %696 = load double, ptr %695, align 16, !tbaa !21
  %697 = load ptr, ptr %14, align 8, !tbaa !5
  %698 = load i32, ptr %7, align 4, !tbaa !13
  %699 = sext i32 %698 to i64
  %700 = getelementptr inbounds ptr, ptr %697, i64 %699
  %701 = load ptr, ptr %700, align 8, !tbaa !5
  %702 = getelementptr inbounds double, ptr %701, i64 1
  %703 = load double, ptr %702, align 8, !tbaa !21
  %704 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 1
  %705 = load double, ptr %704, align 8, !tbaa !21
  %706 = fmul double %703, %705
  %707 = call double @llvm.fmuladd.f64(double %694, double %696, double %706)
  %708 = load ptr, ptr %14, align 8, !tbaa !5
  %709 = load i32, ptr %7, align 4, !tbaa !13
  %710 = sext i32 %709 to i64
  %711 = getelementptr inbounds ptr, ptr %708, i64 %710
  %712 = load ptr, ptr %711, align 8, !tbaa !5
  %713 = getelementptr inbounds double, ptr %712, i64 2
  %714 = load double, ptr %713, align 8, !tbaa !21
  %715 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 2
  %716 = load double, ptr %715, align 16, !tbaa !21
  %717 = call double @llvm.fmuladd.f64(double %714, double %716, double %707)
  store double %717, ptr %18, align 8, !tbaa !21
  br label %743

718:                                              ; preds = %684
  store i32 0, ptr %25, align 4, !tbaa !13
  br label %719

719:                                              ; preds = %739, %718
  %720 = load i32, ptr %25, align 4, !tbaa !13
  %721 = load i32, ptr %12, align 4, !tbaa !13
  %722 = icmp slt i32 %720, %721
  br i1 %722, label %723, label %742

723:                                              ; preds = %719
  %724 = load ptr, ptr %14, align 8, !tbaa !5
  %725 = load i32, ptr %7, align 4, !tbaa !13
  %726 = sext i32 %725 to i64
  %727 = getelementptr inbounds ptr, ptr %724, i64 %726
  %728 = load ptr, ptr %727, align 8, !tbaa !5
  %729 = load i32, ptr %25, align 4, !tbaa !13
  %730 = sext i32 %729 to i64
  %731 = getelementptr inbounds double, ptr %728, i64 %730
  %732 = load double, ptr %731, align 8, !tbaa !21
  %733 = load i32, ptr %25, align 4, !tbaa !13
  %734 = sext i32 %733 to i64
  %735 = getelementptr inbounds [3 x double], ptr %16, i64 0, i64 %734
  %736 = load double, ptr %735, align 8, !tbaa !21
  %737 = load double, ptr %18, align 8, !tbaa !21
  %738 = call double @llvm.fmuladd.f64(double %732, double %736, double %737)
  store double %738, ptr %18, align 8, !tbaa !21
  br label %739

739:                                              ; preds = %723
  %740 = load i32, ptr %25, align 4, !tbaa !13
  %741 = add nsw i32 %740, 1
  store i32 %741, ptr %25, align 4, !tbaa !13
  br label %719, !llvm.loop !34

742:                                              ; preds = %719
  br label %743

743:                                              ; preds = %742, %687
  br label %744

744:                                              ; preds = %743, %663
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #5
  %745 = load double, ptr %18, align 8, !tbaa !21
  %746 = load double, ptr %17, align 8, !tbaa !21
  %747 = fcmp olt double %745, %746
  br i1 %747, label %748, label %789

748:                                              ; preds = %744
  %749 = load double, ptr %18, align 8, !tbaa !21
  %750 = load double, ptr %17, align 8, !tbaa !21
  %751 = fsub double %749, %750
  %752 = call double @llvm.fabs.f64(double %751)
  %753 = fcmp ogt double %752, 1.000000e-15
  br i1 %753, label %754, label %789

754:                                              ; preds = %748
  %755 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 1, ptr %755, align 4, !tbaa !13
  %756 = load ptr, ptr %4, align 8, !tbaa !5
  %757 = getelementptr inbounds %struct.__SMoptimal, ptr %756, i32 0, i32 4
  store i32 104, ptr %757, align 8, !tbaa !18
  store i32 0, ptr %7, align 4, !tbaa !13
  br label %758

758:                                              ; preds = %778, %754
  %759 = load i32, ptr %7, align 4, !tbaa !13
  %760 = load i32, ptr %9, align 4, !tbaa !13
  %761 = icmp slt i32 %759, %760
  br i1 %761, label %762, label %781

762:                                              ; preds = %758
  %763 = load ptr, ptr %14, align 8, !tbaa !5
  %764 = load i32, ptr %7, align 4, !tbaa !13
  %765 = sext i32 %764 to i64
  %766 = getelementptr inbounds ptr, ptr %763, i64 %765
  %767 = load ptr, ptr %766, align 8, !tbaa !5
  %768 = icmp eq ptr %767, null
  br i1 %768, label %769, label %771

769:                                              ; preds = %762
  %770 = call i32 @SMerror(i32 noundef 475, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %770, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

771:                                              ; preds = %762
  %772 = load ptr, ptr %14, align 8, !tbaa !5
  %773 = load i32, ptr %7, align 4, !tbaa !13
  %774 = sext i32 %773 to i64
  %775 = getelementptr inbounds ptr, ptr %772, i64 %774
  %776 = load ptr, ptr %775, align 8, !tbaa !5
  call void @free(ptr noundef %776) #5
  br label %777

777:                                              ; preds = %771
  br label %778

778:                                              ; preds = %777
  %779 = load i32, ptr %7, align 4, !tbaa !13
  %780 = add nsw i32 %779, 1
  store i32 %780, ptr %7, align 4, !tbaa !13
  br label %758, !llvm.loop !35

781:                                              ; preds = %758
  %782 = load ptr, ptr %14, align 8, !tbaa !5
  %783 = icmp eq ptr %782, null
  br i1 %783, label %784, label %786

784:                                              ; preds = %781
  %785 = call i32 @SMerror(i32 noundef 476, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %785, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

786:                                              ; preds = %781
  %787 = load ptr, ptr %14, align 8, !tbaa !5
  call void @free(ptr noundef %787) #5
  br label %788

788:                                              ; preds = %786
  store i32 0, ptr %6, align 4, !tbaa !13
  store i32 0, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

789:                                              ; preds = %748, %744
  br label %790

790:                                              ; preds = %789, %656, %652
  br label %791

791:                                              ; preds = %790
  %792 = load i32, ptr %7, align 4, !tbaa !13
  %793 = add nsw i32 %792, 1
  store i32 %793, ptr %7, align 4, !tbaa !13
  br label %648, !llvm.loop !36

794:                                              ; preds = %648
  br label %795

795:                                              ; preds = %794, %416, %413
  br label %796

796:                                              ; preds = %795, %302
  %797 = load i32, ptr %12, align 4, !tbaa !13
  %798 = icmp eq i32 %797, 3
  br i1 %798, label %799, label %817

799:                                              ; preds = %796
  %800 = load ptr, ptr %14, align 8, !tbaa !5
  %801 = load i32, ptr %9, align 4, !tbaa !13
  %802 = load ptr, ptr %5, align 8, !tbaa !5
  %803 = call i32 @SMconvexHullTest(ptr noundef %800, i32 noundef %801, ptr noundef %802)
  store i32 %803, ptr %6, align 4, !tbaa !13
  %804 = load i32, ptr %6, align 4, !tbaa !13
  %805 = icmp ne i32 %804, 0
  br i1 %805, label %806, label %809

806:                                              ; preds = %799
  %807 = load i32, ptr %6, align 4, !tbaa !13
  %808 = call i32 @SMerror(i32 noundef 487, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef %807, i32 noundef 0, ptr noundef null)
  store i32 %808, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

809:                                              ; preds = %799
  %810 = load ptr, ptr %5, align 8, !tbaa !5
  %811 = load i32, ptr %810, align 4, !tbaa !13
  %812 = icmp eq i32 %811, 1
  br i1 %812, label %813, label %816

813:                                              ; preds = %809
  %814 = load ptr, ptr %4, align 8, !tbaa !5
  %815 = getelementptr inbounds %struct.__SMoptimal, ptr %814, i32 0, i32 4
  store i32 104, ptr %815, align 8, !tbaa !18
  br label %816

816:                                              ; preds = %813, %809
  br label %817

817:                                              ; preds = %816, %796
  store i32 0, ptr %7, align 4, !tbaa !13
  br label %818

818:                                              ; preds = %838, %817
  %819 = load i32, ptr %7, align 4, !tbaa !13
  %820 = load i32, ptr %9, align 4, !tbaa !13
  %821 = icmp slt i32 %819, %820
  br i1 %821, label %822, label %841

822:                                              ; preds = %818
  %823 = load ptr, ptr %14, align 8, !tbaa !5
  %824 = load i32, ptr %7, align 4, !tbaa !13
  %825 = sext i32 %824 to i64
  %826 = getelementptr inbounds ptr, ptr %823, i64 %825
  %827 = load ptr, ptr %826, align 8, !tbaa !5
  %828 = icmp eq ptr %827, null
  br i1 %828, label %829, label %831

829:                                              ; preds = %822
  %830 = call i32 @SMerror(i32 noundef 491, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %830, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

831:                                              ; preds = %822
  %832 = load ptr, ptr %14, align 8, !tbaa !5
  %833 = load i32, ptr %7, align 4, !tbaa !13
  %834 = sext i32 %833 to i64
  %835 = getelementptr inbounds ptr, ptr %832, i64 %834
  %836 = load ptr, ptr %835, align 8, !tbaa !5
  call void @free(ptr noundef %836) #5
  br label %837

837:                                              ; preds = %831
  br label %838

838:                                              ; preds = %837
  %839 = load i32, ptr %7, align 4, !tbaa !13
  %840 = add nsw i32 %839, 1
  store i32 %840, ptr %7, align 4, !tbaa !13
  br label %818, !llvm.loop !37

841:                                              ; preds = %818
  %842 = load ptr, ptr %14, align 8, !tbaa !5
  %843 = icmp eq ptr %842, null
  br i1 %843, label %844, label %846

844:                                              ; preds = %841
  %845 = call i32 @SMerror(i32 noundef 492, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null)
  store i32 %845, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

846:                                              ; preds = %841
  %847 = load ptr, ptr %14, align 8, !tbaa !5
  call void @free(ptr noundef %847) #5
  br label %848

848:                                              ; preds = %846
  store i32 0, ptr %6, align 4, !tbaa !13
  store i32 0, ptr %3, align 4
  store i32 1, ptr %19, align 4
  br label %849

849:                                              ; preds = %848, %844, %829, %806, %788, %784, %769, %380, %376, %361, %315, %58, %40
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 24, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  %850 = load i32, ptr %3, align 4
  ret i32 %850
}

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

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

declare i32 @SMgetActiveDirections(i32 noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) #1

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

declare i32 @SMformGrammian(i32 noundef, ptr noundef, ptr noundef, i32 noundef) #1

; Function Attrs: nounwind
declare void @free(ptr noundef) #4

declare i32 @SMconvexHullTest(ptr noundef, i32 noundef, ptr noundef) #1

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

!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/C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"__SMoptimal", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !12, i64 32, !11, i64 40, !11, i64 44, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !11, i64 104, !7, i64 112, !12, i64 136, !12, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !7, i64 184, !11, i64 196}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !6, i64 80}
!15 = !{!16, !11, i64 0}
!16 = !{!"__SMactive", !11, i64 0, !11, i64 4, !6, i64 8, !12, i64 16}
!17 = !{!10, !11, i64 44}
!18 = !{!10, !11, i64 16}
!19 = !{!10, !6, i64 56}
!20 = !{!16, !6, i64 8}
!21 = !{!12, !12, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = distinct !{!24, !23}
!25 = distinct !{!25, !23}
!26 = !{!10, !6, i64 168}
!27 = distinct !{!27, !23}
!28 = distinct !{!28, !23}
!29 = distinct !{!29, !23}
!30 = distinct !{!30, !23}
!31 = distinct !{!31, !23}
!32 = distinct !{!32, !23}
!33 = distinct !{!33, !23}
!34 = distinct !{!34, !23}
!35 = distinct !{!35, !23}
!36 = distinct !{!36, !23}
!37 = distinct !{!37, !23}


; 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 [110 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [19 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

declare i32 @SMerror(i32 noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @SMcheckEquilibrium(ptr nocapture noundef %0, ptr noundef %1) local_unnamed_addr #2 {
  %3 = alloca ptr, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #6
  %4 = load i32, ptr %0, align 8, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %0, i64 80
  %6 = load ptr, ptr %5, align 8, !tbaa !12
  %7 = load i32, ptr %6, align 8, !tbaa !13
  store i32 0, ptr %1, align 4, !tbaa !15
  %8 = getelementptr inbounds i8, ptr %0, i64 44
  %9 = load i32, ptr %8, align 4, !tbaa !16
  %10 = icmp eq i32 %7, %9
  br i1 %10, label %11, label %13

11:                                               ; preds = %2
  store i32 1, ptr %1, align 4, !tbaa !15
  %12 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 104, ptr %12, align 8, !tbaa !17
  br label %199

13:                                               ; preds = %2
  %14 = getelementptr inbounds i8, ptr %0, i64 56
  %15 = load ptr, ptr %14, align 8, !tbaa !18
  %16 = getelementptr inbounds i8, ptr %6, i64 8
  %17 = load ptr, ptr %16, align 8, !tbaa !19
  %18 = call i32 @SMgetActiveDirections(i32 noundef %7, ptr noundef %15, ptr noundef %17, i32 noundef %4, ptr noundef nonnull %3) #6
  %.not = icmp eq i32 %18, 0
  br i1 %.not, label %.preheader245, label %54

.preheader245:                                    ; preds = %13
  %19 = icmp sgt i32 %7, 0
  br i1 %19, label %.lr.ph258, label %._crit_edge259

.lr.ph258:                                        ; preds = %.preheader245
  %20 = load ptr, ptr %3, align 8
  %21 = icmp sgt i32 %4, 0
  %22 = icmp slt i32 %4, 1
  %wide.trip.count322 = zext nneg i32 %7 to i64
  switch i32 %4, label %.preheader244.preheader [
    i32 2, label %.lr.ph258.split.us
    i32 3, label %.lr.ph258.split.us260
  ]

.preheader244.preheader:                          ; preds = %.lr.ph258
  %wide.trip.count312 = zext i32 %4 to i64
  %wide.trip.count317 = zext nneg i32 %4 to i64
  %xtraiter = and i64 %wide.trip.count312, 3
  %23 = icmp ult i32 %4, 4
  %unroll_iter = and i64 %wide.trip.count312, 2147483644
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %min.iters.check = icmp eq i32 %4, 1
  %n.vec = and i64 %wide.trip.count312, 2147483646
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count312
  br label %.preheader244

.lr.ph258.split.us:                               ; preds = %.lr.ph258, %36
  %indvars.iv304 = phi i64 [ %indvars.iv.next305, %36 ], [ 0, %.lr.ph258 ]
  %24 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv304
  %25 = load ptr, ptr %24, align 8, !tbaa !20
  %26 = load <2 x double>, ptr %25, align 8, !tbaa !21
  %27 = fmul <2 x double> %26, %26
  %28 = extractelement <2 x double> %27, i64 1
  %29 = extractelement <2 x double> %26, i64 0
  %30 = call double @llvm.fmuladd.f64(double %29, double %29, double %28)
  %sqrt.us = call double @llvm.sqrt.f64(double %30)
  %31 = fcmp une double %sqrt.us, 0.000000e+00
  br i1 %31, label %32, label %36

32:                                               ; preds = %.lr.ph258.split.us
  %33 = insertelement <2 x double> poison, double %sqrt.us, i64 0
  %34 = shufflevector <2 x double> %33, <2 x double> poison, <2 x i32> zeroinitializer
  %35 = fdiv <2 x double> %26, %34
  store <2 x double> %35, ptr %25, align 8, !tbaa !21
  br label %36

36:                                               ; preds = %32, %.lr.ph258.split.us
  %indvars.iv.next305 = add nuw nsw i64 %indvars.iv304, 1
  %exitcond308.not = icmp eq i64 %indvars.iv.next305, %wide.trip.count322
  br i1 %exitcond308.not, label %._crit_edge259, label %.lr.ph258.split.us, !llvm.loop !22

.lr.ph258.split.us260:                            ; preds = %.lr.ph258, %53
  %indvars.iv = phi i64 [ %indvars.iv.next, %53 ], [ 0, %.lr.ph258 ]
  %37 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv
  %38 = load ptr, ptr %37, align 8, !tbaa !20
  %39 = load <2 x double>, ptr %38, align 8, !tbaa !21
  %40 = fmul <2 x double> %39, %39
  %41 = extractelement <2 x double> %40, i64 1
  %42 = extractelement <2 x double> %39, i64 0
  %43 = call double @llvm.fmuladd.f64(double %42, double %42, double %41)
  %44 = getelementptr inbounds i8, ptr %38, i64 16
  %45 = load double, ptr %44, align 8, !tbaa !21
  %46 = call double @llvm.fmuladd.f64(double %45, double %45, double %43)
  %sqrt239.us = call double @llvm.sqrt.f64(double %46)
  %47 = fcmp une double %sqrt239.us, 0.000000e+00
  br i1 %47, label %48, label %53

48:                                               ; preds = %.lr.ph258.split.us260
  %49 = insertelement <2 x double> poison, double %sqrt239.us, i64 0
  %50 = shufflevector <2 x double> %49, <2 x double> poison, <2 x i32> zeroinitializer
  %51 = fdiv <2 x double> %39, %50
  store <2 x double> %51, ptr %38, align 8, !tbaa !21
  %52 = fdiv double %45, %sqrt239.us
  store double %52, ptr %44, align 8, !tbaa !21
  br label %53

53:                                               ; preds = %48, %.lr.ph258.split.us260
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count322
  br i1 %exitcond.not, label %._crit_edge259, label %.lr.ph258.split.us260, !llvm.loop !22

54:                                               ; preds = %13
  %55 = call i32 @SMerror(i32 noundef 426, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef %18, i32 noundef 0, ptr noundef null) #6
  br label %199

.preheader244:                                    ; preds = %.preheader244.preheader, %.loopexit243
  %indvars.iv319 = phi i64 [ 0, %.preheader244.preheader ], [ %indvars.iv.next320, %.loopexit243 ]
  %.0189257 = phi double [ undef, %.preheader244.preheader ], [ %.1190.lcssa363, %.loopexit243 ]
  br i1 %21, label %.lr.ph, label %.loopexit243

.lr.ph:                                           ; preds = %.preheader244
  %56 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv319
  %57 = load ptr, ptr %56, align 8, !tbaa !20
  br i1 %23, label %._crit_edge.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph, %.lr.ph.new
  %indvars.iv309 = phi i64 [ %indvars.iv.next310.3, %.lr.ph.new ], [ 0, %.lr.ph ]
  %.1190252 = phi double [ %73, %.lr.ph.new ], [ %.0189257, %.lr.ph ]
  %niter = phi i64 [ %niter.next.3, %.lr.ph.new ], [ 0, %.lr.ph ]
  %58 = getelementptr inbounds double, ptr %57, i64 %indvars.iv309
  %59 = load double, ptr %58, align 8, !tbaa !21
  %60 = fadd double %59, %59
  %61 = fadd double %.1190252, %60
  %indvars.iv.next310 = or disjoint i64 %indvars.iv309, 1
  %62 = getelementptr inbounds double, ptr %57, i64 %indvars.iv.next310
  %63 = load double, ptr %62, align 8, !tbaa !21
  %64 = fadd double %63, %63
  %65 = fadd double %61, %64
  %indvars.iv.next310.1 = or disjoint i64 %indvars.iv309, 2
  %66 = getelementptr inbounds double, ptr %57, i64 %indvars.iv.next310.1
  %67 = load double, ptr %66, align 8, !tbaa !21
  %68 = fadd double %67, %67
  %69 = fadd double %65, %68
  %indvars.iv.next310.2 = or disjoint i64 %indvars.iv309, 3
  %70 = getelementptr inbounds double, ptr %57, i64 %indvars.iv.next310.2
  %71 = load double, ptr %70, align 8, !tbaa !21
  %72 = fadd double %71, %71
  %73 = fadd double %69, %72
  %indvars.iv.next310.3 = add nuw nsw i64 %indvars.iv309, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.unr-lcssa, label %.lr.ph.new, !llvm.loop !24

._crit_edge.unr-lcssa:                            ; preds = %.lr.ph.new, %.lr.ph
  %.lcssa.ph = phi double [ poison, %.lr.ph ], [ %73, %.lr.ph.new ]
  %indvars.iv309.unr = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next310.3, %.lr.ph.new ]
  %.1190252.unr = phi double [ %.0189257, %.lr.ph ], [ %73, %.lr.ph.new ]
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.unr-lcssa, %.epil.preheader
  %indvars.iv309.epil = phi i64 [ %indvars.iv.next310.epil, %.epil.preheader ], [ %indvars.iv309.unr, %._crit_edge.unr-lcssa ]
  %.1190252.epil = phi double [ %77, %.epil.preheader ], [ %.1190252.unr, %._crit_edge.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.unr-lcssa ]
  %74 = getelementptr inbounds double, ptr %57, i64 %indvars.iv309.epil
  %75 = load double, ptr %74, align 8, !tbaa !21
  %76 = fadd double %75, %75
  %77 = fadd double %.1190252.epil, %76
  %indvars.iv.next310.epil = add nuw nsw i64 %indvars.iv309.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.epil.preheader, !llvm.loop !25

._crit_edge:                                      ; preds = %.epil.preheader, %._crit_edge.unr-lcssa
  %.lcssa = phi double [ %.lcssa.ph, %._crit_edge.unr-lcssa ], [ %77, %.epil.preheader ]
  %78 = fcmp oeq double %.lcssa, 0.000000e+00
  %brmerge = select i1 %78, i1 true, i1 %22
  br i1 %brmerge, label %.loopexit243, label %.lr.ph254

.lr.ph254:                                        ; preds = %._crit_edge
  %79 = getelementptr inbounds ptr, ptr %20, i64 %indvars.iv319
  %80 = load ptr, ptr %79, align 8, !tbaa !20
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %.lr.ph254
  %broadcast.splatinsert = insertelement <2 x double> poison, double %.lcssa, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %81 = getelementptr inbounds double, ptr %80, i64 %index
  %wide.load = load <2 x double>, ptr %81, align 8, !tbaa !21
  %82 = fdiv <2 x double> %wide.load, %broadcast.splat
  store <2 x double> %82, ptr %81, align 8, !tbaa !21
  %index.next = add nuw i64 %index, 2
  %83 = icmp eq i64 %index.next, %n.vec
  br i1 %83, label %middle.block, label %vector.body, !llvm.loop !27

middle.block:                                     ; preds = %vector.body
  br i1 %cmp.n, label %.loopexit243, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %.lr.ph254
  %indvars.iv314.ph = phi i64 [ 0, %.lr.ph254 ], [ %n.vec, %middle.block ]
  br label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %indvars.iv314 = phi i64 [ %indvars.iv.next315, %scalar.ph ], [ %indvars.iv314.ph, %scalar.ph.preheader ]
  %84 = getelementptr inbounds double, ptr %80, i64 %indvars.iv314
  %85 = load double, ptr %84, align 8, !tbaa !21
  %86 = fdiv double %85, %.lcssa
  store double %86, ptr %84, align 8, !tbaa !21
  %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 %.loopexit243, label %scalar.ph, !llvm.loop !30

.loopexit243:                                     ; preds = %scalar.ph, %middle.block, %.preheader244, %._crit_edge
  %.1190.lcssa363 = phi double [ %.lcssa, %._crit_edge ], [ %.0189257, %.preheader244 ], [ %.lcssa, %middle.block ], [ %.lcssa, %scalar.ph ]
  %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 %._crit_edge259, label %.preheader244, !llvm.loop !22

._crit_edge259:                                   ; preds = %53, %36, %.loopexit243, %.preheader245
  switch i32 %4, label %.loopexit [
    i32 2, label %87
    i32 3, label %177
  ]

87:                                               ; preds = %._crit_edge259
  %88 = load ptr, ptr %3, align 8, !tbaa !20
  %89 = getelementptr inbounds i8, ptr %0, i64 168
  %90 = load ptr, ptr %89, align 8, !tbaa !31
  %91 = call i32 @SMformGrammian(i32 noundef %7, ptr noundef %88, ptr noundef %90, i32 noundef 2) #6
  %.not234 = icmp eq i32 %91, 0
  br i1 %.not234, label %94, label %92

92:                                               ; preds = %87
  %93 = call i32 @SMerror(i32 noundef 434, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef %91, i32 noundef 0, ptr noundef null) #6
  br label %199

94:                                               ; preds = %87
  %95 = load ptr, ptr %89, align 8, !tbaa !31
  br i1 %19, label %.lr.ph279.preheader, label %._crit_edge298

.lr.ph279.preheader:                              ; preds = %94
  %96 = zext nneg i32 %7 to i64
  %wide.trip.count334 = zext nneg i32 %7 to i64
  br label %.lr.ph279

.loopexit241:                                     ; preds = %120, %.lr.ph279
  %.1206.lcssa = phi i32 [ %.0205275, %.lr.ph279 ], [ %.2207, %120 ]
  %.1203.lcssa = phi i32 [ %.0202276, %.lr.ph279 ], [ %.2204, %120 ]
  %.1200.lcssa = phi double [ %.0199277, %.lr.ph279 ], [ %.2201, %120 ]
  %indvars.iv.next325 = add nuw nsw i64 %indvars.iv324, 1
  %exitcond335.not = icmp eq i64 %indvars.iv.next332, %wide.trip.count334
  br i1 %exitcond335.not, label %._crit_edge280, label %.lr.ph279, !llvm.loop !32

.lr.ph279:                                        ; preds = %.lr.ph279.preheader, %.loopexit241
  %indvars.iv331 = phi i64 [ 0, %.lr.ph279.preheader ], [ %indvars.iv.next332, %.loopexit241 ]
  %indvars.iv324 = phi i64 [ 1, %.lr.ph279.preheader ], [ %indvars.iv.next325, %.loopexit241 ]
  %.0199277 = phi double [ 1.000000e+00, %.lr.ph279.preheader ], [ %.1200.lcssa, %.loopexit241 ]
  %.0202276 = phi i32 [ -1, %.lr.ph279.preheader ], [ %.1203.lcssa, %.loopexit241 ]
  %.0205275 = phi i32 [ -1, %.lr.ph279.preheader ], [ %.1206.lcssa, %.loopexit241 ]
  %indvars.iv.next332 = add nuw nsw i64 %indvars.iv331, 1
  %97 = icmp ult i64 %indvars.iv.next332, %96
  br i1 %97, label %.lr.ph270, label %.loopexit241

.lr.ph270:                                        ; preds = %.lr.ph279
  %98 = getelementptr inbounds ptr, ptr %95, i64 %indvars.iv331
  %99 = load ptr, ptr %98, align 8, !tbaa !20
  %100 = trunc nuw nsw i64 %indvars.iv331 to i32
  br label %101

101:                                              ; preds = %.lr.ph270, %120
  %indvars.iv326 = phi i64 [ %indvars.iv324, %.lr.ph270 ], [ %indvars.iv.next327, %120 ]
  %.1200268 = phi double [ %.0199277, %.lr.ph270 ], [ %.2201, %120 ]
  %.1203267 = phi i32 [ %.0202276, %.lr.ph270 ], [ %.2204, %120 ]
  %.1206266 = phi i32 [ %.0205275, %.lr.ph270 ], [ %.2207, %120 ]
  %102 = getelementptr inbounds double, ptr %99, i64 %indvars.iv326
  %103 = load double, ptr %102, align 8, !tbaa !21
  %104 = fsub double -1.000000e+00, %103
  %105 = call double @llvm.fabs.f64(double %104)
  %106 = fcmp olt double %105, 1.000000e-08
  br i1 %106, label %.lr.ph293.preheader, label %120

.lr.ph293.preheader:                              ; preds = %101
  store i32 1, ptr %1, align 4, !tbaa !15
  %107 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 104, ptr %107, align 8, !tbaa !17
  br label %.lr.ph293

.lr.ph293:                                        ; preds = %.lr.ph293.preheader, %114
  %indvars.iv349 = phi i64 [ 0, %.lr.ph293.preheader ], [ %indvars.iv.next350, %114 ]
  %108 = load ptr, ptr %3, align 8, !tbaa !20
  %109 = getelementptr inbounds ptr, ptr %108, i64 %indvars.iv349
  %110 = load ptr, ptr %109, align 8, !tbaa !20
  %111 = icmp eq ptr %110, null
  br i1 %111, label %112, label %114

112:                                              ; preds = %.lr.ph293
  %113 = call i32 @SMerror(i32 noundef 446, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

114:                                              ; preds = %.lr.ph293
  call void @free(ptr noundef nonnull %110) #6
  %indvars.iv.next350 = add nuw nsw i64 %indvars.iv349, 1
  %exitcond353.not = icmp eq i64 %indvars.iv.next350, %wide.trip.count334
  br i1 %exitcond353.not, label %._crit_edge294, label %.lr.ph293, !llvm.loop !33

._crit_edge294:                                   ; preds = %114
  %115 = load ptr, ptr %3, align 8, !tbaa !20
  %116 = icmp eq ptr %115, null
  br i1 %116, label %117, label %119

117:                                              ; preds = %._crit_edge294
  %118 = call i32 @SMerror(i32 noundef 447, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

119:                                              ; preds = %._crit_edge294
  call void @free(ptr noundef nonnull %115) #6
  br label %199

120:                                              ; preds = %101
  %121 = fcmp olt double %103, %.1200268
  %.2207 = select i1 %121, i32 %100, i32 %.1206266
  %122 = trunc nuw nsw i64 %indvars.iv326 to i32
  %.2204 = select i1 %121, i32 %122, i32 %.1203267
  %.2201 = select i1 %121, double %103, double %.1200268
  %indvars.iv.next327 = add nuw nsw i64 %indvars.iv326, 1
  %exitcond330.not = icmp eq i64 %indvars.iv.next327, %wide.trip.count334
  br i1 %exitcond330.not, label %.loopexit241, label %101, !llvm.loop !34

._crit_edge280:                                   ; preds = %.loopexit241
  %123 = icmp ne i32 %.1206.lcssa, -1
  %124 = icmp ne i32 %.1203.lcssa, -1
  %or.cond = select i1 %123, i1 %124, i1 false
  br i1 %or.cond, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %._crit_edge280
  %125 = load ptr, ptr %3, align 8, !tbaa !20
  %126 = sext i32 %.1206.lcssa to i64
  %127 = getelementptr inbounds ptr, ptr %125, i64 %126
  %128 = load ptr, ptr %127, align 8, !tbaa !20
  %129 = sext i32 %.1203.lcssa to i64
  %130 = getelementptr inbounds ptr, ptr %125, i64 %129
  %131 = load ptr, ptr %130, align 8, !tbaa !20
  %132 = load double, ptr %128, align 8, !tbaa !21
  %133 = load double, ptr %131, align 8, !tbaa !21
  %134 = fadd double %132, %133
  %135 = fmul double %134, 5.000000e-01
  %136 = getelementptr inbounds i8, ptr %128, i64 8
  %137 = load double, ptr %136, align 8, !tbaa !21
  %138 = getelementptr inbounds i8, ptr %131, i64 8
  %139 = load double, ptr %138, align 8, !tbaa !21
  %140 = fadd double %137, %139
  %141 = fmul double %140, 5.000000e-01
  %142 = fmul double %141, %141
  %143 = call double @llvm.fmuladd.f64(double %135, double %135, double %142)
  %sqrt240 = call double @llvm.sqrt.f64(double %143)
  %144 = fcmp une double %sqrt240, 0.000000e+00
  %145 = fdiv double %135, %sqrt240
  %146 = fdiv double %141, %sqrt240
  %.sroa.6.0 = select i1 %144, double %146, double %141
  %.sroa.0.0 = select i1 %144, double %145, double %135
  %147 = fmul double %137, %.sroa.6.0
  %148 = call double @llvm.fmuladd.f64(double %132, double %.sroa.0.0, double %147)
  br i1 %19, label %.lr.ph286.preheader, label %._crit_edge298

.lr.ph286.preheader:                              ; preds = %.preheader
  %149 = zext i32 %.1203.lcssa to i64
  %150 = zext i32 %.1206.lcssa to i64
  %wide.trip.count342 = zext nneg i32 %7 to i64
  br label %.lr.ph286

.lr.ph286:                                        ; preds = %.lr.ph286.preheader, %176
  %indvars.iv339 = phi i64 [ 0, %.lr.ph286.preheader ], [ %indvars.iv.next340, %176 ]
  %.not236 = icmp eq i64 %indvars.iv339, %150
  %.not237 = icmp eq i64 %indvars.iv339, %149
  %or.cond238 = select i1 %.not236, i1 true, i1 %.not237
  br i1 %or.cond238, label %176, label %151

151:                                              ; preds = %.lr.ph286
  %152 = getelementptr inbounds ptr, ptr %125, i64 %indvars.iv339
  %153 = load ptr, ptr %152, align 8, !tbaa !20
  %154 = load double, ptr %153, align 8, !tbaa !21
  %155 = getelementptr inbounds i8, ptr %153, i64 8
  %156 = load double, ptr %155, align 8, !tbaa !21
  %157 = fmul double %.sroa.6.0, %156
  %158 = call double @llvm.fmuladd.f64(double %154, double %.sroa.0.0, double %157)
  %159 = fcmp olt double %158, %148
  br i1 %159, label %160, label %176

160:                                              ; preds = %151
  %161 = fsub double %158, %148
  %162 = call double @llvm.fabs.f64(double %161)
  %163 = fcmp ogt double %162, 1.000000e-15
  br i1 %163, label %.lr.ph289.preheader, label %176

.lr.ph289.preheader:                              ; preds = %160
  store i32 1, ptr %1, align 4, !tbaa !15
  %164 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 104, ptr %164, align 8, !tbaa !17
  br label %.lr.ph289

.lr.ph289:                                        ; preds = %.lr.ph289.preheader, %171
  %indvars.iv344 = phi i64 [ 0, %.lr.ph289.preheader ], [ %indvars.iv.next345, %171 ]
  %165 = load ptr, ptr %3, align 8, !tbaa !20
  %166 = getelementptr inbounds ptr, ptr %165, i64 %indvars.iv344
  %167 = load ptr, ptr %166, align 8, !tbaa !20
  %168 = icmp eq ptr %167, null
  br i1 %168, label %169, label %171

169:                                              ; preds = %.lr.ph289
  %170 = call i32 @SMerror(i32 noundef 475, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

171:                                              ; preds = %.lr.ph289
  call void @free(ptr noundef nonnull %167) #6
  %indvars.iv.next345 = add nuw nsw i64 %indvars.iv344, 1
  %exitcond348.not = icmp eq i64 %indvars.iv.next345, %wide.trip.count342
  br i1 %exitcond348.not, label %._crit_edge290, label %.lr.ph289, !llvm.loop !35

._crit_edge290:                                   ; preds = %171
  %.pre = load ptr, ptr %3, align 8, !tbaa !20
  %172 = icmp eq ptr %.pre, null
  br i1 %172, label %173, label %175

173:                                              ; preds = %._crit_edge290
  %174 = call i32 @SMerror(i32 noundef 476, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

175:                                              ; preds = %._crit_edge290
  call void @free(ptr noundef nonnull %.pre) #6
  br label %199

176:                                              ; preds = %.lr.ph286, %160, %151
  %indvars.iv.next340 = add nuw nsw i64 %indvars.iv339, 1
  %exitcond343.not = icmp eq i64 %indvars.iv.next340, %wide.trip.count342
  br i1 %exitcond343.not, label %.loopexit, label %.lr.ph286, !llvm.loop !36

177:                                              ; preds = %._crit_edge259
  %178 = load ptr, ptr %3, align 8, !tbaa !20
  %179 = call i32 @SMconvexHullTest(ptr noundef %178, i32 noundef %7, ptr noundef nonnull %1) #6
  %.not235 = icmp eq i32 %179, 0
  br i1 %.not235, label %182, label %180

180:                                              ; preds = %177
  %181 = call i32 @SMerror(i32 noundef 487, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef %179, i32 noundef 0, ptr noundef null) #6
  br label %199

182:                                              ; preds = %177
  %183 = load i32, ptr %1, align 4, !tbaa !15
  %184 = icmp eq i32 %183, 1
  br i1 %184, label %185, label %.loopexit

185:                                              ; preds = %182
  %186 = getelementptr inbounds i8, ptr %0, i64 16
  store i32 104, ptr %186, align 8, !tbaa !17
  br label %.loopexit

.loopexit:                                        ; preds = %176, %._crit_edge280, %._crit_edge259, %182, %185
  br i1 %19, label %.lr.ph297.preheader, label %._crit_edge298

.lr.ph297.preheader:                              ; preds = %.loopexit
  %wide.trip.count357 = zext nneg i32 %7 to i64
  br label %.lr.ph297

.lr.ph297:                                        ; preds = %.lr.ph297.preheader, %193
  %indvars.iv354 = phi i64 [ 0, %.lr.ph297.preheader ], [ %indvars.iv.next355, %193 ]
  %187 = load ptr, ptr %3, align 8, !tbaa !20
  %188 = getelementptr inbounds ptr, ptr %187, i64 %indvars.iv354
  %189 = load ptr, ptr %188, align 8, !tbaa !20
  %190 = icmp eq ptr %189, null
  br i1 %190, label %191, label %193

191:                                              ; preds = %.lr.ph297
  %192 = call i32 @SMerror(i32 noundef 491, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

193:                                              ; preds = %.lr.ph297
  call void @free(ptr noundef nonnull %189) #6
  %indvars.iv.next355 = add nuw nsw i64 %indvars.iv354, 1
  %exitcond358.not = icmp eq i64 %indvars.iv.next355, %wide.trip.count357
  br i1 %exitcond358.not, label %._crit_edge298, label %.lr.ph297, !llvm.loop !37

._crit_edge298:                                   ; preds = %193, %94, %.preheader, %.loopexit
  %194 = load ptr, ptr %3, align 8, !tbaa !20
  %195 = icmp eq ptr %194, null
  br i1 %195, label %196, label %198

196:                                              ; preds = %._crit_edge298
  %197 = call i32 @SMerror(i32 noundef 492, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 60, i32 noundef 0, ptr noundef null) #6
  br label %199

198:                                              ; preds = %._crit_edge298
  call void @free(ptr noundef nonnull %194) #6
  br label %199

199:                                              ; preds = %198, %196, %191, %180, %175, %173, %169, %119, %117, %112, %92, %54, %11
  %.0198 = phi i32 [ 0, %11 ], [ %55, %54 ], [ %93, %92 ], [ %113, %112 ], [ %118, %117 ], [ 0, %119 ], [ %170, %169 ], [ %174, %173 ], [ 0, %175 ], [ %181, %180 ], [ %192, %191 ], [ %197, %196 ], [ 0, %198 ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #6
  ret i32 %.0198
}

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

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

declare i32 @SMgetActiveDirections(i32 noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

declare i32 @SMformGrammian(i32 noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #4

declare i32 @SMconvexHullTest(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"__SMoptimal", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !10, i64 32, !7, i64 40, !7, i64 44, !11, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !11, i64 88, !11, i64 96, !7, i64 104, !8, i64 112, !10, i64 136, !10, i64 144, !11, i64 152, !11, i64 160, !11, i64 168, !11, i64 176, !8, i64 184, !7, i64 196}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"double", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!6, !11, i64 80}
!13 = !{!14, !7, i64 0}
!14 = !{!"__SMactive", !7, i64 0, !7, i64 4, !11, i64 8, !10, i64 16}
!15 = !{!7, !7, i64 0}
!16 = !{!6, !7, i64 44}
!17 = !{!6, !7, i64 16}
!18 = !{!6, !11, i64 56}
!19 = !{!14, !11, i64 8}
!20 = !{!11, !11, i64 0}
!21 = !{!10, !10, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = distinct !{!24, !23}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.unroll.disable"}
!27 = distinct !{!27, !23, !28, !29}
!28 = !{!"llvm.loop.isvectorized", i32 1}
!29 = !{!"llvm.loop.unroll.runtime.disable"}
!30 = distinct !{!30, !23, !29, !28}
!31 = !{!6, !11, i64 168}
!32 = distinct !{!32, !23}
!33 = distinct !{!33, !23}
!34 = distinct !{!34, !23}
!35 = distinct !{!35, !23}
!36 = distinct !{!36, !23}
!37 = distinct !{!37, !23}


; Effective O3 passes: AggressiveInstCombinePass,ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,VectorCombinePass