; LLVM IR from chrr/libECP :: src (util)

; 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.doubleArray = type { ptr, ptr }

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fabs.f64(double) #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
declare dso_local double @n_over_k(i32 noundef, i32 noundef, ptr noundef) #2

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

declare { ptr, ptr } @doubleArray_new(i64 noundef, ...) #3

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcPolynomials(ptr %0, ptr %1, ptr noundef %2, ptr noundef %3, i32 noundef %4, ptr noundef %5, double noundef %6, double noundef %7, i32 noundef %8, ptr noundef byval(%struct.doubleArray) align 8 %9, i32 noundef %10, ptr noundef byval(%struct.doubleArray) align 8 %11) #2 {
  %13 = alloca %struct.doubleArray, align 8
  %14 = alloca %struct.doubleArray, align 8
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca double, align 8
  %20 = alloca double, align 8
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %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
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca i32, align 4
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca double, align 8
  %45 = alloca double, align 8
  %46 = alloca double, align 8
  %47 = alloca double, align 8
  %48 = alloca double, align 8
  %49 = alloca double, align 8
  %50 = alloca i32, align 4
  %51 = alloca i32, align 4
  %52 = alloca i32, align 4
  %53 = alloca double, align 8
  %54 = alloca i32, align 4
  %55 = alloca i32, align 4
  %56 = alloca i32, align 4
  %57 = alloca i32, align 4
  %58 = alloca i32, align 4
  %59 = alloca %struct.doubleArray, align 8
  %60 = alloca i32, align 4
  %61 = alloca i32, align 4
  %62 = getelementptr inbounds { ptr, ptr }, ptr %14, i32 0, i32 0
  store ptr %0, ptr %62, align 8
  %63 = getelementptr inbounds { ptr, ptr }, ptr %14, i32 0, i32 1
  store ptr %1, ptr %63, align 8
  store ptr %2, ptr %15, align 8, !tbaa !5
  store ptr %3, ptr %16, align 8, !tbaa !5
  store i32 %4, ptr %17, align 4, !tbaa !9
  store ptr %5, ptr %18, align 8, !tbaa !5
  store double %6, ptr %19, align 8, !tbaa !11
  store double %7, ptr %20, align 8, !tbaa !11
  store i32 %8, ptr %21, align 4, !tbaa !9
  store i32 %10, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %48) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %49) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %51) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %52) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %54) #4
  %64 = getelementptr inbounds %struct.doubleArray, ptr %14, i32 0, i32 0
  %65 = load ptr, ptr %64, align 8, !tbaa !13
  %66 = getelementptr inbounds i64, ptr %65, i64 2
  %67 = load i64, ptr %66, align 8, !tbaa !15
  %68 = trunc i64 %67 to i32
  store i32 %68, ptr %54, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %55) #4
  %69 = getelementptr inbounds %struct.doubleArray, ptr %9, i32 0, i32 0
  %70 = load ptr, ptr %69, align 8, !tbaa !13
  %71 = getelementptr inbounds i64, ptr %70, i64 3
  %72 = load i64, ptr %71, align 8, !tbaa !15
  %73 = trunc i64 %72 to i32
  store i32 %73, ptr %55, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %56) #4
  %74 = getelementptr inbounds %struct.doubleArray, ptr %9, i32 0, i32 0
  %75 = load ptr, ptr %74, align 8, !tbaa !13
  %76 = getelementptr inbounds i64, ptr %75, i64 2
  %77 = load i64, ptr %76, align 8, !tbaa !15
  %78 = getelementptr inbounds %struct.doubleArray, ptr %9, i32 0, i32 0
  %79 = load ptr, ptr %78, align 8, !tbaa !13
  %80 = getelementptr inbounds i64, ptr %79, i64 3
  %81 = load i64, ptr %80, align 8, !tbaa !15
  %82 = mul i64 %77, %81
  %83 = trunc i64 %82 to i32
  store i32 %83, ptr %56, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #4
  %84 = getelementptr inbounds %struct.doubleArray, ptr %11, i32 0, i32 0
  %85 = load ptr, ptr %84, align 8, !tbaa !13
  %86 = getelementptr inbounds i64, ptr %85, i64 3
  %87 = load i64, ptr %86, align 8, !tbaa !15
  %88 = trunc i64 %87 to i32
  store i32 %88, ptr %57, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %58) #4
  %89 = getelementptr inbounds %struct.doubleArray, ptr %11, i32 0, i32 0
  %90 = load ptr, ptr %89, align 8, !tbaa !13
  %91 = getelementptr inbounds i64, ptr %90, i64 2
  %92 = load i64, ptr %91, align 8, !tbaa !15
  %93 = getelementptr inbounds %struct.doubleArray, ptr %11, i32 0, i32 0
  %94 = load ptr, ptr %93, align 8, !tbaa !13
  %95 = getelementptr inbounds i64, ptr %94, i64 3
  %96 = load i64, ptr %95, align 8, !tbaa !15
  %97 = mul i64 %92, %96
  %98 = trunc i64 %97 to i32
  store i32 %98, ptr %58, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 16, ptr %59) #4
  %99 = load i32, ptr %21, align 4, !tbaa !9
  %100 = add nsw i32 %99, 1
  %101 = load i32, ptr %21, align 4, !tbaa !9
  %102 = add nsw i32 %101, 2
  %103 = mul nsw i32 %100, %102
  %104 = sdiv i32 %103, 2
  %105 = load i32, ptr %22, align 4, !tbaa !9
  %106 = add nsw i32 %105, 1
  %107 = load i32, ptr %22, align 4, !tbaa !9
  %108 = add nsw i32 %107, 2
  %109 = mul nsw i32 %106, %108
  %110 = load i32, ptr %22, align 4, !tbaa !9
  %111 = add nsw i32 %110, 3
  %112 = mul nsw i32 %109, %111
  %113 = sdiv i32 %112, 6
  %114 = call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %104, i32 noundef %113)
  %115 = getelementptr inbounds { ptr, ptr }, ptr %59, i32 0, i32 0
  %116 = extractvalue { ptr, ptr } %114, 0
  store ptr %116, ptr %115, align 8
  %117 = getelementptr inbounds { ptr, ptr }, ptr %59, i32 0, i32 1
  %118 = extractvalue { ptr, ptr } %114, 1
  store ptr %118, ptr %117, align 8
  %119 = load i32, ptr %21, align 4, !tbaa !9
  %120 = add nsw i32 %119, 1
  %121 = load i32, ptr %21, align 4, !tbaa !9
  %122 = add nsw i32 %121, 2
  %123 = mul nsw i32 %120, %122
  %124 = sdiv i32 %123, 2
  %125 = load i32, ptr %22, align 4, !tbaa !9
  %126 = add nsw i32 %125, 1
  %127 = load i32, ptr %22, align 4, !tbaa !9
  %128 = add nsw i32 %127, 2
  %129 = mul nsw i32 %126, %128
  %130 = sdiv i32 %129, 2
  %131 = call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %124, i32 noundef %130)
  %132 = getelementptr inbounds { ptr, ptr }, ptr %13, i32 0, i32 0
  %133 = extractvalue { ptr, ptr } %131, 0
  store ptr %133, ptr %132, align 8
  %134 = getelementptr inbounds { ptr, ptr }, ptr %13, i32 0, i32 1
  %135 = extractvalue { ptr, ptr } %131, 1
  store ptr %135, ptr %134, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %60) #4
  %136 = getelementptr inbounds %struct.doubleArray, ptr %59, i32 0, i32 0
  %137 = load ptr, ptr %136, align 8, !tbaa !13
  %138 = getelementptr inbounds i64, ptr %137, i64 2
  %139 = load i64, ptr %138, align 8, !tbaa !15
  %140 = trunc i64 %139 to i32
  store i32 %140, ptr %60, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %61) #4
  %141 = getelementptr inbounds %struct.doubleArray, ptr %13, i32 0, i32 0
  %142 = load ptr, ptr %141, align 8, !tbaa !13
  %143 = getelementptr inbounds i64, ptr %142, i64 2
  %144 = load i64, ptr %143, align 8, !tbaa !15
  %145 = trunc i64 %144 to i32
  store i32 %145, ptr %61, align 4, !tbaa !9
  store i32 0, ptr %23, align 4, !tbaa !9
  br label %146

146:                                              ; preds = %336, %12
  %147 = load i32, ptr %23, align 4, !tbaa !9
  %148 = load i32, ptr %21, align 4, !tbaa !9
  %149 = add nsw i32 %148, 1
  %150 = load i32, ptr %21, align 4, !tbaa !9
  %151 = add nsw i32 %150, 2
  %152 = mul nsw i32 %149, %151
  %153 = sdiv i32 %152, 2
  %154 = icmp slt i32 %147, %153
  br i1 %154, label %155, label %339

155:                                              ; preds = %146
  %156 = load i32, ptr %21, align 4, !tbaa !9
  %157 = sub nsw i32 %156, 1
  %158 = add nsw i32 %157, 1
  %159 = load i32, ptr %21, align 4, !tbaa !9
  %160 = sub nsw i32 %159, 1
  %161 = add nsw i32 %160, 2
  %162 = mul nsw i32 %158, %161
  %163 = load i32, ptr %21, align 4, !tbaa !9
  %164 = sub nsw i32 %163, 1
  %165 = add nsw i32 %164, 3
  %166 = mul nsw i32 %162, %165
  %167 = sdiv i32 %166, 6
  %168 = load i32, ptr %23, align 4, !tbaa !9
  %169 = add nsw i32 %167, %168
  %170 = mul nsw i32 %169, 3
  store i32 %170, ptr %50, align 4, !tbaa !9
  %171 = load ptr, ptr %15, align 8, !tbaa !5
  %172 = load i32, ptr %50, align 4, !tbaa !9
  %173 = sext i32 %172 to i64
  %174 = getelementptr inbounds i32, ptr %171, i64 %173
  %175 = load i32, ptr %174, align 4, !tbaa !9
  store i32 %175, ptr %26, align 4, !tbaa !9
  %176 = load ptr, ptr %15, align 8, !tbaa !5
  %177 = load i32, ptr %50, align 4, !tbaa !9
  %178 = add nsw i32 %177, 1
  %179 = sext i32 %178 to i64
  %180 = getelementptr inbounds i32, ptr %176, i64 %179
  %181 = load i32, ptr %180, align 4, !tbaa !9
  store i32 %181, ptr %27, align 4, !tbaa !9
  %182 = load ptr, ptr %15, align 8, !tbaa !5
  %183 = load i32, ptr %50, align 4, !tbaa !9
  %184 = add nsw i32 %183, 2
  %185 = sext i32 %184 to i64
  %186 = getelementptr inbounds i32, ptr %182, i64 %185
  %187 = load i32, ptr %186, align 4, !tbaa !9
  store i32 %187, ptr %28, align 4, !tbaa !9
  store i32 0, ptr %32, align 4, !tbaa !9
  br label %188

188:                                              ; preds = %332, %155
  %189 = load i32, ptr %32, align 4, !tbaa !9
  %190 = load i32, ptr %26, align 4, !tbaa !9
  %191 = icmp sle i32 %189, %190
  br i1 %191, label %192, label %335

192:                                              ; preds = %188
  %193 = load i32, ptr %26, align 4, !tbaa !9
  %194 = load i32, ptr %32, align 4, !tbaa !9
  %195 = load ptr, ptr %18, align 8, !tbaa !5
  %196 = call double @n_over_k(i32 noundef %193, i32 noundef %194, ptr noundef %195)
  store double %196, ptr %44, align 8, !tbaa !11
  %197 = load i32, ptr %26, align 4, !tbaa !9
  %198 = load i32, ptr %32, align 4, !tbaa !9
  %199 = sub nsw i32 %197, %198
  store i32 %199, ptr %38, align 4, !tbaa !9
  store i32 0, ptr %33, align 4, !tbaa !9
  br label %200

200:                                              ; preds = %328, %192
  %201 = load i32, ptr %33, align 4, !tbaa !9
  %202 = load i32, ptr %27, align 4, !tbaa !9
  %203 = icmp sle i32 %201, %202
  br i1 %203, label %204, label %331

204:                                              ; preds = %200
  %205 = load double, ptr %44, align 8, !tbaa !11
  %206 = load i32, ptr %27, align 4, !tbaa !9
  %207 = load i32, ptr %33, align 4, !tbaa !9
  %208 = load ptr, ptr %18, align 8, !tbaa !5
  %209 = call double @n_over_k(i32 noundef %206, i32 noundef %207, ptr noundef %208)
  %210 = fmul double %205, %209
  store double %210, ptr %45, align 8, !tbaa !11
  %211 = load i32, ptr %27, align 4, !tbaa !9
  %212 = load i32, ptr %33, align 4, !tbaa !9
  %213 = sub nsw i32 %211, %212
  store i32 %213, ptr %39, align 4, !tbaa !9
  store i32 0, ptr %34, align 4, !tbaa !9
  br label %214

214:                                              ; preds = %324, %204
  %215 = load i32, ptr %34, align 4, !tbaa !9
  %216 = load i32, ptr %28, align 4, !tbaa !9
  %217 = icmp sle i32 %215, %216
  br i1 %217, label %218, label %327

218:                                              ; preds = %214
  %219 = load double, ptr %45, align 8, !tbaa !11
  %220 = load i32, ptr %28, align 4, !tbaa !9
  %221 = load i32, ptr %34, align 4, !tbaa !9
  %222 = load ptr, ptr %18, align 8, !tbaa !5
  %223 = call double @n_over_k(i32 noundef %220, i32 noundef %221, ptr noundef %222)
  %224 = fmul double %219, %223
  store double %224, ptr %46, align 8, !tbaa !11
  %225 = load i32, ptr %28, align 4, !tbaa !9
  %226 = load i32, ptr %34, align 4, !tbaa !9
  %227 = sub nsw i32 %225, %226
  store i32 %227, ptr %40, align 4, !tbaa !9
  %228 = load double, ptr %46, align 8, !tbaa !11
  %229 = getelementptr inbounds %struct.doubleArray, ptr %9, i32 0, i32 1
  %230 = load ptr, ptr %229, align 8, !tbaa !17
  %231 = load i32, ptr %38, align 4, !tbaa !9
  %232 = load i32, ptr %56, align 4, !tbaa !9
  %233 = mul nsw i32 %231, %232
  %234 = load i32, ptr %39, align 4, !tbaa !9
  %235 = load i32, ptr %55, align 4, !tbaa !9
  %236 = mul nsw i32 %234, %235
  %237 = add nsw i32 %233, %236
  %238 = load i32, ptr %40, align 4, !tbaa !9
  %239 = add nsw i32 %237, %238
  %240 = sext i32 %239 to i64
  %241 = getelementptr inbounds double, ptr %230, i64 %240
  %242 = load double, ptr %241, align 8, !tbaa !11
  %243 = fmul double %228, %242
  store double %243, ptr %53, align 8, !tbaa !11
  %244 = load double, ptr %53, align 8, !tbaa !11
  %245 = call double @llvm.fabs.f64(double %244)
  %246 = load double, ptr %19, align 8, !tbaa !11
  %247 = fcmp ole double %245, %246
  br i1 %247, label %248, label %249

248:                                              ; preds = %218
  br label %324

249:                                              ; preds = %218
  %250 = load ptr, ptr %16, align 8, !tbaa !5
  %251 = load i32, ptr %32, align 4, !tbaa !9
  %252 = load i32, ptr %17, align 4, !tbaa !9
  %253 = mul nsw i32 %251, %252
  %254 = load i32, ptr %17, align 4, !tbaa !9
  %255 = mul nsw i32 %253, %254
  %256 = load i32, ptr %33, align 4, !tbaa !9
  %257 = load i32, ptr %17, align 4, !tbaa !9
  %258 = mul nsw i32 %256, %257
  %259 = add nsw i32 %255, %258
  %260 = load i32, ptr %34, align 4, !tbaa !9
  %261 = add nsw i32 %259, %260
  %262 = sext i32 %261 to i64
  %263 = getelementptr inbounds i32, ptr %250, i64 %262
  %264 = load i32, ptr %263, align 4, !tbaa !9
  store i32 %264, ptr %52, align 4, !tbaa !9
  store i32 0, ptr %25, align 4, !tbaa !9
  br label %265

265:                                              ; preds = %320, %249
  %266 = load i32, ptr %25, align 4, !tbaa !9
  %267 = load i32, ptr %22, align 4, !tbaa !9
  %268 = icmp sle i32 %266, %267
  br i1 %268, label %269, label %323

269:                                              ; preds = %265
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %270

270:                                              ; preds = %316, %269
  %271 = load i32, ptr %24, align 4, !tbaa !9
  %272 = load i32, ptr %25, align 4, !tbaa !9
  %273 = add nsw i32 %272, 1
  %274 = load i32, ptr %25, align 4, !tbaa !9
  %275 = add nsw i32 %274, 2
  %276 = mul nsw i32 %273, %275
  %277 = sdiv i32 %276, 2
  %278 = icmp slt i32 %271, %277
  br i1 %278, label %279, label %319

279:                                              ; preds = %270
  %280 = load i32, ptr %25, align 4, !tbaa !9
  %281 = sub nsw i32 %280, 1
  %282 = add nsw i32 %281, 1
  %283 = load i32, ptr %25, align 4, !tbaa !9
  %284 = sub nsw i32 %283, 1
  %285 = add nsw i32 %284, 2
  %286 = mul nsw i32 %282, %285
  %287 = load i32, ptr %25, align 4, !tbaa !9
  %288 = sub nsw i32 %287, 1
  %289 = add nsw i32 %288, 3
  %290 = mul nsw i32 %286, %289
  %291 = sdiv i32 %290, 6
  %292 = load i32, ptr %24, align 4, !tbaa !9
  %293 = add nsw i32 %291, %292
  store i32 %293, ptr %51, align 4, !tbaa !9
  %294 = load double, ptr %53, align 8, !tbaa !11
  %295 = getelementptr inbounds %struct.doubleArray, ptr %14, i32 0, i32 1
  %296 = load ptr, ptr %295, align 8, !tbaa !17
  %297 = load i32, ptr %52, align 4, !tbaa !9
  %298 = load i32, ptr %54, align 4, !tbaa !9
  %299 = mul nsw i32 %297, %298
  %300 = load i32, ptr %51, align 4, !tbaa !9
  %301 = add nsw i32 %299, %300
  %302 = sext i32 %301 to i64
  %303 = getelementptr inbounds double, ptr %296, i64 %302
  %304 = load double, ptr %303, align 8, !tbaa !11
  %305 = getelementptr inbounds %struct.doubleArray, ptr %59, i32 0, i32 1
  %306 = load ptr, ptr %305, align 8, !tbaa !17
  %307 = load i32, ptr %23, align 4, !tbaa !9
  %308 = load i32, ptr %60, align 4, !tbaa !9
  %309 = mul nsw i32 %307, %308
  %310 = load i32, ptr %51, align 4, !tbaa !9
  %311 = add nsw i32 %309, %310
  %312 = sext i32 %311 to i64
  %313 = getelementptr inbounds double, ptr %306, i64 %312
  %314 = load double, ptr %313, align 8, !tbaa !11
  %315 = call double @llvm.fmuladd.f64(double %294, double %304, double %314)
  store double %315, ptr %313, align 8, !tbaa !11
  br label %316

316:                                              ; preds = %279
  %317 = load i32, ptr %24, align 4, !tbaa !9
  %318 = add nsw i32 %317, 1
  store i32 %318, ptr %24, align 4, !tbaa !9
  br label %270, !llvm.loop !18

319:                                              ; preds = %270
  br label %320

320:                                              ; preds = %319
  %321 = load i32, ptr %25, align 4, !tbaa !9
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %25, align 4, !tbaa !9
  br label %265, !llvm.loop !20

323:                                              ; preds = %265
  br label %324

324:                                              ; preds = %323, %248
  %325 = load i32, ptr %34, align 4, !tbaa !9
  %326 = add nsw i32 %325, 1
  store i32 %326, ptr %34, align 4, !tbaa !9
  br label %214, !llvm.loop !21

327:                                              ; preds = %214
  br label %328

328:                                              ; preds = %327
  %329 = load i32, ptr %33, align 4, !tbaa !9
  %330 = add nsw i32 %329, 1
  store i32 %330, ptr %33, align 4, !tbaa !9
  br label %200, !llvm.loop !22

331:                                              ; preds = %200
  br label %332

332:                                              ; preds = %331
  %333 = load i32, ptr %32, align 4, !tbaa !9
  %334 = add nsw i32 %333, 1
  store i32 %334, ptr %32, align 4, !tbaa !9
  br label %188, !llvm.loop !23

335:                                              ; preds = %188
  br label %336

336:                                              ; preds = %335
  %337 = load i32, ptr %23, align 4, !tbaa !9
  %338 = add nsw i32 %337, 1
  store i32 %338, ptr %23, align 4, !tbaa !9
  br label %146, !llvm.loop !24

339:                                              ; preds = %146
  store i32 0, ptr %24, align 4, !tbaa !9
  br label %340

340:                                              ; preds = %510, %339
  %341 = load i32, ptr %24, align 4, !tbaa !9
  %342 = load i32, ptr %22, align 4, !tbaa !9
  %343 = add nsw i32 %342, 1
  %344 = load i32, ptr %22, align 4, !tbaa !9
  %345 = add nsw i32 %344, 2
  %346 = mul nsw i32 %343, %345
  %347 = sdiv i32 %346, 2
  %348 = icmp slt i32 %341, %347
  br i1 %348, label %349, label %513

349:                                              ; preds = %340
  %350 = load i32, ptr %22, align 4, !tbaa !9
  %351 = sub nsw i32 %350, 1
  %352 = add nsw i32 %351, 1
  %353 = load i32, ptr %22, align 4, !tbaa !9
  %354 = sub nsw i32 %353, 1
  %355 = add nsw i32 %354, 2
  %356 = mul nsw i32 %352, %355
  %357 = load i32, ptr %22, align 4, !tbaa !9
  %358 = sub nsw i32 %357, 1
  %359 = add nsw i32 %358, 3
  %360 = mul nsw i32 %356, %359
  %361 = sdiv i32 %360, 6
  %362 = load i32, ptr %24, align 4, !tbaa !9
  %363 = add nsw i32 %361, %362
  %364 = mul nsw i32 %363, 3
  store i32 %364, ptr %51, align 4, !tbaa !9
  %365 = load ptr, ptr %15, align 8, !tbaa !5
  %366 = load i32, ptr %51, align 4, !tbaa !9
  %367 = sext i32 %366 to i64
  %368 = getelementptr inbounds i32, ptr %365, i64 %367
  %369 = load i32, ptr %368, align 4, !tbaa !9
  store i32 %369, ptr %29, align 4, !tbaa !9
  %370 = load ptr, ptr %15, align 8, !tbaa !5
  %371 = load i32, ptr %51, align 4, !tbaa !9
  %372 = add nsw i32 %371, 1
  %373 = sext i32 %372 to i64
  %374 = getelementptr inbounds i32, ptr %370, i64 %373
  %375 = load i32, ptr %374, align 4, !tbaa !9
  store i32 %375, ptr %30, align 4, !tbaa !9
  %376 = load ptr, ptr %15, align 8, !tbaa !5
  %377 = load i32, ptr %51, align 4, !tbaa !9
  %378 = add nsw i32 %377, 2
  %379 = sext i32 %378 to i64
  %380 = getelementptr inbounds i32, ptr %376, i64 %379
  %381 = load i32, ptr %380, align 4, !tbaa !9
  store i32 %381, ptr %31, align 4, !tbaa !9
  store i32 0, ptr %35, align 4, !tbaa !9
  br label %382

382:                                              ; preds = %506, %349
  %383 = load i32, ptr %35, align 4, !tbaa !9
  %384 = load i32, ptr %29, align 4, !tbaa !9
  %385 = icmp sle i32 %383, %384
  br i1 %385, label %386, label %509

386:                                              ; preds = %382
  %387 = load i32, ptr %29, align 4, !tbaa !9
  %388 = load i32, ptr %35, align 4, !tbaa !9
  %389 = load ptr, ptr %18, align 8, !tbaa !5
  %390 = call double @n_over_k(i32 noundef %387, i32 noundef %388, ptr noundef %389)
  store double %390, ptr %47, align 8, !tbaa !11
  %391 = load i32, ptr %29, align 4, !tbaa !9
  %392 = load i32, ptr %35, align 4, !tbaa !9
  %393 = sub nsw i32 %391, %392
  store i32 %393, ptr %41, align 4, !tbaa !9
  store i32 0, ptr %36, align 4, !tbaa !9
  br label %394

394:                                              ; preds = %502, %386
  %395 = load i32, ptr %36, align 4, !tbaa !9
  %396 = load i32, ptr %30, align 4, !tbaa !9
  %397 = icmp sle i32 %395, %396
  br i1 %397, label %398, label %505

398:                                              ; preds = %394
  %399 = load double, ptr %47, align 8, !tbaa !11
  %400 = load i32, ptr %30, align 4, !tbaa !9
  %401 = load i32, ptr %36, align 4, !tbaa !9
  %402 = load ptr, ptr %18, align 8, !tbaa !5
  %403 = call double @n_over_k(i32 noundef %400, i32 noundef %401, ptr noundef %402)
  %404 = fmul double %399, %403
  store double %404, ptr %48, align 8, !tbaa !11
  %405 = load i32, ptr %30, align 4, !tbaa !9
  %406 = load i32, ptr %36, align 4, !tbaa !9
  %407 = sub nsw i32 %405, %406
  store i32 %407, ptr %42, align 4, !tbaa !9
  store i32 0, ptr %37, align 4, !tbaa !9
  br label %408

408:                                              ; preds = %498, %398
  %409 = load i32, ptr %37, align 4, !tbaa !9
  %410 = load i32, ptr %31, align 4, !tbaa !9
  %411 = icmp sle i32 %409, %410
  br i1 %411, label %412, label %501

412:                                              ; preds = %408
  %413 = load double, ptr %48, align 8, !tbaa !11
  %414 = load i32, ptr %31, align 4, !tbaa !9
  %415 = load i32, ptr %37, align 4, !tbaa !9
  %416 = load ptr, ptr %18, align 8, !tbaa !5
  %417 = call double @n_over_k(i32 noundef %414, i32 noundef %415, ptr noundef %416)
  %418 = fmul double %413, %417
  store double %418, ptr %49, align 8, !tbaa !11
  %419 = load i32, ptr %31, align 4, !tbaa !9
  %420 = load i32, ptr %37, align 4, !tbaa !9
  %421 = sub nsw i32 %419, %420
  store i32 %421, ptr %43, align 4, !tbaa !9
  %422 = load double, ptr %49, align 8, !tbaa !11
  %423 = getelementptr inbounds %struct.doubleArray, ptr %11, i32 0, i32 1
  %424 = load ptr, ptr %423, align 8, !tbaa !17
  %425 = load i32, ptr %41, align 4, !tbaa !9
  %426 = load i32, ptr %58, align 4, !tbaa !9
  %427 = mul nsw i32 %425, %426
  %428 = load i32, ptr %42, align 4, !tbaa !9
  %429 = load i32, ptr %57, align 4, !tbaa !9
  %430 = mul nsw i32 %428, %429
  %431 = add nsw i32 %427, %430
  %432 = load i32, ptr %43, align 4, !tbaa !9
  %433 = add nsw i32 %431, %432
  %434 = sext i32 %433 to i64
  %435 = getelementptr inbounds double, ptr %424, i64 %434
  %436 = load double, ptr %435, align 8, !tbaa !11
  %437 = fmul double %422, %436
  store double %437, ptr %53, align 8, !tbaa !11
  %438 = load double, ptr %53, align 8, !tbaa !11
  %439 = call double @llvm.fabs.f64(double %438)
  %440 = load double, ptr %19, align 8, !tbaa !11
  %441 = fcmp ole double %439, %440
  br i1 %441, label %442, label %443

442:                                              ; preds = %412
  br label %498

443:                                              ; preds = %412
  %444 = load double, ptr %20, align 8, !tbaa !11
  %445 = load double, ptr %53, align 8, !tbaa !11
  %446 = fmul double %445, %444
  store double %446, ptr %53, align 8, !tbaa !11
  %447 = load ptr, ptr %16, align 8, !tbaa !5
  %448 = load i32, ptr %35, align 4, !tbaa !9
  %449 = load i32, ptr %17, align 4, !tbaa !9
  %450 = mul nsw i32 %448, %449
  %451 = load i32, ptr %17, align 4, !tbaa !9
  %452 = mul nsw i32 %450, %451
  %453 = load i32, ptr %36, align 4, !tbaa !9
  %454 = load i32, ptr %17, align 4, !tbaa !9
  %455 = mul nsw i32 %453, %454
  %456 = add nsw i32 %452, %455
  %457 = load i32, ptr %37, align 4, !tbaa !9
  %458 = add nsw i32 %456, %457
  %459 = sext i32 %458 to i64
  %460 = getelementptr inbounds i32, ptr %447, i64 %459
  %461 = load i32, ptr %460, align 4, !tbaa !9
  store i32 %461, ptr %52, align 4, !tbaa !9
  store i32 0, ptr %23, align 4, !tbaa !9
  br label %462

462:                                              ; preds = %494, %443
  %463 = load i32, ptr %23, align 4, !tbaa !9
  %464 = load i32, ptr %21, align 4, !tbaa !9
  %465 = add nsw i32 %464, 1
  %466 = load i32, ptr %21, align 4, !tbaa !9
  %467 = add nsw i32 %466, 2
  %468 = mul nsw i32 %465, %467
  %469 = sdiv i32 %468, 2
  %470 = icmp slt i32 %463, %469
  br i1 %470, label %471, label %497

471:                                              ; preds = %462
  %472 = load double, ptr %53, align 8, !tbaa !11
  %473 = getelementptr inbounds %struct.doubleArray, ptr %59, i32 0, i32 1
  %474 = load ptr, ptr %473, align 8, !tbaa !17
  %475 = load i32, ptr %23, align 4, !tbaa !9
  %476 = load i32, ptr %60, align 4, !tbaa !9
  %477 = mul nsw i32 %475, %476
  %478 = load i32, ptr %52, align 4, !tbaa !9
  %479 = add nsw i32 %477, %478
  %480 = sext i32 %479 to i64
  %481 = getelementptr inbounds double, ptr %474, i64 %480
  %482 = load double, ptr %481, align 8, !tbaa !11
  %483 = getelementptr inbounds %struct.doubleArray, ptr %13, i32 0, i32 1
  %484 = load ptr, ptr %483, align 8, !tbaa !17
  %485 = load i32, ptr %23, align 4, !tbaa !9
  %486 = load i32, ptr %61, align 4, !tbaa !9
  %487 = mul nsw i32 %485, %486
  %488 = load i32, ptr %24, align 4, !tbaa !9
  %489 = add nsw i32 %487, %488
  %490 = sext i32 %489 to i64
  %491 = getelementptr inbounds double, ptr %484, i64 %490
  %492 = load double, ptr %491, align 8, !tbaa !11
  %493 = call double @llvm.fmuladd.f64(double %472, double %482, double %492)
  store double %493, ptr %491, align 8, !tbaa !11
  br label %494

494:                                              ; preds = %471
  %495 = load i32, ptr %23, align 4, !tbaa !9
  %496 = add nsw i32 %495, 1
  store i32 %496, ptr %23, align 4, !tbaa !9
  br label %462, !llvm.loop !25

497:                                              ; preds = %462
  br label %498

498:                                              ; preds = %497, %442
  %499 = load i32, ptr %37, align 4, !tbaa !9
  %500 = add nsw i32 %499, 1
  store i32 %500, ptr %37, align 4, !tbaa !9
  br label %408, !llvm.loop !26

501:                                              ; preds = %408
  br label %502

502:                                              ; preds = %501
  %503 = load i32, ptr %36, align 4, !tbaa !9
  %504 = add nsw i32 %503, 1
  store i32 %504, ptr %36, align 4, !tbaa !9
  br label %394, !llvm.loop !27

505:                                              ; preds = %394
  br label %506

506:                                              ; preds = %505
  %507 = load i32, ptr %35, align 4, !tbaa !9
  %508 = add nsw i32 %507, 1
  store i32 %508, ptr %35, align 4, !tbaa !9
  br label %382, !llvm.loop !28

509:                                              ; preds = %382
  br label %510

510:                                              ; preds = %509
  %511 = load i32, ptr %24, align 4, !tbaa !9
  %512 = add nsw i32 %511, 1
  store i32 %512, ptr %24, align 4, !tbaa !9
  br label %340, !llvm.loop !29

513:                                              ; preds = %340
  %514 = getelementptr inbounds { ptr, ptr }, ptr %14, i32 0, i32 0
  %515 = load ptr, ptr %514, align 8
  %516 = getelementptr inbounds { ptr, ptr }, ptr %14, i32 0, i32 1
  %517 = load ptr, ptr %516, align 8
  call void @doubleArray_free(ptr %515, ptr %517)
  %518 = getelementptr inbounds { ptr, ptr }, ptr %59, i32 0, i32 0
  %519 = load ptr, ptr %518, align 8
  %520 = getelementptr inbounds { ptr, ptr }, ptr %59, i32 0, i32 1
  %521 = load ptr, ptr %520, align 8
  call void @doubleArray_free(ptr %519, ptr %521)
  call void @llvm.lifetime.end.p0(i64 4, ptr %61) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %60) #4
  call void @llvm.lifetime.end.p0(i64 16, ptr %59) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %58) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %56) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %55) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %54) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %52) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %51) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %50) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %49) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %48) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %33) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  %522 = load { ptr, ptr }, ptr %13, align 8
  ret { ptr, ptr } %522
}

declare void @doubleArray_free(ptr, ptr) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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 = { "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 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !6, i64 0}
!14 = !{!"", !6, i64 0, !6, i64 8}
!15 = !{!16, !16, i64 0}
!16 = !{!"long", !7, i64 0}
!17 = !{!14, !6, i64 8}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !19}
!23 = distinct !{!23, !19}
!24 = distinct !{!24, !19}
!25 = distinct !{!25, !19}
!26 = distinct !{!26, !19}
!27 = distinct !{!27, !19}
!28 = distinct !{!28, !19}
!29 = distinct !{!29, !19}


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

%struct.doubleArray = type { ptr, ptr }

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

; Function Attrs: nounwind uwtable
declare dso_local double @n_over_k(i32 noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

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

declare { ptr, ptr } @doubleArray_new(i64 noundef, ...) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
define dso_local { ptr, ptr } @calcPolynomials(ptr %0, ptr %1, ptr nocapture noundef readonly %2, ptr nocapture noundef readonly %3, i32 noundef %4, ptr noundef %5, double noundef %6, double noundef %7, i32 noundef %8, ptr nocapture noundef readonly byval(%struct.doubleArray) align 8 %9, i32 noundef %10, ptr nocapture noundef readonly byval(%struct.doubleArray) align 8 %11) local_unnamed_addr #1 {
  %13 = getelementptr inbounds i8, ptr %0, i64 16
  %14 = load i64, ptr %13, align 8, !tbaa !5
  %15 = trunc i64 %14 to i32
  %16 = load ptr, ptr %9, align 8, !tbaa !9
  %17 = getelementptr inbounds i8, ptr %16, i64 24
  %18 = load i64, ptr %17, align 8, !tbaa !5
  %19 = getelementptr inbounds i8, ptr %16, i64 16
  %20 = load i64, ptr %19, align 8, !tbaa !5
  %21 = mul i64 %20, %18
  %22 = trunc i64 %21 to i32
  %23 = load ptr, ptr %11, align 8, !tbaa !9
  %24 = getelementptr inbounds i8, ptr %23, i64 24
  %25 = load i64, ptr %24, align 8, !tbaa !5
  %26 = getelementptr inbounds i8, ptr %23, i64 16
  %27 = load i64, ptr %26, align 8, !tbaa !5
  %28 = mul i64 %27, %25
  %29 = trunc i64 %28 to i32
  %30 = add nsw i32 %8, 1
  %31 = add nsw i32 %8, 2
  %32 = mul nsw i32 %30, %31
  %33 = sdiv i32 %32, 2
  %34 = add i32 %10, 1
  %35 = add nsw i32 %10, 2
  %36 = mul nsw i32 %34, %35
  %37 = add nsw i32 %10, 3
  %38 = mul nsw i32 %36, %37
  %39 = sdiv i32 %38, 6
  %40 = tail call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %33, i32 noundef %39) #4
  %41 = extractvalue { ptr, ptr } %40, 0
  %42 = extractvalue { ptr, ptr } %40, 1
  %43 = sdiv i32 %36, 2
  %44 = tail call { ptr, ptr } (i64, ...) @doubleArray_new(i64 noundef 2, i32 noundef %33, i32 noundef %43) #4
  %45 = extractvalue { ptr, ptr } %44, 0
  %46 = extractvalue { ptr, ptr } %44, 1
  %47 = getelementptr inbounds i8, ptr %41, i64 16
  %48 = load i64, ptr %47, align 8, !tbaa !5
  %49 = getelementptr inbounds i8, ptr %45, i64 16
  %50 = load i64, ptr %49, align 8, !tbaa !5
  %51 = icmp sgt i32 %32, 1
  br i1 %51, label %.lr.ph209, label %.preheader.thread

.lr.ph209:                                        ; preds = %12
  %factor.op.mul205 = mul i32 %31, %8
  %.reass206 = mul i32 %factor.op.mul205, %30
  %52 = sdiv i32 %.reass206, 6
  %53 = getelementptr inbounds i8, ptr %9, i64 8
  %.not178183 = icmp slt i32 %10, 0
  %54 = sext i32 %52 to i64
  br i1 %.not178183, label %.lr.ph209.split.us, label %.lr.ph209.split.preheader

.lr.ph209.split.preheader:                        ; preds = %.lr.ph209
  %sext = shl i64 %48, 32
  %55 = ashr exact i64 %sext, 32
  %wide.trip.count286 = zext nneg i32 %33 to i64
  %56 = ashr exact i64 %sext, 29
  br label %.lr.ph209.split

.lr.ph209.split.us:                               ; preds = %.lr.ph209
  %wide.trip.count297 = zext nneg i32 %33 to i64
  br label %57

57:                                               ; preds = %._crit_edge.us, %.lr.ph209.split.us
  %indvars.iv294 = phi i64 [ %indvars.iv.next295, %._crit_edge.us ], [ 0, %.lr.ph209.split.us ]
  %58 = add nsw i64 %indvars.iv294, %54
  %.idx334 = mul i64 %58, 12
  %59 = getelementptr inbounds i8, ptr %2, i64 %.idx334
  %60 = load i32, ptr %59, align 4, !tbaa !12
  %61 = getelementptr i8, ptr %59, i64 4
  %62 = load i32, ptr %61, align 4, !tbaa !12
  %.fr254 = freeze i32 %62
  %63 = getelementptr i8, ptr %59, i64 8
  %64 = load i32, ptr %63, align 4, !tbaa !12
  %.fr253 = freeze i32 %64
  %.not175195.us = icmp slt i32 %60, 0
  br i1 %.not175195.us, label %._crit_edge.us, label %.lr.ph197.us

._crit_edge.us:                                   ; preds = %._crit_edge192.split.split.us.us.us, %._crit_edge192.split.us.us.us, %.lr.ph197.split.us.us, %57
  %indvars.iv.next295 = add nuw nsw i64 %indvars.iv294, 1
  %exitcond298.not = icmp eq i64 %indvars.iv.next295, %wide.trip.count297
  br i1 %exitcond298.not, label %.preheader, label %57, !llvm.loop !14

.lr.ph197.us:                                     ; preds = %57
  %.not176188.us = icmp slt i32 %.fr254, 0
  br i1 %.not176188.us, label %.lr.ph197.split.us.us, label %.lr.ph197.split.us210

.lr.ph197.split.us210:                            ; preds = %.lr.ph197.us
  %.not177185.us = icmp slt i32 %.fr253, 0
  br i1 %.not177185.us, label %.lr.ph191.us.us, label %.lr.ph191.us202.us

.lr.ph197.split.us.us:                            ; preds = %.lr.ph197.us, %.lr.ph197.split.us.us
  %.0160196.us.us = phi i32 [ %66, %.lr.ph197.split.us.us ], [ 0, %.lr.ph197.us ]
  %65 = tail call double @n_over_k(i32 noundef %60, i32 noundef %.0160196.us.us, ptr noundef %5)
  %66 = add nuw i32 %.0160196.us.us, 1
  %exitcond293.not = icmp eq i32 %.0160196.us.us, %60
  br i1 %exitcond293.not, label %._crit_edge.us, label %.lr.ph197.split.us.us, !llvm.loop !16

.lr.ph191.us.us:                                  ; preds = %.lr.ph197.split.us210, %._crit_edge192.split.us.us.us
  %.0160196.us200.us = phi i32 [ %71, %._crit_edge192.split.us.us.us ], [ 0, %.lr.ph197.split.us210 ]
  %67 = tail call double @n_over_k(i32 noundef %60, i32 noundef %.0160196.us200.us, ptr noundef %5)
  br label %68

68:                                               ; preds = %68, %.lr.ph191.us.us
  %.0161189.us.us.us = phi i32 [ 0, %.lr.ph191.us.us ], [ %70, %68 ]
  %69 = tail call double @n_over_k(i32 noundef %.fr254, i32 noundef %.0161189.us.us.us, ptr noundef %5)
  %70 = add nuw i32 %.0161189.us.us.us, 1
  %exitcond291.not = icmp eq i32 %.0161189.us.us.us, %.fr254
  br i1 %exitcond291.not, label %._crit_edge192.split.us.us.us, label %68, !llvm.loop !17

._crit_edge192.split.us.us.us:                    ; preds = %68
  %71 = add nuw i32 %.0160196.us200.us, 1
  %exitcond292.not = icmp eq i32 %.0160196.us200.us, %60
  br i1 %exitcond292.not, label %._crit_edge.us, label %.lr.ph191.us.us, !llvm.loop !16

.lr.ph191.us202.us:                               ; preds = %.lr.ph197.split.us210, %._crit_edge192.split.split.us.us.us
  %.0160196.us203.us = phi i32 [ %77, %._crit_edge192.split.split.us.us.us ], [ 0, %.lr.ph197.split.us210 ]
  %72 = tail call double @n_over_k(i32 noundef %60, i32 noundef %.0160196.us203.us, ptr noundef %5)
  br label %.lr.ph187.us.us.us

.lr.ph187.us.us.us:                               ; preds = %._crit_edge.split.us.us.us.us, %.lr.ph191.us202.us
  %.0161189.us193.us.us = phi i32 [ 0, %.lr.ph191.us202.us ], [ %76, %._crit_edge.split.us.us.us.us ]
  %73 = tail call double @n_over_k(i32 noundef %.fr254, i32 noundef %.0161189.us193.us.us, ptr noundef %5)
  br label %.loopexit181.us.us.us.us

.loopexit181.us.us.us.us:                         ; preds = %.loopexit181.us.us.us.us, %.lr.ph187.us.us.us
  %.0162186.us.us.us.us = phi i32 [ 0, %.lr.ph187.us.us.us ], [ %75, %.loopexit181.us.us.us.us ]
  %74 = tail call double @n_over_k(i32 noundef %.fr253, i32 noundef %.0162186.us.us.us.us, ptr noundef %5)
  %75 = add nuw i32 %.0162186.us.us.us.us, 1
  %exitcond288.not = icmp eq i32 %.0162186.us.us.us.us, %.fr253
  br i1 %exitcond288.not, label %._crit_edge.split.us.us.us.us, label %.loopexit181.us.us.us.us, !llvm.loop !18

._crit_edge.split.us.us.us.us:                    ; preds = %.loopexit181.us.us.us.us
  %76 = add nuw i32 %.0161189.us193.us.us, 1
  %exitcond289.not = icmp eq i32 %.0161189.us193.us.us, %.fr254
  br i1 %exitcond289.not, label %._crit_edge192.split.split.us.us.us, label %.lr.ph187.us.us.us, !llvm.loop !17

._crit_edge192.split.split.us.us.us:              ; preds = %._crit_edge.split.us.us.us.us
  %77 = add nuw i32 %.0160196.us203.us, 1
  %exitcond290.not = icmp eq i32 %.0160196.us203.us, %60
  br i1 %exitcond290.not, label %._crit_edge.us, label %.lr.ph191.us202.us, !llvm.loop !16

.preheader:                                       ; preds = %._crit_edge, %._crit_edge.us
  %78 = icmp sgt i32 %36, 1
  br i1 %78, label %.lr.ph245, label %._crit_edge246

.preheader.thread:                                ; preds = %12
  %79 = icmp sgt i32 %36, 1
  br i1 %79, label %.lr.ph245.thread, label %._crit_edge246

.lr.ph245.thread:                                 ; preds = %.preheader.thread
  %factor.op.mul239339 = mul i32 %35, %10
  %.reass240340 = mul i32 %factor.op.mul239339, %34
  %80 = sdiv i32 %.reass240340, 6
  br label %.lr.ph245.split.preheader

.lr.ph245:                                        ; preds = %.preheader
  %factor.op.mul239 = mul i32 %35, %10
  %.reass240 = mul i32 %factor.op.mul239, %34
  %81 = sdiv i32 %.reass240, 6
  %82 = getelementptr inbounds i8, ptr %11, i64 8
  br i1 %51, label %.lr.ph245.split.us.preheader, label %.lr.ph245.split.preheader

.lr.ph245.split.preheader:                        ; preds = %.lr.ph245.thread, %.lr.ph245
  %83 = phi i32 [ %80, %.lr.ph245.thread ], [ %81, %.lr.ph245 ]
  %84 = sext i32 %83 to i64
  %wide.trip.count308 = zext nneg i32 %43 to i64
  br label %.lr.ph245.split

.lr.ph245.split.us.preheader:                     ; preds = %.lr.ph245
  %sext336 = shl i64 %48, 32
  %85 = ashr exact i64 %sext336, 32
  %sext337 = shl i64 %50, 32
  %86 = ashr exact i64 %sext337, 32
  %87 = sext i32 %81 to i64
  %wide.trip.count332 = zext nneg i32 %43 to i64
  %wide.trip.count313 = zext nneg i32 %33 to i64
  %xtraiter = and i64 %wide.trip.count313, 1
  %88 = and i32 %32, 2147483646
  %89 = icmp eq i32 %88, 2
  %unroll_iter = and i64 %wide.trip.count313, 1073741822
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %.lr.ph245.split.us

.lr.ph245.split.us:                               ; preds = %.lr.ph245.split.us.preheader, %._crit_edge233.us
  %indvars.iv329 = phi i64 [ 0, %.lr.ph245.split.us.preheader ], [ %indvars.iv.next330, %._crit_edge233.us ]
  %90 = add nsw i64 %indvars.iv329, %87
  %.idx338 = mul i64 %90, 12
  %91 = getelementptr inbounds i8, ptr %2, i64 %.idx338
  %92 = load i32, ptr %91, align 4, !tbaa !12
  %93 = getelementptr i8, ptr %91, i64 4
  %94 = load i32, ptr %93, align 4, !tbaa !12
  %.fr258 = freeze i32 %94
  %95 = getelementptr i8, ptr %91, i64 8
  %96 = load i32, ptr %95, align 4, !tbaa !12
  %.fr257 = freeze i32 %96
  %.not229.us = icmp slt i32 %92, 0
  br i1 %.not229.us, label %._crit_edge233.us, label %.lr.ph232.us

._crit_edge233.us:                                ; preds = %._crit_edge226.split.split.us.us.us, %._crit_edge226.split.us.us.us, %.lr.ph232.split.us.us, %.lr.ph245.split.us
  %indvars.iv.next330 = add nuw nsw i64 %indvars.iv329, 1
  %exitcond333.not = icmp eq i64 %indvars.iv.next330, %wide.trip.count332
  br i1 %exitcond333.not, label %._crit_edge246, label %.lr.ph245.split.us, !llvm.loop !19

.lr.ph232.us:                                     ; preds = %.lr.ph245.split.us
  %.not173222.us = icmp slt i32 %.fr258, 0
  br i1 %.not173222.us, label %.lr.ph232.split.us.us, label %.lr.ph232.split.us247

.lr.ph232.split.us247:                            ; preds = %.lr.ph232.us
  %.not174217.us = icmp slt i32 %.fr257, 0
  br i1 %.not174217.us, label %.lr.ph225.us.us, label %.lr.ph225.us236.us.preheader

.lr.ph225.us236.us.preheader:                     ; preds = %.lr.ph232.split.us247
  %97 = add nuw i32 %.fr257, 1
  %98 = zext nneg i32 %.fr258 to i64
  %99 = add nuw i32 %.fr258, 1
  %wide.trip.count323 = zext i32 %99 to i64
  %wide.trip.count318 = zext i32 %97 to i64
  %invariant.gep357 = getelementptr double, ptr %46, i64 %indvars.iv329
  br label %.lr.ph225.us236.us

.lr.ph232.split.us.us:                            ; preds = %.lr.ph232.us, %.lr.ph232.split.us.us
  %.0163230.us.us = phi i32 [ %101, %.lr.ph232.split.us.us ], [ 0, %.lr.ph232.us ]
  %100 = tail call double @n_over_k(i32 noundef %92, i32 noundef %.0163230.us.us, ptr noundef %5)
  %101 = add nuw i32 %.0163230.us.us, 1
  %exitcond328.not = icmp eq i32 %.0163230.us.us, %92
  br i1 %exitcond328.not, label %._crit_edge233.us, label %.lr.ph232.split.us.us, !llvm.loop !20

.lr.ph225.us.us:                                  ; preds = %.lr.ph232.split.us247, %._crit_edge226.split.us.us.us
  %.0163230.us234.us = phi i32 [ %106, %._crit_edge226.split.us.us.us ], [ 0, %.lr.ph232.split.us247 ]
  %102 = tail call double @n_over_k(i32 noundef %92, i32 noundef %.0163230.us234.us, ptr noundef %5)
  br label %103

103:                                              ; preds = %103, %.lr.ph225.us.us
  %.0164223.us.us.us = phi i32 [ 0, %.lr.ph225.us.us ], [ %105, %103 ]
  %104 = tail call double @n_over_k(i32 noundef %.fr258, i32 noundef %.0164223.us.us.us, ptr noundef %5)
  %105 = add nuw i32 %.0164223.us.us.us, 1
  %exitcond326.not = icmp eq i32 %.0164223.us.us.us, %.fr258
  br i1 %exitcond326.not, label %._crit_edge226.split.us.us.us, label %103, !llvm.loop !21

._crit_edge226.split.us.us.us:                    ; preds = %103
  %106 = add nuw i32 %.0163230.us234.us, 1
  %exitcond327.not = icmp eq i32 %.0163230.us234.us, %92
  br i1 %exitcond327.not, label %._crit_edge233.us, label %.lr.ph225.us.us, !llvm.loop !20

.lr.ph225.us236.us:                               ; preds = %.lr.ph225.us236.us.preheader, %._crit_edge226.split.split.us.us.us
  %.0163230.us237.us = phi i32 [ %152, %._crit_edge226.split.split.us.us.us ], [ 0, %.lr.ph225.us236.us.preheader ]
  %107 = tail call double @n_over_k(i32 noundef %92, i32 noundef %.0163230.us237.us, ptr noundef %5)
  %108 = sub nsw i32 %92, %.0163230.us237.us
  %109 = mul nsw i32 %108, %29
  %110 = add i32 %109, %.fr257
  %111 = mul nsw i32 %.0163230.us237.us, %4
  br label %.lr.ph220.us.us.us

.lr.ph220.us.us.us:                               ; preds = %._crit_edge221.split.us.us.us.us, %.lr.ph225.us236.us
  %indvars.iv320 = phi i64 [ %indvars.iv.next321, %._crit_edge221.split.us.us.us.us ], [ 0, %.lr.ph225.us236.us ]
  %112 = trunc nuw nsw i64 %indvars.iv320 to i32
  %113 = tail call double @n_over_k(i32 noundef %.fr258, i32 noundef %112, ptr noundef %5)
  %114 = fmul double %107, %113
  %115 = sub nsw i64 %98, %indvars.iv320
  %116 = load ptr, ptr %82, align 8
  %117 = mul i64 %115, %25
  %118 = trunc i64 %117 to i32
  %119 = add i32 %110, %118
  %120 = add i32 %111, %112
  %121 = mul i32 %120, %4
  %122 = sext i32 %121 to i64
  %invariant.gep359 = getelementptr i32, ptr %3, i64 %122
  br label %123

123:                                              ; preds = %..loopexit_crit_edge.us.us.us.us, %.lr.ph220.us.us.us
  %indvars.iv315 = phi i64 [ %indvars.iv.next316, %..loopexit_crit_edge.us.us.us.us ], [ 0, %.lr.ph220.us.us.us ]
  %124 = trunc nuw nsw i64 %indvars.iv315 to i32
  %125 = tail call double @n_over_k(i32 noundef %.fr257, i32 noundef %124, ptr noundef %5)
  %126 = fmul double %114, %125
  %127 = sub i32 %119, %124
  %128 = sext i32 %127 to i64
  %129 = getelementptr inbounds double, ptr %116, i64 %128
  %130 = load double, ptr %129, align 8, !tbaa !22
  %131 = fmul double %126, %130
  %132 = tail call double @llvm.fabs.f64(double %131)
  %133 = fcmp ugt double %132, %6
  br i1 %133, label %.lr.ph216.us.us.us.us, label %..loopexit_crit_edge.us.us.us.us

.lr.ph216.us.us.us.us:                            ; preds = %123
  %134 = fmul double %131, %7
  %gep360 = getelementptr i32, ptr %invariant.gep359, i64 %indvars.iv315
  %135 = load i32, ptr %gep360, align 4, !tbaa !12
  %136 = sext i32 %135 to i64
  %invariant.gep355 = getelementptr double, ptr %42, i64 %136
  br i1 %89, label %..loopexit_crit_edge.us.us.us.us.loopexit.unr-lcssa, label %.lr.ph216.us.us.us.us.new

..loopexit_crit_edge.us.us.us.us.loopexit.unr-lcssa: ; preds = %.lr.ph216.us.us.us.us.new, %.lr.ph216.us.us.us.us
  %indvars.iv310.unr = phi i64 [ 0, %.lr.ph216.us.us.us.us ], [ %indvars.iv.next311.1, %.lr.ph216.us.us.us.us.new ]
  br i1 %lcmp.mod.not, label %..loopexit_crit_edge.us.us.us.us, label %..loopexit_crit_edge.us.us.us.us.loopexit.epilog-lcssa

..loopexit_crit_edge.us.us.us.us.loopexit.epilog-lcssa: ; preds = %..loopexit_crit_edge.us.us.us.us.loopexit.unr-lcssa
  %137 = mul nsw i64 %indvars.iv310.unr, %85
  %gep356.epil = getelementptr double, ptr %invariant.gep355, i64 %137
  %138 = load double, ptr %gep356.epil, align 8, !tbaa !22
  %139 = mul nsw i64 %indvars.iv310.unr, %86
  %gep358.epil = getelementptr double, ptr %invariant.gep357, i64 %139
  %140 = load double, ptr %gep358.epil, align 8, !tbaa !22
  %141 = tail call double @llvm.fmuladd.f64(double %134, double %138, double %140)
  store double %141, ptr %gep358.epil, align 8, !tbaa !22
  br label %..loopexit_crit_edge.us.us.us.us

..loopexit_crit_edge.us.us.us.us:                 ; preds = %..loopexit_crit_edge.us.us.us.us.loopexit.epilog-lcssa, %..loopexit_crit_edge.us.us.us.us.loopexit.unr-lcssa, %123
  %indvars.iv.next316 = add nuw nsw i64 %indvars.iv315, 1
  %exitcond319.not = icmp eq i64 %indvars.iv.next316, %wide.trip.count318
  br i1 %exitcond319.not, label %._crit_edge221.split.us.us.us.us, label %123, !llvm.loop !24

.lr.ph216.us.us.us.us.new:                        ; preds = %.lr.ph216.us.us.us.us, %.lr.ph216.us.us.us.us.new
  %indvars.iv310 = phi i64 [ %indvars.iv.next311.1, %.lr.ph216.us.us.us.us.new ], [ 0, %.lr.ph216.us.us.us.us ]
  %niter = phi i64 [ %niter.next.1, %.lr.ph216.us.us.us.us.new ], [ 0, %.lr.ph216.us.us.us.us ]
  %142 = mul nsw i64 %indvars.iv310, %85
  %gep356 = getelementptr double, ptr %invariant.gep355, i64 %142
  %143 = load double, ptr %gep356, align 8, !tbaa !22
  %144 = mul nsw i64 %indvars.iv310, %86
  %gep358 = getelementptr double, ptr %invariant.gep357, i64 %144
  %145 = load double, ptr %gep358, align 8, !tbaa !22
  %146 = tail call double @llvm.fmuladd.f64(double %134, double %143, double %145)
  store double %146, ptr %gep358, align 8, !tbaa !22
  %indvars.iv.next311 = or disjoint i64 %indvars.iv310, 1
  %147 = mul nsw i64 %indvars.iv.next311, %85
  %gep356.1 = getelementptr double, ptr %invariant.gep355, i64 %147
  %148 = load double, ptr %gep356.1, align 8, !tbaa !22
  %149 = mul nsw i64 %indvars.iv.next311, %86
  %gep358.1 = getelementptr double, ptr %invariant.gep357, i64 %149
  %150 = load double, ptr %gep358.1, align 8, !tbaa !22
  %151 = tail call double @llvm.fmuladd.f64(double %134, double %148, double %150)
  store double %151, ptr %gep358.1, align 8, !tbaa !22
  %indvars.iv.next311.1 = add nuw nsw i64 %indvars.iv310, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %..loopexit_crit_edge.us.us.us.us.loopexit.unr-lcssa, label %.lr.ph216.us.us.us.us.new, !llvm.loop !25

._crit_edge221.split.us.us.us.us:                 ; preds = %..loopexit_crit_edge.us.us.us.us
  %indvars.iv.next321 = add nuw nsw i64 %indvars.iv320, 1
  %exitcond324.not = icmp eq i64 %indvars.iv.next321, %wide.trip.count323
  br i1 %exitcond324.not, label %._crit_edge226.split.split.us.us.us, label %.lr.ph220.us.us.us, !llvm.loop !21

._crit_edge226.split.split.us.us.us:              ; preds = %._crit_edge221.split.us.us.us.us
  %152 = add nuw i32 %.0163230.us237.us, 1
  %exitcond325.not = icmp eq i32 %.0163230.us237.us, %92
  br i1 %exitcond325.not, label %._crit_edge233.us, label %.lr.ph225.us236.us, !llvm.loop !20

.lr.ph209.split:                                  ; preds = %.lr.ph209.split.preheader, %._crit_edge
  %indvars.iv283 = phi i64 [ 0, %.lr.ph209.split.preheader ], [ %indvars.iv.next284, %._crit_edge ]
  %153 = mul i64 %56, %indvars.iv283
  %scevgep = getelementptr i8, ptr %42, i64 %153
  %154 = add nsw i64 %indvars.iv283, %54
  %.idx = mul i64 %154, 12
  %155 = getelementptr inbounds i8, ptr %2, i64 %.idx
  %156 = load i32, ptr %155, align 4, !tbaa !12
  %157 = getelementptr i8, ptr %155, i64 4
  %158 = load i32, ptr %157, align 4, !tbaa !12
  %.fr251 = freeze i32 %158
  %159 = getelementptr i8, ptr %155, i64 8
  %160 = load i32, ptr %159, align 4, !tbaa !12
  %.fr = freeze i32 %160
  %.not175195 = icmp slt i32 %156, 0
  br i1 %.not175195, label %._crit_edge, label %.lr.ph197

.lr.ph197:                                        ; preds = %.lr.ph209.split
  %.not176188 = icmp slt i32 %.fr251, 0
  %161 = mul nsw i64 %indvars.iv283, %55
  br i1 %.not176188, label %.lr.ph197.split.us, label %.lr.ph197.split

.lr.ph197.split.us:                               ; preds = %.lr.ph197, %.lr.ph197.split.us
  %.0160196.us = phi i32 [ %163, %.lr.ph197.split.us ], [ 0, %.lr.ph197 ]
  %162 = tail call double @n_over_k(i32 noundef %156, i32 noundef %.0160196.us, ptr noundef %5)
  %163 = add nuw i32 %.0160196.us, 1
  %exitcond282.not = icmp eq i32 %.0160196.us, %156
  br i1 %exitcond282.not, label %._crit_edge, label %.lr.ph197.split.us, !llvm.loop !16

.lr.ph197.split:                                  ; preds = %.lr.ph197
  %.not177185 = icmp slt i32 %.fr, 0
  br i1 %.not177185, label %.lr.ph191.us, label %.lr.ph191.preheader

.lr.ph191.preheader:                              ; preds = %.lr.ph197.split
  %164 = add nuw i32 %.fr, 1
  %165 = zext nneg i32 %.fr251 to i64
  %166 = add nuw i32 %.fr251, 1
  %wide.trip.count277 = zext i32 %166 to i64
  %wide.trip.count = zext i32 %164 to i64
  %invariant.gep351 = getelementptr double, ptr %42, i64 %161
  br label %.lr.ph191

.lr.ph191.us:                                     ; preds = %.lr.ph197.split, %._crit_edge192.split.us.us
  %.0160196.us200 = phi i32 [ %171, %._crit_edge192.split.us.us ], [ 0, %.lr.ph197.split ]
  %167 = tail call double @n_over_k(i32 noundef %156, i32 noundef %.0160196.us200, ptr noundef %5)
  br label %168

168:                                              ; preds = %168, %.lr.ph191.us
  %.0161189.us.us = phi i32 [ 0, %.lr.ph191.us ], [ %170, %168 ]
  %169 = tail call double @n_over_k(i32 noundef %.fr251, i32 noundef %.0161189.us.us, ptr noundef %5)
  %170 = add nuw i32 %.0161189.us.us, 1
  %exitcond280.not = icmp eq i32 %.0161189.us.us, %.fr251
  br i1 %exitcond280.not, label %._crit_edge192.split.us.us, label %168, !llvm.loop !17

._crit_edge192.split.us.us:                       ; preds = %168
  %171 = add nuw i32 %.0160196.us200, 1
  %exitcond281.not = icmp eq i32 %.0160196.us200, %156
  br i1 %exitcond281.not, label %._crit_edge, label %.lr.ph191.us, !llvm.loop !16

.lr.ph191:                                        ; preds = %.lr.ph191.preheader, %._crit_edge192.split.split
  %.0160196 = phi i32 [ %236, %._crit_edge192.split.split ], [ 0, %.lr.ph191.preheader ]
  %172 = tail call double @n_over_k(i32 noundef %156, i32 noundef %.0160196, ptr noundef %5)
  %173 = sub nsw i32 %156, %.0160196
  %174 = mul nsw i32 %173, %22
  %175 = add i32 %174, %.fr
  %176 = mul nsw i32 %.0160196, %4
  br label %.lr.ph187

.lr.ph187:                                        ; preds = %.lr.ph191, %._crit_edge.split
  %indvars.iv274 = phi i64 [ 0, %.lr.ph191 ], [ %indvars.iv.next275, %._crit_edge.split ]
  %177 = trunc nuw nsw i64 %indvars.iv274 to i32
  %178 = tail call double @n_over_k(i32 noundef %.fr251, i32 noundef %177, ptr noundef %5)
  %179 = fmul double %172, %178
  %180 = sub nsw i64 %165, %indvars.iv274
  %181 = load ptr, ptr %53, align 8
  %182 = mul i64 %180, %18
  %183 = trunc i64 %182 to i32
  %184 = add i32 %175, %183
  %185 = add i32 %176, %177
  %186 = mul i32 %185, %4
  %187 = sext i32 %186 to i64
  %invariant.gep353 = getelementptr i32, ptr %3, i64 %187
  br label %188

188:                                              ; preds = %.lr.ph187, %..loopexit181_crit_edge
  %indvars.iv270 = phi i64 [ 0, %.lr.ph187 ], [ %indvars.iv.next271, %..loopexit181_crit_edge ]
  %189 = trunc nuw nsw i64 %indvars.iv270 to i32
  %190 = tail call double @n_over_k(i32 noundef %.fr, i32 noundef %189, ptr noundef %5)
  %191 = fmul double %179, %190
  %192 = sub i32 %184, %189
  %193 = sext i32 %192 to i64
  %194 = getelementptr inbounds double, ptr %181, i64 %193
  %195 = load double, ptr %194, align 8, !tbaa !22
  %196 = fmul double %191, %195
  %197 = tail call double @llvm.fabs.f64(double %196)
  %198 = fcmp ugt double %197, %6
  br i1 %198, label %.preheader179.lr.ph, label %..loopexit181_crit_edge

.preheader179.lr.ph:                              ; preds = %188
  %gep354 = getelementptr i32, ptr %invariant.gep353, i64 %indvars.iv270
  %199 = load i32, ptr %gep354, align 4, !tbaa !12
  %200 = mul nsw i32 %199, %15
  %201 = sext i32 %200 to i64
  %invariant.gep = getelementptr double, ptr %1, i64 %201
  %202 = shl nsw i64 %201, 3
  %scevgep377 = getelementptr i8, ptr %1, i64 %202
  %scevgep379 = getelementptr i8, ptr %1, i64 %202
  %broadcast.splatinsert = insertelement <2 x double> poison, double %196, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  br label %.lr.ph

.loopexit180:                                     ; preds = %scalar.ph, %middle.block
  %exitcond.not = icmp eq i32 %.0159184, %10
  %scev.check.iv.next = add i32 %scev.check.iv, %208
  %scev.check.iv.next372 = add i32 %scev.check.iv371, %scev.check.iv
  %scev.check.iv.next375 = add i32 %scev.check.iv374, %206
  br i1 %exitcond.not, label %..loopexit181_crit_edge, label %.lr.ph, !llvm.loop !26

.lr.ph:                                           ; preds = %.loopexit180, %.preheader179.lr.ph
  %scev.check.iv374 = phi i32 [ %scev.check.iv.next375, %.loopexit180 ], [ 2, %.preheader179.lr.ph ]
  %scev.check.iv371 = phi i32 [ %scev.check.iv.next372, %.loopexit180 ], [ 0, %.preheader179.lr.ph ]
  %scev.check.iv = phi i32 [ %scev.check.iv.next, %.loopexit180 ], [ 6, %.preheader179.lr.ph ]
  %.0159184 = phi i32 [ %209, %.loopexit180 ], [ 0, %.preheader179.lr.ph ]
  %203 = lshr exact i32 %scev.check.iv374, 1
  %204 = tail call i32 @llvm.umax.i32(i32 %203, i32 1)
  %umax381 = zext nneg i32 %204 to i64
  %205 = shl nuw i32 %.0159184, 1
  %206 = add i32 %205, 4
  %207 = mul i32 %.0159184, 6
  %208 = add i32 %207, 12
  %209 = add nuw nsw i32 %.0159184, 1
  %210 = add nuw nsw i32 %.0159184, 2
  %211 = mul nuw nsw i32 %209, %210
  %212 = lshr i32 %211, 1
  %factor.op.mul = mul i32 %210, %.0159184
  %.reass = mul i32 %factor.op.mul, %209
  %213 = udiv i32 %.reass, 6
  %214 = zext nneg i32 %213 to i64
  %215 = zext nneg i32 %212 to i64
  %min.iters.check = icmp ult i32 %scev.check.iv374, 8
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph
  %216 = lshr exact i32 %scev.check.iv374, 1
  %217 = tail call i32 @llvm.umax.i32(i32 %216, i32 1)
  %218 = udiv i32 %scev.check.iv371, 6
  %narrow = add nuw i32 %217, %218
  %219 = zext i32 %narrow to i64
  %220 = shl nuw nsw i64 %219, 3
  %scevgep380 = getelementptr i8, ptr %scevgep379, i64 %220
  %221 = zext nneg i32 %218 to i64
  %222 = shl nuw nsw i64 %221, 3
  %scevgep378 = getelementptr i8, ptr %scevgep377, i64 %222
  %scevgep376 = getelementptr i8, ptr %scevgep, i64 %220
  %scevgep373 = getelementptr i8, ptr %scevgep, i64 %222
  %bound0 = icmp ult ptr %scevgep373, %scevgep380
  %bound1 = icmp ult ptr %scevgep378, %scevgep376
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %umax381, 2147483644
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %223 = add nuw nsw i64 %index, %214
  %224 = getelementptr double, ptr %invariant.gep, i64 %223
  %225 = getelementptr i8, ptr %224, i64 16
  %wide.load = load <2 x double>, ptr %224, align 8, !tbaa !22, !alias.scope !27
  %wide.load382 = load <2 x double>, ptr %225, align 8, !tbaa !22, !alias.scope !27
  %226 = getelementptr double, ptr %invariant.gep351, i64 %223
  %227 = getelementptr i8, ptr %226, i64 16
  %wide.load383 = load <2 x double>, ptr %226, align 8, !tbaa !22, !alias.scope !30, !noalias !27
  %wide.load384 = load <2 x double>, ptr %227, align 8, !tbaa !22, !alias.scope !30, !noalias !27
  %228 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %wide.load, <2 x double> %wide.load383)
  %229 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %wide.load382, <2 x double> %wide.load384)
  store <2 x double> %228, ptr %226, align 8, !tbaa !22, !alias.scope !30, !noalias !27
  store <2 x double> %229, ptr %227, align 8, !tbaa !22, !alias.scope !30, !noalias !27
  %index.next = add nuw i64 %index, 4
  %230 = icmp eq i64 %index.next, %n.vec
  br i1 %230, label %middle.block, label %vector.body, !llvm.loop !32

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %umax381
  br i1 %cmp.n, label %.loopexit180, label %scalar.ph.preheader

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

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %scalar.ph ], [ %indvars.iv.ph, %scalar.ph.preheader ]
  %231 = add nuw nsw i64 %indvars.iv, %214
  %gep = getelementptr double, ptr %invariant.gep, i64 %231
  %232 = load double, ptr %gep, align 8, !tbaa !22
  %gep352 = getelementptr double, ptr %invariant.gep351, i64 %231
  %233 = load double, ptr %gep352, align 8, !tbaa !22
  %234 = tail call double @llvm.fmuladd.f64(double %196, double %232, double %233)
  store double %234, ptr %gep352, align 8, !tbaa !22
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %235 = icmp ult i64 %indvars.iv.next, %215
  br i1 %235, label %scalar.ph, label %.loopexit180, !llvm.loop !35

..loopexit181_crit_edge:                          ; preds = %.loopexit180, %188
  %indvars.iv.next271 = add nuw nsw i64 %indvars.iv270, 1
  %exitcond273.not = icmp eq i64 %indvars.iv.next271, %wide.trip.count
  br i1 %exitcond273.not, label %._crit_edge.split, label %188, !llvm.loop !18

._crit_edge.split:                                ; preds = %..loopexit181_crit_edge
  %indvars.iv.next275 = add nuw nsw i64 %indvars.iv274, 1
  %exitcond278.not = icmp eq i64 %indvars.iv.next275, %wide.trip.count277
  br i1 %exitcond278.not, label %._crit_edge192.split.split, label %.lr.ph187, !llvm.loop !17

._crit_edge192.split.split:                       ; preds = %._crit_edge.split
  %236 = add nuw i32 %.0160196, 1
  %exitcond279.not = icmp eq i32 %.0160196, %156
  br i1 %exitcond279.not, label %._crit_edge, label %.lr.ph191, !llvm.loop !16

._crit_edge:                                      ; preds = %._crit_edge192.split.split, %._crit_edge192.split.us.us, %.lr.ph197.split.us, %.lr.ph209.split
  %indvars.iv.next284 = add nuw nsw i64 %indvars.iv283, 1
  %exitcond287.not = icmp eq i64 %indvars.iv.next284, %wide.trip.count286
  br i1 %exitcond287.not, label %.preheader, label %.lr.ph209.split, !llvm.loop !14

.lr.ph245.split:                                  ; preds = %.lr.ph245.split.preheader, %._crit_edge233
  %indvars.iv305 = phi i64 [ 0, %.lr.ph245.split.preheader ], [ %indvars.iv.next306, %._crit_edge233 ]
  %237 = add nsw i64 %indvars.iv305, %84
  %.idx335 = mul i64 %237, 12
  %238 = getelementptr inbounds i8, ptr %2, i64 %.idx335
  %239 = load i32, ptr %238, align 4, !tbaa !12
  %240 = getelementptr i8, ptr %238, i64 4
  %241 = load i32, ptr %240, align 4, !tbaa !12
  %.fr256 = freeze i32 %241
  %242 = getelementptr i8, ptr %238, i64 8
  %243 = load i32, ptr %242, align 4, !tbaa !12
  %.fr255 = freeze i32 %243
  %.not229 = icmp slt i32 %239, 0
  br i1 %.not229, label %._crit_edge233, label %.lr.ph232

.lr.ph232:                                        ; preds = %.lr.ph245.split
  %.not173222 = icmp slt i32 %.fr256, 0
  br i1 %.not173222, label %.lr.ph232.split.us, label %.lr.ph232.split

.lr.ph232.split.us:                               ; preds = %.lr.ph232, %.lr.ph232.split.us
  %.0163230.us = phi i32 [ %245, %.lr.ph232.split.us ], [ 0, %.lr.ph232 ]
  %244 = tail call double @n_over_k(i32 noundef %239, i32 noundef %.0163230.us, ptr noundef %5)
  %245 = add nuw i32 %.0163230.us, 1
  %exitcond304.not = icmp eq i32 %.0163230.us, %239
  br i1 %exitcond304.not, label %._crit_edge233, label %.lr.ph232.split.us, !llvm.loop !20

.lr.ph232.split:                                  ; preds = %.lr.ph232
  %.not174217 = icmp slt i32 %.fr255, 0
  br i1 %.not174217, label %.lr.ph225.us, label %.lr.ph225

.lr.ph225.us:                                     ; preds = %.lr.ph232.split, %._crit_edge226.split.us.us
  %.0163230.us234 = phi i32 [ %250, %._crit_edge226.split.us.us ], [ 0, %.lr.ph232.split ]
  %246 = tail call double @n_over_k(i32 noundef %239, i32 noundef %.0163230.us234, ptr noundef %5)
  br label %247

247:                                              ; preds = %247, %.lr.ph225.us
  %.0164223.us.us = phi i32 [ 0, %.lr.ph225.us ], [ %249, %247 ]
  %248 = tail call double @n_over_k(i32 noundef %.fr256, i32 noundef %.0164223.us.us, ptr noundef %5)
  %249 = add nuw i32 %.0164223.us.us, 1
  %exitcond302.not = icmp eq i32 %.0164223.us.us, %.fr256
  br i1 %exitcond302.not, label %._crit_edge226.split.us.us, label %247, !llvm.loop !21

._crit_edge226.split.us.us:                       ; preds = %247
  %250 = add nuw i32 %.0163230.us234, 1
  %exitcond303.not = icmp eq i32 %.0163230.us234, %239
  br i1 %exitcond303.not, label %._crit_edge233, label %.lr.ph225.us, !llvm.loop !20

.lr.ph225:                                        ; preds = %.lr.ph232.split, %._crit_edge226.split.split
  %.0163230 = phi i32 [ %256, %._crit_edge226.split.split ], [ 0, %.lr.ph232.split ]
  %251 = tail call double @n_over_k(i32 noundef %239, i32 noundef %.0163230, ptr noundef %5)
  br label %.lr.ph220

.lr.ph220:                                        ; preds = %.lr.ph225, %._crit_edge221.split
  %.0164223 = phi i32 [ 0, %.lr.ph225 ], [ %255, %._crit_edge221.split ]
  %252 = tail call double @n_over_k(i32 noundef %.fr256, i32 noundef %.0164223, ptr noundef %5)
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph220, %.loopexit
  %.0165218 = phi i32 [ 0, %.lr.ph220 ], [ %254, %.loopexit ]
  %253 = tail call double @n_over_k(i32 noundef %.fr255, i32 noundef %.0165218, ptr noundef %5)
  %254 = add nuw i32 %.0165218, 1
  %exitcond299.not = icmp eq i32 %.0165218, %.fr255
  br i1 %exitcond299.not, label %._crit_edge221.split, label %.loopexit, !llvm.loop !24

._crit_edge221.split:                             ; preds = %.loopexit
  %255 = add nuw i32 %.0164223, 1
  %exitcond300.not = icmp eq i32 %.0164223, %.fr256
  br i1 %exitcond300.not, label %._crit_edge226.split.split, label %.lr.ph220, !llvm.loop !21

._crit_edge226.split.split:                       ; preds = %._crit_edge221.split
  %256 = add nuw i32 %.0163230, 1
  %exitcond301.not = icmp eq i32 %.0163230, %239
  br i1 %exitcond301.not, label %._crit_edge233, label %.lr.ph225, !llvm.loop !20

._crit_edge233:                                   ; preds = %._crit_edge226.split.split, %._crit_edge226.split.us.us, %.lr.ph232.split.us, %.lr.ph245.split
  %indvars.iv.next306 = add nuw nsw i64 %indvars.iv305, 1
  %exitcond309.not = icmp eq i64 %indvars.iv.next306, %wide.trip.count308
  br i1 %exitcond309.not, label %._crit_edge246, label %.lr.ph245.split, !llvm.loop !19

._crit_edge246:                                   ; preds = %._crit_edge233, %._crit_edge233.us, %.preheader.thread, %.preheader
  tail call void @doubleArray_free(ptr %0, ptr %1) #4
  tail call void @doubleArray_free(ptr %41, ptr %42) #4
  ret { ptr, ptr } %44
}

declare void @doubleArray_free(ptr, ptr) local_unnamed_addr #2

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"", !11, i64 0, !11, i64 8}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"int", !7, i64 0}
!14 = distinct !{!14, !15}
!15 = !{!"llvm.loop.mustprogress"}
!16 = distinct !{!16, !15}
!17 = distinct !{!17, !15}
!18 = distinct !{!18, !15}
!19 = distinct !{!19, !15}
!20 = distinct !{!20, !15}
!21 = distinct !{!21, !15}
!22 = !{!23, !23, i64 0}
!23 = !{!"double", !7, i64 0}
!24 = distinct !{!24, !15}
!25 = distinct !{!25, !15}
!26 = distinct !{!26, !15}
!27 = !{!28}
!28 = distinct !{!28, !29}
!29 = distinct !{!29, !"LVerDomain"}
!30 = !{!31}
!31 = distinct !{!31, !29}
!32 = distinct !{!32, !15, !33, !34}
!33 = !{!"llvm.loop.isvectorized", i32 1}
!34 = !{!"llvm.loop.unroll.runtime.disable"}
!35 = distinct !{!35, !15, !33}


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