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

; 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 [108 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
@.str.5 = external hidden unnamed_addr constant [25 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: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #2

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

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

33:                                               ; preds = %4
  %34 = call i32 @SMerror(i32 noundef 171, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 56, i32 noundef 0, ptr noundef null)
  store i32 %34, ptr %5, align 4
  store i32 1, ptr %23, align 4
  br label %513

35:                                               ; preds = %4
  %36 = load i32, ptr %15, align 4, !tbaa !5
  %37 = icmp ne i32 %36, 2
  br i1 %37, label %38, label %43

38:                                               ; preds = %35
  %39 = load i32, ptr %15, align 4, !tbaa !5
  %40 = icmp ne i32 %39, 3
  br i1 %40, label %41, label %43

41:                                               ; preds = %38
  %42 = call i32 @SMerror(i32 noundef 173, ptr noundef @.str.4, ptr noundef @.str.1, ptr noundef @.str.2, i32 noundef 57, i32 noundef 0, ptr noundef @.str.5)
  store i32 %42, ptr %5, align 4
  store i32 1, ptr %23, align 4
  br label %513

43:                                               ; preds = %38, %35
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %44

44:                                               ; preds = %52, %43
  %45 = load i32, ptr %11, align 4, !tbaa !5
  %46 = load i32, ptr %15, align 4, !tbaa !5
  %47 = icmp slt i32 %45, %46
  br i1 %47, label %48, label %55

48:                                               ; preds = %44
  %49 = load i32, ptr %11, align 4, !tbaa !5
  %50 = sext i32 %49 to i64
  %51 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 %50
  store double 0.000000e+00, ptr %51, align 8, !tbaa !14
  br label %52

52:                                               ; preds = %48
  %53 = load i32, ptr %11, align 4, !tbaa !5
  %54 = add nsw i32 %53, 1
  store i32 %54, ptr %11, align 4, !tbaa !5
  br label %44, !llvm.loop !15

55:                                               ; preds = %44
  store double 1.000000e+300, ptr %22, align 8, !tbaa !14
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %56

56:                                               ; preds = %450, %55
  %57 = load i32, ptr %11, align 4, !tbaa !5
  %58 = load i32, ptr %6, align 4, !tbaa !5
  %59 = icmp slt i32 %57, %58
  br i1 %59, label %60, label %453

60:                                               ; preds = %56
  store i32 1, ptr %14, align 4, !tbaa !5
  store i32 0, ptr %12, align 4, !tbaa !5
  br label %61

61:                                               ; preds = %78, %60
  %62 = load i32, ptr %12, align 4, !tbaa !5
  %63 = load i32, ptr %6, align 4, !tbaa !5
  %64 = icmp slt i32 %62, %63
  br i1 %64, label %65, label %81

65:                                               ; preds = %61
  %66 = load ptr, ptr %7, align 8, !tbaa !9
  %67 = load i32, ptr %12, align 4, !tbaa !5
  %68 = sext i32 %67 to i64
  %69 = getelementptr inbounds ptr, ptr %66, i64 %68
  %70 = load ptr, ptr %69, align 8, !tbaa !9
  %71 = load i32, ptr %11, align 4, !tbaa !5
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds double, ptr %70, i64 %72
  %74 = load double, ptr %73, align 8, !tbaa !14
  %75 = fcmp olt double %74, 0.000000e+00
  br i1 %75, label %76, label %77

76:                                               ; preds = %65
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %77

77:                                               ; preds = %76, %65
  br label %78

78:                                               ; preds = %77
  %79 = load i32, ptr %12, align 4, !tbaa !5
  %80 = add nsw i32 %79, 1
  store i32 %80, ptr %12, align 4, !tbaa !5
  br label %61, !llvm.loop !17

81:                                               ; preds = %61
  %82 = load i32, ptr %14, align 4, !tbaa !5
  %83 = icmp ne i32 %82, 0
  br i1 %83, label %84, label %188

84:                                               ; preds = %81
  %85 = load ptr, ptr %7, align 8, !tbaa !9
  %86 = load i32, ptr %11, align 4, !tbaa !5
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds ptr, ptr %85, i64 %87
  %89 = load ptr, ptr %88, align 8, !tbaa !9
  %90 = load i32, ptr %11, align 4, !tbaa !5
  %91 = sext i32 %90 to i64
  %92 = getelementptr inbounds double, ptr %89, i64 %91
  %93 = load double, ptr %92, align 8, !tbaa !14
  %94 = load double, ptr %22, align 8, !tbaa !14
  %95 = fcmp olt double %93, %94
  br i1 %95, label %96, label %188

96:                                               ; preds = %84
  %97 = load ptr, ptr %7, align 8, !tbaa !9
  %98 = load i32, ptr %11, align 4, !tbaa !5
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds ptr, ptr %97, i64 %99
  %101 = load ptr, ptr %100, align 8, !tbaa !9
  %102 = load i32, ptr %11, align 4, !tbaa !5
  %103 = sext i32 %102 to i64
  %104 = getelementptr inbounds double, ptr %101, i64 %103
  %105 = load double, ptr %104, align 8, !tbaa !14
  store double %105, ptr %22, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  %106 = load i32, ptr %15, align 4, !tbaa !5
  %107 = icmp eq i32 %106, 2
  br i1 %107, label %108, label %125

108:                                              ; preds = %96
  %109 = load ptr, ptr %8, align 8, !tbaa !9
  %110 = load i32, ptr %11, align 4, !tbaa !5
  %111 = sext i32 %110 to i64
  %112 = getelementptr inbounds ptr, ptr %109, i64 %111
  %113 = load ptr, ptr %112, align 8, !tbaa !9
  %114 = getelementptr inbounds double, ptr %113, i64 0
  %115 = load double, ptr %114, align 8, !tbaa !14
  %116 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  store double %115, ptr %116, align 16, !tbaa !14
  %117 = load ptr, ptr %8, align 8, !tbaa !9
  %118 = load i32, ptr %11, align 4, !tbaa !5
  %119 = sext i32 %118 to i64
  %120 = getelementptr inbounds ptr, ptr %117, i64 %119
  %121 = load ptr, ptr %120, align 8, !tbaa !9
  %122 = getelementptr inbounds double, ptr %121, i64 1
  %123 = load double, ptr %122, align 8, !tbaa !14
  %124 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  store double %123, ptr %124, align 8, !tbaa !14
  br label %176

125:                                              ; preds = %96
  %126 = load i32, ptr %15, align 4, !tbaa !5
  %127 = icmp eq i32 %126, 3
  br i1 %127, label %128, label %153

128:                                              ; preds = %125
  %129 = load ptr, ptr %8, align 8, !tbaa !9
  %130 = load i32, ptr %11, align 4, !tbaa !5
  %131 = sext i32 %130 to i64
  %132 = getelementptr inbounds ptr, ptr %129, i64 %131
  %133 = load ptr, ptr %132, align 8, !tbaa !9
  %134 = getelementptr inbounds double, ptr %133, i64 0
  %135 = load double, ptr %134, align 8, !tbaa !14
  %136 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  store double %135, ptr %136, align 16, !tbaa !14
  %137 = load ptr, ptr %8, align 8, !tbaa !9
  %138 = load i32, ptr %11, align 4, !tbaa !5
  %139 = sext i32 %138 to i64
  %140 = getelementptr inbounds ptr, ptr %137, i64 %139
  %141 = load ptr, ptr %140, align 8, !tbaa !9
  %142 = getelementptr inbounds double, ptr %141, i64 1
  %143 = load double, ptr %142, align 8, !tbaa !14
  %144 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  store double %143, ptr %144, align 8, !tbaa !14
  %145 = load ptr, ptr %8, align 8, !tbaa !9
  %146 = load i32, ptr %11, align 4, !tbaa !5
  %147 = sext i32 %146 to i64
  %148 = getelementptr inbounds ptr, ptr %145, i64 %147
  %149 = load ptr, ptr %148, align 8, !tbaa !9
  %150 = getelementptr inbounds double, ptr %149, i64 2
  %151 = load double, ptr %150, align 8, !tbaa !14
  %152 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 2
  store double %151, ptr %152, align 16, !tbaa !14
  br label %175

153:                                              ; preds = %125
  store i32 0, ptr %24, align 4, !tbaa !5
  br label %154

154:                                              ; preds = %171, %153
  %155 = load i32, ptr %24, align 4, !tbaa !5
  %156 = load i32, ptr %15, align 4, !tbaa !5
  %157 = icmp slt i32 %155, %156
  br i1 %157, label %158, label %174

158:                                              ; preds = %154
  %159 = load ptr, ptr %8, align 8, !tbaa !9
  %160 = load i32, ptr %11, align 4, !tbaa !5
  %161 = sext i32 %160 to i64
  %162 = getelementptr inbounds ptr, ptr %159, i64 %161
  %163 = load ptr, ptr %162, align 8, !tbaa !9
  %164 = load i32, ptr %24, align 4, !tbaa !5
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds double, ptr %163, i64 %165
  %167 = load double, ptr %166, align 8, !tbaa !14
  %168 = load i32, ptr %24, align 4, !tbaa !5
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 %169
  store double %167, ptr %170, align 8, !tbaa !14
  br label %171

171:                                              ; preds = %158
  %172 = load i32, ptr %24, align 4, !tbaa !5
  %173 = add nsw i32 %172, 1
  store i32 %173, ptr %24, align 4, !tbaa !5
  br label %154, !llvm.loop !18

174:                                              ; preds = %154
  br label %175

175:                                              ; preds = %174, %128
  br label %176

176:                                              ; preds = %175, %108
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  %177 = load ptr, ptr %9, align 8, !tbaa !9
  %178 = getelementptr inbounds %struct.__SMoptimal, ptr %177, i32 0, i32 14
  %179 = load ptr, ptr %178, align 8, !tbaa !19
  %180 = getelementptr inbounds %struct.__SMactive, ptr %179, i32 0, i32 2
  %181 = load ptr, ptr %180, align 8, !tbaa !20
  %182 = load i32, ptr %11, align 4, !tbaa !5
  %183 = sext i32 %182 to i64
  %184 = getelementptr inbounds i32, ptr %181, i64 %183
  %185 = load i32, ptr %184, align 4, !tbaa !5
  %186 = load ptr, ptr %9, align 8, !tbaa !9
  %187 = getelementptr inbounds %struct.__SMoptimal, ptr %186, i32 0, i32 17
  store i32 %185, ptr %187, align 8, !tbaa !22
  br label %188

188:                                              ; preds = %176, %84, %81
  %189 = load i32, ptr %11, align 4, !tbaa !5
  %190 = add nsw i32 %189, 1
  store i32 %190, ptr %12, align 4, !tbaa !5
  br label %191

191:                                              ; preds = %446, %188
  %192 = load i32, ptr %12, align 4, !tbaa !5
  %193 = load i32, ptr %6, align 4, !tbaa !5
  %194 = icmp slt i32 %192, %193
  br i1 %194, label %195, label %449

195:                                              ; preds = %191
  store i32 1, ptr %14, align 4, !tbaa !5
  %196 = load ptr, ptr %7, align 8, !tbaa !9
  %197 = load i32, ptr %11, align 4, !tbaa !5
  %198 = sext i32 %197 to i64
  %199 = getelementptr inbounds ptr, ptr %196, i64 %198
  %200 = load ptr, ptr %199, align 8, !tbaa !9
  %201 = load i32, ptr %12, align 4, !tbaa !5
  %202 = sext i32 %201 to i64
  %203 = getelementptr inbounds double, ptr %200, i64 %202
  %204 = load double, ptr %203, align 8, !tbaa !14
  %205 = load ptr, ptr %7, align 8, !tbaa !9
  %206 = load i32, ptr %11, align 4, !tbaa !5
  %207 = sext i32 %206 to i64
  %208 = getelementptr inbounds ptr, ptr %205, i64 %207
  %209 = load ptr, ptr %208, align 8, !tbaa !9
  %210 = load i32, ptr %11, align 4, !tbaa !5
  %211 = sext i32 %210 to i64
  %212 = getelementptr inbounds double, ptr %209, i64 %211
  %213 = load double, ptr %212, align 8, !tbaa !14
  %214 = fneg double %213
  %215 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %204, double %214)
  %216 = load ptr, ptr %7, align 8, !tbaa !9
  %217 = load i32, ptr %12, align 4, !tbaa !5
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds ptr, ptr %216, i64 %218
  %220 = load ptr, ptr %219, align 8, !tbaa !9
  %221 = load i32, ptr %12, align 4, !tbaa !5
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds double, ptr %220, i64 %222
  %224 = load double, ptr %223, align 8, !tbaa !14
  %225 = fsub double %215, %224
  store double %225, ptr %18, align 8, !tbaa !14
  store double 0.000000e+00, ptr %17, align 8, !tbaa !14
  store double 0.000000e+00, ptr %16, align 8, !tbaa !14
  %226 = load double, ptr %18, align 8, !tbaa !14
  %227 = call double @llvm.fabs.f64(double %226)
  %228 = fcmp ogt double %227, 1.000000e-15
  br i1 %228, label %229, label %294

229:                                              ; preds = %195
  %230 = load ptr, ptr %7, align 8, !tbaa !9
  %231 = load i32, ptr %11, align 4, !tbaa !5
  %232 = sext i32 %231 to i64
  %233 = getelementptr inbounds ptr, ptr %230, i64 %232
  %234 = load ptr, ptr %233, align 8, !tbaa !9
  %235 = load i32, ptr %12, align 4, !tbaa !5
  %236 = sext i32 %235 to i64
  %237 = getelementptr inbounds double, ptr %234, i64 %236
  %238 = load double, ptr %237, align 8, !tbaa !14
  %239 = load ptr, ptr %7, align 8, !tbaa !9
  %240 = load i32, ptr %11, align 4, !tbaa !5
  %241 = sext i32 %240 to i64
  %242 = getelementptr inbounds ptr, ptr %239, i64 %241
  %243 = load ptr, ptr %242, align 8, !tbaa !9
  %244 = load i32, ptr %11, align 4, !tbaa !5
  %245 = sext i32 %244 to i64
  %246 = getelementptr inbounds double, ptr %243, i64 %245
  %247 = load double, ptr %246, align 8, !tbaa !14
  %248 = fsub double %238, %247
  %249 = load double, ptr %18, align 8, !tbaa !14
  %250 = fdiv double %248, %249
  store double %250, ptr %17, align 8, !tbaa !14
  %251 = load double, ptr %17, align 8, !tbaa !14
  %252 = fsub double 1.000000e+00, %251
  store double %252, ptr %16, align 8, !tbaa !14
  %253 = load double, ptr %17, align 8, !tbaa !14
  %254 = fcmp olt double %253, 0.000000e+00
  br i1 %254, label %258, label %255

255:                                              ; preds = %229
  %256 = load double, ptr %17, align 8, !tbaa !14
  %257 = fcmp ogt double %256, 1.000000e+00
  br i1 %257, label %258, label %259

258:                                              ; preds = %255, %229
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %259

259:                                              ; preds = %258, %255
  store i32 0, ptr %13, align 4, !tbaa !5
  br label %260

260:                                              ; preds = %290, %259
  %261 = load i32, ptr %13, align 4, !tbaa !5
  %262 = load i32, ptr %6, align 4, !tbaa !5
  %263 = icmp slt i32 %261, %262
  br i1 %263, label %264, label %293

264:                                              ; preds = %260
  %265 = load double, ptr %16, align 8, !tbaa !14
  %266 = load ptr, ptr %7, align 8, !tbaa !9
  %267 = load i32, ptr %13, align 4, !tbaa !5
  %268 = sext i32 %267 to i64
  %269 = getelementptr inbounds ptr, ptr %266, i64 %268
  %270 = load ptr, ptr %269, align 8, !tbaa !9
  %271 = load i32, ptr %11, align 4, !tbaa !5
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds double, ptr %270, i64 %272
  %274 = load double, ptr %273, align 8, !tbaa !14
  %275 = load double, ptr %17, align 8, !tbaa !14
  %276 = load ptr, ptr %7, align 8, !tbaa !9
  %277 = load i32, ptr %13, align 4, !tbaa !5
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds ptr, ptr %276, i64 %278
  %280 = load ptr, ptr %279, align 8, !tbaa !9
  %281 = load i32, ptr %12, align 4, !tbaa !5
  %282 = sext i32 %281 to i64
  %283 = getelementptr inbounds double, ptr %280, i64 %282
  %284 = load double, ptr %283, align 8, !tbaa !14
  %285 = fmul double %275, %284
  %286 = call double @llvm.fmuladd.f64(double %265, double %274, double %285)
  %287 = fcmp ole double %286, 0.000000e+00
  br i1 %287, label %288, label %289

288:                                              ; preds = %264
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %289

289:                                              ; preds = %288, %264
  br label %290

290:                                              ; preds = %289
  %291 = load i32, ptr %13, align 4, !tbaa !5
  %292 = add nsw i32 %291, 1
  store i32 %292, ptr %13, align 4, !tbaa !5
  br label %260, !llvm.loop !23

293:                                              ; preds = %260
  br label %295

294:                                              ; preds = %195
  store i32 0, ptr %14, align 4, !tbaa !5
  br label %295

295:                                              ; preds = %294, %293
  %296 = load i32, ptr %14, align 4, !tbaa !5
  %297 = icmp ne i32 %296, 0
  br i1 %297, label %298, label %445

298:                                              ; preds = %295
  store i32 0, ptr %13, align 4, !tbaa !5
  br label %299

299:                                              ; preds = %329, %298
  %300 = load i32, ptr %13, align 4, !tbaa !5
  %301 = load i32, ptr %15, align 4, !tbaa !5
  %302 = icmp slt i32 %300, %301
  br i1 %302, label %303, label %332

303:                                              ; preds = %299
  %304 = load double, ptr %16, align 8, !tbaa !14
  %305 = load ptr, ptr %8, align 8, !tbaa !9
  %306 = load i32, ptr %11, align 4, !tbaa !5
  %307 = sext i32 %306 to i64
  %308 = getelementptr inbounds ptr, ptr %305, i64 %307
  %309 = load ptr, ptr %308, align 8, !tbaa !9
  %310 = load i32, ptr %13, align 4, !tbaa !5
  %311 = sext i32 %310 to i64
  %312 = getelementptr inbounds double, ptr %309, i64 %311
  %313 = load double, ptr %312, align 8, !tbaa !14
  %314 = load double, ptr %17, align 8, !tbaa !14
  %315 = load ptr, ptr %8, align 8, !tbaa !9
  %316 = load i32, ptr %12, align 4, !tbaa !5
  %317 = sext i32 %316 to i64
  %318 = getelementptr inbounds ptr, ptr %315, i64 %317
  %319 = load ptr, ptr %318, align 8, !tbaa !9
  %320 = load i32, ptr %13, align 4, !tbaa !5
  %321 = sext i32 %320 to i64
  %322 = getelementptr inbounds double, ptr %319, i64 %321
  %323 = load double, ptr %322, align 8, !tbaa !14
  %324 = fmul double %314, %323
  %325 = call double @llvm.fmuladd.f64(double %304, double %313, double %324)
  %326 = load i32, ptr %13, align 4, !tbaa !5
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 %327
  store double %325, ptr %328, align 8, !tbaa !14
  br label %329

329:                                              ; preds = %303
  %330 = load i32, ptr %13, align 4, !tbaa !5
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %13, align 4, !tbaa !5
  br label %299, !llvm.loop !24

332:                                              ; preds = %299
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  %333 = load i32, ptr %15, align 4, !tbaa !5
  %334 = icmp eq i32 %333, 2
  br i1 %334, label %335, label %346

335:                                              ; preds = %332
  %336 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %337 = load double, ptr %336, align 16, !tbaa !14
  %338 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %339 = load double, ptr %338, align 16, !tbaa !14
  %340 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %341 = load double, ptr %340, align 8, !tbaa !14
  %342 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %343 = load double, ptr %342, align 8, !tbaa !14
  %344 = fmul double %341, %343
  %345 = call double @llvm.fmuladd.f64(double %337, double %339, double %344)
  store double %345, ptr %21, align 8, !tbaa !14
  br label %386

346:                                              ; preds = %332
  %347 = load i32, ptr %15, align 4, !tbaa !5
  %348 = icmp eq i32 %347, 3
  br i1 %348, label %349, label %365

349:                                              ; preds = %346
  %350 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %351 = load double, ptr %350, align 16, !tbaa !14
  %352 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %353 = load double, ptr %352, align 16, !tbaa !14
  %354 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %355 = load double, ptr %354, align 8, !tbaa !14
  %356 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %357 = load double, ptr %356, align 8, !tbaa !14
  %358 = fmul double %355, %357
  %359 = call double @llvm.fmuladd.f64(double %351, double %353, double %358)
  %360 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 2
  %361 = load double, ptr %360, align 16, !tbaa !14
  %362 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 2
  %363 = load double, ptr %362, align 16, !tbaa !14
  %364 = call double @llvm.fmuladd.f64(double %361, double %363, double %359)
  store double %364, ptr %21, align 8, !tbaa !14
  br label %385

365:                                              ; preds = %346
  store i32 0, ptr %25, align 4, !tbaa !5
  br label %366

366:                                              ; preds = %381, %365
  %367 = load i32, ptr %25, align 4, !tbaa !5
  %368 = load i32, ptr %15, align 4, !tbaa !5
  %369 = icmp slt i32 %367, %368
  br i1 %369, label %370, label %384

370:                                              ; preds = %366
  %371 = load i32, ptr %25, align 4, !tbaa !5
  %372 = sext i32 %371 to i64
  %373 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 %372
  %374 = load double, ptr %373, align 8, !tbaa !14
  %375 = load i32, ptr %25, align 4, !tbaa !5
  %376 = sext i32 %375 to i64
  %377 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 %376
  %378 = load double, ptr %377, align 8, !tbaa !14
  %379 = load double, ptr %21, align 8, !tbaa !14
  %380 = call double @llvm.fmuladd.f64(double %374, double %378, double %379)
  store double %380, ptr %21, align 8, !tbaa !14
  br label %381

381:                                              ; preds = %370
  %382 = load i32, ptr %25, align 4, !tbaa !5
  %383 = add nsw i32 %382, 1
  store i32 %383, ptr %25, align 4, !tbaa !5
  br label %366, !llvm.loop !25

384:                                              ; preds = %366
  br label %385

385:                                              ; preds = %384, %349
  br label %386

386:                                              ; preds = %385, %335
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  %387 = load double, ptr %21, align 8, !tbaa !14
  %388 = load double, ptr %22, align 8, !tbaa !14
  %389 = fcmp olt double %387, %388
  br i1 %389, label %390, label %444

390:                                              ; preds = %386
  %391 = load double, ptr %21, align 8, !tbaa !14
  store double %391, ptr %22, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  %392 = load i32, ptr %15, align 4, !tbaa !5
  %393 = icmp eq i32 %392, 2
  br i1 %393, label %394, label %401

394:                                              ; preds = %390
  %395 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %396 = load double, ptr %395, align 16, !tbaa !14
  %397 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  store double %396, ptr %397, align 16, !tbaa !14
  %398 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %399 = load double, ptr %398, align 8, !tbaa !14
  %400 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  store double %399, ptr %400, align 8, !tbaa !14
  br label %432

401:                                              ; preds = %390
  %402 = load i32, ptr %15, align 4, !tbaa !5
  %403 = icmp eq i32 %402, 3
  br i1 %403, label %404, label %414

404:                                              ; preds = %401
  %405 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 0
  %406 = load double, ptr %405, align 16, !tbaa !14
  %407 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  store double %406, ptr %407, align 16, !tbaa !14
  %408 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 1
  %409 = load double, ptr %408, align 8, !tbaa !14
  %410 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  store double %409, ptr %410, align 8, !tbaa !14
  %411 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 2
  %412 = load double, ptr %411, align 16, !tbaa !14
  %413 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 2
  store double %412, ptr %413, align 16, !tbaa !14
  br label %431

414:                                              ; preds = %401
  store i32 0, ptr %26, align 4, !tbaa !5
  br label %415

415:                                              ; preds = %427, %414
  %416 = load i32, ptr %26, align 4, !tbaa !5
  %417 = load i32, ptr %15, align 4, !tbaa !5
  %418 = icmp slt i32 %416, %417
  br i1 %418, label %419, label %430

419:                                              ; preds = %415
  %420 = load i32, ptr %26, align 4, !tbaa !5
  %421 = sext i32 %420 to i64
  %422 = getelementptr inbounds [3 x double], ptr %19, i64 0, i64 %421
  %423 = load double, ptr %422, align 8, !tbaa !14
  %424 = load i32, ptr %26, align 4, !tbaa !5
  %425 = sext i32 %424 to i64
  %426 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 %425
  store double %423, ptr %426, align 8, !tbaa !14
  br label %427

427:                                              ; preds = %419
  %428 = load i32, ptr %26, align 4, !tbaa !5
  %429 = add nsw i32 %428, 1
  store i32 %429, ptr %26, align 4, !tbaa !5
  br label %415, !llvm.loop !26

430:                                              ; preds = %415
  br label %431

431:                                              ; preds = %430, %404
  br label %432

432:                                              ; preds = %431, %394
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  %433 = load ptr, ptr %9, align 8, !tbaa !9
  %434 = getelementptr inbounds %struct.__SMoptimal, ptr %433, i32 0, i32 14
  %435 = load ptr, ptr %434, align 8, !tbaa !19
  %436 = getelementptr inbounds %struct.__SMactive, ptr %435, i32 0, i32 2
  %437 = load ptr, ptr %436, align 8, !tbaa !20
  %438 = load i32, ptr %11, align 4, !tbaa !5
  %439 = sext i32 %438 to i64
  %440 = getelementptr inbounds i32, ptr %437, i64 %439
  %441 = load i32, ptr %440, align 4, !tbaa !5
  %442 = load ptr, ptr %9, align 8, !tbaa !9
  %443 = getelementptr inbounds %struct.__SMoptimal, ptr %442, i32 0, i32 17
  store i32 %441, ptr %443, align 8, !tbaa !22
  br label %444

444:                                              ; preds = %432, %386
  br label %445

445:                                              ; preds = %444, %295
  br label %446

446:                                              ; preds = %445
  %447 = load i32, ptr %12, align 4, !tbaa !5
  %448 = add nsw i32 %447, 1
  store i32 %448, ptr %12, align 4, !tbaa !5
  br label %191, !llvm.loop !27

449:                                              ; preds = %191
  br label %450

450:                                              ; preds = %449
  %451 = load i32, ptr %11, align 4, !tbaa !5
  %452 = add nsw i32 %451, 1
  store i32 %452, ptr %11, align 4, !tbaa !5
  br label %56, !llvm.loop !28

453:                                              ; preds = %56
  %454 = load ptr, ptr %9, align 8, !tbaa !9
  %455 = getelementptr inbounds %struct.__SMoptimal, ptr %454, i32 0, i32 4
  %456 = load i32, ptr %455, align 8, !tbaa !29
  %457 = icmp ne i32 %456, 104
  br i1 %457, label %458, label %512

458:                                              ; preds = %453
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  %459 = load i32, ptr %15, align 4, !tbaa !5
  %460 = icmp eq i32 %459, 2
  br i1 %460, label %461, label %472

461:                                              ; preds = %458
  %462 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  %463 = load double, ptr %462, align 16, !tbaa !14
  %464 = load ptr, ptr %9, align 8, !tbaa !9
  %465 = getelementptr inbounds %struct.__SMoptimal, ptr %464, i32 0, i32 18
  %466 = getelementptr inbounds [3 x double], ptr %465, i64 0, i64 0
  store double %463, ptr %466, align 8, !tbaa !14
  %467 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  %468 = load double, ptr %467, align 8, !tbaa !14
  %469 = load ptr, ptr %9, align 8, !tbaa !9
  %470 = getelementptr inbounds %struct.__SMoptimal, ptr %469, i32 0, i32 18
  %471 = getelementptr inbounds [3 x double], ptr %470, i64 0, i64 1
  store double %468, ptr %471, align 8, !tbaa !14
  br label %511

472:                                              ; preds = %458
  %473 = load i32, ptr %15, align 4, !tbaa !5
  %474 = icmp eq i32 %473, 3
  br i1 %474, label %475, label %491

475:                                              ; preds = %472
  %476 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 0
  %477 = load double, ptr %476, align 16, !tbaa !14
  %478 = load ptr, ptr %9, align 8, !tbaa !9
  %479 = getelementptr inbounds %struct.__SMoptimal, ptr %478, i32 0, i32 18
  %480 = getelementptr inbounds [3 x double], ptr %479, i64 0, i64 0
  store double %477, ptr %480, align 8, !tbaa !14
  %481 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 1
  %482 = load double, ptr %481, align 8, !tbaa !14
  %483 = load ptr, ptr %9, align 8, !tbaa !9
  %484 = getelementptr inbounds %struct.__SMoptimal, ptr %483, i32 0, i32 18
  %485 = getelementptr inbounds [3 x double], ptr %484, i64 0, i64 1
  store double %482, ptr %485, align 8, !tbaa !14
  %486 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 2
  %487 = load double, ptr %486, align 16, !tbaa !14
  %488 = load ptr, ptr %9, align 8, !tbaa !9
  %489 = getelementptr inbounds %struct.__SMoptimal, ptr %488, i32 0, i32 18
  %490 = getelementptr inbounds [3 x double], ptr %489, i64 0, i64 2
  store double %487, ptr %490, align 8, !tbaa !14
  br label %510

491:                                              ; preds = %472
  store i32 0, ptr %27, align 4, !tbaa !5
  br label %492

492:                                              ; preds = %506, %491
  %493 = load i32, ptr %27, align 4, !tbaa !5
  %494 = load i32, ptr %15, align 4, !tbaa !5
  %495 = icmp slt i32 %493, %494
  br i1 %495, label %496, label %509

496:                                              ; preds = %492
  %497 = load i32, ptr %27, align 4, !tbaa !5
  %498 = sext i32 %497 to i64
  %499 = getelementptr inbounds [3 x double], ptr %20, i64 0, i64 %498
  %500 = load double, ptr %499, align 8, !tbaa !14
  %501 = load ptr, ptr %9, align 8, !tbaa !9
  %502 = getelementptr inbounds %struct.__SMoptimal, ptr %501, i32 0, i32 18
  %503 = load i32, ptr %27, align 4, !tbaa !5
  %504 = sext i32 %503 to i64
  %505 = getelementptr inbounds [3 x double], ptr %502, i64 0, i64 %504
  store double %500, ptr %505, align 8, !tbaa !14
  br label %506

506:                                              ; preds = %496
  %507 = load i32, ptr %27, align 4, !tbaa !5
  %508 = add nsw i32 %507, 1
  store i32 %508, ptr %27, align 4, !tbaa !5
  br label %492, !llvm.loop !30

509:                                              ; preds = %492
  br label %510

510:                                              ; preds = %509, %475
  br label %511

511:                                              ; preds = %510, %461
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #4
  br label %512

512:                                              ; preds = %511, %453
  store i32 0, ptr %10, align 4, !tbaa !5
  store i32 0, ptr %5, align 4
  store i32 1, ptr %23, align 4
  br label %513

513:                                              ; preds = %512, %41, %33
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %20) #4
  call void @llvm.lifetime.end.p0(i64 24, ptr %19) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  %514 = load i32, ptr %5, align 4
  ret i32 %514
}

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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { 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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"__SMoptimal", !6, i64 0, !6, i64 4, !6, i64 8, !6, i64 12, !6, i64 16, !6, i64 20, !6, i64 24, !13, i64 32, !6, i64 40, !6, i64 44, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !6, i64 104, !7, i64 112, !13, i64 136, !13, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !7, i64 184, !6, i64 196}
!13 = !{!"double", !7, i64 0}
!14 = !{!13, !13, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = distinct !{!17, !16}
!18 = distinct !{!18, !16}
!19 = !{!12, !10, i64 80}
!20 = !{!21, !10, i64 8}
!21 = !{!"__SMactive", !6, i64 0, !6, i64 4, !10, i64 8, !13, i64 16}
!22 = !{!12, !6, i64 104}
!23 = distinct !{!23, !16}
!24 = distinct !{!24, !16}
!25 = distinct !{!25, !16}
!26 = distinct !{!26, !16}
!27 = distinct !{!27, !16}
!28 = distinct !{!28, !16}
!29 = !{!12, !6, i64 16}
!30 = distinct !{!30, !16}


; 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 [108 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
@.str.5 = external hidden unnamed_addr constant [25 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: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #2

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

; Function Attrs: nounwind uwtable
define dso_local i32 @SMsearchEdgesFaces(i32 noundef %0, ptr nocapture noundef readonly %1, ptr nocapture noundef readonly %2, ptr nocapture noundef %3) local_unnamed_addr #3 {
  %5 = alloca [3 x double], align 16
  %6 = alloca [3 x double], align 16
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %5)
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %6)
  %7 = load i32, ptr %3, align 8, !tbaa !5
  %8 = add i32 %7, -4
  %or.cond = icmp ult i32 %8, -2
  br i1 %or.cond, label %9, label %.preheader189

9:                                                ; preds = %4
  %10 = tail call i32 @SMerror(i32 noundef 173, ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, ptr noundef nonnull @.str.2, i32 noundef 57, i32 noundef 0, ptr noundef nonnull @.str.5) #6
  br label %.loopexit

.preheader189:                                    ; preds = %4
  %11 = shl nuw nsw i32 %7, 3
  %12 = zext nneg i32 %11 to i64
  call void @llvm.memset.p0.i64(ptr nonnull align 16 %6, i8 0, i64 %12, i1 false), !tbaa !12
  %13 = icmp sgt i32 %0, 0
  br i1 %13, label %.preheader188.lr.ph, label %._crit_edge223

.preheader188.lr.ph:                              ; preds = %.preheader189
  %14 = getelementptr inbounds i8, ptr %3, i64 80
  %15 = getelementptr inbounds i8, ptr %3, i64 104
  %16 = shl nuw nsw i32 %7, 3
  %17 = zext nneg i32 %16 to i64
  %18 = zext nneg i32 %0 to i64
  %wide.trip.count259 = zext nneg i32 %0 to i64
  %xtraiter = and i64 %wide.trip.count259, 3
  %19 = icmp ult i32 %0, 4
  %unroll_iter = and i64 %wide.trip.count259, 2147483644
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %.16.sroa_idx283 = getelementptr inbounds i8, ptr %6, i64 16
  %xtraiter275 = and i64 %wide.trip.count259, 1
  %20 = icmp eq i32 %0, 1
  %unroll_iter279 = and i64 %wide.trip.count259, 2147483646
  %lcmp.mod277.not = icmp eq i64 %xtraiter275, 0
  %exitcond240.not = icmp eq i32 %7, 1
  %.8.sroa_idx = getelementptr inbounds i8, ptr %5, i64 8
  %exitcond240.not.1 = icmp eq i32 %7, 2
  %.16.sroa_idx289 = getelementptr inbounds i8, ptr %5, i64 16
  %.16.sroa_idx = getelementptr inbounds i8, ptr %5, i64 16
  %.16.sroa_idx284 = getelementptr inbounds i8, ptr %6, i64 16
  %exitcond245.not = icmp eq i32 %7, 1
  %.8.sroa_idx288 = getelementptr inbounds i8, ptr %5, i64 8
  %exitcond245.not.1 = icmp eq i32 %7, 2
  %.16.sroa_idx.promoted295 = load double, ptr %.16.sroa_idx, align 16, !tbaa !12
  br label %.lr.ph194

.loopexit185:                                     ; preds = %.thread, %69
  %.16.sroa_idx.promoted296 = phi double [ %.16.sroa_idx.promoted300, %69 ], [ %.16.sroa_idx.promoted297, %.thread ]
  %.1138.lcssa = phi double [ %.0137221, %69 ], [ %.4, %.thread ]
  %.2.lcssa = phi double [ %.1, %69 ], [ %.3, %.thread ]
  %indvars.iv.next250 = add nuw nsw i64 %indvars.iv249, 1
  %exitcond260.not = icmp eq i64 %indvars.iv.next257, %wide.trip.count259
  br i1 %exitcond260.not, label %._crit_edge223, label %.lr.ph194, !llvm.loop !13

.lr.ph194:                                        ; preds = %.loopexit185, %.preheader188.lr.ph
  %.16.sroa_idx.promoted300 = phi double [ %.16.sroa_idx.promoted295, %.preheader188.lr.ph ], [ %.16.sroa_idx.promoted296, %.loopexit185 ]
  %indvars.iv256 = phi i64 [ 0, %.preheader188.lr.ph ], [ %indvars.iv.next257, %.loopexit185 ]
  %indvars.iv249 = phi i64 [ 1, %.preheader188.lr.ph ], [ %indvars.iv.next250, %.loopexit185 ]
  %.0136222 = phi double [ 1.000000e+300, %.preheader188.lr.ph ], [ %.2.lcssa, %.loopexit185 ]
  %.0137221 = phi double [ undef, %.preheader188.lr.ph ], [ %.1138.lcssa, %.loopexit185 ]
  br i1 %19, label %._crit_edge.unr-lcssa, label %.lr.ph194.new

.lr.ph194.new:                                    ; preds = %.lr.ph194, %.lr.ph194.new
  %indvars.iv = phi i64 [ %indvars.iv.next.3, %.lr.ph194.new ], [ 0, %.lr.ph194 ]
  %.0146193 = phi i32 [ %.1147.3, %.lr.ph194.new ], [ 1, %.lr.ph194 ]
  %niter = phi i64 [ %niter.next.3, %.lr.ph194.new ], [ 0, %.lr.ph194 ]
  %21 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv
  %22 = load ptr, ptr %21, align 8, !tbaa !15
  %23 = getelementptr inbounds double, ptr %22, i64 %indvars.iv256
  %24 = load double, ptr %23, align 8, !tbaa !12
  %25 = fcmp olt double %24, 0.000000e+00
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %26 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv.next
  %27 = load ptr, ptr %26, align 8, !tbaa !15
  %28 = getelementptr inbounds double, ptr %27, i64 %indvars.iv256
  %29 = load double, ptr %28, align 8, !tbaa !12
  %30 = fcmp olt double %29, 0.000000e+00
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %31 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv.next.1
  %32 = load ptr, ptr %31, align 8, !tbaa !15
  %33 = getelementptr inbounds double, ptr %32, i64 %indvars.iv256
  %34 = load double, ptr %33, align 8, !tbaa !12
  %35 = fcmp olt double %34, 0.000000e+00
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %36 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv.next.2
  %37 = load ptr, ptr %36, align 8, !tbaa !15
  %38 = getelementptr inbounds double, ptr %37, i64 %indvars.iv256
  %39 = load double, ptr %38, align 8, !tbaa !12
  %40 = fcmp olt double %39, 0.000000e+00
  %41 = select i1 %40, i1 true, i1 %35
  %42 = select i1 %41, i1 true, i1 %30
  %43 = select i1 %42, i1 true, i1 %25
  %.1147.3 = select i1 %43, i32 0, i32 %.0146193
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 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.ph194.new, !llvm.loop !16

._crit_edge.unr-lcssa:                            ; preds = %.lr.ph194.new, %.lr.ph194
  %.1147.lcssa.ph = phi i32 [ poison, %.lr.ph194 ], [ %.1147.3, %.lr.ph194.new ]
  %indvars.iv.unr = phi i64 [ 0, %.lr.ph194 ], [ %indvars.iv.next.3, %.lr.ph194.new ]
  %.0146193.unr = phi i32 [ 1, %.lr.ph194 ], [ %.1147.3, %.lr.ph194.new ]
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.unr-lcssa, %.epil.preheader
  %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %.epil.preheader ], [ %indvars.iv.unr, %._crit_edge.unr-lcssa ]
  %.0146193.epil = phi i32 [ %.1147.epil, %.epil.preheader ], [ %.0146193.unr, %._crit_edge.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.unr-lcssa ]
  %44 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv.epil
  %45 = load ptr, ptr %44, align 8, !tbaa !15
  %46 = getelementptr inbounds double, ptr %45, i64 %indvars.iv256
  %47 = load double, ptr %46, align 8, !tbaa !12
  %48 = fcmp olt double %47, 0.000000e+00
  %.1147.epil = select i1 %48, i32 0, i32 %.0146193.epil
  %indvars.iv.next.epil = add nuw nsw i64 %indvars.iv.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 !17

._crit_edge:                                      ; preds = %.epil.preheader, %._crit_edge.unr-lcssa
  %.1147.lcssa = phi i32 [ %.1147.lcssa.ph, %._crit_edge.unr-lcssa ], [ %.1147.epil, %.epil.preheader ]
  %.not158 = icmp eq i32 %.1147.lcssa, 0
  br i1 %.not158, label %69, label %49

49:                                               ; preds = %._crit_edge
  %50 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv256
  %51 = load ptr, ptr %50, align 8, !tbaa !15
  %52 = getelementptr inbounds double, ptr %51, i64 %indvars.iv256
  %53 = load double, ptr %52, align 8, !tbaa !12
  %54 = fcmp olt double %53, %.0136222
  br i1 %54, label %55, label %69

55:                                               ; preds = %49
  %56 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv256
  %57 = load ptr, ptr %56, align 8, !tbaa !15
  switch i32 %7, label %.lr.ph196 [
    i32 2, label %58
    i32 3, label %60
  ]

.lr.ph196:                                        ; preds = %55
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %6, ptr align 8 %57, i64 %17, i1 false), !tbaa !12
  br label %.loopexit187

58:                                               ; preds = %55
  %59 = load <2 x double>, ptr %57, align 8, !tbaa !12
  store <2 x double> %59, ptr %6, align 16, !tbaa !12
  br label %.loopexit187

60:                                               ; preds = %55
  %61 = load <2 x double>, ptr %57, align 8, !tbaa !12
  store <2 x double> %61, ptr %6, align 16, !tbaa !12
  %62 = getelementptr inbounds i8, ptr %57, i64 16
  %63 = load double, ptr %62, align 8, !tbaa !12
  store double %63, ptr %.16.sroa_idx283, align 16, !tbaa !12
  br label %.loopexit187

.loopexit187:                                     ; preds = %.lr.ph196, %60, %58
  %64 = load ptr, ptr %14, align 8, !tbaa !19
  %65 = getelementptr inbounds i8, ptr %64, i64 8
  %66 = load ptr, ptr %65, align 8, !tbaa !20
  %67 = getelementptr inbounds i32, ptr %66, i64 %indvars.iv256
  %68 = load i32, ptr %67, align 4, !tbaa !22
  store i32 %68, ptr %15, align 8, !tbaa !23
  br label %69

69:                                               ; preds = %.loopexit187, %49, %._crit_edge
  %.1 = phi double [ %53, %.loopexit187 ], [ %.0136222, %49 ], [ %.0136222, %._crit_edge ]
  %indvars.iv.next257 = add nuw nsw i64 %indvars.iv256, 1
  %70 = icmp ult i64 %indvars.iv.next257, %18
  br i1 %70, label %.lr.ph217, label %.loopexit185

.lr.ph217:                                        ; preds = %69
  %71 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv256
  %72 = load ptr, ptr %71, align 8, !tbaa !15
  %73 = getelementptr inbounds double, ptr %72, i64 %indvars.iv256
  %74 = load double, ptr %73, align 8, !tbaa !12
  %75 = fneg double %74
  %76 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv256
  br label %77

77:                                               ; preds = %.lr.ph217, %.thread
  %.16.sroa_idx.promoted299 = phi double [ %.16.sroa_idx.promoted300, %.lr.ph217 ], [ %.16.sroa_idx.promoted297, %.thread ]
  %.16.292 = phi double [ %.16.sroa_idx.promoted300, %.lr.ph217 ], [ %.16.293, %.thread ]
  %indvars.iv251 = phi i64 [ %indvars.iv249, %.lr.ph217 ], [ %indvars.iv.next252, %.thread ]
  %.2215 = phi double [ %.1, %.lr.ph217 ], [ %.3, %.thread ]
  %.1138214 = phi double [ %.0137221, %.lr.ph217 ], [ %.4, %.thread ]
  %78 = getelementptr inbounds double, ptr %72, i64 %indvars.iv251
  %79 = load double, ptr %78, align 8, !tbaa !12
  %80 = tail call double @llvm.fmuladd.f64(double %79, double 2.000000e+00, double %75)
  %81 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv251
  %82 = load ptr, ptr %81, align 8, !tbaa !15
  %83 = getelementptr inbounds double, ptr %82, i64 %indvars.iv251
  %84 = load double, ptr %83, align 8, !tbaa !12
  %85 = fsub double %80, %84
  %86 = tail call double @llvm.fabs.f64(double %85)
  %87 = fcmp ogt double %86, 1.000000e-15
  br i1 %87, label %.lr.ph200.preheader, label %.thread

.lr.ph200.preheader:                              ; preds = %77
  %88 = fsub double %79, %74
  %89 = fdiv double %88, %85
  %90 = fsub double 1.000000e+00, %89
  %91 = fcmp uge double %89, 0.000000e+00
  %92 = fcmp ule double %89, 1.000000e+00
  %or.cond3.not = and i1 %91, %92
  %spec.select = zext i1 %or.cond3.not to i32
  br i1 %20, label %._crit_edge201.unr-lcssa, label %.lr.ph200

.lr.ph200:                                        ; preds = %.lr.ph200.preheader, %.lr.ph200
  %indvars.iv231 = phi i64 [ %indvars.iv.next232.1, %.lr.ph200 ], [ 0, %.lr.ph200.preheader ]
  %.3149198 = phi i32 [ %.4150.1, %.lr.ph200 ], [ %spec.select, %.lr.ph200.preheader ]
  %niter280 = phi i64 [ %niter280.next.1, %.lr.ph200 ], [ 0, %.lr.ph200.preheader ]
  %93 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv231
  %94 = load ptr, ptr %93, align 8, !tbaa !15
  %95 = getelementptr inbounds double, ptr %94, i64 %indvars.iv256
  %96 = load double, ptr %95, align 8, !tbaa !12
  %97 = getelementptr inbounds double, ptr %94, i64 %indvars.iv251
  %98 = load double, ptr %97, align 8, !tbaa !12
  %99 = fmul double %89, %98
  %100 = tail call double @llvm.fmuladd.f64(double %90, double %96, double %99)
  %101 = fcmp ugt double %100, 0.000000e+00
  %indvars.iv.next232 = or disjoint i64 %indvars.iv231, 1
  %102 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv.next232
  %103 = load ptr, ptr %102, align 8, !tbaa !15
  %104 = getelementptr inbounds double, ptr %103, i64 %indvars.iv256
  %105 = load double, ptr %104, align 8, !tbaa !12
  %106 = getelementptr inbounds double, ptr %103, i64 %indvars.iv251
  %107 = load double, ptr %106, align 8, !tbaa !12
  %108 = fmul double %89, %107
  %109 = tail call double @llvm.fmuladd.f64(double %90, double %105, double %108)
  %110 = fcmp ugt double %109, 0.000000e+00
  %111 = select i1 %110, i1 %101, i1 false
  %.4150.1 = select i1 %111, i32 %.3149198, i32 0
  %indvars.iv.next232.1 = add nuw nsw i64 %indvars.iv231, 2
  %niter280.next.1 = add i64 %niter280, 2
  %niter280.ncmp.1 = icmp eq i64 %niter280.next.1, %unroll_iter279
  br i1 %niter280.ncmp.1, label %._crit_edge201.unr-lcssa, label %.lr.ph200, !llvm.loop !24

._crit_edge201.unr-lcssa:                         ; preds = %.lr.ph200, %.lr.ph200.preheader
  %.4150.lcssa.ph = phi i32 [ poison, %.lr.ph200.preheader ], [ %.4150.1, %.lr.ph200 ]
  %indvars.iv231.unr = phi i64 [ 0, %.lr.ph200.preheader ], [ %indvars.iv.next232.1, %.lr.ph200 ]
  %.3149198.unr = phi i32 [ %spec.select, %.lr.ph200.preheader ], [ %.4150.1, %.lr.ph200 ]
  br i1 %lcmp.mod277.not, label %._crit_edge201, label %.lr.ph200.epil

.lr.ph200.epil:                                   ; preds = %._crit_edge201.unr-lcssa
  %112 = getelementptr inbounds ptr, ptr %1, i64 %indvars.iv231.unr
  %113 = load ptr, ptr %112, align 8, !tbaa !15
  %114 = getelementptr inbounds double, ptr %113, i64 %indvars.iv256
  %115 = load double, ptr %114, align 8, !tbaa !12
  %116 = getelementptr inbounds double, ptr %113, i64 %indvars.iv251
  %117 = load double, ptr %116, align 8, !tbaa !12
  %118 = fmul double %89, %117
  %119 = tail call double @llvm.fmuladd.f64(double %90, double %115, double %118)
  %120 = fcmp ugt double %119, 0.000000e+00
  %.4150.epil = select i1 %120, i32 %.3149198.unr, i32 0
  br label %._crit_edge201

._crit_edge201:                                   ; preds = %._crit_edge201.unr-lcssa, %.lr.ph200.epil
  %.4150.lcssa = phi i32 [ %.4150.lcssa.ph, %._crit_edge201.unr-lcssa ], [ %.4150.epil, %.lr.ph200.epil ]
  %.not159 = icmp eq i32 %.4150.lcssa, 0
  br i1 %.not159, label %.thread, label %.lr.ph204

.lr.ph204:                                        ; preds = %._crit_edge201
  %121 = load ptr, ptr %76, align 8, !tbaa !15
  %122 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv251
  %123 = load ptr, ptr %122, align 8, !tbaa !15
  %124 = load double, ptr %121, align 8, !tbaa !12
  %125 = load double, ptr %123, align 8, !tbaa !12
  %126 = fmul double %89, %125
  %127 = tail call double @llvm.fmuladd.f64(double %90, double %124, double %126)
  store double %127, ptr %5, align 16, !tbaa !12
  br i1 %exitcond240.not, label %._crit_edge205, label %128, !llvm.loop !25

128:                                              ; preds = %.lr.ph204
  %129 = getelementptr inbounds i8, ptr %121, i64 8
  %130 = load double, ptr %129, align 8, !tbaa !12
  %131 = getelementptr inbounds i8, ptr %123, i64 8
  %132 = load double, ptr %131, align 8, !tbaa !12
  %133 = fmul double %89, %132
  %134 = tail call double @llvm.fmuladd.f64(double %90, double %130, double %133)
  store double %134, ptr %.8.sroa_idx, align 8, !tbaa !12
  br i1 %exitcond240.not.1, label %._crit_edge205, label %135, !llvm.loop !25

135:                                              ; preds = %128
  %136 = getelementptr inbounds i8, ptr %121, i64 16
  %137 = load double, ptr %136, align 8, !tbaa !12
  %138 = getelementptr inbounds i8, ptr %123, i64 16
  %139 = load double, ptr %138, align 8, !tbaa !12
  %140 = fmul double %89, %139
  %141 = tail call double @llvm.fmuladd.f64(double %90, double %137, double %140)
  store double %141, ptr %.16.sroa_idx289, align 16, !tbaa !12
  br label %._crit_edge205

._crit_edge205:                                   ; preds = %135, %128, %.lr.ph204
  %.16.sroa_idx.promoted298 = phi double [ %141, %135 ], [ %.16.sroa_idx.promoted299, %128 ], [ %.16.sroa_idx.promoted299, %.lr.ph204 ]
  %.16.294 = phi double [ %141, %135 ], [ %.16.292, %128 ], [ %.16.292, %.lr.ph204 ]
  switch i32 %7, label %.lr.ph208 [
    i32 2, label %.thread171
    i32 3, label %.thread164
  ]

.lr.ph208:                                        ; preds = %._crit_edge205
  %.0.287 = load double, ptr %5, align 16, !tbaa !12
  %142 = tail call double @llvm.fmuladd.f64(double %.0.287, double %.0.287, double %.1138214)
  br i1 %exitcond245.not, label %._crit_edge209, label %.lr.ph208.1, !llvm.loop !26

.lr.ph208.1:                                      ; preds = %.lr.ph208
  %.8. = load double, ptr %.8.sroa_idx288, align 8, !tbaa !12
  %143 = tail call double @llvm.fmuladd.f64(double %.8., double %.8., double %142)
  br i1 %exitcond245.not.1, label %._crit_edge209, label %.lr.ph208.2, !llvm.loop !26

.lr.ph208.2:                                      ; preds = %.lr.ph208.1
  %144 = tail call double @llvm.fmuladd.f64(double %.16.294, double %.16.294, double %143)
  br label %._crit_edge209

._crit_edge209:                                   ; preds = %.lr.ph208.2, %.lr.ph208.1, %.lr.ph208
  %.lcssa = phi double [ %142, %.lr.ph208 ], [ %143, %.lr.ph208.1 ], [ %144, %.lr.ph208.2 ]
  %145 = fcmp olt double %.lcssa, %.2215
  br i1 %145, label %.lr.ph212.preheader, label %.thread

.thread171:                                       ; preds = %._crit_edge205
  %.0.285 = load <2 x double>, ptr %5, align 16, !tbaa !12
  %146 = fmul <2 x double> %.0.285, %.0.285
  %147 = extractelement <2 x double> %146, i64 1
  %148 = extractelement <2 x double> %.0.285, i64 0
  %149 = tail call double @llvm.fmuladd.f64(double %148, double %148, double %147)
  %150 = fcmp olt double %149, %.2215
  br i1 %150, label %.thread173, label %.thread

.thread164:                                       ; preds = %._crit_edge205
  %.0.286 = load <2 x double>, ptr %5, align 16, !tbaa !12
  %151 = fmul <2 x double> %.0.286, %.0.286
  %152 = extractelement <2 x double> %151, i64 1
  %153 = extractelement <2 x double> %.0.286, i64 0
  %154 = tail call double @llvm.fmuladd.f64(double %153, double %153, double %152)
  %155 = tail call double @llvm.fmuladd.f64(double %.16.294, double %.16.294, double %154)
  %156 = fcmp olt double %155, %.2215
  br i1 %156, label %.thread176, label %.thread

.lr.ph212.preheader:                              ; preds = %._crit_edge209
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 16 %6, ptr nonnull align 16 %5, i64 %17, i1 false), !tbaa !12
  br label %.loopexit182

.thread173:                                       ; preds = %.thread171
  store <2 x double> %.0.285, ptr %6, align 16, !tbaa !12
  br label %.loopexit182

.thread176:                                       ; preds = %.thread164
  store <2 x double> %.0.286, ptr %6, align 16, !tbaa !12
  store double %.16.294, ptr %.16.sroa_idx284, align 16, !tbaa !12
  br label %.loopexit182

.loopexit182:                                     ; preds = %.lr.ph212.preheader, %.thread176, %.thread173
  %.3140166169 = phi double [ %155, %.thread176 ], [ %149, %.thread173 ], [ %.lcssa, %.lr.ph212.preheader ]
  %157 = load ptr, ptr %14, align 8, !tbaa !19
  %158 = getelementptr inbounds i8, ptr %157, i64 8
  %159 = load ptr, ptr %158, align 8, !tbaa !20
  %160 = getelementptr inbounds i32, ptr %159, i64 %indvars.iv256
  %161 = load i32, ptr %160, align 4, !tbaa !22
  store i32 %161, ptr %15, align 8, !tbaa !23
  br label %.thread

.thread:                                          ; preds = %77, %.thread171, %.thread164, %._crit_edge201, %.loopexit182, %._crit_edge209
  %.16.sroa_idx.promoted297 = phi double [ %.16.sroa_idx.promoted298, %.loopexit182 ], [ %.16.sroa_idx.promoted298, %._crit_edge209 ], [ %.16.sroa_idx.promoted299, %._crit_edge201 ], [ %.16.sroa_idx.promoted298, %.thread164 ], [ %.16.sroa_idx.promoted298, %.thread171 ], [ %.16.sroa_idx.promoted299, %77 ]
  %.16.293 = phi double [ %.16.294, %.loopexit182 ], [ %.16.294, %._crit_edge209 ], [ %.16.292, %._crit_edge201 ], [ %.16.294, %.thread164 ], [ %.16.294, %.thread171 ], [ %.16.292, %77 ]
  %.4 = phi double [ %.3140166169, %.loopexit182 ], [ %.lcssa, %._crit_edge209 ], [ %.1138214, %._crit_edge201 ], [ %155, %.thread164 ], [ %149, %.thread171 ], [ %.1138214, %77 ]
  %.3 = phi double [ %.3140166169, %.loopexit182 ], [ %.2215, %._crit_edge209 ], [ %.2215, %._crit_edge201 ], [ %.2215, %.thread164 ], [ %.2215, %.thread171 ], [ %.2215, %77 ]
  %indvars.iv.next252 = add nuw nsw i64 %indvars.iv251, 1
  %exitcond255.not = icmp eq i64 %indvars.iv.next252, %wide.trip.count259
  br i1 %exitcond255.not, label %.loopexit185, label %77, !llvm.loop !27

._crit_edge223:                                   ; preds = %.loopexit185, %.preheader189
  %162 = getelementptr inbounds i8, ptr %3, i64 16
  %163 = load i32, ptr %162, align 8, !tbaa !28
  %.not = icmp eq i32 %163, 104
  br i1 %.not, label %.loopexit, label %164

164:                                              ; preds = %._crit_edge223
  switch i32 %7, label %.lr.ph225 [
    i32 2, label %168
    i32 3, label %170
  ]

.lr.ph225:                                        ; preds = %164
  %165 = getelementptr inbounds i8, ptr %3, i64 112
  %166 = shl nuw nsw i32 %7, 3
  %167 = zext nneg i32 %166 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 8 %165, ptr nonnull align 16 %6, i64 %167, i1 false), !tbaa !12
  br label %.loopexit

168:                                              ; preds = %164
  %169 = getelementptr inbounds i8, ptr %3, i64 112
  %.0. = load <2 x double>, ptr %6, align 16, !tbaa !12
  store <2 x double> %.0., ptr %169, align 8, !tbaa !12
  br label %.loopexit

170:                                              ; preds = %164
  %171 = getelementptr inbounds i8, ptr %3, i64 112
  %.0.281 = load <2 x double>, ptr %6, align 16, !tbaa !12
  store <2 x double> %.0.281, ptr %171, align 8, !tbaa !12
  %.16.sroa_idx282 = getelementptr inbounds i8, ptr %6, i64 16
  %.16..16. = load double, ptr %.16.sroa_idx282, align 16, !tbaa !12
  %172 = getelementptr inbounds i8, ptr %3, i64 128
  store double %.16..16., ptr %172, align 8, !tbaa !12
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph225, %._crit_edge223, %170, %168, %9
  %.0141 = phi i32 [ %10, %9 ], [ 0, %168 ], [ 0, %170 ], [ 0, %._crit_edge223 ], [ 0, %.lr.ph225 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %6)
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %5)
  ret i32 %.0141
}

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #4

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #5 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = !{!10, !10, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!11, !11, i64 0}
!16 = distinct !{!16, !14}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.unroll.disable"}
!19 = !{!6, !11, i64 80}
!20 = !{!21, !11, i64 8}
!21 = !{!"__SMactive", !7, i64 0, !7, i64 4, !11, i64 8, !10, i64 16}
!22 = !{!7, !7, i64 0}
!23 = !{!6, !7, i64 104}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = !{!6, !7, i64 16}


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