; LLVM IR from rgolubtsov/nonlinear-optimization-algorithms-multilang :: nlp-unconstrained-cli/nelder-mead/c/src (nelmin)

; 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.optimum = type { [20 x double], double, [3 x i32] }

; Function Attrs: nounwind uwtable
define dso_local ptr @nelmin(i32 noundef %0, ptr noundef %1, double noundef %2, ptr noundef %3, i32 noundef %4, i32 noundef %5) #0 {
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca double, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca [20 x double], align 16
  %16 = alloca double, align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %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 double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca double, align 8
  %31 = alloca [20 x [21 x double]], align 16
  %32 = alloca [21 x double], align 16
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca [20 x double], align 16
  %37 = alloca [20 x double], align 16
  %38 = alloca double, align 8
  %39 = alloca [20 x double], align 16
  %40 = alloca double, align 8
  %41 = alloca i32, align 4
  store i32 %0, ptr %8, align 4, !tbaa !5
  store ptr %1, ptr %9, align 8, !tbaa !9
  store double %2, ptr %10, align 8, !tbaa !11
  store ptr %3, ptr %11, align 8, !tbaa !9
  store i32 %4, ptr %12, align 4, !tbaa !5
  store i32 %5, ptr %13, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.start.p0(i64 160, ptr %15) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #6
  call void @llvm.lifetime.start.p0(i64 3360, ptr %31) #6
  call void @llvm.lifetime.start.p0(i64 168, ptr %32) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #6
  call void @llvm.lifetime.start.p0(i64 160, ptr %36) #6
  call void @llvm.lifetime.start.p0(i64 160, ptr %37) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #6
  call void @llvm.lifetime.start.p0(i64 160, ptr %39) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #6
  %42 = call noalias ptr @malloc(i64 noundef 184) #7
  store ptr %42, ptr %14, align 8, !tbaa !9
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %43

43:                                               ; preds = %53, %6
  %44 = load i32, ptr %22, align 4, !tbaa !5
  %45 = load i32, ptr %8, align 4, !tbaa !5
  %46 = icmp ult i32 %44, %45
  br i1 %46, label %47, label %56

47:                                               ; preds = %43
  %48 = load ptr, ptr %14, align 8, !tbaa !9
  %49 = getelementptr inbounds %struct.optimum, ptr %48, i32 0, i32 0
  %50 = load i32, ptr %22, align 4, !tbaa !5
  %51 = zext i32 %50 to i64
  %52 = getelementptr inbounds [20 x double], ptr %49, i64 0, i64 %51
  store double 0.000000e+00, ptr %52, align 8, !tbaa !11
  br label %53

53:                                               ; preds = %47
  %54 = load i32, ptr %22, align 4, !tbaa !5
  %55 = add i32 %54, 1
  store i32 %55, ptr %22, align 4, !tbaa !5
  br label %43, !llvm.loop !13

56:                                               ; preds = %43
  store i32 0, ptr %18, align 4, !tbaa !5
  store i32 0, ptr %17, align 4, !tbaa !5
  %57 = load ptr, ptr %14, align 8, !tbaa !9
  %58 = getelementptr inbounds %struct.optimum, ptr %57, i32 0, i32 1
  store double 0.000000e+00, ptr %58, align 8, !tbaa !15
  %59 = load i32, ptr %17, align 4, !tbaa !5
  %60 = load ptr, ptr %14, align 8, !tbaa !9
  %61 = getelementptr inbounds %struct.optimum, ptr %60, i32 0, i32 2
  %62 = getelementptr inbounds [3 x i32], ptr %61, i64 0, i64 0
  store i32 %59, ptr %62, align 8, !tbaa !5
  %63 = load i32, ptr %18, align 4, !tbaa !5
  %64 = load ptr, ptr %14, align 8, !tbaa !9
  %65 = getelementptr inbounds %struct.optimum, ptr %64, i32 0, i32 2
  %66 = getelementptr inbounds [3 x i32], ptr %65, i64 0, i64 1
  store i32 %63, ptr %66, align 4, !tbaa !5
  %67 = load double, ptr %10, align 8, !tbaa !11
  %68 = fcmp ole double %67, 0.000000e+00
  br i1 %68, label %69, label %75

69:                                               ; preds = %56
  store i32 1, ptr %19, align 4, !tbaa !5
  %70 = load i32, ptr %19, align 4, !tbaa !5
  %71 = load ptr, ptr %14, align 8, !tbaa !9
  %72 = getelementptr inbounds %struct.optimum, ptr %71, i32 0, i32 2
  %73 = getelementptr inbounds [3 x i32], ptr %72, i64 0, i64 2
  store i32 %70, ptr %73, align 8, !tbaa !5
  %74 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %74, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

75:                                               ; preds = %56
  %76 = load i32, ptr %8, align 4, !tbaa !5
  %77 = icmp ult i32 %76, 1
  br i1 %77, label %78, label %84

78:                                               ; preds = %75
  store i32 1, ptr %19, align 4, !tbaa !5
  %79 = load i32, ptr %19, align 4, !tbaa !5
  %80 = load ptr, ptr %14, align 8, !tbaa !9
  %81 = getelementptr inbounds %struct.optimum, ptr %80, i32 0, i32 2
  %82 = getelementptr inbounds [3 x i32], ptr %81, i64 0, i64 2
  store i32 %79, ptr %82, align 8, !tbaa !5
  %83 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %83, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

84:                                               ; preds = %75
  %85 = load i32, ptr %8, align 4, !tbaa !5
  %86 = icmp ult i32 20, %85
  br i1 %86, label %87, label %93

87:                                               ; preds = %84
  store i32 1, ptr %19, align 4, !tbaa !5
  %88 = load i32, ptr %19, align 4, !tbaa !5
  %89 = load ptr, ptr %14, align 8, !tbaa !9
  %90 = getelementptr inbounds %struct.optimum, ptr %89, i32 0, i32 2
  %91 = getelementptr inbounds [3 x i32], ptr %90, i64 0, i64 2
  store i32 %88, ptr %91, align 8, !tbaa !5
  %92 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %92, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

93:                                               ; preds = %84
  %94 = load i32, ptr %12, align 4, !tbaa !5
  %95 = icmp ult i32 %94, 1
  br i1 %95, label %96, label %102

96:                                               ; preds = %93
  store i32 1, ptr %19, align 4, !tbaa !5
  %97 = load i32, ptr %19, align 4, !tbaa !5
  %98 = load ptr, ptr %14, align 8, !tbaa !9
  %99 = getelementptr inbounds %struct.optimum, ptr %98, i32 0, i32 2
  %100 = getelementptr inbounds [3 x i32], ptr %99, i64 0, i64 2
  store i32 %97, ptr %100, align 8, !tbaa !5
  %101 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %101, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

102:                                              ; preds = %93
  %103 = load i32, ptr %12, align 4, !tbaa !5
  store i32 %103, ptr %20, align 4, !tbaa !5
  %104 = load i32, ptr %8, align 4, !tbaa !5
  %105 = uitofp i32 %104 to double
  store double %105, ptr %27, align 8, !tbaa !11
  %106 = load i32, ptr %8, align 4, !tbaa !5
  %107 = add i32 %106, 1
  store i32 %107, ptr %21, align 4, !tbaa !5
  %108 = load i32, ptr %21, align 4, !tbaa !5
  %109 = uitofp i32 %108 to double
  store double %109, ptr %28, align 8, !tbaa !11
  store double 1.000000e+00, ptr %29, align 8, !tbaa !11
  %110 = load double, ptr %10, align 8, !tbaa !11
  %111 = load double, ptr %27, align 8, !tbaa !11
  %112 = fmul double %110, %111
  store double %112, ptr %30, align 8, !tbaa !11
  br label %113

113:                                              ; preds = %936, %102
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %114

114:                                              ; preds = %130, %113
  %115 = load i32, ptr %22, align 4, !tbaa !5
  %116 = load i32, ptr %8, align 4, !tbaa !5
  %117 = icmp ult i32 %115, %116
  br i1 %117, label %118, label %133

118:                                              ; preds = %114
  %119 = load ptr, ptr %9, align 8, !tbaa !9
  %120 = load i32, ptr %22, align 4, !tbaa !5
  %121 = zext i32 %120 to i64
  %122 = getelementptr inbounds double, ptr %119, i64 %121
  %123 = load double, ptr %122, align 8, !tbaa !11
  %124 = load i32, ptr %22, align 4, !tbaa !5
  %125 = zext i32 %124 to i64
  %126 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %125
  %127 = load i32, ptr %21, align 4, !tbaa !5
  %128 = zext i32 %127 to i64
  %129 = getelementptr inbounds [21 x double], ptr %126, i64 0, i64 %128
  store double %123, ptr %129, align 8, !tbaa !11
  br label %130

130:                                              ; preds = %118
  %131 = load i32, ptr %22, align 4, !tbaa !5
  %132 = add i32 %131, 1
  store i32 %132, ptr %22, align 4, !tbaa !5
  br label %114, !llvm.loop !17

133:                                              ; preds = %114
  %134 = load ptr, ptr %9, align 8, !tbaa !9
  %135 = call double @f(ptr noundef %134)
  %136 = load i32, ptr %21, align 4, !tbaa !5
  %137 = zext i32 %136 to i64
  %138 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %137
  store double %135, ptr %138, align 8, !tbaa !11
  store i32 0, ptr %23, align 4, !tbaa !5
  br label %139

139:                                              ; preds = %191, %133
  %140 = load i32, ptr %23, align 4, !tbaa !5
  %141 = load i32, ptr %8, align 4, !tbaa !5
  %142 = icmp ult i32 %140, %141
  br i1 %142, label %143, label %194

143:                                              ; preds = %139
  %144 = load ptr, ptr %9, align 8, !tbaa !9
  %145 = load i32, ptr %23, align 4, !tbaa !5
  %146 = zext i32 %145 to i64
  %147 = getelementptr inbounds double, ptr %144, i64 %146
  %148 = load double, ptr %147, align 8, !tbaa !11
  store double %148, ptr %33, align 8, !tbaa !11
  %149 = load ptr, ptr %11, align 8, !tbaa !9
  %150 = load i32, ptr %23, align 4, !tbaa !5
  %151 = zext i32 %150 to i64
  %152 = getelementptr inbounds double, ptr %149, i64 %151
  %153 = load double, ptr %152, align 8, !tbaa !11
  %154 = load double, ptr %29, align 8, !tbaa !11
  %155 = load ptr, ptr %9, align 8, !tbaa !9
  %156 = load i32, ptr %23, align 4, !tbaa !5
  %157 = zext i32 %156 to i64
  %158 = getelementptr inbounds double, ptr %155, i64 %157
  %159 = load double, ptr %158, align 8, !tbaa !11
  %160 = call double @llvm.fmuladd.f64(double %153, double %154, double %159)
  store double %160, ptr %158, align 8, !tbaa !11
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %161

161:                                              ; preds = %177, %143
  %162 = load i32, ptr %22, align 4, !tbaa !5
  %163 = load i32, ptr %8, align 4, !tbaa !5
  %164 = icmp ult i32 %162, %163
  br i1 %164, label %165, label %180

165:                                              ; preds = %161
  %166 = load ptr, ptr %9, align 8, !tbaa !9
  %167 = load i32, ptr %22, align 4, !tbaa !5
  %168 = zext i32 %167 to i64
  %169 = getelementptr inbounds double, ptr %166, i64 %168
  %170 = load double, ptr %169, align 8, !tbaa !11
  %171 = load i32, ptr %22, align 4, !tbaa !5
  %172 = zext i32 %171 to i64
  %173 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %172
  %174 = load i32, ptr %23, align 4, !tbaa !5
  %175 = zext i32 %174 to i64
  %176 = getelementptr inbounds [21 x double], ptr %173, i64 0, i64 %175
  store double %170, ptr %176, align 8, !tbaa !11
  br label %177

177:                                              ; preds = %165
  %178 = load i32, ptr %22, align 4, !tbaa !5
  %179 = add i32 %178, 1
  store i32 %179, ptr %22, align 4, !tbaa !5
  br label %161, !llvm.loop !18

180:                                              ; preds = %161
  %181 = load ptr, ptr %9, align 8, !tbaa !9
  %182 = call double @f(ptr noundef %181)
  %183 = load i32, ptr %23, align 4, !tbaa !5
  %184 = zext i32 %183 to i64
  %185 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %184
  store double %182, ptr %185, align 8, !tbaa !11
  %186 = load double, ptr %33, align 8, !tbaa !11
  %187 = load ptr, ptr %9, align 8, !tbaa !9
  %188 = load i32, ptr %23, align 4, !tbaa !5
  %189 = zext i32 %188 to i64
  %190 = getelementptr inbounds double, ptr %187, i64 %189
  store double %186, ptr %190, align 8, !tbaa !11
  br label %191

191:                                              ; preds = %180
  %192 = load i32, ptr %23, align 4, !tbaa !5
  %193 = add i32 %192, 1
  store i32 %193, ptr %23, align 4, !tbaa !5
  br label %139, !llvm.loop !19

194:                                              ; preds = %139
  %195 = load i32, ptr %21, align 4, !tbaa !5
  %196 = load i32, ptr %17, align 4, !tbaa !5
  %197 = add i32 %196, %195
  store i32 %197, ptr %17, align 4, !tbaa !5
  %198 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 0
  %199 = load double, ptr %198, align 16, !tbaa !11
  store double %199, ptr %34, align 8, !tbaa !11
  store i32 0, ptr %24, align 4, !tbaa !5
  store i32 1, ptr %22, align 4, !tbaa !5
  br label %200

200:                                              ; preds = %218, %194
  %201 = load i32, ptr %22, align 4, !tbaa !5
  %202 = load i32, ptr %21, align 4, !tbaa !5
  %203 = icmp ult i32 %201, %202
  br i1 %203, label %204, label %221

204:                                              ; preds = %200
  %205 = load i32, ptr %22, align 4, !tbaa !5
  %206 = zext i32 %205 to i64
  %207 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %206
  %208 = load double, ptr %207, align 8, !tbaa !11
  %209 = load double, ptr %34, align 8, !tbaa !11
  %210 = fcmp olt double %208, %209
  br i1 %210, label %211, label %217

211:                                              ; preds = %204
  %212 = load i32, ptr %22, align 4, !tbaa !5
  %213 = zext i32 %212 to i64
  %214 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %213
  %215 = load double, ptr %214, align 8, !tbaa !11
  store double %215, ptr %34, align 8, !tbaa !11
  %216 = load i32, ptr %22, align 4, !tbaa !5
  store i32 %216, ptr %24, align 4, !tbaa !5
  br label %217

217:                                              ; preds = %211, %204
  br label %218

218:                                              ; preds = %217
  %219 = load i32, ptr %22, align 4, !tbaa !5
  %220 = add i32 %219, 1
  store i32 %220, ptr %22, align 4, !tbaa !5
  br label %200, !llvm.loop !20

221:                                              ; preds = %200
  br label %222

222:                                              ; preds = %763, %717, %584, %221
  %223 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 0
  %224 = load double, ptr %223, align 16, !tbaa !11
  store double %224, ptr %16, align 8, !tbaa !11
  store i32 0, ptr %25, align 4, !tbaa !5
  store i32 1, ptr %22, align 4, !tbaa !5
  br label %225

225:                                              ; preds = %243, %222
  %226 = load i32, ptr %22, align 4, !tbaa !5
  %227 = load i32, ptr %21, align 4, !tbaa !5
  %228 = icmp ult i32 %226, %227
  br i1 %228, label %229, label %246

229:                                              ; preds = %225
  %230 = load double, ptr %16, align 8, !tbaa !11
  %231 = load i32, ptr %22, align 4, !tbaa !5
  %232 = zext i32 %231 to i64
  %233 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %232
  %234 = load double, ptr %233, align 8, !tbaa !11
  %235 = fcmp olt double %230, %234
  br i1 %235, label %236, label %242

236:                                              ; preds = %229
  %237 = load i32, ptr %22, align 4, !tbaa !5
  %238 = zext i32 %237 to i64
  %239 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %238
  %240 = load double, ptr %239, align 8, !tbaa !11
  store double %240, ptr %16, align 8, !tbaa !11
  %241 = load i32, ptr %22, align 4, !tbaa !5
  store i32 %241, ptr %25, align 4, !tbaa !5
  br label %242

242:                                              ; preds = %236, %229
  br label %243

243:                                              ; preds = %242
  %244 = load i32, ptr %22, align 4, !tbaa !5
  %245 = add i32 %244, 1
  store i32 %245, ptr %22, align 4, !tbaa !5
  br label %225, !llvm.loop !21

246:                                              ; preds = %225
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %247

247:                                              ; preds = %285, %246
  %248 = load i32, ptr %22, align 4, !tbaa !5
  %249 = load i32, ptr %8, align 4, !tbaa !5
  %250 = icmp ult i32 %248, %249
  br i1 %250, label %251, label %288

251:                                              ; preds = %247
  store double 0.000000e+00, ptr %35, align 8, !tbaa !11
  store i32 0, ptr %23, align 4, !tbaa !5
  br label %252

252:                                              ; preds = %266, %251
  %253 = load i32, ptr %23, align 4, !tbaa !5
  %254 = load i32, ptr %21, align 4, !tbaa !5
  %255 = icmp ult i32 %253, %254
  br i1 %255, label %256, label %269

256:                                              ; preds = %252
  %257 = load i32, ptr %22, align 4, !tbaa !5
  %258 = zext i32 %257 to i64
  %259 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %258
  %260 = load i32, ptr %23, align 4, !tbaa !5
  %261 = zext i32 %260 to i64
  %262 = getelementptr inbounds [21 x double], ptr %259, i64 0, i64 %261
  %263 = load double, ptr %262, align 8, !tbaa !11
  %264 = load double, ptr %35, align 8, !tbaa !11
  %265 = fadd double %264, %263
  store double %265, ptr %35, align 8, !tbaa !11
  br label %266

266:                                              ; preds = %256
  %267 = load i32, ptr %23, align 4, !tbaa !5
  %268 = add i32 %267, 1
  store i32 %268, ptr %23, align 4, !tbaa !5
  br label %252, !llvm.loop !22

269:                                              ; preds = %252
  %270 = load i32, ptr %22, align 4, !tbaa !5
  %271 = zext i32 %270 to i64
  %272 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %271
  %273 = load i32, ptr %25, align 4, !tbaa !5
  %274 = zext i32 %273 to i64
  %275 = getelementptr inbounds [21 x double], ptr %272, i64 0, i64 %274
  %276 = load double, ptr %275, align 8, !tbaa !11
  %277 = load double, ptr %35, align 8, !tbaa !11
  %278 = fsub double %277, %276
  store double %278, ptr %35, align 8, !tbaa !11
  %279 = load double, ptr %35, align 8, !tbaa !11
  %280 = load double, ptr %27, align 8, !tbaa !11
  %281 = fdiv double %279, %280
  %282 = load i32, ptr %22, align 4, !tbaa !5
  %283 = zext i32 %282 to i64
  %284 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %283
  store double %281, ptr %284, align 8, !tbaa !11
  br label %285

285:                                              ; preds = %269
  %286 = load i32, ptr %22, align 4, !tbaa !5
  %287 = add i32 %286, 1
  store i32 %287, ptr %22, align 4, !tbaa !5
  br label %247, !llvm.loop !23

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

289:                                              ; preds = %314, %288
  %290 = load i32, ptr %22, align 4, !tbaa !5
  %291 = load i32, ptr %8, align 4, !tbaa !5
  %292 = icmp ult i32 %290, %291
  br i1 %292, label %293, label %317

293:                                              ; preds = %289
  %294 = load i32, ptr %22, align 4, !tbaa !5
  %295 = zext i32 %294 to i64
  %296 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %295
  %297 = load double, ptr %296, align 8, !tbaa !11
  %298 = load i32, ptr %22, align 4, !tbaa !5
  %299 = zext i32 %298 to i64
  %300 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %299
  %301 = load double, ptr %300, align 8, !tbaa !11
  %302 = load i32, ptr %22, align 4, !tbaa !5
  %303 = zext i32 %302 to i64
  %304 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %303
  %305 = load i32, ptr %25, align 4, !tbaa !5
  %306 = zext i32 %305 to i64
  %307 = getelementptr inbounds [21 x double], ptr %304, i64 0, i64 %306
  %308 = load double, ptr %307, align 8, !tbaa !11
  %309 = fsub double %301, %308
  %310 = call double @llvm.fmuladd.f64(double 1.000000e+00, double %309, double %297)
  %311 = load i32, ptr %22, align 4, !tbaa !5
  %312 = zext i32 %311 to i64
  %313 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %312
  store double %310, ptr %313, align 8, !tbaa !11
  br label %314

314:                                              ; preds = %293
  %315 = load i32, ptr %22, align 4, !tbaa !5
  %316 = add i32 %315, 1
  store i32 %316, ptr %22, align 4, !tbaa !5
  br label %289, !llvm.loop !24

317:                                              ; preds = %289
  %318 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 0
  %319 = call double @f(ptr noundef %318)
  store double %319, ptr %38, align 8, !tbaa !11
  %320 = load i32, ptr %17, align 4, !tbaa !5
  %321 = add i32 %320, 1
  store i32 %321, ptr %17, align 4, !tbaa !5
  %322 = load double, ptr %38, align 8, !tbaa !11
  %323 = load double, ptr %34, align 8, !tbaa !11
  %324 = fcmp olt double %322, %323
  br i1 %324, label %325, label %408

325:                                              ; preds = %317
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %326

326:                                              ; preds = %348, %325
  %327 = load i32, ptr %22, align 4, !tbaa !5
  %328 = load i32, ptr %8, align 4, !tbaa !5
  %329 = icmp ult i32 %327, %328
  br i1 %329, label %330, label %351

330:                                              ; preds = %326
  %331 = load i32, ptr %22, align 4, !tbaa !5
  %332 = zext i32 %331 to i64
  %333 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %332
  %334 = load double, ptr %333, align 8, !tbaa !11
  %335 = load i32, ptr %22, align 4, !tbaa !5
  %336 = zext i32 %335 to i64
  %337 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %336
  %338 = load double, ptr %337, align 8, !tbaa !11
  %339 = load i32, ptr %22, align 4, !tbaa !5
  %340 = zext i32 %339 to i64
  %341 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %340
  %342 = load double, ptr %341, align 8, !tbaa !11
  %343 = fsub double %338, %342
  %344 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %343, double %334)
  %345 = load i32, ptr %22, align 4, !tbaa !5
  %346 = zext i32 %345 to i64
  %347 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %346
  store double %344, ptr %347, align 8, !tbaa !11
  br label %348

348:                                              ; preds = %330
  %349 = load i32, ptr %22, align 4, !tbaa !5
  %350 = add i32 %349, 1
  store i32 %350, ptr %22, align 4, !tbaa !5
  br label %326, !llvm.loop !25

351:                                              ; preds = %326
  %352 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 0
  %353 = call double @f(ptr noundef %352)
  store double %353, ptr %40, align 8, !tbaa !11
  %354 = load i32, ptr %17, align 4, !tbaa !5
  %355 = add i32 %354, 1
  store i32 %355, ptr %17, align 4, !tbaa !5
  %356 = load double, ptr %38, align 8, !tbaa !11
  %357 = load double, ptr %40, align 8, !tbaa !11
  %358 = fcmp olt double %356, %357
  br i1 %358, label %359, label %383

359:                                              ; preds = %351
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %360

360:                                              ; preds = %375, %359
  %361 = load i32, ptr %22, align 4, !tbaa !5
  %362 = load i32, ptr %8, align 4, !tbaa !5
  %363 = icmp ult i32 %361, %362
  br i1 %363, label %364, label %378

364:                                              ; preds = %360
  %365 = load i32, ptr %22, align 4, !tbaa !5
  %366 = zext i32 %365 to i64
  %367 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %366
  %368 = load double, ptr %367, align 8, !tbaa !11
  %369 = load i32, ptr %22, align 4, !tbaa !5
  %370 = zext i32 %369 to i64
  %371 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %370
  %372 = load i32, ptr %25, align 4, !tbaa !5
  %373 = zext i32 %372 to i64
  %374 = getelementptr inbounds [21 x double], ptr %371, i64 0, i64 %373
  store double %368, ptr %374, align 8, !tbaa !11
  br label %375

375:                                              ; preds = %364
  %376 = load i32, ptr %22, align 4, !tbaa !5
  %377 = add i32 %376, 1
  store i32 %377, ptr %22, align 4, !tbaa !5
  br label %360, !llvm.loop !26

378:                                              ; preds = %360
  %379 = load double, ptr %38, align 8, !tbaa !11
  %380 = load i32, ptr %25, align 4, !tbaa !5
  %381 = zext i32 %380 to i64
  %382 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %381
  store double %379, ptr %382, align 8, !tbaa !11
  br label %407

383:                                              ; preds = %351
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %384

384:                                              ; preds = %399, %383
  %385 = load i32, ptr %22, align 4, !tbaa !5
  %386 = load i32, ptr %8, align 4, !tbaa !5
  %387 = icmp ult i32 %385, %386
  br i1 %387, label %388, label %402

388:                                              ; preds = %384
  %389 = load i32, ptr %22, align 4, !tbaa !5
  %390 = zext i32 %389 to i64
  %391 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %390
  %392 = load double, ptr %391, align 8, !tbaa !11
  %393 = load i32, ptr %22, align 4, !tbaa !5
  %394 = zext i32 %393 to i64
  %395 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %394
  %396 = load i32, ptr %25, align 4, !tbaa !5
  %397 = zext i32 %396 to i64
  %398 = getelementptr inbounds [21 x double], ptr %395, i64 0, i64 %397
  store double %392, ptr %398, align 8, !tbaa !11
  br label %399

399:                                              ; preds = %388
  %400 = load i32, ptr %22, align 4, !tbaa !5
  %401 = add i32 %400, 1
  store i32 %401, ptr %22, align 4, !tbaa !5
  br label %384, !llvm.loop !27

402:                                              ; preds = %384
  %403 = load double, ptr %40, align 8, !tbaa !11
  %404 = load i32, ptr %25, align 4, !tbaa !5
  %405 = zext i32 %404 to i64
  %406 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %405
  store double %403, ptr %406, align 8, !tbaa !11
  br label %407

407:                                              ; preds = %402, %378
  br label %699

408:                                              ; preds = %317
  store i32 0, ptr %26, align 4, !tbaa !5
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %409

409:                                              ; preds = %424, %408
  %410 = load i32, ptr %22, align 4, !tbaa !5
  %411 = load i32, ptr %21, align 4, !tbaa !5
  %412 = icmp ult i32 %410, %411
  br i1 %412, label %413, label %427

413:                                              ; preds = %409
  %414 = load double, ptr %38, align 8, !tbaa !11
  %415 = load i32, ptr %22, align 4, !tbaa !5
  %416 = zext i32 %415 to i64
  %417 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %416
  %418 = load double, ptr %417, align 8, !tbaa !11
  %419 = fcmp olt double %414, %418
  br i1 %419, label %420, label %423

420:                                              ; preds = %413
  %421 = load i32, ptr %26, align 4, !tbaa !5
  %422 = add i32 %421, 1
  store i32 %422, ptr %26, align 4, !tbaa !5
  br label %423

423:                                              ; preds = %420, %413
  br label %424

424:                                              ; preds = %423
  %425 = load i32, ptr %22, align 4, !tbaa !5
  %426 = add i32 %425, 1
  store i32 %426, ptr %22, align 4, !tbaa !5
  br label %409, !llvm.loop !28

427:                                              ; preds = %409
  %428 = load i32, ptr %26, align 4, !tbaa !5
  %429 = icmp ult i32 1, %428
  br i1 %429, label %430, label %454

430:                                              ; preds = %427
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %431

431:                                              ; preds = %446, %430
  %432 = load i32, ptr %22, align 4, !tbaa !5
  %433 = load i32, ptr %8, align 4, !tbaa !5
  %434 = icmp ult i32 %432, %433
  br i1 %434, label %435, label %449

435:                                              ; preds = %431
  %436 = load i32, ptr %22, align 4, !tbaa !5
  %437 = zext i32 %436 to i64
  %438 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %437
  %439 = load double, ptr %438, align 8, !tbaa !11
  %440 = load i32, ptr %22, align 4, !tbaa !5
  %441 = zext i32 %440 to i64
  %442 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %441
  %443 = load i32, ptr %25, align 4, !tbaa !5
  %444 = zext i32 %443 to i64
  %445 = getelementptr inbounds [21 x double], ptr %442, i64 0, i64 %444
  store double %439, ptr %445, align 8, !tbaa !11
  br label %446

446:                                              ; preds = %435
  %447 = load i32, ptr %22, align 4, !tbaa !5
  %448 = add i32 %447, 1
  store i32 %448, ptr %22, align 4, !tbaa !5
  br label %431, !llvm.loop !29

449:                                              ; preds = %431
  %450 = load double, ptr %38, align 8, !tbaa !11
  %451 = load i32, ptr %25, align 4, !tbaa !5
  %452 = zext i32 %451 to i64
  %453 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %452
  store double %450, ptr %453, align 8, !tbaa !11
  br label %698

454:                                              ; preds = %427
  %455 = load i32, ptr %26, align 4, !tbaa !5
  %456 = icmp eq i32 %455, 0
  br i1 %456, label %457, label %610

457:                                              ; preds = %454
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %458

458:                                              ; preds = %483, %457
  %459 = load i32, ptr %22, align 4, !tbaa !5
  %460 = load i32, ptr %8, align 4, !tbaa !5
  %461 = icmp ult i32 %459, %460
  br i1 %461, label %462, label %486

462:                                              ; preds = %458
  %463 = load i32, ptr %22, align 4, !tbaa !5
  %464 = zext i32 %463 to i64
  %465 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %464
  %466 = load double, ptr %465, align 8, !tbaa !11
  %467 = load i32, ptr %22, align 4, !tbaa !5
  %468 = zext i32 %467 to i64
  %469 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %468
  %470 = load i32, ptr %25, align 4, !tbaa !5
  %471 = zext i32 %470 to i64
  %472 = getelementptr inbounds [21 x double], ptr %469, i64 0, i64 %471
  %473 = load double, ptr %472, align 8, !tbaa !11
  %474 = load i32, ptr %22, align 4, !tbaa !5
  %475 = zext i32 %474 to i64
  %476 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %475
  %477 = load double, ptr %476, align 8, !tbaa !11
  %478 = fsub double %473, %477
  %479 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %478, double %466)
  %480 = load i32, ptr %22, align 4, !tbaa !5
  %481 = zext i32 %480 to i64
  %482 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %481
  store double %479, ptr %482, align 8, !tbaa !11
  br label %483

483:                                              ; preds = %462
  %484 = load i32, ptr %22, align 4, !tbaa !5
  %485 = add i32 %484, 1
  store i32 %485, ptr %22, align 4, !tbaa !5
  br label %458, !llvm.loop !30

486:                                              ; preds = %458
  %487 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 0
  %488 = call double @f(ptr noundef %487)
  store double %488, ptr %40, align 8, !tbaa !11
  %489 = load i32, ptr %17, align 4, !tbaa !5
  %490 = add i32 %489, 1
  store i32 %490, ptr %17, align 4, !tbaa !5
  %491 = load i32, ptr %25, align 4, !tbaa !5
  %492 = zext i32 %491 to i64
  %493 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %492
  %494 = load double, ptr %493, align 8, !tbaa !11
  %495 = load double, ptr %40, align 8, !tbaa !11
  %496 = fcmp olt double %494, %495
  br i1 %496, label %497, label %585

497:                                              ; preds = %486
  store i32 0, ptr %23, align 4, !tbaa !5
  br label %498

498:                                              ; preds = %549, %497
  %499 = load i32, ptr %23, align 4, !tbaa !5
  %500 = load i32, ptr %21, align 4, !tbaa !5
  %501 = icmp ult i32 %499, %500
  br i1 %501, label %502, label %552

502:                                              ; preds = %498
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %503

503:                                              ; preds = %540, %502
  %504 = load i32, ptr %22, align 4, !tbaa !5
  %505 = load i32, ptr %8, align 4, !tbaa !5
  %506 = icmp ult i32 %504, %505
  br i1 %506, label %507, label %543

507:                                              ; preds = %503
  %508 = load i32, ptr %22, align 4, !tbaa !5
  %509 = zext i32 %508 to i64
  %510 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %509
  %511 = load i32, ptr %23, align 4, !tbaa !5
  %512 = zext i32 %511 to i64
  %513 = getelementptr inbounds [21 x double], ptr %510, i64 0, i64 %512
  %514 = load double, ptr %513, align 8, !tbaa !11
  %515 = load i32, ptr %22, align 4, !tbaa !5
  %516 = zext i32 %515 to i64
  %517 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %516
  %518 = load i32, ptr %24, align 4, !tbaa !5
  %519 = zext i32 %518 to i64
  %520 = getelementptr inbounds [21 x double], ptr %517, i64 0, i64 %519
  %521 = load double, ptr %520, align 8, !tbaa !11
  %522 = fadd double %514, %521
  %523 = fmul double %522, 5.000000e-01
  %524 = load i32, ptr %22, align 4, !tbaa !5
  %525 = zext i32 %524 to i64
  %526 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %525
  %527 = load i32, ptr %23, align 4, !tbaa !5
  %528 = zext i32 %527 to i64
  %529 = getelementptr inbounds [21 x double], ptr %526, i64 0, i64 %528
  store double %523, ptr %529, align 8, !tbaa !11
  %530 = load i32, ptr %22, align 4, !tbaa !5
  %531 = zext i32 %530 to i64
  %532 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %531
  %533 = load i32, ptr %23, align 4, !tbaa !5
  %534 = zext i32 %533 to i64
  %535 = getelementptr inbounds [21 x double], ptr %532, i64 0, i64 %534
  %536 = load double, ptr %535, align 8, !tbaa !11
  %537 = load i32, ptr %22, align 4, !tbaa !5
  %538 = zext i32 %537 to i64
  %539 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %538
  store double %536, ptr %539, align 8, !tbaa !11
  br label %540

540:                                              ; preds = %507
  %541 = load i32, ptr %22, align 4, !tbaa !5
  %542 = add i32 %541, 1
  store i32 %542, ptr %22, align 4, !tbaa !5
  br label %503, !llvm.loop !31

543:                                              ; preds = %503
  %544 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 0
  %545 = call double @f(ptr noundef %544)
  %546 = load i32, ptr %23, align 4, !tbaa !5
  %547 = zext i32 %546 to i64
  %548 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %547
  store double %545, ptr %548, align 8, !tbaa !11
  br label %549

549:                                              ; preds = %543
  %550 = load i32, ptr %23, align 4, !tbaa !5
  %551 = add i32 %550, 1
  store i32 %551, ptr %23, align 4, !tbaa !5
  br label %498, !llvm.loop !32

552:                                              ; preds = %498
  %553 = load i32, ptr %21, align 4, !tbaa !5
  %554 = load i32, ptr %17, align 4, !tbaa !5
  %555 = add i32 %554, %553
  store i32 %555, ptr %17, align 4, !tbaa !5
  %556 = load i32, ptr %13, align 4, !tbaa !5
  %557 = load i32, ptr %17, align 4, !tbaa !5
  %558 = icmp ult i32 %556, %557
  br i1 %558, label %559, label %560

559:                                              ; preds = %552
  br label %766

560:                                              ; preds = %552
  %561 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 0
  %562 = load double, ptr %561, align 16, !tbaa !11
  store double %562, ptr %34, align 8, !tbaa !11
  store i32 0, ptr %24, align 4, !tbaa !5
  store i32 1, ptr %22, align 4, !tbaa !5
  br label %563

563:                                              ; preds = %581, %560
  %564 = load i32, ptr %22, align 4, !tbaa !5
  %565 = load i32, ptr %21, align 4, !tbaa !5
  %566 = icmp ult i32 %564, %565
  br i1 %566, label %567, label %584

567:                                              ; preds = %563
  %568 = load i32, ptr %22, align 4, !tbaa !5
  %569 = zext i32 %568 to i64
  %570 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %569
  %571 = load double, ptr %570, align 8, !tbaa !11
  %572 = load double, ptr %34, align 8, !tbaa !11
  %573 = fcmp olt double %571, %572
  br i1 %573, label %574, label %580

574:                                              ; preds = %567
  %575 = load i32, ptr %22, align 4, !tbaa !5
  %576 = zext i32 %575 to i64
  %577 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %576
  %578 = load double, ptr %577, align 8, !tbaa !11
  store double %578, ptr %34, align 8, !tbaa !11
  %579 = load i32, ptr %22, align 4, !tbaa !5
  store i32 %579, ptr %24, align 4, !tbaa !5
  br label %580

580:                                              ; preds = %574, %567
  br label %581

581:                                              ; preds = %580
  %582 = load i32, ptr %22, align 4, !tbaa !5
  %583 = add i32 %582, 1
  store i32 %583, ptr %22, align 4, !tbaa !5
  br label %563, !llvm.loop !33

584:                                              ; preds = %563
  br label %222

585:                                              ; preds = %486
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %586

586:                                              ; preds = %601, %585
  %587 = load i32, ptr %22, align 4, !tbaa !5
  %588 = load i32, ptr %8, align 4, !tbaa !5
  %589 = icmp ult i32 %587, %588
  br i1 %589, label %590, label %604

590:                                              ; preds = %586
  %591 = load i32, ptr %22, align 4, !tbaa !5
  %592 = zext i32 %591 to i64
  %593 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %592
  %594 = load double, ptr %593, align 8, !tbaa !11
  %595 = load i32, ptr %22, align 4, !tbaa !5
  %596 = zext i32 %595 to i64
  %597 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %596
  %598 = load i32, ptr %25, align 4, !tbaa !5
  %599 = zext i32 %598 to i64
  %600 = getelementptr inbounds [21 x double], ptr %597, i64 0, i64 %599
  store double %594, ptr %600, align 8, !tbaa !11
  br label %601

601:                                              ; preds = %590
  %602 = load i32, ptr %22, align 4, !tbaa !5
  %603 = add i32 %602, 1
  store i32 %603, ptr %22, align 4, !tbaa !5
  br label %586, !llvm.loop !34

604:                                              ; preds = %586
  %605 = load double, ptr %40, align 8, !tbaa !11
  %606 = load i32, ptr %25, align 4, !tbaa !5
  %607 = zext i32 %606 to i64
  %608 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %607
  store double %605, ptr %608, align 8, !tbaa !11
  br label %609

609:                                              ; preds = %604
  br label %697

610:                                              ; preds = %454
  %611 = load i32, ptr %26, align 4, !tbaa !5
  %612 = icmp eq i32 %611, 1
  br i1 %612, label %613, label %696

613:                                              ; preds = %610
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %614

614:                                              ; preds = %636, %613
  %615 = load i32, ptr %22, align 4, !tbaa !5
  %616 = load i32, ptr %8, align 4, !tbaa !5
  %617 = icmp ult i32 %615, %616
  br i1 %617, label %618, label %639

618:                                              ; preds = %614
  %619 = load i32, ptr %22, align 4, !tbaa !5
  %620 = zext i32 %619 to i64
  %621 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %620
  %622 = load double, ptr %621, align 8, !tbaa !11
  %623 = load i32, ptr %22, align 4, !tbaa !5
  %624 = zext i32 %623 to i64
  %625 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %624
  %626 = load double, ptr %625, align 8, !tbaa !11
  %627 = load i32, ptr %22, align 4, !tbaa !5
  %628 = zext i32 %627 to i64
  %629 = getelementptr inbounds [20 x double], ptr %36, i64 0, i64 %628
  %630 = load double, ptr %629, align 8, !tbaa !11
  %631 = fsub double %626, %630
  %632 = call double @llvm.fmuladd.f64(double 5.000000e-01, double %631, double %622)
  %633 = load i32, ptr %22, align 4, !tbaa !5
  %634 = zext i32 %633 to i64
  %635 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %634
  store double %632, ptr %635, align 8, !tbaa !11
  br label %636

636:                                              ; preds = %618
  %637 = load i32, ptr %22, align 4, !tbaa !5
  %638 = add i32 %637, 1
  store i32 %638, ptr %22, align 4, !tbaa !5
  br label %614, !llvm.loop !35

639:                                              ; preds = %614
  %640 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 0
  %641 = call double @f(ptr noundef %640)
  store double %641, ptr %40, align 8, !tbaa !11
  %642 = load i32, ptr %17, align 4, !tbaa !5
  %643 = add i32 %642, 1
  store i32 %643, ptr %17, align 4, !tbaa !5
  %644 = load double, ptr %40, align 8, !tbaa !11
  %645 = load double, ptr %38, align 8, !tbaa !11
  %646 = fcmp ole double %644, %645
  br i1 %646, label %647, label %671

647:                                              ; preds = %639
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %648

648:                                              ; preds = %663, %647
  %649 = load i32, ptr %22, align 4, !tbaa !5
  %650 = load i32, ptr %8, align 4, !tbaa !5
  %651 = icmp ult i32 %649, %650
  br i1 %651, label %652, label %666

652:                                              ; preds = %648
  %653 = load i32, ptr %22, align 4, !tbaa !5
  %654 = zext i32 %653 to i64
  %655 = getelementptr inbounds [20 x double], ptr %39, i64 0, i64 %654
  %656 = load double, ptr %655, align 8, !tbaa !11
  %657 = load i32, ptr %22, align 4, !tbaa !5
  %658 = zext i32 %657 to i64
  %659 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %658
  %660 = load i32, ptr %25, align 4, !tbaa !5
  %661 = zext i32 %660 to i64
  %662 = getelementptr inbounds [21 x double], ptr %659, i64 0, i64 %661
  store double %656, ptr %662, align 8, !tbaa !11
  br label %663

663:                                              ; preds = %652
  %664 = load i32, ptr %22, align 4, !tbaa !5
  %665 = add i32 %664, 1
  store i32 %665, ptr %22, align 4, !tbaa !5
  br label %648, !llvm.loop !36

666:                                              ; preds = %648
  %667 = load double, ptr %40, align 8, !tbaa !11
  %668 = load i32, ptr %25, align 4, !tbaa !5
  %669 = zext i32 %668 to i64
  %670 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %669
  store double %667, ptr %670, align 8, !tbaa !11
  br label %695

671:                                              ; preds = %639
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %672

672:                                              ; preds = %687, %671
  %673 = load i32, ptr %22, align 4, !tbaa !5
  %674 = load i32, ptr %8, align 4, !tbaa !5
  %675 = icmp ult i32 %673, %674
  br i1 %675, label %676, label %690

676:                                              ; preds = %672
  %677 = load i32, ptr %22, align 4, !tbaa !5
  %678 = zext i32 %677 to i64
  %679 = getelementptr inbounds [20 x double], ptr %37, i64 0, i64 %678
  %680 = load double, ptr %679, align 8, !tbaa !11
  %681 = load i32, ptr %22, align 4, !tbaa !5
  %682 = zext i32 %681 to i64
  %683 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %682
  %684 = load i32, ptr %25, align 4, !tbaa !5
  %685 = zext i32 %684 to i64
  %686 = getelementptr inbounds [21 x double], ptr %683, i64 0, i64 %685
  store double %680, ptr %686, align 8, !tbaa !11
  br label %687

687:                                              ; preds = %676
  %688 = load i32, ptr %22, align 4, !tbaa !5
  %689 = add i32 %688, 1
  store i32 %689, ptr %22, align 4, !tbaa !5
  br label %672, !llvm.loop !37

690:                                              ; preds = %672
  %691 = load double, ptr %38, align 8, !tbaa !11
  %692 = load i32, ptr %25, align 4, !tbaa !5
  %693 = zext i32 %692 to i64
  %694 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %693
  store double %691, ptr %694, align 8, !tbaa !11
  br label %695

695:                                              ; preds = %690, %666
  br label %696

696:                                              ; preds = %695, %610
  br label %697

697:                                              ; preds = %696, %609
  br label %698

698:                                              ; preds = %697, %449
  br label %699

699:                                              ; preds = %698, %407
  %700 = load i32, ptr %25, align 4, !tbaa !5
  %701 = zext i32 %700 to i64
  %702 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %701
  %703 = load double, ptr %702, align 8, !tbaa !11
  %704 = load double, ptr %34, align 8, !tbaa !11
  %705 = fcmp olt double %703, %704
  br i1 %705, label %706, label %712

706:                                              ; preds = %699
  %707 = load i32, ptr %25, align 4, !tbaa !5
  %708 = zext i32 %707 to i64
  %709 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %708
  %710 = load double, ptr %709, align 8, !tbaa !11
  store double %710, ptr %34, align 8, !tbaa !11
  %711 = load i32, ptr %25, align 4, !tbaa !5
  store i32 %711, ptr %24, align 4, !tbaa !5
  br label %712

712:                                              ; preds = %706, %699
  %713 = load i32, ptr %20, align 4, !tbaa !5
  %714 = add i32 %713, -1
  store i32 %714, ptr %20, align 4, !tbaa !5
  %715 = load i32, ptr %20, align 4, !tbaa !5
  %716 = icmp ne i32 %715, 0
  br i1 %716, label %717, label %718

717:                                              ; preds = %712
  br label %222

718:                                              ; preds = %712
  %719 = load i32, ptr %17, align 4, !tbaa !5
  %720 = load i32, ptr %13, align 4, !tbaa !5
  %721 = icmp ule i32 %719, %720
  br i1 %721, label %722, label %765

722:                                              ; preds = %718
  %723 = load i32, ptr %12, align 4, !tbaa !5
  store i32 %723, ptr %20, align 4, !tbaa !5
  store double 0.000000e+00, ptr %35, align 8, !tbaa !11
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %724

724:                                              ; preds = %735, %722
  %725 = load i32, ptr %22, align 4, !tbaa !5
  %726 = load i32, ptr %21, align 4, !tbaa !5
  %727 = icmp ult i32 %725, %726
  br i1 %727, label %728, label %738

728:                                              ; preds = %724
  %729 = load i32, ptr %22, align 4, !tbaa !5
  %730 = zext i32 %729 to i64
  %731 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %730
  %732 = load double, ptr %731, align 8, !tbaa !11
  %733 = load double, ptr %35, align 8, !tbaa !11
  %734 = fadd double %733, %732
  store double %734, ptr %35, align 8, !tbaa !11
  br label %735

735:                                              ; preds = %728
  %736 = load i32, ptr %22, align 4, !tbaa !5
  %737 = add i32 %736, 1
  store i32 %737, ptr %22, align 4, !tbaa !5
  br label %724, !llvm.loop !38

738:                                              ; preds = %724
  %739 = load double, ptr %35, align 8, !tbaa !11
  %740 = load double, ptr %28, align 8, !tbaa !11
  %741 = fdiv double %739, %740
  store double %741, ptr %33, align 8, !tbaa !11
  store double 0.000000e+00, ptr %35, align 8, !tbaa !11
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %742

742:                                              ; preds = %756, %738
  %743 = load i32, ptr %22, align 4, !tbaa !5
  %744 = load i32, ptr %21, align 4, !tbaa !5
  %745 = icmp ult i32 %743, %744
  br i1 %745, label %746, label %759

746:                                              ; preds = %742
  %747 = load i32, ptr %22, align 4, !tbaa !5
  %748 = zext i32 %747 to i64
  %749 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %748
  %750 = load double, ptr %749, align 8, !tbaa !11
  %751 = load double, ptr %33, align 8, !tbaa !11
  %752 = fsub double %750, %751
  %753 = call double @pow(double noundef %752, double noundef 2.000000e+00) #6
  %754 = load double, ptr %35, align 8, !tbaa !11
  %755 = fadd double %754, %753
  store double %755, ptr %35, align 8, !tbaa !11
  br label %756

756:                                              ; preds = %746
  %757 = load i32, ptr %22, align 4, !tbaa !5
  %758 = add i32 %757, 1
  store i32 %758, ptr %22, align 4, !tbaa !5
  br label %742, !llvm.loop !39

759:                                              ; preds = %742
  %760 = load double, ptr %30, align 8, !tbaa !11
  %761 = load double, ptr %35, align 8, !tbaa !11
  %762 = fcmp olt double %760, %761
  br i1 %762, label %763, label %764

763:                                              ; preds = %759
  br label %222

764:                                              ; preds = %759
  br label %765

765:                                              ; preds = %764, %718
  br label %766

766:                                              ; preds = %765, %559
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %767

767:                                              ; preds = %782, %766
  %768 = load i32, ptr %22, align 4, !tbaa !5
  %769 = load i32, ptr %8, align 4, !tbaa !5
  %770 = icmp ult i32 %768, %769
  br i1 %770, label %771, label %785

771:                                              ; preds = %767
  %772 = load i32, ptr %22, align 4, !tbaa !5
  %773 = zext i32 %772 to i64
  %774 = getelementptr inbounds [20 x [21 x double]], ptr %31, i64 0, i64 %773
  %775 = load i32, ptr %24, align 4, !tbaa !5
  %776 = zext i32 %775 to i64
  %777 = getelementptr inbounds [21 x double], ptr %774, i64 0, i64 %776
  %778 = load double, ptr %777, align 8, !tbaa !11
  %779 = load i32, ptr %22, align 4, !tbaa !5
  %780 = zext i32 %779 to i64
  %781 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %780
  store double %778, ptr %781, align 8, !tbaa !11
  br label %782

782:                                              ; preds = %771
  %783 = load i32, ptr %22, align 4, !tbaa !5
  %784 = add i32 %783, 1
  store i32 %784, ptr %22, align 4, !tbaa !5
  br label %767, !llvm.loop !40

785:                                              ; preds = %767
  %786 = load i32, ptr %24, align 4, !tbaa !5
  %787 = zext i32 %786 to i64
  %788 = getelementptr inbounds [21 x double], ptr %32, i64 0, i64 %787
  %789 = load double, ptr %788, align 8, !tbaa !11
  store double %789, ptr %16, align 8, !tbaa !11
  %790 = load i32, ptr %13, align 4, !tbaa !5
  %791 = load i32, ptr %17, align 4, !tbaa !5
  %792 = icmp ult i32 %790, %791
  br i1 %792, label %793, label %828

793:                                              ; preds = %785
  store i32 2, ptr %19, align 4, !tbaa !5
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %794

794:                                              ; preds = %808, %793
  %795 = load i32, ptr %22, align 4, !tbaa !5
  %796 = load i32, ptr %8, align 4, !tbaa !5
  %797 = icmp ult i32 %795, %796
  br i1 %797, label %798, label %811

798:                                              ; preds = %794
  %799 = load i32, ptr %22, align 4, !tbaa !5
  %800 = zext i32 %799 to i64
  %801 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %800
  %802 = load double, ptr %801, align 8, !tbaa !11
  %803 = load ptr, ptr %14, align 8, !tbaa !9
  %804 = getelementptr inbounds %struct.optimum, ptr %803, i32 0, i32 0
  %805 = load i32, ptr %22, align 4, !tbaa !5
  %806 = zext i32 %805 to i64
  %807 = getelementptr inbounds [20 x double], ptr %804, i64 0, i64 %806
  store double %802, ptr %807, align 8, !tbaa !11
  br label %808

808:                                              ; preds = %798
  %809 = load i32, ptr %22, align 4, !tbaa !5
  %810 = add i32 %809, 1
  store i32 %810, ptr %22, align 4, !tbaa !5
  br label %794, !llvm.loop !41

811:                                              ; preds = %794
  %812 = load double, ptr %16, align 8, !tbaa !11
  %813 = load ptr, ptr %14, align 8, !tbaa !9
  %814 = getelementptr inbounds %struct.optimum, ptr %813, i32 0, i32 1
  store double %812, ptr %814, align 8, !tbaa !15
  %815 = load i32, ptr %17, align 4, !tbaa !5
  %816 = load ptr, ptr %14, align 8, !tbaa !9
  %817 = getelementptr inbounds %struct.optimum, ptr %816, i32 0, i32 2
  %818 = getelementptr inbounds [3 x i32], ptr %817, i64 0, i64 0
  store i32 %815, ptr %818, align 8, !tbaa !5
  %819 = load i32, ptr %18, align 4, !tbaa !5
  %820 = load ptr, ptr %14, align 8, !tbaa !9
  %821 = getelementptr inbounds %struct.optimum, ptr %820, i32 0, i32 2
  %822 = getelementptr inbounds [3 x i32], ptr %821, i64 0, i64 1
  store i32 %819, ptr %822, align 4, !tbaa !5
  %823 = load i32, ptr %19, align 4, !tbaa !5
  %824 = load ptr, ptr %14, align 8, !tbaa !9
  %825 = getelementptr inbounds %struct.optimum, ptr %824, i32 0, i32 2
  %826 = getelementptr inbounds [3 x i32], ptr %825, i64 0, i64 2
  store i32 %823, ptr %826, align 8, !tbaa !5
  %827 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %827, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

828:                                              ; preds = %785
  store i32 0, ptr %19, align 4, !tbaa !5
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %829

829:                                              ; preds = %877, %828
  %830 = load i32, ptr %22, align 4, !tbaa !5
  %831 = load i32, ptr %8, align 4, !tbaa !5
  %832 = icmp ult i32 %830, %831
  br i1 %832, label %833, label %880

833:                                              ; preds = %829
  %834 = load ptr, ptr %11, align 8, !tbaa !9
  %835 = load i32, ptr %22, align 4, !tbaa !5
  %836 = zext i32 %835 to i64
  %837 = getelementptr inbounds double, ptr %834, i64 %836
  %838 = load double, ptr %837, align 8, !tbaa !11
  %839 = fmul double %838, 1.000000e-03
  store double %839, ptr %29, align 8, !tbaa !11
  %840 = load double, ptr %29, align 8, !tbaa !11
  %841 = load i32, ptr %22, align 4, !tbaa !5
  %842 = zext i32 %841 to i64
  %843 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %842
  %844 = load double, ptr %843, align 8, !tbaa !11
  %845 = fadd double %844, %840
  store double %845, ptr %843, align 8, !tbaa !11
  %846 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 0
  %847 = call double @f(ptr noundef %846)
  store double %847, ptr %35, align 8, !tbaa !11
  %848 = load i32, ptr %17, align 4, !tbaa !5
  %849 = add i32 %848, 1
  store i32 %849, ptr %17, align 4, !tbaa !5
  %850 = load double, ptr %35, align 8, !tbaa !11
  %851 = load double, ptr %16, align 8, !tbaa !11
  %852 = fcmp olt double %850, %851
  br i1 %852, label %853, label %854

853:                                              ; preds = %833
  store i32 2, ptr %19, align 4, !tbaa !5
  br label %881

854:                                              ; preds = %833
  %855 = load double, ptr %29, align 8, !tbaa !11
  %856 = load i32, ptr %22, align 4, !tbaa !5
  %857 = zext i32 %856 to i64
  %858 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %857
  %859 = load double, ptr %858, align 8, !tbaa !11
  %860 = fneg double %855
  %861 = call double @llvm.fmuladd.f64(double %860, double 2.000000e+00, double %859)
  store double %861, ptr %858, align 8, !tbaa !11
  %862 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 0
  %863 = call double @f(ptr noundef %862)
  store double %863, ptr %35, align 8, !tbaa !11
  %864 = load i32, ptr %17, align 4, !tbaa !5
  %865 = add i32 %864, 1
  store i32 %865, ptr %17, align 4, !tbaa !5
  %866 = load double, ptr %35, align 8, !tbaa !11
  %867 = load double, ptr %16, align 8, !tbaa !11
  %868 = fcmp olt double %866, %867
  br i1 %868, label %869, label %870

869:                                              ; preds = %854
  store i32 2, ptr %19, align 4, !tbaa !5
  br label %881

870:                                              ; preds = %854
  %871 = load double, ptr %29, align 8, !tbaa !11
  %872 = load i32, ptr %22, align 4, !tbaa !5
  %873 = zext i32 %872 to i64
  %874 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %873
  %875 = load double, ptr %874, align 8, !tbaa !11
  %876 = fadd double %875, %871
  store double %876, ptr %874, align 8, !tbaa !11
  br label %877

877:                                              ; preds = %870
  %878 = load i32, ptr %22, align 4, !tbaa !5
  %879 = add i32 %878, 1
  store i32 %879, ptr %22, align 4, !tbaa !5
  br label %829, !llvm.loop !42

880:                                              ; preds = %829
  br label %881

881:                                              ; preds = %880, %869, %853
  %882 = load i32, ptr %19, align 4, !tbaa !5
  %883 = icmp eq i32 %882, 0
  br i1 %883, label %884, label %919

884:                                              ; preds = %881
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %885

885:                                              ; preds = %899, %884
  %886 = load i32, ptr %22, align 4, !tbaa !5
  %887 = load i32, ptr %8, align 4, !tbaa !5
  %888 = icmp ult i32 %886, %887
  br i1 %888, label %889, label %902

889:                                              ; preds = %885
  %890 = load i32, ptr %22, align 4, !tbaa !5
  %891 = zext i32 %890 to i64
  %892 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %891
  %893 = load double, ptr %892, align 8, !tbaa !11
  %894 = load ptr, ptr %14, align 8, !tbaa !9
  %895 = getelementptr inbounds %struct.optimum, ptr %894, i32 0, i32 0
  %896 = load i32, ptr %22, align 4, !tbaa !5
  %897 = zext i32 %896 to i64
  %898 = getelementptr inbounds [20 x double], ptr %895, i64 0, i64 %897
  store double %893, ptr %898, align 8, !tbaa !11
  br label %899

899:                                              ; preds = %889
  %900 = load i32, ptr %22, align 4, !tbaa !5
  %901 = add i32 %900, 1
  store i32 %901, ptr %22, align 4, !tbaa !5
  br label %885, !llvm.loop !43

902:                                              ; preds = %885
  %903 = load double, ptr %16, align 8, !tbaa !11
  %904 = load ptr, ptr %14, align 8, !tbaa !9
  %905 = getelementptr inbounds %struct.optimum, ptr %904, i32 0, i32 1
  store double %903, ptr %905, align 8, !tbaa !15
  %906 = load i32, ptr %17, align 4, !tbaa !5
  %907 = load ptr, ptr %14, align 8, !tbaa !9
  %908 = getelementptr inbounds %struct.optimum, ptr %907, i32 0, i32 2
  %909 = getelementptr inbounds [3 x i32], ptr %908, i64 0, i64 0
  store i32 %906, ptr %909, align 8, !tbaa !5
  %910 = load i32, ptr %18, align 4, !tbaa !5
  %911 = load ptr, ptr %14, align 8, !tbaa !9
  %912 = getelementptr inbounds %struct.optimum, ptr %911, i32 0, i32 2
  %913 = getelementptr inbounds [3 x i32], ptr %912, i64 0, i64 1
  store i32 %910, ptr %913, align 4, !tbaa !5
  %914 = load i32, ptr %19, align 4, !tbaa !5
  %915 = load ptr, ptr %14, align 8, !tbaa !9
  %916 = getelementptr inbounds %struct.optimum, ptr %915, i32 0, i32 2
  %917 = getelementptr inbounds [3 x i32], ptr %916, i64 0, i64 2
  store i32 %914, ptr %917, align 8, !tbaa !5
  %918 = load ptr, ptr %14, align 8, !tbaa !9
  store ptr %918, ptr %7, align 8
  store i32 1, ptr %41, align 4
  br label %939

919:                                              ; preds = %881
  store i32 0, ptr %22, align 4, !tbaa !5
  br label %920

920:                                              ; preds = %933, %919
  %921 = load i32, ptr %22, align 4, !tbaa !5
  %922 = load i32, ptr %8, align 4, !tbaa !5
  %923 = icmp ult i32 %921, %922
  br i1 %923, label %924, label %936

924:                                              ; preds = %920
  %925 = load i32, ptr %22, align 4, !tbaa !5
  %926 = zext i32 %925 to i64
  %927 = getelementptr inbounds [20 x double], ptr %15, i64 0, i64 %926
  %928 = load double, ptr %927, align 8, !tbaa !11
  %929 = load ptr, ptr %9, align 8, !tbaa !9
  %930 = load i32, ptr %22, align 4, !tbaa !5
  %931 = zext i32 %930 to i64
  %932 = getelementptr inbounds double, ptr %929, i64 %931
  store double %928, ptr %932, align 8, !tbaa !11
  br label %933

933:                                              ; preds = %924
  %934 = load i32, ptr %22, align 4, !tbaa !5
  %935 = add i32 %934, 1
  store i32 %935, ptr %22, align 4, !tbaa !5
  br label %920, !llvm.loop !44

936:                                              ; preds = %920
  store double 1.000000e-03, ptr %29, align 8, !tbaa !11
  %937 = load i32, ptr %18, align 4, !tbaa !5
  %938 = add i32 %937, 1
  store i32 %938, ptr %18, align 4, !tbaa !5
  br label %113

939:                                              ; preds = %902, %811, %96, %87, %78, %69
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #6
  call void @llvm.lifetime.end.p0(i64 160, ptr %39) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #6
  call void @llvm.lifetime.end.p0(i64 160, ptr %37) #6
  call void @llvm.lifetime.end.p0(i64 160, ptr %36) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #6
  call void @llvm.lifetime.end.p0(i64 168, ptr %32) #6
  call void @llvm.lifetime.end.p0(i64 3360, ptr %31) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #6
  call void @llvm.lifetime.end.p0(i64 160, ptr %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  %940 = load ptr, ptr %7, align 8
  ret ptr %940
}

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

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #2

declare double @f(ptr noundef) #3

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

; Function Attrs: nounwind
declare double @pow(double noundef, double noundef) #5

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

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

!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, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!16, !12, i64 160}
!16 = !{!"optimum", !7, i64 0, !12, i64 160, !7, i64 168}
!17 = distinct !{!17, !14}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}
!21 = distinct !{!21, !14}
!22 = distinct !{!22, !14}
!23 = distinct !{!23, !14}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}
!29 = distinct !{!29, !14}
!30 = distinct !{!30, !14}
!31 = distinct !{!31, !14}
!32 = distinct !{!32, !14}
!33 = distinct !{!33, !14}
!34 = distinct !{!34, !14}
!35 = distinct !{!35, !14}
!36 = distinct !{!36, !14}
!37 = distinct !{!37, !14}
!38 = distinct !{!38, !14}
!39 = distinct !{!39, !14}
!40 = distinct !{!40, !14}
!41 = distinct !{!41, !14}
!42 = distinct !{!42, !14}
!43 = distinct !{!43, !14}
!44 = distinct !{!44, !14}


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

; Function Attrs: nounwind uwtable
define dso_local noalias noundef ptr @nelmin(i32 noundef %0, ptr noundef %1, double noundef %2, ptr nocapture noundef readonly %3, i32 noundef %4, i32 noundef %5) local_unnamed_addr #0 {
  %7 = alloca [20 x double], align 16
  %8 = alloca [20 x [21 x double]], align 16
  %9 = alloca [21 x double], align 16
  %10 = alloca [20 x double], align 16
  %11 = alloca [20 x double], align 16
  %12 = alloca [20 x double], align 16
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %7) #8
  call void @llvm.lifetime.start.p0(i64 3360, ptr nonnull %8) #8
  call void @llvm.lifetime.start.p0(i64 168, ptr nonnull %9) #8
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %10) #8
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %11) #8
  call void @llvm.lifetime.start.p0(i64 160, ptr nonnull %12) #8
  %13 = tail call noalias dereferenceable_or_null(184) ptr @malloc(i64 noundef 184) #9
  %.not496 = icmp eq i32 %0, 0
  br i1 %.not496, label %._crit_edge, label %._crit_edge.thread

._crit_edge:                                      ; preds = %6
  %14 = getelementptr inbounds i8, ptr %13, i64 160
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %14, i8 0, i64 16, i1 false)
  br label %787

._crit_edge.thread:                               ; preds = %6
  %15 = zext i32 %0 to i64
  %16 = shl nuw nsw i64 %15, 3
  tail call void @llvm.memset.p0.i64(ptr align 8 %13, i8 0, i64 %16, i1 false), !tbaa !5
  %17 = getelementptr inbounds i8, ptr %13, i64 160
  %18 = getelementptr inbounds i8, ptr %13, i64 168
  %19 = getelementptr inbounds i8, ptr %13, i64 172
  %20 = fcmp ole double %2, 0.000000e+00
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %17, i8 0, i64 16, i1 false)
  %21 = icmp ugt i32 %0, 20
  %or.cond = or i1 %20, %21
  %22 = icmp eq i32 %4, 0
  %or.cond721 = or i1 %or.cond, %22
  br i1 %or.cond721, label %787, label %23

23:                                               ; preds = %._crit_edge.thread
  %24 = uitofp nneg i32 %0 to double
  %25 = add nuw nsw i32 %0, 1
  %26 = uitofp nneg i32 %25 to double
  %27 = fmul double %24, %2
  %28 = zext nneg i32 %25 to i64
  %29 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %28
  %30 = zext nneg i32 %0 to i64
  %31 = shl nuw nsw i32 %0, 1
  %32 = shl nuw nsw i64 %30, 3
  %33 = zext nneg i32 %0 to i64
  %34 = add nsw i64 %28, -2
  %xtraiter = and i64 %30, 3
  %35 = icmp ult i32 %0, 4
  %unroll_iter = and i64 %30, 28
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %xtraiter889 = and i64 %30, 3
  %36 = icmp ult i32 %0, 4
  %unroll_iter893 = and i64 %30, 28
  %lcmp.mod891.not = icmp eq i64 %xtraiter889, 0
  %xtraiter895 = and i64 %33, 1
  %37 = icmp eq i64 %34, 0
  %unroll_iter900 = and i64 %33, 30
  %lcmp.mod897.not = icmp eq i64 %xtraiter895, 0
  %xtraiter902 = and i64 %33, 1
  %38 = icmp eq i64 %34, 0
  %unroll_iter906 = and i64 %33, 30
  %lcmp.mod904.not = icmp eq i64 %xtraiter902, 0
  %xtraiter910 = and i64 %28, 3
  %39 = icmp ult i32 %0, 3
  %unroll_iter915 = and i64 %28, 60
  %lcmp.mod912.not = icmp eq i64 %xtraiter910, 0
  %min.iters.check821 = icmp ult i32 %0, 4
  %n.vec824 = and i64 %30, 28
  %40 = getelementptr inbounds i8, ptr %10, i64 16
  %41 = getelementptr inbounds i8, ptr %11, i64 16
  %42 = icmp eq i64 %n.vec824, 4
  %43 = getelementptr inbounds i8, ptr %10, i64 32
  %44 = getelementptr inbounds i8, ptr %10, i64 48
  %45 = getelementptr inbounds i8, ptr %11, i64 32
  %46 = getelementptr inbounds i8, ptr %11, i64 48
  %47 = icmp eq i64 %n.vec824, 8
  %48 = getelementptr inbounds i8, ptr %10, i64 64
  %49 = getelementptr inbounds i8, ptr %10, i64 80
  %50 = getelementptr inbounds i8, ptr %11, i64 64
  %51 = getelementptr inbounds i8, ptr %11, i64 80
  %52 = icmp eq i64 %n.vec824, 12
  %53 = getelementptr inbounds i8, ptr %10, i64 96
  %54 = getelementptr inbounds i8, ptr %10, i64 112
  %55 = getelementptr inbounds i8, ptr %11, i64 96
  %56 = getelementptr inbounds i8, ptr %11, i64 112
  %57 = icmp eq i64 %n.vec824, 16
  %58 = getelementptr inbounds i8, ptr %10, i64 128
  %59 = getelementptr inbounds i8, ptr %10, i64 144
  %60 = getelementptr inbounds i8, ptr %11, i64 128
  %61 = getelementptr inbounds i8, ptr %11, i64 144
  %cmp.n831 = icmp eq i64 %n.vec824, %30
  %min.iters.check807 = icmp ult i32 %0, 3
  %n.vec810 = and i64 %28, 60
  %62 = getelementptr inbounds i8, ptr %9, i64 16
  %63 = icmp eq i64 %n.vec810, 4
  %64 = getelementptr inbounds i8, ptr %9, i64 32
  %65 = getelementptr inbounds i8, ptr %9, i64 48
  %66 = icmp eq i64 %n.vec810, 8
  %67 = getelementptr inbounds i8, ptr %9, i64 64
  %68 = getelementptr inbounds i8, ptr %9, i64 80
  %69 = icmp eq i64 %n.vec810, 12
  %70 = getelementptr inbounds i8, ptr %9, i64 96
  %71 = getelementptr inbounds i8, ptr %9, i64 112
  %72 = icmp eq i64 %n.vec810, 16
  %73 = getelementptr inbounds i8, ptr %9, i64 128
  %74 = getelementptr inbounds i8, ptr %9, i64 144
  %cmp.n818 = icmp eq i64 %n.vec810, %28
  %min.iters.check794 = icmp ult i32 %0, 4
  %n.vec797 = and i64 %30, 28
  %75 = getelementptr inbounds i8, ptr %10, i64 16
  %76 = getelementptr inbounds i8, ptr %12, i64 16
  %77 = icmp eq i64 %n.vec797, 4
  %78 = getelementptr inbounds i8, ptr %10, i64 32
  %79 = getelementptr inbounds i8, ptr %10, i64 48
  %80 = getelementptr inbounds i8, ptr %12, i64 32
  %81 = getelementptr inbounds i8, ptr %12, i64 48
  %82 = icmp eq i64 %n.vec797, 8
  %83 = getelementptr inbounds i8, ptr %10, i64 64
  %84 = getelementptr inbounds i8, ptr %10, i64 80
  %85 = getelementptr inbounds i8, ptr %12, i64 64
  %86 = getelementptr inbounds i8, ptr %12, i64 80
  %87 = icmp eq i64 %n.vec797, 12
  %88 = getelementptr inbounds i8, ptr %10, i64 96
  %89 = getelementptr inbounds i8, ptr %10, i64 112
  %90 = getelementptr inbounds i8, ptr %12, i64 96
  %91 = getelementptr inbounds i8, ptr %12, i64 112
  %92 = icmp eq i64 %n.vec797, 16
  %93 = getelementptr inbounds i8, ptr %10, i64 128
  %94 = getelementptr inbounds i8, ptr %10, i64 144
  %95 = getelementptr inbounds i8, ptr %12, i64 128
  %96 = getelementptr inbounds i8, ptr %12, i64 144
  %cmp.n804 = icmp eq i64 %n.vec797, %30
  %xtraiter919 = and i64 %30, 1
  %97 = icmp eq i32 %0, 1
  %unroll_iter923 = and i64 %30, 30
  %lcmp.mod921.not = icmp eq i64 %xtraiter919, 0
  %xtraiter925 = and i64 %33, 1
  %98 = icmp eq i64 %34, 0
  %unroll_iter930 = and i64 %33, 30
  %lcmp.mod927.not = icmp eq i64 %xtraiter925, 0
  %n.vec782 = and i64 %30, 28
  %cmp.n791 = icmp eq i64 %n.vec782, %30
  %xtraiter933 = and i64 %30, 3
  %99 = icmp ult i32 %0, 4
  %unroll_iter937 = and i64 %30, 28
  %lcmp.mod935.not = icmp eq i64 %xtraiter933, 0
  %xtraiter940 = and i64 %30, 3
  %100 = icmp ult i32 %0, 4
  %unroll_iter944 = and i64 %30, 28
  %lcmp.mod942.not = icmp eq i64 %xtraiter940, 0
  %xtraiter948 = and i64 %30, 3
  %101 = icmp ult i32 %0, 4
  %unroll_iter952 = and i64 %30, 28
  %lcmp.mod950.not = icmp eq i64 %xtraiter948, 0
  %xtraiter955 = and i64 %30, 3
  %102 = icmp ult i32 %0, 4
  %unroll_iter959 = and i64 %30, 28
  %lcmp.mod957.not = icmp eq i64 %xtraiter955, 0
  %min.iters.check765 = icmp ult i32 %0, 4
  %n.vec768 = and i64 %30, 28
  %103 = getelementptr inbounds i8, ptr %10, i64 16
  %104 = getelementptr inbounds i8, ptr %11, i64 16
  %105 = getelementptr inbounds i8, ptr %12, i64 16
  %106 = icmp eq i64 %n.vec768, 4
  %107 = getelementptr inbounds i8, ptr %10, i64 32
  %108 = getelementptr inbounds i8, ptr %10, i64 48
  %109 = getelementptr inbounds i8, ptr %11, i64 32
  %110 = getelementptr inbounds i8, ptr %11, i64 48
  %111 = getelementptr inbounds i8, ptr %12, i64 32
  %112 = getelementptr inbounds i8, ptr %12, i64 48
  %113 = icmp eq i64 %n.vec768, 8
  %114 = getelementptr inbounds i8, ptr %10, i64 64
  %115 = getelementptr inbounds i8, ptr %10, i64 80
  %116 = getelementptr inbounds i8, ptr %11, i64 64
  %117 = getelementptr inbounds i8, ptr %11, i64 80
  %118 = getelementptr inbounds i8, ptr %12, i64 64
  %119 = getelementptr inbounds i8, ptr %12, i64 80
  %120 = icmp eq i64 %n.vec768, 12
  %121 = getelementptr inbounds i8, ptr %10, i64 96
  %122 = getelementptr inbounds i8, ptr %10, i64 112
  %123 = getelementptr inbounds i8, ptr %11, i64 96
  %124 = getelementptr inbounds i8, ptr %11, i64 112
  %125 = getelementptr inbounds i8, ptr %12, i64 96
  %126 = getelementptr inbounds i8, ptr %12, i64 112
  %127 = icmp eq i64 %n.vec768, 16
  %128 = getelementptr inbounds i8, ptr %10, i64 128
  %129 = getelementptr inbounds i8, ptr %10, i64 144
  %130 = getelementptr inbounds i8, ptr %11, i64 128
  %131 = getelementptr inbounds i8, ptr %11, i64 144
  %132 = getelementptr inbounds i8, ptr %12, i64 128
  %133 = getelementptr inbounds i8, ptr %12, i64 144
  %cmp.n776 = icmp eq i64 %n.vec768, %30
  %xtraiter962 = and i64 %30, 3
  %134 = icmp ult i32 %0, 4
  %unroll_iter966 = and i64 %30, 28
  %lcmp.mod964.not = icmp eq i64 %xtraiter962, 0
  %xtraiter969 = and i64 %30, 3
  %135 = icmp ult i32 %0, 4
  %unroll_iter973 = and i64 %30, 28
  %lcmp.mod971.not = icmp eq i64 %xtraiter969, 0
  %xtraiter976 = and i64 %28, 7
  %136 = icmp ult i32 %0, 7
  %unroll_iter981 = and i64 %28, 56
  %lcmp.mod978.not = icmp eq i64 %xtraiter976, 0
  %xtraiter986 = and i64 %28, 3
  %137 = icmp ult i32 %0, 3
  %unroll_iter991 = and i64 %28, 60
  %lcmp.mod988.not = icmp eq i64 %xtraiter986, 0
  %min.iters.check = icmp ult i32 %0, 4
  %n.vec = and i64 %30, 28
  %138 = getelementptr inbounds i8, ptr %7, i64 16
  %139 = icmp eq i64 %n.vec, 4
  %140 = getelementptr inbounds i8, ptr %7, i64 32
  %141 = getelementptr inbounds i8, ptr %7, i64 48
  %142 = icmp eq i64 %n.vec, 8
  %143 = getelementptr inbounds i8, ptr %7, i64 64
  %144 = getelementptr inbounds i8, ptr %7, i64 80
  %145 = icmp eq i64 %n.vec, 12
  %146 = getelementptr inbounds i8, ptr %7, i64 96
  %147 = getelementptr inbounds i8, ptr %7, i64 112
  %148 = icmp eq i64 %n.vec, 16
  %149 = getelementptr inbounds i8, ptr %7, i64 128
  %150 = getelementptr inbounds i8, ptr %7, i64 144
  %cmp.n = icmp eq i64 %n.vec, %30
  br label %151

151:                                              ; preds = %.preheader390.preheader, %23
  %.0343 = phi i32 [ %4, %23 ], [ %.2345, %.preheader390.preheader ]
  %.0321 = phi i32 [ 0, %23 ], [ %786, %.preheader390.preheader ]
  %.0315 = phi i32 [ 0, %23 ], [ %.5320671, %.preheader390.preheader ]
  %.0314 = phi double [ 1.000000e+00, %23 ], [ 1.000000e-03, %.preheader390.preheader ]
  br i1 %35, label %.unr-lcssa, label %.new

.new:                                             ; preds = %151, %.new
  %indvars.iv = phi i64 [ %indvars.iv.next.3, %.new ], [ 0, %151 ]
  %niter = phi i64 [ %niter.next.3, %.new ], [ 0, %151 ]
  %152 = getelementptr inbounds double, ptr %1, i64 %indvars.iv
  %153 = load double, ptr %152, align 8, !tbaa !5
  %154 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv, i64 %28
  store double %153, ptr %154, align 8, !tbaa !5
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %155 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next
  %156 = load double, ptr %155, align 8, !tbaa !5
  %157 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next, i64 %28
  store double %156, ptr %157, align 8, !tbaa !5
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %158 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next.1
  %159 = load double, ptr %158, align 8, !tbaa !5
  %160 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next.1, i64 %28
  store double %159, ptr %160, align 8, !tbaa !5
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %161 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next.2
  %162 = load double, ptr %161, align 8, !tbaa !5
  %163 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next.2, i64 %28
  store double %162, ptr %163, align 8, !tbaa !5
  %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 %.unr-lcssa, label %.new, !llvm.loop !9

.unr-lcssa:                                       ; preds = %.new, %151
  %indvars.iv.unr = phi i64 [ 0, %151 ], [ %indvars.iv.next.3, %.new ]
  br i1 %lcmp.mod.not, label %.epilog-lcssa, label %.epil.preheader

.epil.preheader:                                  ; preds = %.unr-lcssa, %.epil.preheader
  %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %.epil.preheader ], [ %indvars.iv.unr, %.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %.unr-lcssa ]
  %164 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.epil
  %165 = load double, ptr %164, align 8, !tbaa !5
  %166 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.epil, i64 %28
  store double %165, ptr %166, align 8, !tbaa !5
  %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 %.epilog-lcssa, label %.epil.preheader, !llvm.loop !11

.epilog-lcssa:                                    ; preds = %.epil.preheader, %.unr-lcssa
  %167 = call double @f(ptr noundef nonnull %1) #8
  store double %167, ptr %29, align 8, !tbaa !5
  br label %168

168:                                              ; preds = %.epilog-lcssa, %.epilog-lcssa892
  %indvars.iv546 = phi i64 [ 0, %.epilog-lcssa ], [ %indvars.iv.next547, %.epilog-lcssa892 ]
  %169 = getelementptr inbounds double, ptr %1, i64 %indvars.iv546
  %170 = load double, ptr %169, align 8, !tbaa !5
  %171 = getelementptr inbounds double, ptr %3, i64 %indvars.iv546
  %172 = load double, ptr %171, align 8, !tbaa !5
  %173 = call double @llvm.fmuladd.f64(double %172, double %.0314, double %170)
  store double %173, ptr %169, align 8, !tbaa !5
  br i1 %36, label %.unr-lcssa887, label %.new886

.new886:                                          ; preds = %168, %.new886
  %indvars.iv541 = phi i64 [ %indvars.iv.next542.3, %.new886 ], [ 0, %168 ]
  %niter894 = phi i64 [ %niter894.next.3, %.new886 ], [ 0, %168 ]
  %174 = getelementptr inbounds double, ptr %1, i64 %indvars.iv541
  %175 = load double, ptr %174, align 8, !tbaa !5
  %176 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv541, i64 %indvars.iv546
  store double %175, ptr %176, align 8, !tbaa !5
  %indvars.iv.next542 = or disjoint i64 %indvars.iv541, 1
  %177 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next542
  %178 = load double, ptr %177, align 8, !tbaa !5
  %179 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next542, i64 %indvars.iv546
  store double %178, ptr %179, align 8, !tbaa !5
  %indvars.iv.next542.1 = or disjoint i64 %indvars.iv541, 2
  %180 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next542.1
  %181 = load double, ptr %180, align 8, !tbaa !5
  %182 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next542.1, i64 %indvars.iv546
  store double %181, ptr %182, align 8, !tbaa !5
  %indvars.iv.next542.2 = or disjoint i64 %indvars.iv541, 3
  %183 = getelementptr inbounds double, ptr %1, i64 %indvars.iv.next542.2
  %184 = load double, ptr %183, align 8, !tbaa !5
  %185 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next542.2, i64 %indvars.iv546
  store double %184, ptr %185, align 8, !tbaa !5
  %indvars.iv.next542.3 = add nuw nsw i64 %indvars.iv541, 4
  %niter894.next.3 = add i64 %niter894, 4
  %niter894.ncmp.3 = icmp eq i64 %niter894.next.3, %unroll_iter893
  br i1 %niter894.ncmp.3, label %.unr-lcssa887, label %.new886, !llvm.loop !13

.unr-lcssa887:                                    ; preds = %.new886, %168
  %indvars.iv541.unr = phi i64 [ 0, %168 ], [ %indvars.iv.next542.3, %.new886 ]
  br i1 %lcmp.mod891.not, label %.epilog-lcssa892, label %.epil.preheader888

.epil.preheader888:                               ; preds = %.unr-lcssa887, %.epil.preheader888
  %indvars.iv541.epil = phi i64 [ %indvars.iv.next542.epil, %.epil.preheader888 ], [ %indvars.iv541.unr, %.unr-lcssa887 ]
  %epil.iter890 = phi i64 [ %epil.iter890.next, %.epil.preheader888 ], [ 0, %.unr-lcssa887 ]
  %186 = getelementptr inbounds double, ptr %1, i64 %indvars.iv541.epil
  %187 = load double, ptr %186, align 8, !tbaa !5
  %188 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv541.epil, i64 %indvars.iv546
  store double %187, ptr %188, align 8, !tbaa !5
  %indvars.iv.next542.epil = add nuw nsw i64 %indvars.iv541.epil, 1
  %epil.iter890.next = add i64 %epil.iter890, 1
  %epil.iter890.cmp.not = icmp eq i64 %epil.iter890.next, %xtraiter889
  br i1 %epil.iter890.cmp.not, label %.epilog-lcssa892, label %.epil.preheader888, !llvm.loop !14

.epilog-lcssa892:                                 ; preds = %.epil.preheader888, %.unr-lcssa887
  %189 = call double @f(ptr noundef nonnull %1) #8
  %190 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv546
  store double %189, ptr %190, align 8, !tbaa !5
  store double %170, ptr %169, align 8, !tbaa !5
  %indvars.iv.next547 = add nuw nsw i64 %indvars.iv546, 1
  %exitcond550.not = icmp eq i64 %indvars.iv.next547, %30
  br i1 %exitcond550.not, label %.lr.ph449.preheader, label %168, !llvm.loop !15

.lr.ph449.preheader:                              ; preds = %.epilog-lcssa892
  %191 = add i32 %.0315, %25
  %192 = load double, ptr %9, align 16, !tbaa !5
  br i1 %37, label %.outer.preheader.unr-lcssa, label %.lr.ph449

.lr.ph449:                                        ; preds = %.lr.ph449.preheader, %.lr.ph449
  %indvars.iv551 = phi i64 [ %indvars.iv.next552.1, %.lr.ph449 ], [ 1, %.lr.ph449.preheader ]
  %.0309447 = phi double [ %.1310.1, %.lr.ph449 ], [ %192, %.lr.ph449.preheader ]
  %.0326446 = phi i32 [ %.1327.1, %.lr.ph449 ], [ 0, %.lr.ph449.preheader ]
  %niter901 = phi i64 [ %niter901.next.1, %.lr.ph449 ], [ 0, %.lr.ph449.preheader ]
  %193 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv551
  %194 = load double, ptr %193, align 8, !tbaa !5
  %195 = fcmp olt double %194, %.0309447
  %196 = trunc nuw nsw i64 %indvars.iv551 to i32
  %.1327 = select i1 %195, i32 %196, i32 %.0326446
  %.1310 = select i1 %195, double %194, double %.0309447
  %indvars.iv.next552 = add nuw nsw i64 %indvars.iv551, 1
  %197 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next552
  %198 = load double, ptr %197, align 8, !tbaa !5
  %199 = fcmp olt double %198, %.1310
  %200 = trunc nuw nsw i64 %indvars.iv.next552 to i32
  %.1327.1 = select i1 %199, i32 %200, i32 %.1327
  %.1310.1 = select i1 %199, double %198, double %.1310
  %indvars.iv.next552.1 = add nuw nsw i64 %indvars.iv551, 2
  %niter901.next.1 = add i64 %niter901, 2
  %niter901.ncmp.1 = icmp eq i64 %niter901.next.1, %unroll_iter900
  br i1 %niter901.ncmp.1, label %.outer.preheader.unr-lcssa, label %.lr.ph449, !llvm.loop !16

.outer.preheader.unr-lcssa:                       ; preds = %.lr.ph449, %.lr.ph449.preheader
  %.1327.lcssa.ph = phi i32 [ poison, %.lr.ph449.preheader ], [ %.1327.1, %.lr.ph449 ]
  %.1310.lcssa.ph = phi double [ poison, %.lr.ph449.preheader ], [ %.1310.1, %.lr.ph449 ]
  %indvars.iv551.unr = phi i64 [ 1, %.lr.ph449.preheader ], [ %indvars.iv.next552.1, %.lr.ph449 ]
  %.0309447.unr = phi double [ %192, %.lr.ph449.preheader ], [ %.1310.1, %.lr.ph449 ]
  %.0326446.unr = phi i32 [ 0, %.lr.ph449.preheader ], [ %.1327.1, %.lr.ph449 ]
  br i1 %lcmp.mod897.not, label %.outer.preheader, label %.lr.ph449.epil

.lr.ph449.epil:                                   ; preds = %.outer.preheader.unr-lcssa
  %201 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv551.unr
  %202 = load double, ptr %201, align 8, !tbaa !5
  %203 = fcmp olt double %202, %.0309447.unr
  %204 = trunc nuw nsw i64 %indvars.iv551.unr to i32
  %.1327.epil = select i1 %203, i32 %204, i32 %.0326446.unr
  %.1310.epil = select i1 %203, double %202, double %.0309447.unr
  br label %.outer.preheader

.outer.preheader:                                 ; preds = %.outer.preheader.unr-lcssa, %.lr.ph449.epil
  %.1327.lcssa = phi i32 [ %.1327.lcssa.ph, %.outer.preheader.unr-lcssa ], [ %.1327.epil, %.lr.ph449.epil ]
  %.1310.lcssa = phi double [ %.1310.lcssa.ph, %.outer.preheader.unr-lcssa ], [ %.1310.epil, %.lr.ph449.epil ]
  br label %.outer

.lr.ph456.preheader.loopexit.unr-lcssa:           ; preds = %.lr.ph472, %.lr.ph472.preheader
  %.4330.lcssa.ph = phi i32 [ poison, %.lr.ph472.preheader ], [ %.4330.1, %.lr.ph472 ]
  %.4.lcssa.ph = phi double [ poison, %.lr.ph472.preheader ], [ %.4.1, %.lr.ph472 ]
  %indvars.iv596.unr = phi i64 [ 1, %.lr.ph472.preheader ], [ %indvars.iv.next597.1, %.lr.ph472 ]
  %.3470.unr = phi double [ %579, %.lr.ph472.preheader ], [ %.4.1, %.lr.ph472 ]
  %.3329469.unr = phi i32 [ 0, %.lr.ph472.preheader ], [ %.4330.1, %.lr.ph472 ]
  br i1 %lcmp.mod927.not, label %.lr.ph456.preheader.loopexit, label %.lr.ph472.epil

.lr.ph472.epil:                                   ; preds = %.lr.ph456.preheader.loopexit.unr-lcssa
  %205 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv596.unr
  %206 = load double, ptr %205, align 8, !tbaa !5
  %207 = fcmp olt double %206, %.3470.unr
  %208 = trunc nuw nsw i64 %indvars.iv596.unr to i32
  %.4330.epil = select i1 %207, i32 %208, i32 %.3329469.unr
  %.4.epil = select i1 %207, double %206, double %.3470.unr
  br label %.lr.ph456.preheader.loopexit

.lr.ph456.preheader.loopexit:                     ; preds = %.lr.ph456.preheader.loopexit.unr-lcssa, %.lr.ph472.epil
  %.4330.lcssa = phi i32 [ %.4330.lcssa.ph, %.lr.ph456.preheader.loopexit.unr-lcssa ], [ %.4330.epil, %.lr.ph472.epil ]
  %.4.lcssa = phi double [ %.4.lcssa.ph, %.lr.ph456.preheader.loopexit.unr-lcssa ], [ %.4.epil, %.lr.ph472.epil ]
  br label %.lr.ph456.preheader, !llvm.loop !17

.lr.ph456.preheader:                              ; preds = %.lr.ph456.preheader.loopexit, %.outer
  %209 = phi double [ %.pre, %.outer ], [ %579, %.lr.ph456.preheader.loopexit ]
  %.2328 = phi i32 [ %.2328.ph, %.outer ], [ %.4330.lcssa, %.lr.ph456.preheader.loopexit ]
  %.1316 = phi i32 [ %.1316.ph, %.outer ], [ %577, %.lr.ph456.preheader.loopexit ]
  %.2311 = phi double [ %.2311.ph, %.outer ], [ %.4.lcssa, %.lr.ph456.preheader.loopexit ]
  br i1 %38, label %.preheader389.unr-lcssa, label %.lr.ph456

.preheader389.unr-lcssa:                          ; preds = %.lr.ph456, %.lr.ph456.preheader
  %.1325.lcssa.ph = phi i32 [ poison, %.lr.ph456.preheader ], [ %.1325.1, %.lr.ph456 ]
  %indvars.iv556.unr = phi i64 [ 1, %.lr.ph456.preheader ], [ %indvars.iv.next557.1, %.lr.ph456 ]
  %.0312454.unr = phi double [ %209, %.lr.ph456.preheader ], [ %.1313.1, %.lr.ph456 ]
  %.0324453.unr = phi i32 [ 0, %.lr.ph456.preheader ], [ %.1325.1, %.lr.ph456 ]
  br i1 %lcmp.mod904.not, label %.preheader389, label %.lr.ph456.epil

.lr.ph456.epil:                                   ; preds = %.preheader389.unr-lcssa
  %210 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv556.unr
  %211 = load double, ptr %210, align 8, !tbaa !5
  %212 = fcmp olt double %.0312454.unr, %211
  %213 = trunc nuw nsw i64 %indvars.iv556.unr to i32
  %.1325.epil = select i1 %212, i32 %213, i32 %.0324453.unr
  br label %.preheader389

.preheader389:                                    ; preds = %.preheader389.unr-lcssa, %.lr.ph456.epil
  %.1325.lcssa = phi i32 [ %.1325.lcssa.ph, %.preheader389.unr-lcssa ], [ %.1325.epil, %.lr.ph456.epil ]
  %214 = zext i32 %.1325.lcssa to i64
  br label %.preheader375

.lr.ph456:                                        ; preds = %.lr.ph456.preheader, %.lr.ph456
  %indvars.iv556 = phi i64 [ %indvars.iv.next557.1, %.lr.ph456 ], [ 1, %.lr.ph456.preheader ]
  %.0312454 = phi double [ %.1313.1, %.lr.ph456 ], [ %209, %.lr.ph456.preheader ]
  %.0324453 = phi i32 [ %.1325.1, %.lr.ph456 ], [ 0, %.lr.ph456.preheader ]
  %niter907 = phi i64 [ %niter907.next.1, %.lr.ph456 ], [ 0, %.lr.ph456.preheader ]
  %215 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv556
  %216 = load double, ptr %215, align 8, !tbaa !5
  %217 = fcmp olt double %.0312454, %216
  %218 = trunc nuw nsw i64 %indvars.iv556 to i32
  %.1325 = select i1 %217, i32 %218, i32 %.0324453
  %.1313 = select i1 %217, double %216, double %.0312454
  %indvars.iv.next557 = add nuw nsw i64 %indvars.iv556, 1
  %219 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next557
  %220 = load double, ptr %219, align 8, !tbaa !5
  %221 = fcmp olt double %.1313, %220
  %222 = trunc nuw nsw i64 %indvars.iv.next557 to i32
  %.1325.1 = select i1 %221, i32 %222, i32 %.1325
  %.1313.1 = select i1 %221, double %220, double %.1313
  %indvars.iv.next557.1 = add nuw nsw i64 %indvars.iv556, 2
  %niter907.next.1 = add i64 %niter907, 2
  %niter907.ncmp.1 = icmp eq i64 %niter907.next.1, %unroll_iter906
  br i1 %niter907.ncmp.1, label %.preheader389.unr-lcssa, label %.lr.ph456, !llvm.loop !18

.preheader375:                                    ; preds = %.preheader389, %.epilog-lcssa913
  %indvars.iv566 = phi i64 [ 0, %.preheader389 ], [ %indvars.iv.next567, %.epilog-lcssa913 ]
  br i1 %39, label %.unr-lcssa908, label %.preheader375.new

.preheader375.new:                                ; preds = %.preheader375, %.preheader375.new
  %indvars.iv561 = phi i64 [ %indvars.iv.next562.3, %.preheader375.new ], [ 0, %.preheader375 ]
  %.0308459 = phi double [ %234, %.preheader375.new ], [ 0.000000e+00, %.preheader375 ]
  %niter916 = phi i64 [ %niter916.next.3, %.preheader375.new ], [ 0, %.preheader375 ]
  %223 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %indvars.iv561
  %224 = load double, ptr %223, align 8, !tbaa !5
  %225 = fadd double %.0308459, %224
  %indvars.iv.next562 = or disjoint i64 %indvars.iv561, 1
  %226 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %indvars.iv.next562
  %227 = load double, ptr %226, align 8, !tbaa !5
  %228 = fadd double %225, %227
  %indvars.iv.next562.1 = or disjoint i64 %indvars.iv561, 2
  %229 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %indvars.iv.next562.1
  %230 = load double, ptr %229, align 8, !tbaa !5
  %231 = fadd double %228, %230
  %indvars.iv.next562.2 = or disjoint i64 %indvars.iv561, 3
  %232 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %indvars.iv.next562.2
  %233 = load double, ptr %232, align 8, !tbaa !5
  %234 = fadd double %231, %233
  %indvars.iv.next562.3 = add nuw nsw i64 %indvars.iv561, 4
  %niter916.next.3 = add i64 %niter916, 4
  %niter916.ncmp.3 = icmp eq i64 %niter916.next.3, %unroll_iter915
  br i1 %niter916.ncmp.3, label %.unr-lcssa908, label %.preheader375.new, !llvm.loop !19

.unr-lcssa908:                                    ; preds = %.preheader375.new, %.preheader375
  %.lcssa.ph = phi double [ poison, %.preheader375 ], [ %234, %.preheader375.new ]
  %indvars.iv561.unr = phi i64 [ 0, %.preheader375 ], [ %indvars.iv.next562.3, %.preheader375.new ]
  %.0308459.unr = phi double [ 0.000000e+00, %.preheader375 ], [ %234, %.preheader375.new ]
  br i1 %lcmp.mod912.not, label %.epilog-lcssa913, label %.epil.preheader909

.epil.preheader909:                               ; preds = %.unr-lcssa908, %.epil.preheader909
  %indvars.iv561.epil = phi i64 [ %indvars.iv.next562.epil, %.epil.preheader909 ], [ %indvars.iv561.unr, %.unr-lcssa908 ]
  %.0308459.epil = phi double [ %237, %.epil.preheader909 ], [ %.0308459.unr, %.unr-lcssa908 ]
  %epil.iter911 = phi i64 [ %epil.iter911.next, %.epil.preheader909 ], [ 0, %.unr-lcssa908 ]
  %235 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %indvars.iv561.epil
  %236 = load double, ptr %235, align 8, !tbaa !5
  %237 = fadd double %.0308459.epil, %236
  %indvars.iv.next562.epil = add nuw nsw i64 %indvars.iv561.epil, 1
  %epil.iter911.next = add i64 %epil.iter911, 1
  %epil.iter911.cmp.not = icmp eq i64 %epil.iter911.next, %xtraiter910
  br i1 %epil.iter911.cmp.not, label %.epilog-lcssa913, label %.epil.preheader909, !llvm.loop !20

.epilog-lcssa913:                                 ; preds = %.epil.preheader909, %.unr-lcssa908
  %.lcssa = phi double [ %.lcssa.ph, %.unr-lcssa908 ], [ %237, %.epil.preheader909 ]
  %238 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv566, i64 %214
  %239 = load double, ptr %238, align 8, !tbaa !5
  %240 = fsub double %.lcssa, %239
  %241 = fdiv double %240, %24
  %242 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %indvars.iv566
  store double %241, ptr %242, align 8, !tbaa !5
  %indvars.iv.next567 = add nuw nsw i64 %indvars.iv566, 1
  %exitcond570.not = icmp eq i64 %indvars.iv.next567, %30
  br i1 %exitcond570.not, label %.preheader388.preheader, label %.preheader375, !llvm.loop !21

.preheader388.preheader:                          ; preds = %.epilog-lcssa913
  br i1 %min.iters.check821, label %.preheader388.preheader839, label %vector.body826

vector.body826:                                   ; preds = %.preheader388.preheader
  %wide.load828 = load <2 x double>, ptr %10, align 16, !tbaa !5
  %wide.load829 = load <2 x double>, ptr %40, align 16, !tbaa !5
  %243 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 0, i64 %214
  %244 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 1, i64 %214
  %245 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 2, i64 %214
  %246 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 3, i64 %214
  %247 = load double, ptr %243, align 8, !tbaa !5
  %248 = load double, ptr %244, align 8, !tbaa !5
  %249 = insertelement <2 x double> poison, double %247, i64 0
  %250 = insertelement <2 x double> %249, double %248, i64 1
  %251 = load double, ptr %245, align 8, !tbaa !5
  %252 = load double, ptr %246, align 8, !tbaa !5
  %253 = insertelement <2 x double> poison, double %251, i64 0
  %254 = insertelement <2 x double> %253, double %252, i64 1
  %255 = fsub <2 x double> %wide.load828, %250
  %256 = fsub <2 x double> %wide.load829, %254
  %257 = fadd <2 x double> %wide.load828, %255
  %258 = fadd <2 x double> %wide.load829, %256
  store <2 x double> %257, ptr %11, align 16, !tbaa !5
  store <2 x double> %258, ptr %41, align 16, !tbaa !5
  br i1 %42, label %middle.block819, label %vector.body826.1, !llvm.loop !22

vector.body826.1:                                 ; preds = %vector.body826
  %wide.load828.1 = load <2 x double>, ptr %43, align 16, !tbaa !5
  %wide.load829.1 = load <2 x double>, ptr %44, align 16, !tbaa !5
  %259 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 4, i64 %214
  %260 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 5, i64 %214
  %261 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 6, i64 %214
  %262 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 7, i64 %214
  %263 = load double, ptr %259, align 8, !tbaa !5
  %264 = load double, ptr %260, align 8, !tbaa !5
  %265 = insertelement <2 x double> poison, double %263, i64 0
  %266 = insertelement <2 x double> %265, double %264, i64 1
  %267 = load double, ptr %261, align 8, !tbaa !5
  %268 = load double, ptr %262, align 8, !tbaa !5
  %269 = insertelement <2 x double> poison, double %267, i64 0
  %270 = insertelement <2 x double> %269, double %268, i64 1
  %271 = fsub <2 x double> %wide.load828.1, %266
  %272 = fsub <2 x double> %wide.load829.1, %270
  %273 = fadd <2 x double> %wide.load828.1, %271
  %274 = fadd <2 x double> %wide.load829.1, %272
  store <2 x double> %273, ptr %45, align 16, !tbaa !5
  store <2 x double> %274, ptr %46, align 16, !tbaa !5
  br i1 %47, label %middle.block819, label %vector.body826.2, !llvm.loop !22

vector.body826.2:                                 ; preds = %vector.body826.1
  %wide.load828.2 = load <2 x double>, ptr %48, align 16, !tbaa !5
  %wide.load829.2 = load <2 x double>, ptr %49, align 16, !tbaa !5
  %275 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 8, i64 %214
  %276 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 9, i64 %214
  %277 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 10, i64 %214
  %278 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 11, i64 %214
  %279 = load double, ptr %275, align 8, !tbaa !5
  %280 = load double, ptr %276, align 8, !tbaa !5
  %281 = insertelement <2 x double> poison, double %279, i64 0
  %282 = insertelement <2 x double> %281, double %280, i64 1
  %283 = load double, ptr %277, align 8, !tbaa !5
  %284 = load double, ptr %278, align 8, !tbaa !5
  %285 = insertelement <2 x double> poison, double %283, i64 0
  %286 = insertelement <2 x double> %285, double %284, i64 1
  %287 = fsub <2 x double> %wide.load828.2, %282
  %288 = fsub <2 x double> %wide.load829.2, %286
  %289 = fadd <2 x double> %wide.load828.2, %287
  %290 = fadd <2 x double> %wide.load829.2, %288
  store <2 x double> %289, ptr %50, align 16, !tbaa !5
  store <2 x double> %290, ptr %51, align 16, !tbaa !5
  br i1 %52, label %middle.block819, label %vector.body826.3, !llvm.loop !22

vector.body826.3:                                 ; preds = %vector.body826.2
  %wide.load828.3 = load <2 x double>, ptr %53, align 16, !tbaa !5
  %wide.load829.3 = load <2 x double>, ptr %54, align 16, !tbaa !5
  %291 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 12, i64 %214
  %292 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 13, i64 %214
  %293 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 14, i64 %214
  %294 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 15, i64 %214
  %295 = load double, ptr %291, align 8, !tbaa !5
  %296 = load double, ptr %292, align 8, !tbaa !5
  %297 = insertelement <2 x double> poison, double %295, i64 0
  %298 = insertelement <2 x double> %297, double %296, i64 1
  %299 = load double, ptr %293, align 8, !tbaa !5
  %300 = load double, ptr %294, align 8, !tbaa !5
  %301 = insertelement <2 x double> poison, double %299, i64 0
  %302 = insertelement <2 x double> %301, double %300, i64 1
  %303 = fsub <2 x double> %wide.load828.3, %298
  %304 = fsub <2 x double> %wide.load829.3, %302
  %305 = fadd <2 x double> %wide.load828.3, %303
  %306 = fadd <2 x double> %wide.load829.3, %304
  store <2 x double> %305, ptr %55, align 16, !tbaa !5
  store <2 x double> %306, ptr %56, align 16, !tbaa !5
  br i1 %57, label %middle.block819, label %vector.body826.4, !llvm.loop !22

vector.body826.4:                                 ; preds = %vector.body826.3
  %wide.load828.4 = load <2 x double>, ptr %58, align 16, !tbaa !5
  %wide.load829.4 = load <2 x double>, ptr %59, align 16, !tbaa !5
  %307 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 16, i64 %214
  %308 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 17, i64 %214
  %309 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 18, i64 %214
  %310 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 19, i64 %214
  %311 = load double, ptr %307, align 8, !tbaa !5
  %312 = load double, ptr %308, align 8, !tbaa !5
  %313 = insertelement <2 x double> poison, double %311, i64 0
  %314 = insertelement <2 x double> %313, double %312, i64 1
  %315 = load double, ptr %309, align 8, !tbaa !5
  %316 = load double, ptr %310, align 8, !tbaa !5
  %317 = insertelement <2 x double> poison, double %315, i64 0
  %318 = insertelement <2 x double> %317, double %316, i64 1
  %319 = fsub <2 x double> %wide.load828.4, %314
  %320 = fsub <2 x double> %wide.load829.4, %318
  %321 = fadd <2 x double> %wide.load828.4, %319
  %322 = fadd <2 x double> %wide.load829.4, %320
  store <2 x double> %321, ptr %60, align 16, !tbaa !5
  store <2 x double> %322, ptr %61, align 16, !tbaa !5
  br label %middle.block819

middle.block819:                                  ; preds = %vector.body826.4, %vector.body826.3, %vector.body826.2, %vector.body826.1, %vector.body826
  br i1 %cmp.n831, label %.loopexit833, label %.preheader388.preheader839

.preheader388.preheader839:                       ; preds = %middle.block819, %.preheader388.preheader
  %indvars.iv571.ph = phi i64 [ 0, %.preheader388.preheader ], [ %n.vec824, %middle.block819 ]
  br label %.preheader388

.preheader388:                                    ; preds = %.preheader388.preheader839, %.preheader388
  %indvars.iv571 = phi i64 [ %indvars.iv.next572, %.preheader388 ], [ %indvars.iv571.ph, %.preheader388.preheader839 ]
  %323 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %indvars.iv571
  %324 = load double, ptr %323, align 8, !tbaa !5
  %325 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv571, i64 %214
  %326 = load double, ptr %325, align 8, !tbaa !5
  %327 = fsub double %324, %326
  %328 = fadd double %324, %327
  %329 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv571
  store double %328, ptr %329, align 8, !tbaa !5
  %indvars.iv.next572 = add nuw nsw i64 %indvars.iv571, 1
  %exitcond575.not = icmp eq i64 %indvars.iv.next572, %30
  br i1 %exitcond575.not, label %.loopexit833, label %.preheader388, !llvm.loop !25

.loopexit833:                                     ; preds = %.preheader388, %middle.block819
  %330 = call double @f(ptr noundef nonnull %11) #8
  %331 = fcmp olt double %330, %.2311
  br i1 %331, label %.preheader379, label %.preheader387.preheader

.preheader387.preheader:                          ; preds = %.loopexit833
  br i1 %min.iters.check807, label %.preheader387.preheader838, label %vector.ph808

.preheader387.preheader838:                       ; preds = %middle.block805, %.preheader387.preheader
  %indvars.iv576.ph = phi i64 [ 0, %.preheader387.preheader ], [ %n.vec810, %middle.block805 ]
  %.0322463.ph = phi i32 [ 0, %.preheader387.preheader ], [ %360, %middle.block805 ]
  br label %.preheader387

vector.ph808:                                     ; preds = %.preheader387.preheader
  %broadcast.splatinsert = insertelement <2 x double> poison, double %330, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %wide.load815 = load <2 x double>, ptr %9, align 16, !tbaa !5
  %wide.load816 = load <2 x double>, ptr %62, align 16, !tbaa !5
  %332 = fcmp olt <2 x double> %broadcast.splat, %wide.load815
  %333 = fcmp olt <2 x double> %broadcast.splat, %wide.load816
  %334 = zext <2 x i1> %332 to <2 x i32>
  %335 = zext <2 x i1> %333 to <2 x i32>
  br i1 %63, label %middle.block805, label %vector.body812.1, !llvm.loop !26

vector.body812.1:                                 ; preds = %vector.ph808
  %wide.load815.1 = load <2 x double>, ptr %64, align 16, !tbaa !5
  %wide.load816.1 = load <2 x double>, ptr %65, align 16, !tbaa !5
  %336 = fcmp olt <2 x double> %broadcast.splat, %wide.load815.1
  %337 = fcmp olt <2 x double> %broadcast.splat, %wide.load816.1
  %338 = zext <2 x i1> %336 to <2 x i32>
  %339 = zext <2 x i1> %337 to <2 x i32>
  %340 = add nuw nsw <2 x i32> %334, %338
  %341 = add nuw nsw <2 x i32> %335, %339
  br i1 %66, label %middle.block805, label %vector.body812.2, !llvm.loop !26

vector.body812.2:                                 ; preds = %vector.body812.1
  %wide.load815.2 = load <2 x double>, ptr %67, align 16, !tbaa !5
  %wide.load816.2 = load <2 x double>, ptr %68, align 16, !tbaa !5
  %342 = fcmp olt <2 x double> %broadcast.splat, %wide.load815.2
  %343 = fcmp olt <2 x double> %broadcast.splat, %wide.load816.2
  %344 = zext <2 x i1> %342 to <2 x i32>
  %345 = zext <2 x i1> %343 to <2 x i32>
  %346 = add nuw nsw <2 x i32> %340, %344
  %347 = add nuw nsw <2 x i32> %341, %345
  br i1 %69, label %middle.block805, label %vector.body812.3, !llvm.loop !26

vector.body812.3:                                 ; preds = %vector.body812.2
  %wide.load815.3 = load <2 x double>, ptr %70, align 16, !tbaa !5
  %wide.load816.3 = load <2 x double>, ptr %71, align 16, !tbaa !5
  %348 = fcmp olt <2 x double> %broadcast.splat, %wide.load815.3
  %349 = fcmp olt <2 x double> %broadcast.splat, %wide.load816.3
  %350 = zext <2 x i1> %348 to <2 x i32>
  %351 = zext <2 x i1> %349 to <2 x i32>
  %352 = add nuw nsw <2 x i32> %346, %350
  %353 = add nuw nsw <2 x i32> %347, %351
  br i1 %72, label %middle.block805, label %vector.body812.4, !llvm.loop !26

vector.body812.4:                                 ; preds = %vector.body812.3
  %wide.load815.4 = load <2 x double>, ptr %73, align 16, !tbaa !5
  %wide.load816.4 = load <2 x double>, ptr %74, align 16, !tbaa !5
  %354 = fcmp olt <2 x double> %broadcast.splat, %wide.load815.4
  %355 = fcmp olt <2 x double> %broadcast.splat, %wide.load816.4
  %356 = zext <2 x i1> %354 to <2 x i32>
  %357 = zext <2 x i1> %355 to <2 x i32>
  %358 = add nuw nsw <2 x i32> %352, %356
  %359 = add nuw nsw <2 x i32> %353, %357
  br label %middle.block805

middle.block805:                                  ; preds = %vector.body812.4, %vector.body812.3, %vector.body812.2, %vector.body812.1, %vector.ph808
  %.lcssa846 = phi <2 x i32> [ %334, %vector.ph808 ], [ %340, %vector.body812.1 ], [ %346, %vector.body812.2 ], [ %352, %vector.body812.3 ], [ %358, %vector.body812.4 ]
  %.lcssa845 = phi <2 x i32> [ %335, %vector.ph808 ], [ %341, %vector.body812.1 ], [ %347, %vector.body812.2 ], [ %353, %vector.body812.3 ], [ %359, %vector.body812.4 ]
  %bin.rdx = add <2 x i32> %.lcssa845, %.lcssa846
  %360 = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %bin.rdx)
  br i1 %cmp.n818, label %.loopexit832, label %.preheader387.preheader838

.preheader379:                                    ; preds = %.loopexit833
  br i1 %min.iters.check765, label %scalar.ph764.preheader, label %vector.body770

vector.body770:                                   ; preds = %.preheader379
  %wide.load = load <2 x double>, ptr %10, align 16, !tbaa !5
  %wide.load772 = load <2 x double>, ptr %103, align 16, !tbaa !5
  %wide.load773 = load <2 x double>, ptr %11, align 16, !tbaa !5
  %wide.load774 = load <2 x double>, ptr %104, align 16, !tbaa !5
  %361 = fsub <2 x double> %wide.load773, %wide.load
  %362 = fsub <2 x double> %wide.load774, %wide.load772
  %363 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %361, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load)
  %364 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %362, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load772)
  store <2 x double> %363, ptr %12, align 16, !tbaa !5
  store <2 x double> %364, ptr %105, align 16, !tbaa !5
  br i1 %106, label %middle.block763, label %vector.body770.1, !llvm.loop !27

vector.body770.1:                                 ; preds = %vector.body770
  %wide.load.1 = load <2 x double>, ptr %107, align 16, !tbaa !5
  %wide.load772.1 = load <2 x double>, ptr %108, align 16, !tbaa !5
  %wide.load773.1 = load <2 x double>, ptr %109, align 16, !tbaa !5
  %wide.load774.1 = load <2 x double>, ptr %110, align 16, !tbaa !5
  %365 = fsub <2 x double> %wide.load773.1, %wide.load.1
  %366 = fsub <2 x double> %wide.load774.1, %wide.load772.1
  %367 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %365, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load.1)
  %368 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %366, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load772.1)
  store <2 x double> %367, ptr %111, align 16, !tbaa !5
  store <2 x double> %368, ptr %112, align 16, !tbaa !5
  br i1 %113, label %middle.block763, label %vector.body770.2, !llvm.loop !27

vector.body770.2:                                 ; preds = %vector.body770.1
  %wide.load.2 = load <2 x double>, ptr %114, align 16, !tbaa !5
  %wide.load772.2 = load <2 x double>, ptr %115, align 16, !tbaa !5
  %wide.load773.2 = load <2 x double>, ptr %116, align 16, !tbaa !5
  %wide.load774.2 = load <2 x double>, ptr %117, align 16, !tbaa !5
  %369 = fsub <2 x double> %wide.load773.2, %wide.load.2
  %370 = fsub <2 x double> %wide.load774.2, %wide.load772.2
  %371 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %369, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load.2)
  %372 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %370, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load772.2)
  store <2 x double> %371, ptr %118, align 16, !tbaa !5
  store <2 x double> %372, ptr %119, align 16, !tbaa !5
  br i1 %120, label %middle.block763, label %vector.body770.3, !llvm.loop !27

vector.body770.3:                                 ; preds = %vector.body770.2
  %wide.load.3 = load <2 x double>, ptr %121, align 16, !tbaa !5
  %wide.load772.3 = load <2 x double>, ptr %122, align 16, !tbaa !5
  %wide.load773.3 = load <2 x double>, ptr %123, align 16, !tbaa !5
  %wide.load774.3 = load <2 x double>, ptr %124, align 16, !tbaa !5
  %373 = fsub <2 x double> %wide.load773.3, %wide.load.3
  %374 = fsub <2 x double> %wide.load774.3, %wide.load772.3
  %375 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %373, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load.3)
  %376 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %374, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load772.3)
  store <2 x double> %375, ptr %125, align 16, !tbaa !5
  store <2 x double> %376, ptr %126, align 16, !tbaa !5
  br i1 %127, label %middle.block763, label %vector.body770.4, !llvm.loop !27

vector.body770.4:                                 ; preds = %vector.body770.3
  %wide.load.4 = load <2 x double>, ptr %128, align 16, !tbaa !5
  %wide.load772.4 = load <2 x double>, ptr %129, align 16, !tbaa !5
  %wide.load773.4 = load <2 x double>, ptr %130, align 16, !tbaa !5
  %wide.load774.4 = load <2 x double>, ptr %131, align 16, !tbaa !5
  %377 = fsub <2 x double> %wide.load773.4, %wide.load.4
  %378 = fsub <2 x double> %wide.load774.4, %wide.load772.4
  %379 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %377, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load.4)
  %380 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %378, <2 x double> <double 2.000000e+00, double 2.000000e+00>, <2 x double> %wide.load772.4)
  store <2 x double> %379, ptr %132, align 16, !tbaa !5
  store <2 x double> %380, ptr %133, align 16, !tbaa !5
  br label %middle.block763

middle.block763:                                  ; preds = %vector.body770.4, %vector.body770.3, %vector.body770.2, %vector.body770.1, %vector.body770
  br i1 %cmp.n776, label %.loopexit834, label %scalar.ph764.preheader

scalar.ph764.preheader:                           ; preds = %middle.block763, %.preheader379
  %indvars.iv626.ph = phi i64 [ 0, %.preheader379 ], [ %n.vec768, %middle.block763 ]
  br label %scalar.ph764

scalar.ph764:                                     ; preds = %scalar.ph764.preheader, %scalar.ph764
  %indvars.iv626 = phi i64 [ %indvars.iv.next627, %scalar.ph764 ], [ %indvars.iv626.ph, %scalar.ph764.preheader ]
  %381 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %indvars.iv626
  %382 = load double, ptr %381, align 8, !tbaa !5
  %383 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv626
  %384 = load double, ptr %383, align 8, !tbaa !5
  %385 = fsub double %384, %382
  %386 = call double @llvm.fmuladd.f64(double %385, double 2.000000e+00, double %382)
  %387 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv626
  store double %386, ptr %387, align 8, !tbaa !5
  %indvars.iv.next627 = add nuw nsw i64 %indvars.iv626, 1
  %exitcond630.not = icmp eq i64 %indvars.iv.next627, %30
  br i1 %exitcond630.not, label %.loopexit834, label %scalar.ph764, !llvm.loop !28

.loopexit834:                                     ; preds = %scalar.ph764, %middle.block763
  %388 = call double @f(ptr noundef nonnull %12) #8
  %389 = add i32 %.1316, 2
  %390 = fcmp olt double %330, %388
  br i1 %390, label %.preheader377.preheader, label %.preheader378.preheader

.preheader378.preheader:                          ; preds = %.loopexit834
  br i1 %134, label %.unr-lcssa961, label %.preheader378

.preheader377.preheader:                          ; preds = %.loopexit834
  br i1 %135, label %.unr-lcssa968, label %.preheader377

.preheader377:                                    ; preds = %.preheader377.preheader, %.preheader377
  %indvars.iv636 = phi i64 [ %indvars.iv.next637.3, %.preheader377 ], [ 0, %.preheader377.preheader ]
  %niter974 = phi i64 [ %niter974.next.3, %.preheader377 ], [ 0, %.preheader377.preheader ]
  %391 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv636
  %392 = load double, ptr %391, align 16, !tbaa !5
  %393 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv636, i64 %214
  store double %392, ptr %393, align 8, !tbaa !5
  %indvars.iv.next637 = or disjoint i64 %indvars.iv636, 1
  %394 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next637
  %395 = load double, ptr %394, align 8, !tbaa !5
  %396 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next637, i64 %214
  store double %395, ptr %396, align 8, !tbaa !5
  %indvars.iv.next637.1 = or disjoint i64 %indvars.iv636, 2
  %397 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next637.1
  %398 = load double, ptr %397, align 16, !tbaa !5
  %399 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next637.1, i64 %214
  store double %398, ptr %399, align 8, !tbaa !5
  %indvars.iv.next637.2 = or disjoint i64 %indvars.iv636, 3
  %400 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next637.2
  %401 = load double, ptr %400, align 8, !tbaa !5
  %402 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next637.2, i64 %214
  store double %401, ptr %402, align 8, !tbaa !5
  %indvars.iv.next637.3 = add nuw nsw i64 %indvars.iv636, 4
  %niter974.next.3 = add i64 %niter974, 4
  %niter974.ncmp.3 = icmp eq i64 %niter974.next.3, %unroll_iter973
  br i1 %niter974.ncmp.3, label %.unr-lcssa968, label %.preheader377, !llvm.loop !29

.unr-lcssa968:                                    ; preds = %.preheader377, %.preheader377.preheader
  %indvars.iv636.unr = phi i64 [ 0, %.preheader377.preheader ], [ %indvars.iv.next637.3, %.preheader377 ]
  br i1 %lcmp.mod971.not, label %.epilog-lcssa972, label %.preheader377.epil

.preheader377.epil:                               ; preds = %.unr-lcssa968, %.preheader377.epil
  %indvars.iv636.epil = phi i64 [ %indvars.iv.next637.epil, %.preheader377.epil ], [ %indvars.iv636.unr, %.unr-lcssa968 ]
  %epil.iter970 = phi i64 [ %epil.iter970.next, %.preheader377.epil ], [ 0, %.unr-lcssa968 ]
  %403 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv636.epil
  %404 = load double, ptr %403, align 8, !tbaa !5
  %405 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv636.epil, i64 %214
  store double %404, ptr %405, align 8, !tbaa !5
  %indvars.iv.next637.epil = add nuw nsw i64 %indvars.iv636.epil, 1
  %epil.iter970.next = add i64 %epil.iter970, 1
  %epil.iter970.cmp.not = icmp eq i64 %epil.iter970.next, %xtraiter969
  br i1 %epil.iter970.cmp.not, label %.epilog-lcssa972, label %.preheader377.epil, !llvm.loop !30

.epilog-lcssa972:                                 ; preds = %.preheader377.epil, %.unr-lcssa968
  %406 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  store double %330, ptr %406, align 8, !tbaa !5
  br label %645

.preheader378:                                    ; preds = %.preheader378.preheader, %.preheader378
  %indvars.iv631 = phi i64 [ %indvars.iv.next632.3, %.preheader378 ], [ 0, %.preheader378.preheader ]
  %niter967 = phi i64 [ %niter967.next.3, %.preheader378 ], [ 0, %.preheader378.preheader ]
  %407 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv631
  %408 = load double, ptr %407, align 16, !tbaa !5
  %409 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv631, i64 %214
  store double %408, ptr %409, align 8, !tbaa !5
  %indvars.iv.next632 = or disjoint i64 %indvars.iv631, 1
  %410 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next632
  %411 = load double, ptr %410, align 8, !tbaa !5
  %412 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next632, i64 %214
  store double %411, ptr %412, align 8, !tbaa !5
  %indvars.iv.next632.1 = or disjoint i64 %indvars.iv631, 2
  %413 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next632.1
  %414 = load double, ptr %413, align 16, !tbaa !5
  %415 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next632.1, i64 %214
  store double %414, ptr %415, align 8, !tbaa !5
  %indvars.iv.next632.2 = or disjoint i64 %indvars.iv631, 3
  %416 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next632.2
  %417 = load double, ptr %416, align 8, !tbaa !5
  %418 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next632.2, i64 %214
  store double %417, ptr %418, align 8, !tbaa !5
  %indvars.iv.next632.3 = add nuw nsw i64 %indvars.iv631, 4
  %niter967.next.3 = add i64 %niter967, 4
  %niter967.ncmp.3 = icmp eq i64 %niter967.next.3, %unroll_iter966
  br i1 %niter967.ncmp.3, label %.unr-lcssa961, label %.preheader378, !llvm.loop !31

.unr-lcssa961:                                    ; preds = %.preheader378, %.preheader378.preheader
  %indvars.iv631.unr = phi i64 [ 0, %.preheader378.preheader ], [ %indvars.iv.next632.3, %.preheader378 ]
  br i1 %lcmp.mod964.not, label %.epilog-lcssa965, label %.preheader378.epil

.preheader378.epil:                               ; preds = %.unr-lcssa961, %.preheader378.epil
  %indvars.iv631.epil = phi i64 [ %indvars.iv.next632.epil, %.preheader378.epil ], [ %indvars.iv631.unr, %.unr-lcssa961 ]
  %epil.iter963 = phi i64 [ %epil.iter963.next, %.preheader378.epil ], [ 0, %.unr-lcssa961 ]
  %419 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv631.epil
  %420 = load double, ptr %419, align 8, !tbaa !5
  %421 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv631.epil, i64 %214
  store double %420, ptr %421, align 8, !tbaa !5
  %indvars.iv.next632.epil = add nuw nsw i64 %indvars.iv631.epil, 1
  %epil.iter963.next = add i64 %epil.iter963, 1
  %epil.iter963.cmp.not = icmp eq i64 %epil.iter963.next, %xtraiter962
  br i1 %epil.iter963.cmp.not, label %.epilog-lcssa965, label %.preheader378.epil, !llvm.loop !32

.epilog-lcssa965:                                 ; preds = %.preheader378.epil, %.unr-lcssa961
  %422 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  store double %388, ptr %422, align 8, !tbaa !5
  br label %645

.preheader387:                                    ; preds = %.preheader387.preheader838, %.preheader387
  %indvars.iv576 = phi i64 [ %indvars.iv.next577, %.preheader387 ], [ %indvars.iv576.ph, %.preheader387.preheader838 ]
  %.0322463 = phi i32 [ %.1323, %.preheader387 ], [ %.0322463.ph, %.preheader387.preheader838 ]
  %423 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv576
  %424 = load double, ptr %423, align 8, !tbaa !5
  %425 = fcmp olt double %330, %424
  %426 = zext i1 %425 to i32
  %.1323 = add i32 %.0322463, %426
  %indvars.iv.next577 = add nuw nsw i64 %indvars.iv576, 1
  %exitcond580.not = icmp eq i64 %indvars.iv.next577, %28
  br i1 %exitcond580.not, label %.loopexit832, label %.preheader387, !llvm.loop !33

.loopexit832:                                     ; preds = %.preheader387, %middle.block805
  %.1323.lcssa = phi i32 [ %360, %middle.block805 ], [ %.1323, %.preheader387 ]
  %427 = icmp ugt i32 %.1323.lcssa, 1
  br i1 %427, label %.preheader380.preheader, label %445

.preheader380.preheader:                          ; preds = %.loopexit832
  br i1 %102, label %.unr-lcssa954, label %.preheader380

.preheader380:                                    ; preds = %.preheader380.preheader, %.preheader380
  %indvars.iv621 = phi i64 [ %indvars.iv.next622.3, %.preheader380 ], [ 0, %.preheader380.preheader ]
  %niter960 = phi i64 [ %niter960.next.3, %.preheader380 ], [ 0, %.preheader380.preheader ]
  %428 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv621
  %429 = load double, ptr %428, align 16, !tbaa !5
  %430 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv621, i64 %214
  store double %429, ptr %430, align 8, !tbaa !5
  %indvars.iv.next622 = or disjoint i64 %indvars.iv621, 1
  %431 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next622
  %432 = load double, ptr %431, align 8, !tbaa !5
  %433 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next622, i64 %214
  store double %432, ptr %433, align 8, !tbaa !5
  %indvars.iv.next622.1 = or disjoint i64 %indvars.iv621, 2
  %434 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next622.1
  %435 = load double, ptr %434, align 16, !tbaa !5
  %436 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next622.1, i64 %214
  store double %435, ptr %436, align 8, !tbaa !5
  %indvars.iv.next622.2 = or disjoint i64 %indvars.iv621, 3
  %437 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next622.2
  %438 = load double, ptr %437, align 8, !tbaa !5
  %439 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next622.2, i64 %214
  store double %438, ptr %439, align 8, !tbaa !5
  %indvars.iv.next622.3 = add nuw nsw i64 %indvars.iv621, 4
  %niter960.next.3 = add i64 %niter960, 4
  %niter960.ncmp.3 = icmp eq i64 %niter960.next.3, %unroll_iter959
  br i1 %niter960.ncmp.3, label %.unr-lcssa954, label %.preheader380, !llvm.loop !34

.unr-lcssa954:                                    ; preds = %.preheader380, %.preheader380.preheader
  %indvars.iv621.unr = phi i64 [ 0, %.preheader380.preheader ], [ %indvars.iv.next622.3, %.preheader380 ]
  br i1 %lcmp.mod957.not, label %.epilog-lcssa958, label %.preheader380.epil

.preheader380.epil:                               ; preds = %.unr-lcssa954, %.preheader380.epil
  %indvars.iv621.epil = phi i64 [ %indvars.iv.next622.epil, %.preheader380.epil ], [ %indvars.iv621.unr, %.unr-lcssa954 ]
  %epil.iter956 = phi i64 [ %epil.iter956.next, %.preheader380.epil ], [ 0, %.unr-lcssa954 ]
  %440 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv621.epil
  %441 = load double, ptr %440, align 8, !tbaa !5
  %442 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv621.epil, i64 %214
  store double %441, ptr %442, align 8, !tbaa !5
  %indvars.iv.next622.epil = add nuw nsw i64 %indvars.iv621.epil, 1
  %epil.iter956.next = add i64 %epil.iter956, 1
  %epil.iter956.cmp.not = icmp eq i64 %epil.iter956.next, %xtraiter955
  br i1 %epil.iter956.cmp.not, label %.epilog-lcssa958, label %.preheader380.epil, !llvm.loop !35

.epilog-lcssa958:                                 ; preds = %.preheader380.epil, %.unr-lcssa954
  %443 = add i32 %.1316, 1
  %444 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  store double %330, ptr %444, align 8, !tbaa !5
  br label %645

445:                                              ; preds = %.loopexit832
  %446 = icmp eq i32 %.1323.lcssa, 0
  br i1 %446, label %.preheader383.preheader, label %.preheader386

.preheader383.preheader:                          ; preds = %445
  br i1 %min.iters.check794, label %.preheader383.preheader837, label %vector.body799

.preheader383.preheader837:                       ; preds = %middle.block792, %.preheader383.preheader
  %indvars.iv581.ph = phi i64 [ 0, %.preheader383.preheader ], [ %n.vec797, %middle.block792 ]
  br label %.preheader383

vector.body799:                                   ; preds = %.preheader383.preheader
  %wide.load801 = load <2 x double>, ptr %10, align 16, !tbaa !5
  %wide.load802 = load <2 x double>, ptr %75, align 16, !tbaa !5
  %447 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 0, i64 %214
  %448 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 1, i64 %214
  %449 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 2, i64 %214
  %450 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 3, i64 %214
  %451 = load double, ptr %447, align 8, !tbaa !5
  %452 = load double, ptr %448, align 8, !tbaa !5
  %453 = insertelement <2 x double> poison, double %451, i64 0
  %454 = insertelement <2 x double> %453, double %452, i64 1
  %455 = load double, ptr %449, align 8, !tbaa !5
  %456 = load double, ptr %450, align 8, !tbaa !5
  %457 = insertelement <2 x double> poison, double %455, i64 0
  %458 = insertelement <2 x double> %457, double %456, i64 1
  %459 = fsub <2 x double> %454, %wide.load801
  %460 = fsub <2 x double> %458, %wide.load802
  %461 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %459, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load801)
  %462 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %460, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load802)
  store <2 x double> %461, ptr %12, align 16, !tbaa !5
  store <2 x double> %462, ptr %76, align 16, !tbaa !5
  br i1 %77, label %middle.block792, label %vector.body799.1, !llvm.loop !36

vector.body799.1:                                 ; preds = %vector.body799
  %wide.load801.1 = load <2 x double>, ptr %78, align 16, !tbaa !5
  %wide.load802.1 = load <2 x double>, ptr %79, align 16, !tbaa !5
  %463 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 4, i64 %214
  %464 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 5, i64 %214
  %465 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 6, i64 %214
  %466 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 7, i64 %214
  %467 = load double, ptr %463, align 8, !tbaa !5
  %468 = load double, ptr %464, align 8, !tbaa !5
  %469 = insertelement <2 x double> poison, double %467, i64 0
  %470 = insertelement <2 x double> %469, double %468, i64 1
  %471 = load double, ptr %465, align 8, !tbaa !5
  %472 = load double, ptr %466, align 8, !tbaa !5
  %473 = insertelement <2 x double> poison, double %471, i64 0
  %474 = insertelement <2 x double> %473, double %472, i64 1
  %475 = fsub <2 x double> %470, %wide.load801.1
  %476 = fsub <2 x double> %474, %wide.load802.1
  %477 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %475, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load801.1)
  %478 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %476, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load802.1)
  store <2 x double> %477, ptr %80, align 16, !tbaa !5
  store <2 x double> %478, ptr %81, align 16, !tbaa !5
  br i1 %82, label %middle.block792, label %vector.body799.2, !llvm.loop !36

vector.body799.2:                                 ; preds = %vector.body799.1
  %wide.load801.2 = load <2 x double>, ptr %83, align 16, !tbaa !5
  %wide.load802.2 = load <2 x double>, ptr %84, align 16, !tbaa !5
  %479 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 8, i64 %214
  %480 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 9, i64 %214
  %481 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 10, i64 %214
  %482 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 11, i64 %214
  %483 = load double, ptr %479, align 8, !tbaa !5
  %484 = load double, ptr %480, align 8, !tbaa !5
  %485 = insertelement <2 x double> poison, double %483, i64 0
  %486 = insertelement <2 x double> %485, double %484, i64 1
  %487 = load double, ptr %481, align 8, !tbaa !5
  %488 = load double, ptr %482, align 8, !tbaa !5
  %489 = insertelement <2 x double> poison, double %487, i64 0
  %490 = insertelement <2 x double> %489, double %488, i64 1
  %491 = fsub <2 x double> %486, %wide.load801.2
  %492 = fsub <2 x double> %490, %wide.load802.2
  %493 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %491, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load801.2)
  %494 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %492, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load802.2)
  store <2 x double> %493, ptr %85, align 16, !tbaa !5
  store <2 x double> %494, ptr %86, align 16, !tbaa !5
  br i1 %87, label %middle.block792, label %vector.body799.3, !llvm.loop !36

vector.body799.3:                                 ; preds = %vector.body799.2
  %wide.load801.3 = load <2 x double>, ptr %88, align 16, !tbaa !5
  %wide.load802.3 = load <2 x double>, ptr %89, align 16, !tbaa !5
  %495 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 12, i64 %214
  %496 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 13, i64 %214
  %497 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 14, i64 %214
  %498 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 15, i64 %214
  %499 = load double, ptr %495, align 8, !tbaa !5
  %500 = load double, ptr %496, align 8, !tbaa !5
  %501 = insertelement <2 x double> poison, double %499, i64 0
  %502 = insertelement <2 x double> %501, double %500, i64 1
  %503 = load double, ptr %497, align 8, !tbaa !5
  %504 = load double, ptr %498, align 8, !tbaa !5
  %505 = insertelement <2 x double> poison, double %503, i64 0
  %506 = insertelement <2 x double> %505, double %504, i64 1
  %507 = fsub <2 x double> %502, %wide.load801.3
  %508 = fsub <2 x double> %506, %wide.load802.3
  %509 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %507, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load801.3)
  %510 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %508, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load802.3)
  store <2 x double> %509, ptr %90, align 16, !tbaa !5
  store <2 x double> %510, ptr %91, align 16, !tbaa !5
  br i1 %92, label %middle.block792, label %vector.body799.4, !llvm.loop !36

vector.body799.4:                                 ; preds = %vector.body799.3
  %wide.load801.4 = load <2 x double>, ptr %93, align 16, !tbaa !5
  %wide.load802.4 = load <2 x double>, ptr %94, align 16, !tbaa !5
  %511 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 16, i64 %214
  %512 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 17, i64 %214
  %513 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 18, i64 %214
  %514 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 19, i64 %214
  %515 = load double, ptr %511, align 8, !tbaa !5
  %516 = load double, ptr %512, align 8, !tbaa !5
  %517 = insertelement <2 x double> poison, double %515, i64 0
  %518 = insertelement <2 x double> %517, double %516, i64 1
  %519 = load double, ptr %513, align 8, !tbaa !5
  %520 = load double, ptr %514, align 8, !tbaa !5
  %521 = insertelement <2 x double> poison, double %519, i64 0
  %522 = insertelement <2 x double> %521, double %520, i64 1
  %523 = fsub <2 x double> %518, %wide.load801.4
  %524 = fsub <2 x double> %522, %wide.load802.4
  %525 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %523, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load801.4)
  %526 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %524, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load802.4)
  store <2 x double> %525, ptr %95, align 16, !tbaa !5
  store <2 x double> %526, ptr %96, align 16, !tbaa !5
  br label %middle.block792

middle.block792:                                  ; preds = %vector.body799.4, %vector.body799.3, %vector.body799.2, %vector.body799.1, %vector.body799
  br i1 %cmp.n804, label %.loopexit, label %.preheader383.preheader837

.preheader386:                                    ; preds = %445
  br i1 %min.iters.check794, label %scalar.ph778.preheader, label %vector.body784

scalar.ph778.preheader:                           ; preds = %middle.block777, %.preheader386
  %indvars.iv601.ph = phi i64 [ 0, %.preheader386 ], [ %n.vec782, %middle.block777 ]
  br label %scalar.ph778

vector.body784:                                   ; preds = %.preheader386, %vector.body784
  %index785 = phi i64 [ %index.next790, %vector.body784 ], [ 0, %.preheader386 ]
  %527 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %index785
  %528 = getelementptr inbounds i8, ptr %527, i64 16
  %wide.load786 = load <2 x double>, ptr %527, align 16, !tbaa !5
  %wide.load787 = load <2 x double>, ptr %528, align 16, !tbaa !5
  %529 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %index785
  %530 = getelementptr inbounds i8, ptr %529, i64 16
  %wide.load788 = load <2 x double>, ptr %529, align 16, !tbaa !5
  %wide.load789 = load <2 x double>, ptr %530, align 16, !tbaa !5
  %531 = fsub <2 x double> %wide.load788, %wide.load786
  %532 = fsub <2 x double> %wide.load789, %wide.load787
  %533 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %531, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load786)
  %534 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %532, <2 x double> <double 5.000000e-01, double 5.000000e-01>, <2 x double> %wide.load787)
  %535 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %index785
  %536 = getelementptr inbounds i8, ptr %535, i64 16
  store <2 x double> %533, ptr %535, align 16, !tbaa !5
  store <2 x double> %534, ptr %536, align 16, !tbaa !5
  %index.next790 = add nuw i64 %index785, 4
  %537 = icmp eq i64 %index.next790, %n.vec782
  br i1 %537, label %middle.block777, label %vector.body784, !llvm.loop !37

middle.block777:                                  ; preds = %vector.body784
  br i1 %cmp.n791, label %.loopexit835, label %scalar.ph778.preheader

.preheader383:                                    ; preds = %.preheader383.preheader837, %.preheader383
  %indvars.iv581 = phi i64 [ %indvars.iv.next582, %.preheader383 ], [ %indvars.iv581.ph, %.preheader383.preheader837 ]
  %538 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %indvars.iv581
  %539 = load double, ptr %538, align 8, !tbaa !5
  %540 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv581, i64 %214
  %541 = load double, ptr %540, align 8, !tbaa !5
  %542 = fsub double %541, %539
  %543 = call double @llvm.fmuladd.f64(double %542, double 5.000000e-01, double %539)
  %544 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv581
  store double %543, ptr %544, align 8, !tbaa !5
  %indvars.iv.next582 = add nuw nsw i64 %indvars.iv581, 1
  %exitcond585.not = icmp eq i64 %indvars.iv.next582, %30
  br i1 %exitcond585.not, label %.loopexit, label %.preheader383, !llvm.loop !38

.loopexit:                                        ; preds = %.preheader383, %middle.block792
  %545 = call double @f(ptr noundef nonnull %12) #8
  %546 = add i32 %.1316, 2
  %547 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  %548 = load double, ptr %547, align 8, !tbaa !5
  %549 = fcmp olt double %548, %545
  br i1 %549, label %.preheader381, label %.preheader382

.preheader382:                                    ; preds = %.loopexit
  %550 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  br i1 %101, label %.unr-lcssa946, label %.preheader382.new

.preheader381:                                    ; preds = %.loopexit
  %551 = zext i32 %.2328 to i64
  br label %.preheader374

.preheader374:                                    ; preds = %.preheader381, %573
  %indvars.iv591 = phi i64 [ 0, %.preheader381 ], [ %indvars.iv.next592, %573 ]
  br i1 %97, label %.unr-lcssa917, label %.preheader374.new

.preheader374.new:                                ; preds = %.preheader374, %.preheader374.new
  %indvars.iv586 = phi i64 [ %indvars.iv.next587.1, %.preheader374.new ], [ 0, %.preheader374 ]
  %niter924 = phi i64 [ %niter924.next.1, %.preheader374.new ], [ 0, %.preheader374 ]
  %552 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv586, i64 %indvars.iv591
  %553 = load double, ptr %552, align 8, !tbaa !5
  %554 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv586, i64 %551
  %555 = load double, ptr %554, align 8, !tbaa !5
  %556 = fadd double %553, %555
  %557 = fmul double %556, 5.000000e-01
  store double %557, ptr %552, align 8, !tbaa !5
  %558 = getelementptr inbounds [20 x double], ptr %7, i64 0, i64 %indvars.iv586
  store double %557, ptr %558, align 16, !tbaa !5
  %indvars.iv.next587 = or disjoint i64 %indvars.iv586, 1
  %559 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next587, i64 %indvars.iv591
  %560 = load double, ptr %559, align 8, !tbaa !5
  %561 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next587, i64 %551
  %562 = load double, ptr %561, align 8, !tbaa !5
  %563 = fadd double %560, %562
  %564 = fmul double %563, 5.000000e-01
  store double %564, ptr %559, align 8, !tbaa !5
  %565 = getelementptr inbounds [20 x double], ptr %7, i64 0, i64 %indvars.iv.next587
  store double %564, ptr %565, align 8, !tbaa !5
  %indvars.iv.next587.1 = add nuw nsw i64 %indvars.iv586, 2
  %niter924.next.1 = add i64 %niter924, 2
  %niter924.ncmp.1 = icmp eq i64 %niter924.next.1, %unroll_iter923
  br i1 %niter924.ncmp.1, label %.unr-lcssa917, label %.preheader374.new, !llvm.loop !39

.unr-lcssa917:                                    ; preds = %.preheader374.new, %.preheader374
  %indvars.iv586.unr = phi i64 [ 0, %.preheader374 ], [ %indvars.iv.next587.1, %.preheader374.new ]
  br i1 %lcmp.mod921.not, label %573, label %.epilog-lcssa922

.epilog-lcssa922:                                 ; preds = %.unr-lcssa917
  %566 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv586.unr, i64 %indvars.iv591
  %567 = load double, ptr %566, align 8, !tbaa !5
  %568 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv586.unr, i64 %551
  %569 = load double, ptr %568, align 8, !tbaa !5
  %570 = fadd double %567, %569
  %571 = fmul double %570, 5.000000e-01
  store double %571, ptr %566, align 8, !tbaa !5
  %572 = getelementptr inbounds [20 x double], ptr %7, i64 0, i64 %indvars.iv586.unr
  store double %571, ptr %572, align 8, !tbaa !5
  br label %573

573:                                              ; preds = %.unr-lcssa917, %.epilog-lcssa922
  %574 = call double @f(ptr noundef nonnull %7) #8
  %575 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv591
  store double %574, ptr %575, align 8, !tbaa !5
  %indvars.iv.next592 = add nuw nsw i64 %indvars.iv591, 1
  %exitcond595.not = icmp eq i64 %indvars.iv.next592, %28
  br i1 %exitcond595.not, label %576, label %.preheader374, !llvm.loop !40

576:                                              ; preds = %573
  %577 = add i32 %546, %25
  %578 = icmp ugt i32 %577, %5
  br i1 %578, label %.loopexit394, label %.lr.ph472.preheader

.lr.ph472.preheader:                              ; preds = %576
  %579 = load double, ptr %9, align 16, !tbaa !5
  br i1 %98, label %.lr.ph456.preheader.loopexit.unr-lcssa, label %.lr.ph472

.lr.ph472:                                        ; preds = %.lr.ph472.preheader, %.lr.ph472
  %indvars.iv596 = phi i64 [ %indvars.iv.next597.1, %.lr.ph472 ], [ 1, %.lr.ph472.preheader ]
  %.3470 = phi double [ %.4.1, %.lr.ph472 ], [ %579, %.lr.ph472.preheader ]
  %.3329469 = phi i32 [ %.4330.1, %.lr.ph472 ], [ 0, %.lr.ph472.preheader ]
  %niter931 = phi i64 [ %niter931.next.1, %.lr.ph472 ], [ 0, %.lr.ph472.preheader ]
  %580 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv596
  %581 = load double, ptr %580, align 8, !tbaa !5
  %582 = fcmp olt double %581, %.3470
  %583 = trunc nuw nsw i64 %indvars.iv596 to i32
  %.4330 = select i1 %582, i32 %583, i32 %.3329469
  %.4 = select i1 %582, double %581, double %.3470
  %indvars.iv.next597 = add nuw nsw i64 %indvars.iv596, 1
  %584 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next597
  %585 = load double, ptr %584, align 8, !tbaa !5
  %586 = fcmp olt double %585, %.4
  %587 = trunc nuw nsw i64 %indvars.iv.next597 to i32
  %.4330.1 = select i1 %586, i32 %587, i32 %.4330
  %.4.1 = select i1 %586, double %585, double %.4
  %indvars.iv.next597.1 = add nuw nsw i64 %indvars.iv596, 2
  %niter931.next.1 = add i64 %niter931, 2
  %niter931.ncmp.1 = icmp eq i64 %niter931.next.1, %unroll_iter930
  br i1 %niter931.ncmp.1, label %.lr.ph456.preheader.loopexit.unr-lcssa, label %.lr.ph472, !llvm.loop !17

.preheader382.new:                                ; preds = %.preheader382, %.preheader382.new
  %indvars.iv616 = phi i64 [ %indvars.iv.next617.3, %.preheader382.new ], [ 0, %.preheader382 ]
  %niter953 = phi i64 [ %niter953.next.3, %.preheader382.new ], [ 0, %.preheader382 ]
  %588 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv616
  %589 = load double, ptr %588, align 16, !tbaa !5
  %590 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv616, i64 %214
  store double %589, ptr %590, align 8, !tbaa !5
  %indvars.iv.next617 = or disjoint i64 %indvars.iv616, 1
  %591 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next617
  %592 = load double, ptr %591, align 8, !tbaa !5
  %593 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next617, i64 %214
  store double %592, ptr %593, align 8, !tbaa !5
  %indvars.iv.next617.1 = or disjoint i64 %indvars.iv616, 2
  %594 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next617.1
  %595 = load double, ptr %594, align 16, !tbaa !5
  %596 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next617.1, i64 %214
  store double %595, ptr %596, align 8, !tbaa !5
  %indvars.iv.next617.2 = or disjoint i64 %indvars.iv616, 3
  %597 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next617.2
  %598 = load double, ptr %597, align 8, !tbaa !5
  %599 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next617.2, i64 %214
  store double %598, ptr %599, align 8, !tbaa !5
  %indvars.iv.next617.3 = add nuw nsw i64 %indvars.iv616, 4
  %niter953.next.3 = add i64 %niter953, 4
  %niter953.ncmp.3 = icmp eq i64 %niter953.next.3, %unroll_iter952
  br i1 %niter953.ncmp.3, label %.unr-lcssa946, label %.preheader382.new, !llvm.loop !41

.unr-lcssa946:                                    ; preds = %.preheader382.new, %.preheader382
  %indvars.iv616.unr = phi i64 [ 0, %.preheader382 ], [ %indvars.iv.next617.3, %.preheader382.new ]
  br i1 %lcmp.mod950.not, label %.epilog-lcssa951, label %.epil.preheader947

.epil.preheader947:                               ; preds = %.unr-lcssa946, %.epil.preheader947
  %indvars.iv616.epil = phi i64 [ %indvars.iv.next617.epil, %.epil.preheader947 ], [ %indvars.iv616.unr, %.unr-lcssa946 ]
  %epil.iter949 = phi i64 [ %epil.iter949.next, %.epil.preheader947 ], [ 0, %.unr-lcssa946 ]
  %600 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv616.epil
  %601 = load double, ptr %600, align 8, !tbaa !5
  %602 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv616.epil, i64 %214
  store double %601, ptr %602, align 8, !tbaa !5
  %indvars.iv.next617.epil = add nuw nsw i64 %indvars.iv616.epil, 1
  %epil.iter949.next = add i64 %epil.iter949, 1
  %epil.iter949.cmp.not = icmp eq i64 %epil.iter949.next, %xtraiter948
  br i1 %epil.iter949.cmp.not, label %.epilog-lcssa951, label %.epil.preheader947, !llvm.loop !42

.epilog-lcssa951:                                 ; preds = %.epil.preheader947, %.unr-lcssa946
  store double %545, ptr %550, align 8, !tbaa !5
  br label %645

scalar.ph778:                                     ; preds = %scalar.ph778.preheader, %scalar.ph778
  %indvars.iv601 = phi i64 [ %indvars.iv.next602, %scalar.ph778 ], [ %indvars.iv601.ph, %scalar.ph778.preheader ]
  %603 = getelementptr inbounds [20 x double], ptr %10, i64 0, i64 %indvars.iv601
  %604 = load double, ptr %603, align 8, !tbaa !5
  %605 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv601
  %606 = load double, ptr %605, align 8, !tbaa !5
  %607 = fsub double %606, %604
  %608 = call double @llvm.fmuladd.f64(double %607, double 5.000000e-01, double %604)
  %609 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv601
  store double %608, ptr %609, align 8, !tbaa !5
  %indvars.iv.next602 = add nuw nsw i64 %indvars.iv601, 1
  %exitcond605.not = icmp eq i64 %indvars.iv.next602, %30
  br i1 %exitcond605.not, label %.loopexit835, label %scalar.ph778, !llvm.loop !43

.loopexit835:                                     ; preds = %scalar.ph778, %middle.block777
  %610 = call double @f(ptr noundef nonnull %12) #8
  %611 = add i32 %.1316, 2
  %612 = fcmp ugt double %610, %330
  br i1 %612, label %.preheader384.preheader, label %.preheader385.preheader

.preheader385.preheader:                          ; preds = %.loopexit835
  br i1 %99, label %.unr-lcssa932, label %.preheader385

.preheader384.preheader:                          ; preds = %.loopexit835
  br i1 %100, label %.unr-lcssa939, label %.preheader384

.preheader385:                                    ; preds = %.preheader385.preheader, %.preheader385
  %indvars.iv606 = phi i64 [ %indvars.iv.next607.3, %.preheader385 ], [ 0, %.preheader385.preheader ]
  %niter938 = phi i64 [ %niter938.next.3, %.preheader385 ], [ 0, %.preheader385.preheader ]
  %613 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv606
  %614 = load double, ptr %613, align 16, !tbaa !5
  %615 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv606, i64 %214
  store double %614, ptr %615, align 8, !tbaa !5
  %indvars.iv.next607 = or disjoint i64 %indvars.iv606, 1
  %616 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next607
  %617 = load double, ptr %616, align 8, !tbaa !5
  %618 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next607, i64 %214
  store double %617, ptr %618, align 8, !tbaa !5
  %indvars.iv.next607.1 = or disjoint i64 %indvars.iv606, 2
  %619 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next607.1
  %620 = load double, ptr %619, align 16, !tbaa !5
  %621 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next607.1, i64 %214
  store double %620, ptr %621, align 8, !tbaa !5
  %indvars.iv.next607.2 = or disjoint i64 %indvars.iv606, 3
  %622 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv.next607.2
  %623 = load double, ptr %622, align 8, !tbaa !5
  %624 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next607.2, i64 %214
  store double %623, ptr %624, align 8, !tbaa !5
  %indvars.iv.next607.3 = add nuw nsw i64 %indvars.iv606, 4
  %niter938.next.3 = add i64 %niter938, 4
  %niter938.ncmp.3 = icmp eq i64 %niter938.next.3, %unroll_iter937
  br i1 %niter938.ncmp.3, label %.unr-lcssa932, label %.preheader385, !llvm.loop !44

.unr-lcssa932:                                    ; preds = %.preheader385, %.preheader385.preheader
  %indvars.iv606.unr = phi i64 [ 0, %.preheader385.preheader ], [ %indvars.iv.next607.3, %.preheader385 ]
  br i1 %lcmp.mod935.not, label %.epilog-lcssa936, label %.preheader385.epil

.preheader385.epil:                               ; preds = %.unr-lcssa932, %.preheader385.epil
  %indvars.iv606.epil = phi i64 [ %indvars.iv.next607.epil, %.preheader385.epil ], [ %indvars.iv606.unr, %.unr-lcssa932 ]
  %epil.iter934 = phi i64 [ %epil.iter934.next, %.preheader385.epil ], [ 0, %.unr-lcssa932 ]
  %625 = getelementptr inbounds [20 x double], ptr %12, i64 0, i64 %indvars.iv606.epil
  %626 = load double, ptr %625, align 8, !tbaa !5
  %627 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv606.epil, i64 %214
  store double %626, ptr %627, align 8, !tbaa !5
  %indvars.iv.next607.epil = add nuw nsw i64 %indvars.iv606.epil, 1
  %epil.iter934.next = add i64 %epil.iter934, 1
  %epil.iter934.cmp.not = icmp eq i64 %epil.iter934.next, %xtraiter933
  br i1 %epil.iter934.cmp.not, label %.epilog-lcssa936, label %.preheader385.epil, !llvm.loop !45

.epilog-lcssa936:                                 ; preds = %.preheader385.epil, %.unr-lcssa932
  %628 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  store double %610, ptr %628, align 8, !tbaa !5
  br label %645

.preheader384:                                    ; preds = %.preheader384.preheader, %.preheader384
  %indvars.iv611 = phi i64 [ %indvars.iv.next612.3, %.preheader384 ], [ 0, %.preheader384.preheader ]
  %niter945 = phi i64 [ %niter945.next.3, %.preheader384 ], [ 0, %.preheader384.preheader ]
  %629 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv611
  %630 = load double, ptr %629, align 16, !tbaa !5
  %631 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv611, i64 %214
  store double %630, ptr %631, align 8, !tbaa !5
  %indvars.iv.next612 = or disjoint i64 %indvars.iv611, 1
  %632 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next612
  %633 = load double, ptr %632, align 8, !tbaa !5
  %634 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next612, i64 %214
  store double %633, ptr %634, align 8, !tbaa !5
  %indvars.iv.next612.1 = or disjoint i64 %indvars.iv611, 2
  %635 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next612.1
  %636 = load double, ptr %635, align 16, !tbaa !5
  %637 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next612.1, i64 %214
  store double %636, ptr %637, align 8, !tbaa !5
  %indvars.iv.next612.2 = or disjoint i64 %indvars.iv611, 3
  %638 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv.next612.2
  %639 = load double, ptr %638, align 8, !tbaa !5
  %640 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv.next612.2, i64 %214
  store double %639, ptr %640, align 8, !tbaa !5
  %indvars.iv.next612.3 = add nuw nsw i64 %indvars.iv611, 4
  %niter945.next.3 = add i64 %niter945, 4
  %niter945.ncmp.3 = icmp eq i64 %niter945.next.3, %unroll_iter944
  br i1 %niter945.ncmp.3, label %.unr-lcssa939, label %.preheader384, !llvm.loop !46

.unr-lcssa939:                                    ; preds = %.preheader384, %.preheader384.preheader
  %indvars.iv611.unr = phi i64 [ 0, %.preheader384.preheader ], [ %indvars.iv.next612.3, %.preheader384 ]
  br i1 %lcmp.mod942.not, label %.epilog-lcssa943, label %.preheader384.epil

.preheader384.epil:                               ; preds = %.unr-lcssa939, %.preheader384.epil
  %indvars.iv611.epil = phi i64 [ %indvars.iv.next612.epil, %.preheader384.epil ], [ %indvars.iv611.unr, %.unr-lcssa939 ]
  %epil.iter941 = phi i64 [ %epil.iter941.next, %.preheader384.epil ], [ 0, %.unr-lcssa939 ]
  %641 = getelementptr inbounds [20 x double], ptr %11, i64 0, i64 %indvars.iv611.epil
  %642 = load double, ptr %641, align 8, !tbaa !5
  %643 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv611.epil, i64 %214
  store double %642, ptr %643, align 8, !tbaa !5
  %indvars.iv.next612.epil = add nuw nsw i64 %indvars.iv611.epil, 1
  %epil.iter941.next = add i64 %epil.iter941, 1
  %epil.iter941.cmp.not = icmp eq i64 %epil.iter941.next, %xtraiter940
  br i1 %epil.iter941.cmp.not, label %.epilog-lcssa943, label %.preheader384.epil, !llvm.loop !47

.epilog-lcssa943:                                 ; preds = %.preheader384.epil, %.unr-lcssa939
  %644 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %214
  store double %330, ptr %644, align 8, !tbaa !5
  br label %645

645:                                              ; preds = %.epilog-lcssa958, %.epilog-lcssa943, %.epilog-lcssa936, %.epilog-lcssa951, %.epilog-lcssa972, %.epilog-lcssa965
  %646 = phi double [ %330, %.epilog-lcssa972 ], [ %388, %.epilog-lcssa965 ], [ %330, %.epilog-lcssa958 ], [ %545, %.epilog-lcssa951 ], [ %610, %.epilog-lcssa936 ], [ %330, %.epilog-lcssa943 ]
  %.2317 = phi i32 [ %389, %.epilog-lcssa972 ], [ %389, %.epilog-lcssa965 ], [ %443, %.epilog-lcssa958 ], [ %546, %.epilog-lcssa951 ], [ %611, %.epilog-lcssa936 ], [ %611, %.epilog-lcssa943 ]
  %647 = fcmp olt double %646, %.2311
  %.5331 = select i1 %647, i32 %.1325.lcssa, i32 %.2328
  %.5 = select i1 %647, double %646, double %.2311
  %648 = add i32 %.1344.ph, -1
  %.not367 = icmp eq i32 %648, 0
  br i1 %.not367, label %649, label %.outer.backedge

.outer.backedge:                                  ; preds = %645, %.epilog-lcssa989
  %.1344.ph.be = phi i32 [ %4, %.epilog-lcssa989 ], [ %648, %645 ]
  %.pre.pre = load double, ptr %9, align 16, !tbaa !5
  br label %.outer

.outer:                                           ; preds = %.outer.preheader, %.outer.backedge
  %.pre = phi double [ %.pre.pre, %.outer.backedge ], [ %192, %.outer.preheader ]
  %.1344.ph = phi i32 [ %.1344.ph.be, %.outer.backedge ], [ %.0343, %.outer.preheader ]
  %.2328.ph = phi i32 [ %.5331, %.outer.backedge ], [ %.1327.lcssa, %.outer.preheader ]
  %.1316.ph = phi i32 [ %.2317, %.outer.backedge ], [ %191, %.outer.preheader ]
  %.2311.ph = phi double [ %.5, %.outer.backedge ], [ %.1310.lcssa, %.outer.preheader ]
  br label %.lr.ph456.preheader

649:                                              ; preds = %645
  %.not368 = icmp ugt i32 %.2317, %5
  br i1 %.not368, label %.loopexit394.loopexit497, label %.preheader376.preheader

.preheader376.preheader:                          ; preds = %649
  br i1 %136, label %.unr-lcssa975, label %.preheader376

.preheader376:                                    ; preds = %.preheader376.preheader, %.preheader376
  %indvars.iv641 = phi i64 [ %indvars.iv.next642.7, %.preheader376 ], [ 0, %.preheader376.preheader ]
  %.1486 = phi double [ %673, %.preheader376 ], [ 0.000000e+00, %.preheader376.preheader ]
  %niter982 = phi i64 [ %niter982.next.7, %.preheader376 ], [ 0, %.preheader376.preheader ]
  %650 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv641
  %651 = load double, ptr %650, align 16, !tbaa !5
  %652 = fadd double %.1486, %651
  %indvars.iv.next642 = or disjoint i64 %indvars.iv641, 1
  %653 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642
  %654 = load double, ptr %653, align 8, !tbaa !5
  %655 = fadd double %652, %654
  %indvars.iv.next642.1 = or disjoint i64 %indvars.iv641, 2
  %656 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.1
  %657 = load double, ptr %656, align 16, !tbaa !5
  %658 = fadd double %655, %657
  %indvars.iv.next642.2 = or disjoint i64 %indvars.iv641, 3
  %659 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.2
  %660 = load double, ptr %659, align 8, !tbaa !5
  %661 = fadd double %658, %660
  %indvars.iv.next642.3 = or disjoint i64 %indvars.iv641, 4
  %662 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.3
  %663 = load double, ptr %662, align 16, !tbaa !5
  %664 = fadd double %661, %663
  %indvars.iv.next642.4 = or disjoint i64 %indvars.iv641, 5
  %665 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.4
  %666 = load double, ptr %665, align 8, !tbaa !5
  %667 = fadd double %664, %666
  %indvars.iv.next642.5 = or disjoint i64 %indvars.iv641, 6
  %668 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.5
  %669 = load double, ptr %668, align 16, !tbaa !5
  %670 = fadd double %667, %669
  %indvars.iv.next642.6 = or disjoint i64 %indvars.iv641, 7
  %671 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next642.6
  %672 = load double, ptr %671, align 8, !tbaa !5
  %673 = fadd double %670, %672
  %indvars.iv.next642.7 = add nuw nsw i64 %indvars.iv641, 8
  %niter982.next.7 = add i64 %niter982, 8
  %niter982.ncmp.7 = icmp eq i64 %niter982.next.7, %unroll_iter981
  br i1 %niter982.ncmp.7, label %.unr-lcssa975, label %.preheader376, !llvm.loop !48

.unr-lcssa975:                                    ; preds = %.preheader376, %.preheader376.preheader
  %.lcssa880.ph = phi double [ poison, %.preheader376.preheader ], [ %673, %.preheader376 ]
  %indvars.iv641.unr = phi i64 [ 0, %.preheader376.preheader ], [ %indvars.iv.next642.7, %.preheader376 ]
  %.1486.unr = phi double [ 0.000000e+00, %.preheader376.preheader ], [ %673, %.preheader376 ]
  br i1 %lcmp.mod978.not, label %.epilog-lcssa979, label %.preheader376.epil

.preheader376.epil:                               ; preds = %.unr-lcssa975, %.preheader376.epil
  %indvars.iv641.epil = phi i64 [ %indvars.iv.next642.epil, %.preheader376.epil ], [ %indvars.iv641.unr, %.unr-lcssa975 ]
  %.1486.epil = phi double [ %676, %.preheader376.epil ], [ %.1486.unr, %.unr-lcssa975 ]
  %epil.iter977 = phi i64 [ %epil.iter977.next, %.preheader376.epil ], [ 0, %.unr-lcssa975 ]
  %674 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv641.epil
  %675 = load double, ptr %674, align 8, !tbaa !5
  %676 = fadd double %.1486.epil, %675
  %indvars.iv.next642.epil = add nuw nsw i64 %indvars.iv641.epil, 1
  %epil.iter977.next = add i64 %epil.iter977, 1
  %epil.iter977.cmp.not = icmp eq i64 %epil.iter977.next, %xtraiter976
  br i1 %epil.iter977.cmp.not, label %.epilog-lcssa979, label %.preheader376.epil, !llvm.loop !49

.epilog-lcssa979:                                 ; preds = %.preheader376.epil, %.unr-lcssa975
  %.lcssa880 = phi double [ %.lcssa880.ph, %.unr-lcssa975 ], [ %676, %.preheader376.epil ]
  %677 = fdiv double %.lcssa880, %26
  br i1 %137, label %.unr-lcssa984, label %.new983

.new983:                                          ; preds = %.epilog-lcssa979, %.new983
  %indvars.iv646 = phi i64 [ %indvars.iv.next647.3, %.new983 ], [ 0, %.epilog-lcssa979 ]
  %.2488 = phi double [ %693, %.new983 ], [ 0.000000e+00, %.epilog-lcssa979 ]
  %niter992 = phi i64 [ %niter992.next.3, %.new983 ], [ 0, %.epilog-lcssa979 ]
  %678 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv646
  %679 = load double, ptr %678, align 16, !tbaa !5
  %680 = fsub double %679, %677
  %square = fmul double %680, %680
  %681 = fadd double %.2488, %square
  %indvars.iv.next647 = or disjoint i64 %indvars.iv646, 1
  %682 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next647
  %683 = load double, ptr %682, align 8, !tbaa !5
  %684 = fsub double %683, %677
  %square.1 = fmul double %684, %684
  %685 = fadd double %681, %square.1
  %indvars.iv.next647.1 = or disjoint i64 %indvars.iv646, 2
  %686 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next647.1
  %687 = load double, ptr %686, align 16, !tbaa !5
  %688 = fsub double %687, %677
  %square.2 = fmul double %688, %688
  %689 = fadd double %685, %square.2
  %indvars.iv.next647.2 = or disjoint i64 %indvars.iv646, 3
  %690 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv.next647.2
  %691 = load double, ptr %690, align 8, !tbaa !5
  %692 = fsub double %691, %677
  %square.3 = fmul double %692, %692
  %693 = fadd double %689, %square.3
  %indvars.iv.next647.3 = add nuw nsw i64 %indvars.iv646, 4
  %niter992.next.3 = add i64 %niter992, 4
  %niter992.ncmp.3 = icmp eq i64 %niter992.next.3, %unroll_iter991
  br i1 %niter992.ncmp.3, label %.unr-lcssa984, label %.new983, !llvm.loop !50

.unr-lcssa984:                                    ; preds = %.new983, %.epilog-lcssa979
  %.lcssa881.ph = phi double [ poison, %.epilog-lcssa979 ], [ %693, %.new983 ]
  %indvars.iv646.unr = phi i64 [ 0, %.epilog-lcssa979 ], [ %indvars.iv.next647.3, %.new983 ]
  %.2488.unr = phi double [ 0.000000e+00, %.epilog-lcssa979 ], [ %693, %.new983 ]
  br i1 %lcmp.mod988.not, label %.epilog-lcssa989, label %.epil.preheader985

.epil.preheader985:                               ; preds = %.unr-lcssa984, %.epil.preheader985
  %indvars.iv646.epil = phi i64 [ %indvars.iv.next647.epil, %.epil.preheader985 ], [ %indvars.iv646.unr, %.unr-lcssa984 ]
  %.2488.epil = phi double [ %697, %.epil.preheader985 ], [ %.2488.unr, %.unr-lcssa984 ]
  %epil.iter987 = phi i64 [ %epil.iter987.next, %.epil.preheader985 ], [ 0, %.unr-lcssa984 ]
  %694 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %indvars.iv646.epil
  %695 = load double, ptr %694, align 8, !tbaa !5
  %696 = fsub double %695, %677
  %square.epil = fmul double %696, %696
  %697 = fadd double %.2488.epil, %square.epil
  %indvars.iv.next647.epil = add nuw nsw i64 %indvars.iv646.epil, 1
  %epil.iter987.next = add i64 %epil.iter987, 1
  %epil.iter987.cmp.not = icmp eq i64 %epil.iter987.next, %xtraiter986
  br i1 %epil.iter987.cmp.not, label %.epilog-lcssa989, label %.epil.preheader985, !llvm.loop !51

.epilog-lcssa989:                                 ; preds = %.epil.preheader985, %.unr-lcssa984
  %.lcssa881 = phi double [ %.lcssa881.ph, %.unr-lcssa984 ], [ %697, %.epil.preheader985 ]
  %698 = fcmp olt double %27, %.lcssa881
  br i1 %698, label %.outer.backedge, label %.loopexit394.loopexit497

.loopexit394.loopexit497:                         ; preds = %.epilog-lcssa989, %649
  %.2345.ph = phi i32 [ %4, %.epilog-lcssa989 ], [ 0, %649 ]
  %.pre669 = zext i32 %.5331 to i64
  br label %.loopexit394

.loopexit394:                                     ; preds = %576, %.loopexit394.loopexit497
  %.pre-phi = phi i64 [ %.pre669, %.loopexit394.loopexit497 ], [ %551, %576 ]
  %.2345 = phi i32 [ %.2345.ph, %.loopexit394.loopexit497 ], [ %.1344.ph, %576 ]
  %.3318 = phi i32 [ %.2317, %.loopexit394.loopexit497 ], [ %577, %576 ]
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.body

vector.body:                                      ; preds = %.loopexit394
  %699 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 0, i64 %.pre-phi
  %700 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 1, i64 %.pre-phi
  %701 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 2, i64 %.pre-phi
  %702 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 3, i64 %.pre-phi
  %703 = load double, ptr %699, align 8, !tbaa !5
  %704 = load double, ptr %700, align 8, !tbaa !5
  %705 = insertelement <2 x double> poison, double %703, i64 0
  %706 = insertelement <2 x double> %705, double %704, i64 1
  %707 = load double, ptr %701, align 8, !tbaa !5
  %708 = load double, ptr %702, align 8, !tbaa !5
  %709 = insertelement <2 x double> poison, double %707, i64 0
  %710 = insertelement <2 x double> %709, double %708, i64 1
  store <2 x double> %706, ptr %7, align 16, !tbaa !5
  store <2 x double> %710, ptr %138, align 16, !tbaa !5
  br i1 %139, label %middle.block, label %vector.body.1, !llvm.loop !52

vector.body.1:                                    ; preds = %vector.body
  %711 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 4, i64 %.pre-phi
  %712 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 5, i64 %.pre-phi
  %713 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 6, i64 %.pre-phi
  %714 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 7, i64 %.pre-phi
  %715 = load double, ptr %711, align 8, !tbaa !5
  %716 = load double, ptr %712, align 8, !tbaa !5
  %717 = insertelement <2 x double> poison, double %715, i64 0
  %718 = insertelement <2 x double> %717, double %716, i64 1
  %719 = load double, ptr %713, align 8, !tbaa !5
  %720 = load double, ptr %714, align 8, !tbaa !5
  %721 = insertelement <2 x double> poison, double %719, i64 0
  %722 = insertelement <2 x double> %721, double %720, i64 1
  store <2 x double> %718, ptr %140, align 16, !tbaa !5
  store <2 x double> %722, ptr %141, align 16, !tbaa !5
  br i1 %142, label %middle.block, label %vector.body.2, !llvm.loop !52

vector.body.2:                                    ; preds = %vector.body.1
  %723 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 8, i64 %.pre-phi
  %724 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 9, i64 %.pre-phi
  %725 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 10, i64 %.pre-phi
  %726 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 11, i64 %.pre-phi
  %727 = load double, ptr %723, align 8, !tbaa !5
  %728 = load double, ptr %724, align 8, !tbaa !5
  %729 = insertelement <2 x double> poison, double %727, i64 0
  %730 = insertelement <2 x double> %729, double %728, i64 1
  %731 = load double, ptr %725, align 8, !tbaa !5
  %732 = load double, ptr %726, align 8, !tbaa !5
  %733 = insertelement <2 x double> poison, double %731, i64 0
  %734 = insertelement <2 x double> %733, double %732, i64 1
  store <2 x double> %730, ptr %143, align 16, !tbaa !5
  store <2 x double> %734, ptr %144, align 16, !tbaa !5
  br i1 %145, label %middle.block, label %vector.body.3, !llvm.loop !52

vector.body.3:                                    ; preds = %vector.body.2
  %735 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 12, i64 %.pre-phi
  %736 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 13, i64 %.pre-phi
  %737 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 14, i64 %.pre-phi
  %738 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 15, i64 %.pre-phi
  %739 = load double, ptr %735, align 8, !tbaa !5
  %740 = load double, ptr %736, align 8, !tbaa !5
  %741 = insertelement <2 x double> poison, double %739, i64 0
  %742 = insertelement <2 x double> %741, double %740, i64 1
  %743 = load double, ptr %737, align 8, !tbaa !5
  %744 = load double, ptr %738, align 8, !tbaa !5
  %745 = insertelement <2 x double> poison, double %743, i64 0
  %746 = insertelement <2 x double> %745, double %744, i64 1
  store <2 x double> %742, ptr %146, align 16, !tbaa !5
  store <2 x double> %746, ptr %147, align 16, !tbaa !5
  br i1 %148, label %middle.block, label %vector.body.4, !llvm.loop !52

vector.body.4:                                    ; preds = %vector.body.3
  %747 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 16, i64 %.pre-phi
  %748 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 17, i64 %.pre-phi
  %749 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 18, i64 %.pre-phi
  %750 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 19, i64 %.pre-phi
  %751 = load double, ptr %747, align 8, !tbaa !5
  %752 = load double, ptr %748, align 8, !tbaa !5
  %753 = insertelement <2 x double> poison, double %751, i64 0
  %754 = insertelement <2 x double> %753, double %752, i64 1
  %755 = load double, ptr %749, align 8, !tbaa !5
  %756 = load double, ptr %750, align 8, !tbaa !5
  %757 = insertelement <2 x double> poison, double %755, i64 0
  %758 = insertelement <2 x double> %757, double %756, i64 1
  store <2 x double> %754, ptr %149, align 16, !tbaa !5
  store <2 x double> %758, ptr %150, align 16, !tbaa !5
  br label %middle.block

middle.block:                                     ; preds = %vector.body.4, %vector.body.3, %vector.body.2, %vector.body.1, %vector.body
  br i1 %cmp.n, label %.loopexit836, label %scalar.ph.preheader

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

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %indvars.iv651 = phi i64 [ %indvars.iv.next652, %scalar.ph ], [ %indvars.iv651.ph, %scalar.ph.preheader ]
  %759 = getelementptr inbounds [20 x [21 x double]], ptr %8, i64 0, i64 %indvars.iv651, i64 %.pre-phi
  %760 = load double, ptr %759, align 8, !tbaa !5
  %761 = getelementptr inbounds [20 x double], ptr %7, i64 0, i64 %indvars.iv651
  store double %760, ptr %761, align 8, !tbaa !5
  %indvars.iv.next652 = add nuw nsw i64 %indvars.iv651, 1
  %exitcond655.not = icmp eq i64 %indvars.iv.next652, %30
  br i1 %exitcond655.not, label %.loopexit836, label %scalar.ph, !llvm.loop !53

.loopexit836:                                     ; preds = %scalar.ph, %middle.block
  %762 = getelementptr inbounds [21 x double], ptr %9, i64 0, i64 %.pre-phi
  %763 = load double, ptr %762, align 8, !tbaa !5
  %764 = icmp ugt i32 %.3318, %5
  br i1 %764, label %.sink.split, label %.preheader391.preheader

.preheader391.preheader:                          ; preds = %.loopexit836
  %765 = add i32 %31, %.3318
  br label %.preheader391

.preheader391:                                    ; preds = %.preheader391.preheader, %783
  %indvars.iv656 = phi i64 [ 0, %.preheader391.preheader ], [ %indvars.iv.next657, %783 ]
  %.not371492 = phi i1 [ true, %.preheader391.preheader ], [ %.not371, %783 ]
  %.4319491 = phi i32 [ %.3318, %.preheader391.preheader ], [ %781, %783 ]
  %766 = getelementptr inbounds double, ptr %3, i64 %indvars.iv656
  %767 = load double, ptr %766, align 8, !tbaa !5
  %768 = fmul double %767, 1.000000e-03
  %769 = getelementptr inbounds [20 x double], ptr %7, i64 0, i64 %indvars.iv656
  %770 = load double, ptr %769, align 8, !tbaa !5
  %771 = fadd double %770, %768
  store double %771, ptr %769, align 8, !tbaa !5
  %772 = call double @f(ptr noundef nonnull %7) #8
  %773 = fcmp olt double %772, %763
  br i1 %773, label %774, label %776

774:                                              ; preds = %.preheader391
  %775 = add i32 %.4319491, 1
  br i1 %.not371492, label %.preheader390.preheader, label %.sink.split

776:                                              ; preds = %.preheader391
  %777 = load double, ptr %769, align 8, !tbaa !5
  %778 = fneg double %768
  %779 = call double @llvm.fmuladd.f64(double %778, double 2.000000e+00, double %777)
  store double %779, ptr %769, align 8, !tbaa !5
  %780 = call double @f(ptr noundef nonnull %7) #8
  %781 = add i32 %.4319491, 2
  %782 = fcmp olt double %780, %763
  br i1 %782, label %.loopexit392, label %783

783:                                              ; preds = %776
  %784 = load double, ptr %769, align 8, !tbaa !5
  %785 = fadd double %768, %784
  store double %785, ptr %769, align 8, !tbaa !5
  %indvars.iv.next657 = add nuw nsw i64 %indvars.iv656, 1
  %.not371 = icmp ult i64 %indvars.iv.next657, %30
  %exitcond659.not = icmp eq i64 %indvars.iv.next657, %30
  br i1 %exitcond659.not, label %.loopexit392, label %.preheader391, !llvm.loop !54

.loopexit392:                                     ; preds = %776, %783
  %.not371435 = phi i1 [ %.not371, %783 ], [ %.not371492, %776 ]
  %.5320 = phi i32 [ %765, %783 ], [ %781, %776 ]
  br i1 %.not371435, label %.preheader390.preheader, label %.sink.split

.preheader390.preheader:                          ; preds = %774, %.loopexit392
  %.5320671 = phi i32 [ %775, %774 ], [ %.5320, %.loopexit392 ]
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1, ptr nonnull align 16 %7, i64 %32, i1 false), !tbaa !5
  %786 = add i32 %.0321, 1
  br label %151

.sink.split:                                      ; preds = %.loopexit392, %774, %.loopexit836
  %.5320672.sink = phi i32 [ %.3318, %.loopexit836 ], [ %775, %774 ], [ %.5320, %.loopexit392 ]
  %.sink.ph = phi i32 [ 2, %.loopexit836 ], [ 0, %774 ], [ 0, %.loopexit392 ]
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %13, ptr nonnull align 16 %7, i64 %32, i1 false), !tbaa !5
  store double %763, ptr %17, align 8, !tbaa !55
  store i32 %.5320672.sink, ptr %18, align 8, !tbaa !57
  store i32 %.0321, ptr %19, align 4, !tbaa !57
  br label %787

787:                                              ; preds = %._crit_edge, %.sink.split, %._crit_edge.thread
  %.sink = phi i32 [ 1, %._crit_edge.thread ], [ 1, %._crit_edge ], [ %.sink.ph, %.sink.split ]
  %788 = getelementptr inbounds i8, ptr %13, i64 176
  store i32 %.sink, ptr %788, align 8, !tbaa !57
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %12) #8
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %11) #8
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %10) #8
  call void @llvm.lifetime.end.p0(i64 168, ptr nonnull %9) #8
  call void @llvm.lifetime.end.p0(i64 3360, ptr nonnull %8) #8
  call void @llvm.lifetime.end.p0(i64 160, ptr nonnull %7) #8
  ret ptr %13
}

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

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #2

declare double @f(ptr noundef) local_unnamed_addr #3

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

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

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

; 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) #6

; 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>) #7

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>) #7

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

!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 = !{!"double", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.unroll.disable"}
!13 = distinct !{!13, !10}
!14 = distinct !{!14, !12}
!15 = distinct !{!15, !10}
!16 = distinct !{!16, !10}
!17 = distinct !{!17, !10}
!18 = distinct !{!18, !10}
!19 = distinct !{!19, !10}
!20 = distinct !{!20, !12}
!21 = distinct !{!21, !10}
!22 = distinct !{!22, !10, !23, !24}
!23 = !{!"llvm.loop.isvectorized", i32 1}
!24 = !{!"llvm.loop.unroll.runtime.disable"}
!25 = distinct !{!25, !10, !24, !23}
!26 = distinct !{!26, !10, !23, !24}
!27 = distinct !{!27, !10, !23, !24}
!28 = distinct !{!28, !10, !24, !23}
!29 = distinct !{!29, !10}
!30 = distinct !{!30, !12}
!31 = distinct !{!31, !10}
!32 = distinct !{!32, !12}
!33 = distinct !{!33, !10, !24, !23}
!34 = distinct !{!34, !10}
!35 = distinct !{!35, !12}
!36 = distinct !{!36, !10, !23, !24}
!37 = distinct !{!37, !10, !23, !24}
!38 = distinct !{!38, !10, !24, !23}
!39 = distinct !{!39, !10}
!40 = distinct !{!40, !10}
!41 = distinct !{!41, !10}
!42 = distinct !{!42, !12}
!43 = distinct !{!43, !10, !24, !23}
!44 = distinct !{!44, !10}
!45 = distinct !{!45, !12}
!46 = distinct !{!46, !10}
!47 = distinct !{!47, !12}
!48 = distinct !{!48, !10}
!49 = distinct !{!49, !12}
!50 = distinct !{!50, !10}
!51 = distinct !{!51, !12}
!52 = distinct !{!52, !10, !23, !24}
!53 = distinct !{!53, !10, !24, !23}
!54 = distinct !{!54, !10}
!55 = !{!56, !6, i64 160}
!56 = !{!"optimum", !7, i64 0, !6, i64 160, !7, i64 168}
!57 = !{!58, !58, i64 0}
!58 = !{!"int", !7, i64 0}


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